我的春招

Hello,首先自我介紹一下,我是一所普普通通的二本院校的大三學生,座標江蘇。

今年三月份拿到了騰訊實習的offer,人生中第一次面試是騰訊,部門是 TEG 的雲架構,並且順利簽約,說實話內心還是挺高興的,在這裡和大家分享一下自己的經歷。

該讀者後面也拿到了阿里的 offer

我的看法

下手要果斷。不要怕自己不夠好不夠強,我大概是二月底開始投簡歷。我一開始使用了牛客網投簡歷的方式,很遺憾,記得牛客網公眾號當時給我的等待面試安排直到現在我都沒有收到安排,效率過慢,很容易失去機會。不過我的簡歷是很簡單地使用牛客網的模板寫的。

有了想法就果斷去投,要去官網投!

帥地注:平時帥地讓大家去牛客網,更多的是大家去那裡找內推,檢視公司招聘時間,筆試時間,最後還是要進去官網投遞的,而不是在牛客網投遞。

對於大概的需要學習的知識有:

  1. 比較牢靠的基礎知識

    • 計算機網路
    • 作業系統
    • 語言基礎
    • 多執行緒
    • 演算法
    • 資料庫
  2. 專案

對應的書籍可以看這裡:

少走彎路,必讀計算機經典書籍推薦(含下載方式)

關於簡歷

我是遵循著越精簡越好的做法寫的。本來寫了兩三頁,最後刪刪改改保留到了最後一頁內容,無用的可以刪掉,比如學生會經歷啥的,基本沒用,不過很多公司制定的簡歷都是要必填的話,可以都寫上去。

如果是內推直接發簡歷的話建議寫的少一些,把重點和亮點寫上去,讓 hr 一眼就直接看見,包含了一定需要的資訊,比如姓名學校什麼的,自己比較擅長的知識,比如說 redis,爬蟲,linux,或者對 jvm 理解比較深,也可以強調一下,面試官會針對著你的簡歷去問。

專案的話不要太大眾化,也千萬不要造假,最好是自己真的比較熟悉的,面試官會問有沒有 github 連結,這個時候如果沒有還是比較尷尬的,可以分條寫下重點內容、利用的知識點,最後可以總結不足之處,遇到困難如何解決,後期會如何去改進。專案不用很多,我寫的是2個,不過越多一般會比較好,前提是比較有價值的。

簡歷模版看這裡:

開發崗 9 套簡歷模版(附下載)

關於基礎知識點

計算機網路

騰訊基本上是必問,特別是 TEG這 些部門,我的三輪技術面每一輪都是從計算機網路開始問的,而且問了還挺久的,一定要重視 TCP 協議,三面面試官讓我講TCP 裡面的各種機制,然後我因為時間間隔久,說的就比較亂,這裡建議可以自己整理一個大綱,然後好好填充,最後複習,不要抄網上的,一個是各種版本太多,還有的是不一定完全正確。

我是從大一開始就看計算機網路自頂向下方法這本書,大概斷斷續續讀了有兩三遍,這本書在本科應付面試還是夠了。我也只讀了這一本書,我覺得自定向下的方式還是挺好的,和 csapp 不太一樣,計網還是舉了很多比較通俗的小例子,比如郵遞員啊,一家人和鄰居的互動這些,看著還是挺有趣的,前六章一定要讀懂,記住關鍵知識點。

在校招的層次上,這本書已經是很詳細了。舉個例子,面試有一個高頻題目,就是 web 頁面請求的過程,可能大家看過面經的都會粗略的說什麼 DNS 查詢啊,三次握手,瀏覽器解析,但是這個問題其實在書上的 326~331 頁上有十分詳細的過程,同時也囊過了前六章的非常多的知識點,書中是用Bob用他的便攜機在學校查詢了 www.google.com 主頁來舉例。你說的越詳細,面試官對你越評分會越高。

作業系統

作業系統是我比較薄弱的地方,我看 csapp 都挺吃力的,經常看的犯困,當時學校教的其實也比較水,就是直接教你怎麼算,然後出英文試卷,相當於背題應試。那怎麼夠呢,我因為看書吃力,於是選擇了看 b 站清華大學的作業系統課,老師是向勇和陳渝,對於我這種比較笨的人還是挺友好的,然後對應著 csapp 來看,會好一些。

還有就是 linux,似乎很多面試官會問你平時是不是使用 Linux 程式設計,我直接就慫,雖然平時專案上線會用 linux,不過我大概只知道一些指令,比如 ps, netstat 這些,然後去 proc 查查 cpu 狀態,這個三面面試官也問了,你平時如何檢視 cpu 狀態,如何檢視記憶體佔用情況,如何定位程式出錯的地方(大概是)。

