面試流程#
騰訊的面試分為三部分:初試、復試和 HR 面試,前兩輪是技術面,最後一輪主要是調研學生的個人理念、學習狀況、家庭情況等內容。
三次面試通過後,幾天內會收到騰訊 HR 助手發來的雲證鏈接,主要內容是上傳身份證和臉部信息,進行信息核實。接著靜心等待 oc 及意向書即可。
個人情況#
博主是東北大學計算機科學與技術專業的大三學生,了解 Go、C++、Java、JavaScript 等語言(主要使用 Golang),績點中下,簡歷上的項目寫了 Java 課程設計的課設 “Java 畫圖板”、Web 編程技術的課設 “Java 論壇系統” 以及大創的項目 “基於區塊鏈的電子病歷系統”,投遞崗位為後台開發,無明確部門意向,base 北京且接受調劑。
時間線#
時間 | 事件 |
---|---|
3.17 | 投遞簡歷 |
3.18 | 約面試 |
3.22 | 騰訊深圳一面 |
3.30 | 騰訊深圳二面 |
4.1 | 騰訊深圳二面掛掉 |
4.7 | 騰訊北京撈人,約面試 |
4.8 | 騰訊北京一面 |
4.12 | 騰訊北京二面 |
4.14 | 騰訊北京 HR 面 |
4.15 | 收到 oc(因為趕上了提前批最後一天,所以出結果比較快) |
接下來是詳細的面試流程。
第一次初試(1 小時 10 分鐘)#
自我介紹#
編程題目#
開場是一道編程題,找到二叉樹中兩個結點的最近公共父節點。
這道題我曾經做過,但印象不夠深刻,卡了比較久,且過程中小錯誤出現較多,痛苦面具。
面試官:
- 需要學習一下 Golang 的命名規範。(然而我函數名寫成 test 是因為不知道最近公共父節點的英文怎麼拼 XD)
- 省略掉函數中 return 後多餘的 else if 和 else(這裡的確是自己考慮不周)
非編程題目#
接著全部都是非編程題目了,以下分類記錄。
策略題#
一共 64 匹馬,有 8 個賽道,最少通過多少次比賽可以得到最快的 4 匹馬?(不允許計時,馬的實力固定)
個人感覺這道題卡了我至少二十分鐘,但最後也沒想出來。
開始考慮了二進制,因為之前見到過一道形似的老鼠試毒藥問題。但面試官告訴我這題和二進制無關,於是我思路陷入了混沌...
面試官見這題我一時半會解決不了,就將其暫且搁置進行後續流程了。後續流程結束後,他又返回問了問我這道題的思路和答案,但最終我也沒能解決。(面試官一直在引導我往正確的方向想,可惜我太不爭氣了呜呜呜)
網上題解:https://blog.csdn.net/u013829973/article/details/80787928
語言相關題#
- Golang 的切片實現方式?既然切片底層是定長數組,那在切片中插入元素具體是如何處理的?切片作為函數參數傳參時的考慮?
個人回答:Golang 的切片是一個由指向底層數組的指針、容量、當前長度構成的構造體。
切片插入元素時,如果底層數組的容量足夠,則直接 length+1,切片中加入新增元素。如果底層數組容量不夠,重新分配容量為原有容量二倍的底層數組,進行拷貝後令切片指向底層數組的指針指向新數組。
切片作為函數傳參時,如果僅僅是修改切片內元素,因為在構造體值拷貝時可以拿到指向底層數組的指針,所以可以使用值傳遞。
當需要在切片中插入元素(即 append)時,因為有可能會擴容進而導致底層數組指針的重新指向,所以需要傳遞原有切片的指針。
- Golang 的 map 是什麼?發生哈希衝突的處理方法?
個人回答:Golang 的 map 是哈希表。
發生哈希衝突時,Golang 會將需要存入的 value 寫入到 key 所對應的鏈表中(即使用通用的解決哈希衝突的拉鏈法)。
- Golang 的結構體對 interface 是隱式實現的,如果將結構體賦值給它實現了的 interface,通過該 interface 調用結構體內的方法,內部是怎樣實現的?
個人對這一個問題了解不多,開始只是說結構體實現接口需要實現接口內的所有方法,面試官又強調了一次 “內部實現”,即調用接口方法時,Golang 內部應該有一個機制找到實際被賦值給接口的結構體內的對應方法。
我憑感覺回答了反射(reflect),他繼續往深處問,我沒辦法,只能回答不太了解了。
個人問題#
看到你簡歷裡寫了一些 web 開發經歷,既然有 web 開發相關經驗,為什麼要投後台開發呢?(他介紹說騰訊內部也有大前端開發、全棧之類的崗位)
個人回答:我感覺自己的前端水平還很有限,只是能寫而不是會寫;因為自己其實大部分前端寫的是 Vue,對基礎的 Javascript/Typescript 等了解反而不夠深入,所以感覺自己沒有足夠能力勝任那樣的職位。
現在回想來,說不定面試官覺得我同樣沒有能力勝任後台開發?(悲
基礎知識#
- 既然你比較熟悉 web 開發,那介紹一下 http 協議吧。
回答的時候感覺有點懵,說了一下 http 請求有請求頭和請求體,介紹了常用的請求方法(Get/Post/Head)以及狀態碼。
- 看到你簡歷裡有寫大創使用了 RSA 加密,那介紹一下 https 加密的實現方法?在第一步需要 client 向 server 發送自己支持的加密算法,如果 client 不支持任何加密算法,https 的處理方式是什麼?
https 的對稱加密,非對稱加密的具體密鑰交換流程我有講出來,但 client 不支持任何加密算法出現的情況我實在是不清楚,只能坦誠說自己不知道了。(後來查了查,應該會出現加密套件不匹配錯誤?)
反向提問#
最後是我的提問環節,我主要問了兩個問題:
- 投後台開發簡歷時,招聘網站上只寫了 c/c++/java 三門語言,如果我能夠通過面試的話需要考慮轉語言嗎?
面試官答:騰訊內部有很多語言的崗位,他們是 Golang 部門,是招聘網站上文案的失誤。
- 投簡歷時我選擇的開始時間是 6.1,但後來發現有一門課程需要佔用一些額外時間,關於開始實習的時間能否再協調?
面試官答:開始實習的時間不是很重要,應該可以再協商,重要的是實習多久。
總結#
總體來講我對這次面試是比較滿意的,不是因為自己在面試中表現有多好(實際表現很差),而是說面試過程讓我學到了很多。
一方面,這是我有生以來的第一次面試,而且上來就是騰訊這樣的大廠,緊張是在所難免的。開始面試時,我甚至感覺自己學過的所有東西都忘得一乾二淨了(第一題沒有做好也有這部分的原因)。所幸我遇到的是一位和藹的面試官,看到我卡殼之後並不咄咄逼人,而是試圖引導我往正確的方向去思考,一來二去也緩解了我的緊張情緒,讓我在後續過程中有機會穩定發揮出自己的正常水平。
另一方面,通過這次面試,我也看到了自己與大廠之間的差距,趁現在還有時間可以有針對性地做準備。就我目前的感覺,騰訊的面試是更加偏向於底層的,這意味著如果我有機會參加二面的话,需要更加詳細地了解 Golang 的底層數據結構、逃逸分析、調度器、垃圾回收、並發模型等內容。
最後,面試官的態度也給我留下了深刻的印象。本來面試官家裡臨時有事需要調整一下面試時間,我說自己最近都有空,可以多延長一些時日方便他先處理,但為了不耽誤我的時間,他還是把時間約在了第二天的晚上。第二天面試結束後道別,我感謝的話還沒有說出口,面試官卻先對我說:“這次面了個多小時,辛苦你了”,讓我很是感動。
結果#
第二天查詢,發現進入到二面狀態。
第一次復試(50 分鐘)#
自我介紹#
項目#
- 大創項目的設計、架構、創新點、改進點、應用價值。
這裡有在盡力回答,但可能因為這個項目過於簡單,而我說的又太含糊了,明顯感覺面試官不滿意。
- Java 論壇系統的數據庫設計、難點、鑒權方式等。
大概說了有一個用戶表、一個帖子表和一個帖子內容表。難點確實沒啥,就沒有說到。鑒權方式使用 JWT。
- 詳細介紹一下 JWT,除了 JWT 方式外,還有什麼鑒權方式?JWT 方式鑒權和 Session-Cookie 方式鑒權方式的對比及優缺點?前後端分離就不能使用 Session-Cookie 嗎?
因為很久沒有復習,只說到了 JWT 內可以存儲部分數據(面試後查了查才想起來 JWT 的 Token 內有 Header、Payload 和 Signature)。
除 JWT 外還有 Session-Cookie 方式。對比來說,因為 JWT 在服務器端是無狀態的,因此更適用於服務器集群等分佈式場景,Session-Cookie 是傳統方式,Cookie 中存儲有 Session-id。
我當時確實認為前後端分離不能使用 Session-Cookie,因此就這樣回答了。
其它#
- 你的博客是原創的嗎?介紹一下《查找相同字符串》裡使用了幾種方式?
是,但那篇是半年前的了,有點想不起來。
- 進程、線程和協程的區別?有沒有使用過多線程編程?
前一問是八股文,正常回答就可。
後一問,答用過但使用不多。
- 為什麼會想要學 Go 語言?
個人比較喜歡了解新興的事物,接觸過 rust 和 go,因為 golang 足夠簡單,因此進行了一些學習。後來有查過一些工作崗位,發現大廠一般都有 golang 部門,這門語言的發展前景比較廣闊,因此有了專心 Golang 的想法。
- 學校的實習安排。工作地點的問題(意向北京,但他們在深圳)。
介紹了開始實習的時間,表達了工作地點無所謂的想法。
反問#
- 面試我的工作部門?
騰訊的信息流部門。
- 有沒有什麼給我的建議?
加強實踐,了解後台開發的基本原理。
結果#
兩天半後,官網變灰,提示流程已結束(掛掉了)。
一周後接到北京的電話,對方介紹說自己是北京騰訊,問我還有沒有實習意願,得到我的肯定答復後約了一下初試時間。
第二次初試(50 分鐘)#
因為曾經已經過了一次初試,所以這次沒有問基礎知識,全都是 Go 語言相關問題。
自我介紹#
口述#
- 你使用的 Go 版本?講一下 Go 的版本變化。
因為我這裡使用的是 Arch Linux,經常會滾動更新,所以使用的一直是 Go 的最新版。
版本變化只說出了兩個:Golang 1.11 版本加入了 go mod,1.16 版本加入了靜態資源的打包。
- 有了解過 Goroutine 嗎,介紹一下調度方式。
有了解過,介紹了一下 GMP 調度模型。
但面試官追問 G 阻塞 M 時 P 內的 G 會不會餓死,我答了是。(後來才想起來這時候 M 和 P 會放棄綁定,由其它的 M 執行該 P)
- Go 語言 sync 包內的類型?
答到了 sync.Map(並發安全的 map),sync.Mutex(互斥鎖),sync.RWMutex(讀寫鎖),sync.WaitGroup(統計信號量)。
- Mutex 和 RWMutex 的區別?
Mutex 是不區分場景的普通鎖,RWMutex 是允許多讀,只能單寫的鎖。
編程#
- 實現一個 m 個 task,n 個 worker 的模型。
主要考察 channel 和 routine 的用法。
- 實現一個並發安全的 map,實現 Get/Set/Add 方法。
考察 RWMutex 的用法。
反問#
- 自己的面試表現。
挺好的,可以發現我的 Go 語言比較熟練,但對更深入的一些東西了解不夠。
推薦了我一本書:《Effective Go》。
- 面試的部門職責。
和上次面試相同,也是信息流方面的。
第二次復試(24 分鐘)#
自我介紹#
語言#
- 是學校有開 Go 語言的課,還是自己自學的?為什麼要想要自學 Go?
答自學,原因同第一次復試。
- Go 與 C++ 的區別?與 Java 的呢?
Go 和 C++ 都是原生語言,首先肯定 C++ 可以實現 Go 的所有功能,但 Go 的封裝層級夠高,使用也夠簡單。
Java 作為運行在虛擬機上的語言,個人認為在性能上是比不過 Go 的,不過勝在歷史悠久,有著成熟的軟件庫與項目管理工具,而 Go 的這方面要差一點。
基礎#
- 計算機網絡七層模型,TCP/UDP、ICMP、IP、路由器、交換機的層級。
由於計算機網絡很久沒看,居然忘記了網絡層,而且最後路由器的層級也答錯了。(實在不應該)
- 有學過操作系統嗎?進程與線程的區別?32 位 Linux 機的進程 ID 範圍?
操作系統這學期正在學。進程與線程的區別是八股,后一問沒有了解過,答不會。
- SQL 查詢 18 到 25 歲的人,如何按照年齡排序?如何加快查詢速度,如果不加索引,該語句的查詢方式是怎樣的?
前一問很簡單。
後一問答了建立索引。如果不加索引,查詢方式是遍歷。
項目#
介紹一下你的項目?講一下它的設計與難點?
反問#
- 我的表現如何,有什麼建議嗎?
語言只是工具,最主要的還是基礎,應該加強對基礎知識的掌握。
- 實習時間相關問題。
最少要求三個月,具體的時間可以和 HR 聊。
結果#
面完本來以為自己要掛了,正在和朋友訴苦,查了查發現自己居然過了。(感謝面試官!)
HR 面試(23 分鐘)#
自我介紹#
其它#
- 前面面試官反饋說你 Go 語言掌握比較好,為什麼要學 Go 語言?
- 你理想的工作?
- 家庭情況,父母是做什麼工作的?有兄弟姐妹嗎?
- 績點排名,為什麼績點不理想?將來規劃(保研 / 考研 / 就業)是什麼?
- 比起其他保研和考研的同學,你的優點是什麼?
- 介紹一個你的項目,主要講一下項目的目的,功能和你的職責。
- 大創是如何組隊的,在大創中學到了什麼?
- 有無直系親屬在騰訊?實習的時間?