秋招大廠研發(fā)崗復(fù)習(xí)指南

今年春招補(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ì)形勢整體不太景氣,所以比之前幾年都更難找。

節(jié)選自《2019,中國互聯(lián)網(wǎng)讓人失望的一年》

我現(xiàn)在所在的實驗室是做 cv 的,所以研一開始入門深度學(xué)習(xí)的基礎(chǔ)知識,包括看網(wǎng)課和學(xué)習(xí)配環(huán)境跑模型。由于平時比較關(guān)注??途W(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í),一方面花早上的時間去看一些比較繁瑣費腦的文獻(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)容:

容器:

  1. ArrayList、Vector、TreeMap 的底層實現(xiàn)原理
  2. HashMap 的所有屬性和方法底層實現(xiàn)、hash 的實現(xiàn)、怎樣擴(kuò)容、與 HashTable 的區(qū)別
  3. ConcurrentHashMap 做了哪些改進(jìn)
  4. JDK 1.7 與 1.8 這些容器的底層有什么變化和區(qū)別,有哪些改進(jìn)

并發(fā)編程:

  1. 線程的狀態(tài)和方法、線程池的參數(shù)和實現(xiàn)原理、線程池的使用與注意事項
  2. synchronized 的實現(xiàn)原理
  3. Java 的鎖機(jī)制與鎖優(yōu)化
  4. volatile 的特點
  5. CAS 更新的原理與存在的不足,怎樣解決
  6. Java 內(nèi)存模型
  7. 常見的 J.U.C 工具類,原子類的底層原理
  8. ThreadLocal 原理與內(nèi)部數(shù)據(jù)結(jié)構(gòu)
  9. Lock、AQS、Condition、與 synchronized 的對比

數(shù)據(jù)結(jié)構(gòu)與算法:

  1. B+ 樹的定義和應(yīng)用場景
  2. 紅黑樹的定義和特點
  3. 二叉樹的前中后序遍歷非遞歸算法
  4. 字典樹
  5. 并查集
  6. BFS + DFS
  7. 貪心算法
  8. KMP 算法

Java 虛擬機(jī):

  1. JVM 內(nèi)存結(jié)構(gòu)
  2. 垃圾回收算法與垃圾收集器
  3. 內(nèi)存分配策略
  4. 類加載機(jī)制的過程、雙親委派模型以及應(yīng)用

框架:

  1. Spring IOC 容器的初始化過程
  2. AOP 面向切面的原理
  3. Spring 中運(yùn)用了哪些設(shè)計模式
  4. SpringMVC 的工作原理
  5. MyBatis 中的 DAO 接口和 XML 中的 SQL是如何建立聯(lián)系的

MySQL:

  1. 事務(wù)的四大特性、三種現(xiàn)象(臟讀、不可重復(fù)讀和幻讀)的定義以及隔離級別
  2. 版本鏈的概念以及 MVCC
  3. 數(shù)據(jù)庫引擎的格式以及內(nèi)部實現(xiàn)機(jī)制、不同引擎之間的對比
  4. 存儲引擎的頁結(jié)構(gòu)
  5. 數(shù)據(jù)庫索引
  6. 數(shù)據(jù)庫鎖機(jī)制
  7. 分庫分表方案

進(jìn)階知識完善(并不是必需,但面試知道這些會加分很多):

  1. 分布式相關(guān)概念:CAP、BASE 理論
  2. Zookeeper 的定義以及層次結(jié)構(gòu)、集群和選舉過程、應(yīng)用場景
  3. Redis 的數(shù)據(jù)結(jié)構(gòu)、持久化機(jī)制、集群、選舉方式、應(yīng)用場景
  4. 如何保證 Redis 的高并發(fā)和高可用
  5. Redis 持久化的優(yōu)缺點
  6. 一致性 hash 算法
  7. 緩存穿透、雪崩和擊穿的定義和解決方案
  8. 如何保證緩存與數(shù)據(jù)庫的雙寫一致性
  9. 常見的消息隊列及作用
  10. 如何保證消息隊列的高可用
  11. 如何保證消息的冪等性和可靠性傳輸

上面的內(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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容