然後我就開始扯什麼 top 啊,什麼利用率負載率啊。最後還算是扯過去了,二面面試官也針對 Linux 問了挺多的,遇到不會的就誠實的說不會,不要強行去解釋,也不要逞能,這樣會被懟的很慘。三面的時候面試官還問我磁碟問題,RAID1-5,我覺得這個對我來說還是挺深的...

視訊推薦:計算機基礎三門課視訊

別人總結的PDF:圖解作業系統、網路、計算機組成 PDF 下載!

語言基礎

這裡扯下 java 的,二面面試官針對java問的比較多,一和三基本沒問。

其實我二面是答得最不好的一輪,很多概念模糊了,也猶豫了挺久的,比如他問我抽象類和介面的區別,我大概還是一年前看的了,當時我努力搜尋記憶中的概念...,憋了好一會才憋出來幾個區別,不過事後看看真的很簡單,基本上是看了一遍就回憶出來了,大概還有類繼承的一些問題,jvm 讓我每一塊分開來說,面向物件,我每個說的都不太詳細,還是挺遺憾的,因為我真的對java太有信心了,一直沒去複習看它,結果眼高手低了。

所以千萬不要放棄每一個知識點,然後聊了一下 go 語言,我之前有去看過雲風 c 語言寫的協程,大概瞭解了一些。java 我看的書是 JAVA核心卷,Thinking in Java,effective Java,其實我覺得這三本書是挺夠的了,特別是 Thinking in Java,初看是略看,然後多看幾次,就能注意到很多細節,而細節往往可以決定成敗。

其實說是三本書,還有很多是不必看的,比如 Swing 程式設計這些。核心卷對於入門來說非常友好,因為很簡單。Effective Java 放在最後看,往往是優化程式碼,讓程式碼更加安全、效能高、優雅。

多執行緒

我用的是 java 併發程式設計的藝術這本書,多執行緒一定要好好學,專案中一定是常用到的,然後推薦大家看一看併發程式設計網,裡面的內容基本是很優秀的。很多是國外搬運翻譯的。

另外可以通過面試題複習:Java面試題必知必會(附答案)

演算法

演算法靠刷,刷多了有題感,不過騰訊是挺愛問排序演算法的,那基本的穩定和不穩定排序演算法是要熟悉的,比如我二面問了希爾排序,我本來以為大概率是問快速排序的,然後希爾時間複雜度我還說錯了,,,,

好在其他我都記得比較熟悉,堆排序,快速排序(隨機選基數,三路快排)等,歸併排序(我覺得這個很重要,因為 java 的 sort 就是用的快速排序+歸併排序),而且歸併排序是穩定排序。基於歸併排序的演算法題延申的都挺多的,有看到其他大廠的筆試演算法題就是歸併。

演算法的話,如果時間充足,比如我是大一寒假開始寫演算法,我是每一題自己鑽,然後看題解,往往一天只寫兩三題。目前為止刷題總數 leetcode + 牛客,加上一些 OJ 平臺,大概是 600+ 的題量,可惜騰訊的面試裡問的演算法不怎麼多...,這裡總結一下必要的演算法知識,首先是資料結構每一個都需要很熟悉,比如連結串列,雜湊表,樹,圖,棧,佇列,堆。

(1)連結串列,什麼反轉連結串列,環形連結串列,連結串列排序等等演算法,比如 LRU,就是用一個雙向連結串列 + HashMap 來實現。別看連結串列基礎,但是很多大廠是挺喜歡連結串列的,比如位元組跳動,再比如跳躍表,是 redis 裡的 zset 的底層實現。

(2)雜湊表,最好要理解底層實現,建議看原始碼,一定要清楚如何實現。用處也是非常非常多。比如記憶化遞迴在有時候陣列不適用的情況就是用 map,還有HashSet,TreeSet,這些的原始碼都建議去看。雜湊表的用處還非常廣泛,這個基本是最常用的資料結構。

(3)樹,樹有很多,二叉搜尋樹,AVL 樹,紅黑樹(旋轉不如AVL頻繁),字典樹(敏感詞過濾)等,leetcode 樹專題,不要猶豫,直接刷,騰訊這次筆試也有樹的題目。而且很容易變種,樹基本是以遞迴,不過也會有題目要求使用非遞迴,這個時候就要用棧和佇列來輔助,比如迭代方式前序遍歷。關於樹的演算法題太多了,有一陣子 leetcode 周賽,每次第三題都是樹。

