amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
x
telegram
steam
nintendo switch
email

腾讯2021後台開發崗暑期實習面試記錄

面試流程#

騰訊的面試分為三部分:初試、復試和 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 分鐘)#

自我介紹#

編程題目#

開場是一道編程題,找到二叉樹中兩個結點的最近公共父節點。

這道題我曾經做過,但印象不夠深刻,卡了比較久,且過程中小錯誤出現較多,痛苦面具。

面試官:

  1. 需要學習一下 Golang 的命名規範。(然而我函數名寫成 test 是因為不知道最近公共父節點的英文怎麼拼 XD)
  2. 省略掉函數中 return 後多餘的 else if 和 else(這裡的確是自己考慮不周)

非編程題目#

接著全部都是非編程題目了,以下分類記錄。

策略題#

一共 64 匹馬,有 8 個賽道,最少通過多少次比賽可以得到最快的 4 匹馬?(不允許計時,馬的實力固定)

個人感覺這道題卡了我至少二十分鐘,但最後也沒想出來。
開始考慮了二進制,因為之前見到過一道形似的老鼠試毒藥問題。但面試官告訴我這題和二進制無關,於是我思路陷入了混沌...
面試官見這題我一時半會解決不了,就將其暫且搁置進行後續流程了。後續流程結束後,他又返回問了問我這道題的思路和答案,但最終我也沒能解決。(面試官一直在引導我往正確的方向想,可惜我太不爭氣了呜呜呜)
網上題解:https://blog.csdn.net/u013829973/article/details/80787928

語言相關題#

  1. Golang 的切片實現方式?既然切片底層是定長數組,那在切片中插入元素具體是如何處理的?切片作為函數參數傳參時的考慮?

個人回答:Golang 的切片是一個由指向底層數組的指針、容量、當前長度構成的構造體。
切片插入元素時,如果底層數組的容量足夠,則直接 length+1,切片中加入新增元素。如果底層數組容量不夠,重新分配容量為原有容量二倍的底層數組,進行拷貝後令切片指向底層數組的指針指向新數組。
切片作為函數傳參時,如果僅僅是修改切片內元素,因為在構造體值拷貝時可以拿到指向底層數組的指針,所以可以使用值傳遞。
當需要在切片中插入元素(即 append)時,因為有可能會擴容進而導致底層數組指針的重新指向,所以需要傳遞原有切片的指針。

  1. Golang 的 map 是什麼?發生哈希衝突的處理方法?

個人回答:Golang 的 map 是哈希表。
發生哈希衝突時,Golang 會將需要存入的 value 寫入到 key 所對應的鏈表中(即使用通用的解決哈希衝突的拉鏈法)。

  1. Golang 的結構體對 interface 是隱式實現的,如果將結構體賦值給它實現了的 interface,通過該 interface 調用結構體內的方法,內部是怎樣實現的?

個人對這一個問題了解不多,開始只是說結構體實現接口需要實現接口內的所有方法,面試官又強調了一次 “內部實現”,即調用接口方法時,Golang 內部應該有一個機制找到實際被賦值給接口的結構體內的對應方法。
我憑感覺回答了反射(reflect),他繼續往深處問,我沒辦法,只能回答不太了解了。

個人問題#

看到你簡歷裡寫了一些 web 開發經歷,既然有 web 開發相關經驗,為什麼要投後台開發呢?(他介紹說騰訊內部也有大前端開發、全棧之類的崗位)

