今年春招補(bǔ)招與暑假實習(xí)即將開始捉捅,有簡書的粉絲私信問我校招的短期復(fù)習(xí)規(guī)劃撤防;還有些21屆的研究生想搞研發(fā),但實驗室做算法棒口,問我如何權(quán)衡寄月;又或者對秋招過程中出現(xiàn)的一些問題很迷茫辜膝,出現(xiàn)了瓶頸覺得自己無法突破...這些問題我在復(fù)習(xí)備戰(zhàn)的時候曾經(jīng)都遇到過,有一些自己的心得漾肮,在之前的文章中也有寫厂抖,只是大家可能沒有耐心仔細(xì)看。在這篇文章中最后做一次全面的匯總克懊,文中的部分內(nèi)容與之前的文章會略有重復(fù)忱辅,但也會有新的內(nèi)容需要大家好好理解消化...ψ(*`ー′)ψ
秋招分析與個人概況
首先闡述一下我的個人基本情況。本科湖北工業(yè)大學(xué)軟件工程谭溉,碩士哈爾濱工業(yè)大學(xué)計算機(jī)技術(shù)墙懂,在19年的暑假提前批中拿到了字節(jié)跳動(sp,深圳 + 今日頭條研發(fā)服務(wù)端部門)扮念、百度(北京 + Java 開發(fā)工程師)损搬、小米(北京 + Java 開發(fā)工程師)、華為(口頭15級柜与,深圳 + 通用軟件工程師)和猿輔導(dǎo)(北京 + 服務(wù)端研發(fā)工程師)的 offer巧勤。
今年,或者說最近幾年弄匕,計算機(jī)專業(yè)的校招形勢比較嚴(yán)峻颅悉。算法崗的泡沫越來越小,平均工資趨向與研發(fā)崗持平粘茄,導(dǎo)致今年算法轉(zhuǎn)研發(fā)的很多签舞,但某些大廠的算法還是一騎絕塵。前端和客戶端競爭稍小一點柒瓣,但由于今年經(jīng)濟(jì)形勢整體不太景氣儒搭,所以比之前幾年都更難找。
我現(xiàn)在所在的實驗室是做 cv 的搂鲫,所以研一開始入門深度學(xué)習(xí)的基礎(chǔ)知識,包括看網(wǎng)課和學(xué)習(xí)配環(huán)境跑模型磺平。由于平時比較關(guān)注呕耆裕客網(wǎng)、脈脈這一類信息流中有關(guān)互聯(lián)網(wǎng)前沿的求職動向拣挪,所以對當(dāng)前的就業(yè)形勢有一個大致的預(yù)估擦酌。感覺大環(huán)境有些浮躁,搞算法菠劝,特別是機(jī)器學(xué)習(xí)赊舶、深度學(xué)習(xí),要么偏研究,發(fā)論文笼平,要么偏應(yīng)用园骆,算法落地。而且對我來說寓调,深度學(xué)習(xí)就像煉丹锌唾,各種 tricks 排列組合,然后 train 模型夺英,煉來煉去提升性能晌涕,然后發(fā)文章...可能本身科研能力也一般,所以并沒有很深的體會或者對科研抱有很高的熱情秋麸,只是覺得有時候算法落地還是挺難的渐排,很多論文的實驗復(fù)現(xiàn)后效果并不太理想。而且算法工程師首先得是一個工程師灸蟆,自認(rèn)為離一個真正的工程師還有一定的距離驯耻,于是選擇了研發(fā)這條路,繼續(xù)提高自己的 coding 能力和工程應(yīng)用能力炒考。
由于平時實驗室也沒有太多的活需要去完成可缚,導(dǎo)師也很好比較信任我,讓我可以按照自己既定的計劃去學(xué)習(xí)斋枢,一方面花早上的時間去看一些比較繁瑣費(fèi)腦的文獻(xiàn)帘靡,一方面花下午和晚上的時間復(fù)習(xí)秋招的基礎(chǔ)知識或者刷題、準(zhǔn)備面試項目瓤帚,也還算游刃有余描姚。
后端基礎(chǔ)知識
研發(fā)需要掌握的知識點很廣,作為一個應(yīng)屆生想要面面俱到不太現(xiàn)實戈次,但一定要能在面試官面前展現(xiàn)出扎實的基礎(chǔ)轩勘、對業(yè)務(wù)的理解能力和較強(qiáng)的 coding 實現(xiàn)能力,至于項目是不是高大上怯邪,他們并不會太在意绊寻。
Java 基礎(chǔ)主要包括但不限于以下內(nèi)容:
容器:
- ArrayList、Vector悬秉、TreeMap 的底層實現(xiàn)原理
- HashMap 的所有屬性和方法底層實現(xiàn)澄步、hash 的實現(xiàn)、怎樣擴(kuò)容和泌、與 HashTable 的區(qū)別
- ConcurrentHashMap 做了哪些改進(jìn)
- JDK 1.7 與 1.8 這些容器的底層有什么變化和區(qū)別村缸,有哪些改進(jìn)
并發(fā)編程:
- 線程的狀態(tài)和方法、線程池的參數(shù)和實現(xiàn)原理武氓、線程池的使用與注意事項
- synchronized 的實現(xiàn)原理
- Java 的鎖機(jī)制與鎖優(yōu)化
- volatile 的特點
- CAS 更新的原理與存在的不足梯皿,怎樣解決
- Java 內(nèi)存模型
- 常見的 J.U.C 工具類搪柑,原子類的底層原理
- ThreadLocal 原理與內(nèi)部數(shù)據(jù)結(jié)構(gòu)
- Lock、AQS索烹、Condition、與 synchronized 的對比
數(shù)據(jù)結(jié)構(gòu)與算法:
- B+ 樹的定義和應(yīng)用場景
- 紅黑樹的定義和特點
- 二叉樹的前中后序遍歷非遞歸算法
- 字典樹
- 并查集
- BFS + DFS
- 貪心算法
- KMP 算法
Java 虛擬機(jī):
- JVM 內(nèi)存結(jié)構(gòu)
- 垃圾回收算法與垃圾收集器
- 內(nèi)存分配策略
- 類加載機(jī)制的過程弱睦、雙親委派模型以及應(yīng)用
框架:
- Spring IOC 容器的初始化過程
- AOP 面向切面的原理
- Spring 中運(yùn)用了哪些設(shè)計模式
- SpringMVC 的工作原理
- MyBatis 中的 DAO 接口和 XML 中的 SQL是如何建立聯(lián)系的
MySQL:
- 事務(wù)的四大特性百姓、三種現(xiàn)象(臟讀、不可重復(fù)讀和幻讀)的定義以及隔離級別
- 版本鏈的概念以及 MVCC
- 數(shù)據(jù)庫引擎的格式以及內(nèi)部實現(xiàn)機(jī)制况木、不同引擎之間的對比
- 存儲引擎的頁結(jié)構(gòu)
- 數(shù)據(jù)庫索引
- 數(shù)據(jù)庫鎖機(jī)制
- 分庫分表方案
進(jìn)階知識完善(并不是必需垒拢,但面試知道這些會加分很多):
- 分布式相關(guān)概念:CAP、BASE 理論
- Zookeeper 的定義以及層次結(jié)構(gòu)火惊、集群和選舉過程求类、應(yīng)用場景
- Redis 的數(shù)據(jù)結(jié)構(gòu)、持久化機(jī)制屹耐、集群尸疆、選舉方式、應(yīng)用場景
- 如何保證 Redis 的高并發(fā)和高可用
- Redis 持久化的優(yōu)缺點
- 一致性 hash 算法
- 緩存穿透惶岭、雪崩和擊穿的定義和解決方案
- 如何保證緩存與數(shù)據(jù)庫的雙寫一致性
- 常見的消息隊列及作用
- 如何保證消息隊列的高可用
- 如何保證消息的冪等性和可靠性傳輸
上面的內(nèi)容大致上是按照我秋招過程中總結(jié)的思維導(dǎo)圖大綱羅列出來的寿弱,看上去雖然并不是很多,但在復(fù)習(xí)的時候按灶,會發(fā)現(xiàn)很多問題症革。當(dāng)你復(fù)習(xí) A 模塊的時候,你需要知道 B 模塊的內(nèi)容鸯旁,不同知識有區(qū)別也有相似的地方噪矛,很多知識都是串起來的,是一個體系铺罢。如果把以上內(nèi)容做到熟能生巧心中有數(shù)艇挨,面試這一環(huán)節(jié)中的所有跟基礎(chǔ)有關(guān)的問題基本上都能答出來。
適合此階段看的計算機(jī)書籍有(排名不分先后):《瘋狂 Java 講義》畏铆、《深入理解 Java 虛擬機(jī)》雷袋、《Java 編程思想》、《Java 并發(fā)編程的藝術(shù)》辞居、《Redis 的設(shè)計與實現(xiàn)》楷怒。每本書不必從頭讀到尾,當(dāng)成一個工具書或者寶典瓦灶,對一些存疑的地方可以有針對性地去查閱鸠删,當(dāng)然有些比較重點的知識(容器、并發(fā))還是按章節(jié)去讀贼陶,知識才能形成一個整體刃泡。
coding 能力
刷題這件事巧娱,需要好好重視。19年實習(xí) + 秋招我大大小小參加了十幾場筆試烘贴,一般都是2小時4-5道編程題禁添,平均半小時一道,時間還是比較緊的桨踪。而且在那種競爭壓力下老翘,難免思路上會出現(xiàn)一些障礙,因此需要平時刻苦的訓(xùn)練锻离。
很多人刷了一些題铺峭,發(fā)現(xiàn)不僅以前刷過的忘了,而且碰到新題也不會做汽纠,感覺怎么也突破不了卫键。這種情況我也遇到過,也讓我苦惱了一段時間虱朵。解決方法就是做過的題反復(fù)做莉炉。我從18年底開始刷劍指 offer 和 LeetCode,一直到19年暑假提前批卧秘,大概半年左右的時間呢袱,劍指67題 + LeetCode 接近400題 + 牛客網(wǎng)互聯(lián)網(wǎng)真題翅敌,基本都是三刷羞福,總題量有一兩千。其中 LeetCode 的題目是按照 GitHub 上的面試精選分類從頭刷到尾蚯涮,包括字符串治专、樹、圖遭顶、數(shù)學(xué)张峰、暴力、貪心和動規(guī)等方面的內(nèi)容棒旗。
第一遍基本上相當(dāng)于熟悉基本的輸入輸出和筆試的出題風(fēng)格喘批,雖然之前搞過藍(lán)橋杯和 ACM 的短期訓(xùn)練,但過了很長時間比較生疏铣揉,很多題對我而言相當(dāng)于是全新的饶深,第一次啃完這些題,時間最長逛拱,花的精力也最多敌厘。
第二遍是熟悉解題套路,比如迷宮就是 bfs/dfs朽合,top K 就是堆/排序俱两,K th 就是 partition/排序饱狂,分硬幣/找錢/最長公共子序列就是 dp 等等,畢竟是以面試為導(dǎo)向的題庫宪彩,不像 ACM 那樣技巧性很強(qiáng)休讳,很多題的公共思想都是相通的,因此基礎(chǔ)題要牢牢掌握尿孔,在真正筆試的時候很多題其實就是在這些基礎(chǔ)題上加一個背景衍腥,比如拼多多的“多多干了什么事”、騰訊的“小Q又干了什么事”纳猫,只要仔細(xì)讀題理解完背景本身,再去思考之前做過的套路中哪一個最合適就行竹捉。
第三遍是練思維能力芜辕、練手速。訓(xùn)練迅速寫好輸入輸出框架的能力块差,訓(xùn)練從題目背景中提取算法模型的能力侵续,訓(xùn)練從記憶中提取合適解題套路的能力,訓(xùn)練迅速找出邊界測試數(shù)據(jù)修復(fù)代碼中 bug 的能力憨闰。
做完這些状蜗,筆試和面試中的手撕代碼應(yīng)該沒有很大的問題。今年秋招中幾家大廠的面試手撕代碼鹉动,我都碰到了幾個與 LeetCode medium 題類似的題目轧坎,在短時間內(nèi)找出了最優(yōu)解,還算比較幸運(yùn)泽示「籽克服過程的枯燥并堅持,結(jié)果不會差械筛。
項目
我在簡歷中羅列的項目比較水捎泻,但也并不是像一些人 fork 完別人的 GitHub repository,跑通代碼埋哟,知道有哪些功能就萬事大吉笆豁。比如秒殺平臺,大多數(shù)人都會考慮如何解決超賣現(xiàn)象闯狱、Redis 實現(xiàn)緩存提升性能,但有沒有想過怎樣保證秒殺請求的可靠性砍鸠?怎樣保證消息的冪等性?如果在分布式環(huán)境下如何再優(yōu)化…這都是可以自己去思考的問題爷辱。
其實不管我們做的是什么項目朦肘,在面試官眼里都是很 low 的,那么在這個前提下双饥,如何讓對方看出你的與眾不同,這就是你需要思考的地方咏花。比如展現(xiàn)出你在項目中對業(yè)務(wù)邏輯的認(rèn)識、如何優(yōu)化使得并發(fā)量有一個提升昏翰、對項目中出現(xiàn)的 bug 是怎樣定位和解決的...這些東西作為一個沒有實習(xí)過的人來說想掌握好不太容易苍匆,我在面阿里菜鳥的時候棚菊,由于實習(xí)有掛面記錄,再加上項目的一些實戰(zhàn)經(jīng)驗不是很充足统求,所以吃了不少虧...
結(jié)語
今年的提前批比較幸運(yùn),準(zhǔn)備得比較早码邻,投簡歷也比較早折剃,及時上車像屋,可能晚一點就沒有hc了,找工作除了實力也需要運(yùn)氣己莺,更是一個持久戰(zhàn)因苹,一場戰(zhàn)斗,主要還是打法和迎難而上的勇氣篇恒。今年很多公司縮招,要是我一直猶豫不敢投簡歷胁艰,說不定就沒機(jī)會了款筑。至于打法,得益于自己平時一直都是按照經(jīng)過自己深思熟慮后的學(xué)習(xí)計劃一步步走腾么,從語法到基礎(chǔ)奈梳,再到進(jìn)階,通過一次次面試實戰(zhàn)積累經(jīng)驗解虱、總結(jié)技巧攘须,最終取得了久違的勝利。
越好的東西越值得等待殴泰,希望大家能堅持每天輸入于宙,堅持總結(jié)浮驳,堅持刷題,平常心發(fā)揮捞魁,積累經(jīng)驗至会,多拿 offer。