(4)圖,圖的考察點不如以上頻繁,大概是有向圖,無向圖,BFS 和 DFS,還有拓撲排序,Dijkstra 最短路徑,Krusal 最小生成樹等等。

(5)棧,用法也是多,感覺很多情況是和字串掛鉤,更難一些的是單調棧,某年京東除了一題很難的題目,就是用單調棧。

(6)佇列,用法也是很多,比如拓撲排序,求二進位制,BFS 等等。

(7)堆,很多時候有妙用,比如拓撲排序,Top K 問題。

以上資料結構一定要很熟悉,應用實在是太廣泛了。我大一的時候,用c語言寫動態擴容棧、佇列,紅黑樹,斐波那契堆,二叉堆,有向圖(包含各種演算法),AVL樹等挺難的資料結構,如果時間充足可以這麼寫著玩,鍛鍊coding能力。

重要的演算法有:二分,遞迴,記憶化遞迴,回溯,廣度優先,動態規劃,數學(有蠻多腦筋急轉彎題目的),滑動視窗(雙指標),排序演算法,程式設計(比如設計LRU,LFU)。

這裡推薦一份大佬的刷題筆記:兩個月斬獲 70k star,前位元組大神刷題筆記

把大部分演算法都總結了

資料庫

如果寫後臺那大概率是和資料庫打交道的,這裡推薦大家學習 Mysql,redis,mongoDB。MySQL 可以學習的太多了,首先要寫得一手好 sql 語句,這裡要注意利用到索引,減少表連線,提高 sql 效率等等,leetcode 上直接就用 sql 練習,刷個幾十道足夠。

然後深入一點,學習引擎,索引(聚簇索引,二級索引,B+樹,Hash索引,最左匹配等),ACID特性等等,索引是重點,三面的時候詳細問了B+樹,然後就扯到了索引。這裡建議重視一下索引,一是它是真的非常有意思,二是它真的很重點...

關於 NoSql,看的出來三面面試官是挺挖掘深度的,對於專案,資料庫,作業系統,計網,問的都是挺細節挺深的,他問我聊不瞭解 MongoDB,我說用過但不是很瞭解,是以前寫爬蟲的時候配合用的,可以有什麼什麼用,扯了一堆。然後 redis 也問了,比如主從輔助,哨兵,選舉機制,分割槽叢集,等等。還好我redis學的還可以,都答上來了。

redis是絕對值得認真學習的

關於面試

我投了提前批,所以直接參加面試。3.5 給了通知,我剛好到南京見到了女朋友,結果傍晚通知就來了,於是晚上一起在南京吃了一頓索然無味的飯,明明菜做的非常好...

帥地注:如果可以,一定要參加提前批。

一面

3.8 在常州初面,面試官很隨和,帶著耳機,我自我介紹到一半然後網斷了,於是接下來的自我介紹他都沒聽見,笑著叫我重說,我突然也就不緊張了。上來直接問計算機網路,也沒緊張,流暢的答完了,記得的問題就是TCP和UDP,三次握手,為啥不能二次握手,瀏覽器輸入URL,還有的也記不得了,問的挺多的計算機網路,然後似乎對其他沒什麼興趣就直接問了專案。

問了 nginx,分散式鎖實現,分散式限流實現,令牌桶演算法和漏桶演算法,除了這些演算法你還有什麼思路,這些演算法的優缺點比較,redis做什麼用,優點?非同步阻塞佇列?和kafka比較?聊天系統,為什麼兩個專案使用的MQ不一樣,MQ對比,心跳機制和選舉機制。

大概是這些,總的來說答得還可以,也蠻流暢的,最後問面試官優缺點,他說優點是比較帥,我於是開始覺得我說的並不怎麼樣...然後第二天早上就接到了二面通知。

二面

3.10 晚上 8 點,我一邊喝紅牛一邊等電話,二面面試官聲音比較成熟一些,態度也比較正式,不過人超好,認真的介紹了自己,我一開始都沒聽清TEG部門...,

然後二面其實說的不怎麼好,一開始一樣是懟了計網,有一個問題一面面試官問過了,於是我告訴他上一個面試官問過了,然後他就跳過了,印象深的是狀態碼,從1-5我都說了一些,其中我還說錯了,我說我專案中經常看見的Method not allowed,我說成了403,結果是400...很尷尬。

然後懟了java基礎,jvm, 排序演算法,我說的真的不是很好,因為過於自信...,這一面反而專案問的不怎麼多。然後瞭解了我的性格,學習態度,有點像 HR 面,我中間緊張的時候還安慰了我,說沒事喝口水。