個人回答:我感覺自己的前端水平還很有限,只是能寫而不是會寫;因為自己其實大部分前端寫的是 Vue,對基礎的 Javascript/Typescript 等了解反而不夠深入,所以感覺自己沒有足夠能力勝任那樣的職位。
現在回想來,說不定面試官覺得我同樣沒有能力勝任後台開發?(悲

基礎知識#

  1. 既然你比較熟悉 web 開發,那介紹一下 http 協議吧。

回答的時候感覺有點懵,說了一下 http 請求有請求頭和請求體,介紹了常用的請求方法(Get/Post/Head)以及狀態碼。

  1. 看到你簡歷裡有寫大創使用了 RSA 加密,那介紹一下 https 加密的實現方法?在第一步需要 client 向 server 發送自己支持的加密算法,如果 client 不支持任何加密算法,https 的處理方式是什麼?

https 的對稱加密,非對稱加密的具體密鑰交換流程我有講出來,但 client 不支持任何加密算法出現的情況我實在是不清楚,只能坦誠說自己不知道了。(後來查了查,應該會出現加密套件不匹配錯誤?)

反向提問#

最後是我的提問環節,我主要問了兩個問題:

  1. 投後台開發簡歷時,招聘網站上只寫了 c/c++/java 三門語言,如果我能夠通過面試的話需要考慮轉語言嗎?

面試官答:騰訊內部有很多語言的崗位,他們是 Golang 部門,是招聘網站上文案的失誤。

  1. 投簡歷時我選擇的開始時間是 6.1,但後來發現有一門課程需要佔用一些額外時間,關於開始實習的時間能否再協調?

面試官答:開始實習的時間不是很重要,應該可以再協商,重要的是實習多久。

總結#

總體來講我對這次面試是比較滿意的,不是因為自己在面試中表現有多好(實際表現很差),而是說面試過程讓我學到了很多。

一方面,這是我有生以來的第一次面試,而且上來就是騰訊這樣的大廠,緊張是在所難免的。開始面試時,我甚至感覺自己學過的所有東西都忘得一乾二淨了(第一題沒有做好也有這部分的原因)。所幸我遇到的是一位和藹的面試官,看到我卡殼之後並不咄咄逼人,而是試圖引導我往正確的方向去思考,一來二去也緩解了我的緊張情緒,讓我在後續過程中有機會穩定發揮出自己的正常水平。

另一方面,通過這次面試,我也看到了自己與大廠之間的差距,趁現在還有時間可以有針對性地做準備。就我目前的感覺,騰訊的面試是更加偏向於底層的,這意味著如果我有機會參加二面的话,需要更加詳細地了解 Golang 的底層數據結構、逃逸分析、調度器、垃圾回收、並發模型等內容。

最後,面試官的態度也給我留下了深刻的印象。本來面試官家裡臨時有事需要調整一下面試時間,我說自己最近都有空,可以多延長一些時日方便他先處理,但為了不耽誤我的時間,他還是把時間約在了第二天的晚上。第二天面試結束後道別,我感謝的話還沒有說出口,面試官卻先對我說:“這次面了個多小時,辛苦你了”,讓我很是感動。

結果#

第二天查詢,發現進入到二面狀態。

第一次復試(50 分鐘)#

自我介紹#

項目#

  1. 大創項目的設計、架構、創新點、改進點、應用價值。

這裡有在盡力回答,但可能因為這個項目過於簡單,而我說的又太含糊了,明顯感覺面試官不滿意。

  1. Java 論壇系統的數據庫設計、難點、鑒權方式等。

大概說了有一個用戶表、一個帖子表和一個帖子內容表。難點確實沒啥,就沒有說到。鑒權方式使用 JWT。

  1. 詳細介紹一下 JWT,除了 JWT 方式外,還有什麼鑒權方式?JWT 方式鑒權和 Session-Cookie 方式鑒權方式的對比及優缺點?前後端分離就不能使用 Session-Cookie 嗎?

因為很久沒有復習,只說到了 JWT 內可以存儲部分數據(面試後查了查才想起來 JWT 的 Token 內有 Header、Payload 和 Signature)。
除 JWT 外還有 Session-Cookie 方式。

對比來說,因為 JWT 在服務器端是無狀態的,因此更適用於服務器集群等分佈式場景,Session-Cookie 是傳統方式,Cookie 中存儲有 Session-id。

我當時確實認為前後端分離不能使用 Session-Cookie,因此就這樣回答了。

其它#

  1. 你的博客是原創的嗎?介紹一下《查找相同字符串》裡使用了幾種方式?

是,但那篇是半年前的了,有點想不起來。

  1. 進程、線程和協程的區別?有沒有使用過多線程編程?

前一問是八股文,正常回答就可。
後一問,答用過但使用不多。

  1. 為什麼會想要學 Go 語言?

個人比較喜歡了解新興的事物,接觸過 rust 和 go,因為 golang 足夠簡單,因此進行了一些學習。後來有查過一些工作崗位,發現大廠一般都有 golang 部門,這門語言的發展前景比較廣闊,因此有了專心 Golang 的想法。

  1. 學校的實習安排。工作地點的問題(意向北京,但他們在深圳)。

介紹了開始實習的時間,表達了工作地點無所謂的想法。

反問#

  1. 面試我的工作部門?

騰訊的信息流部門。

  1. 有沒有什麼給我的建議?

加強實踐,了解後台開發的基本原理。

結果#

兩天半後,官網變灰,提示流程已結束(掛掉了)。


一周後接到北京的電話,對方介紹說自己是北京騰訊,問我還有沒有實習意願,得到我的肯定答復後約了一下初試時間。

第二次初試(50 分鐘)#

因為曾經已經過了一次初試,所以這次沒有問基礎知識,全都是 Go 語言相關問題。

自我介紹#

口述#

  1. 你使用的 Go 版本?講一下 Go 的版本變化。

因為我這裡使用的是 Arch Linux,經常會滾動更新,所以使用的一直是 Go 的最新版。

版本變化只說出了兩個:Golang 1.11 版本加入了 go mod,1.16 版本加入了靜態資源的打包。

  1. 有了解過 Goroutine 嗎,介紹一下調度方式。

有了解過,介紹了一下 GMP 調度模型。

但面試官追問 G 阻塞 M 時 P 內的 G 會不會餓死,我答了是。(後來才想起來這時候 M 和 P 會放棄綁定,由其它的 M 執行該 P)

  1. Go 語言 sync 包內的類型?

答到了 sync.Map(並發安全的 map),sync.Mutex(互斥鎖),sync.RWMutex(讀寫鎖),sync.WaitGroup(統計信號量)。

  1. Mutex 和 RWMutex 的區別?

Mutex 是不區分場景的普通鎖,RWMutex 是允許多讀,只能單寫的鎖。

編程#

  1. 實現一個 m 個 task,n 個 worker 的模型。

主要考察 channel 和 routine 的用法。

  1. 實現一個並發安全的 map,實現 Get/Set/Add 方法。

考察 RWMutex 的用法。

反問#

  1. 自己的面試表現。

挺好的,可以發現我的 Go 語言比較熟練,但對更深入的一些東西了解不夠。

推薦了我一本書:《Effective Go》。

  1. 面試的部門職責。

和上次面試相同,也是信息流方面的。

第二次復試(24 分鐘)#

自我介紹#

語言#

  1. 是學校有開 Go 語言的課,還是自己自學的?為什麼要想要自學 Go?

答自學,原因同第一次復試。

  1. Go 與 C++ 的區別?與 Java 的呢?

Go 和 C++ 都是原生語言,首先肯定 C++ 可以實現 Go 的所有功能,但 Go 的封裝層級夠高,使用也夠簡單。

Java 作為運行在虛擬機上的語言,個人認為在性能上是比不過 Go 的,不過勝在歷史悠久,有著成熟的軟件庫與項目管理工具,而 Go 的這方面要差一點。

基礎#

  1. 計算機網絡七層模型,TCP/UDP、ICMP、IP、路由器、交換機的層級。

由於計算機網絡很久沒看,居然忘記了網絡層,而且最後路由器的層級也答錯了。(實在不應該)

  1. 有學過操作系統嗎?進程與線程的區別?32 位 Linux 機的進程 ID 範圍?

操作系統這學期正在學。進程與線程的區別是八股,后一問沒有了解過,答不會。

  1. SQL 查詢 18 到 25 歲的人,如何按照年齡排序?如何加快查詢速度,如果不加索引,該語句的查詢方式是怎樣的?

前一問很簡單。

後一問答了建立索引。如果不加索引,查詢方式是遍歷。

項目#

介紹一下你的項目?講一下它的設計與難點?

反問#

  1. 我的表現如何,有什麼建議嗎?

語言只是工具,最主要的還是基礎,應該加強對基礎知識的掌握。

  1. 實習時間相關問題。

最少要求三個月,具體的時間可以和 HR 聊。

結果#

面完本來以為自己要掛了,正在和朋友訴苦,查了查發現自己居然過了。(感謝面試官!)

HR 面試(23 分鐘)#

自我介紹#

其它#

  1. 前面面試官反饋說你 Go 語言掌握比較好,為什麼要學 Go 語言?
  2. 你理想的工作?
  3. 家庭情況,父母是做什麼工作的?有兄弟姐妹嗎?
  4. 績點排名,為什麼績點不理想?將來規劃(保研 / 考研 / 就業)是什麼?
  5. 比起其他保研和考研的同學,你的優點是什麼?
  6. 介紹一個你的項目,主要講一下項目的目的,功能和你的職責。
  7. 大創是如何組隊的,在大創中學到了什麼?
  8. 有無直系親屬在騰訊?實習的時間?
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。