然後有的記不得了也耐心等待我,然後聊了聊第一個專案中微信支付怎麼做的,其實沒什麼技術含量...還有一些專案點大概忘了,聊了一下 go 語言。然後我做了一件愚蠢的事情,我問面試官我還有下一面嗎,面試官告訴我不管在哪個公司問這個都是不好的,我心裡涼涼的...

大家切記...最後說我總體來說挺不錯的,可能有些基礎忘了,但是其他方面還是不錯的。結束了以後我還是挺沮喪的,覺得自己肯定掛了。

三面

然後 3.11 下午躺在宿舍床上接到了深圳總部的電話,是一個聲音挺年輕的男聲,後來才知道是部門主管...,

約了一下三面技術面時間,我選擇了14號週日,然後安排了一下上午的時間,於是愉快(煎熬)地等待。

在學校咖啡館面試,感覺壓迫感還是蠻重得,首先考察計網,很多問題還是在面經上沒有的,結合了實際場景,感覺也是在挖掘深度,懟了我的專案,問的很詳細,從分散式限流,然後solr,redis分割槽叢集,Linux,定位專案問題,檢視cpu狀態等,主從複製,哨兵等等,B+樹,資料庫。

然後說我們部門也負責的資料庫,然後我哇,好厲害(確實很厲害),然後作業系統,磁碟,我坦白作業系統是我比較薄弱的地方就不往下問了,還問了儲存計算分離,鎖,定位功能和附近景區附近的人實現,總的來說還是感覺在挖掘深度。

然後問我興趣愛好,我說彈鋼琴和看動漫,進擊的巨人你看過嗎,他說你咋不說鬼滅之刃呢,恰好我寒假補完了鬼滅...,感覺人還是很親和友好的,聊的很開心,最後我問是哪個部門呀,他說是TEG,說實話我心裡是非常開心的,因為我是真的喜歡TEG。

HR 面

最後 3.16HR面試,不得不說騰訊效率高,基本是隔一天就會進入下一輪。HR面也聊了挺久的,從各方面來問,然後讓我講第一個專案從頭到尾的過程,我就說了很多很多,從技術方面和團隊方面,解決問題,程式碼規範,然後講了一下自己的經歷,瞭解了一下家庭情況等等。

最後過了幾天打電話給了口頭offer,聊了一下薪資,確定了地點是實習時間,當然是開心的不行了。第二天電子offer就發來了,於是愉快的簽約。

三個面試官真的都超好,人非常親和,騰訊效率是真的很棒,總的來說面試體驗非常非常好。

帥地注:不得不說,騰訊的面試官真的好評。

另外可以通過面試題複習:Java面試題必知必會(附答案)

一些想說的話

首先要感謝一些人,一直支援我的家人,給我提供好的條件,關心我的身體。

然後是女朋友,面試是一路陪我過來的,每一輪面試都默默陪著我,在心情不好的時候安慰我,鼓勵我,會一直走下去。

接著是地哥(公眾號 帥地玩程式設計),從我大一就一直給我幫助,我有的時候發了一題演算法題,過了一會就把詳解給我,打的字都超多,平時很忙也沒敷衍我,不厭其煩地幫我解答,公眾號內容也很贊,乾貨滿滿,非常感謝。

然後是我的舍友們,大一是一位舍友,也是兄弟,教了我第一個 C 語言程式,看著小黑框,莫名的成就感油然而生。也是他給了我很多路線上的幫助,我記得大一我學不會指標,他罵了我一頓,然後教我,我還真被給罵會了,我的學習態度也是被他感染的吧,解決一個問題一晚上不睡,吃飯也在思考遇到的問題。

現在雖然人在英國,不過也保持著聯絡,交流學習,互相幫忙。還有一個搞前端的舍友,我們學校第一前端,和我一起經歷了很多時光,一起工作一起玩樂,陪我度過艱難的時刻,感情深厚。

寫這篇文章是想告訴一些新人朋友們,不管學校是好是壞,只要自己相信自己,永遠不服輸,永遠認為自己可以,那麼你一定可以,學校其實真的不是很重要,重要的是你這個人如何。我以前也很迷茫,覺得一個二本學校怎麼可能去大廠,但是事實上不要考慮那麼多,人生也是如此,只管不斷前進就好了。

最後帥地說幾句

無論是春招還是秋招,也無論拿到什麼樣的 offer,這絕對不是終點,而是人生另外一個重要的起點,為了讓我們以後有更多的選擇,我們都得持續學習,只有持續學習,我們才能變的更強,當然,所謂學習 ,絕對不侷限於程式設計知識哦。

最後把總結的書籍送給大家:少走彎路,必讀計算機經典書籍推薦(含下載方式)