1. 程式人生 > >騰訊後端面試經驗

騰訊後端面試經驗

終於等來騰訊的面試。

4.3號 機試

機試包括選擇(30多)、簡答(2題)、程式設計(2)。選擇和簡答程式設計分別一小時,選擇題考的比較廣,概率、Linux 、作業系統、網路等各個方面,
自我感覺比牛客網題有深度和難度,不是那種一看就知道結果的問題,而且都是多選題(這點比較坑),
從面試的整體過來來看,無論筆試還是面試騰訊都注重廣度和深度,也就是技術實力。

4.12

接到13號面試的通知,地點安排在某星級酒店,逼格甚高,承包一個宴會廳,面試官在不同的樓層房間裡,標間。
騰訊面試官給我的感覺是不像碼農的技術碼農,穿著時尚,非標準工科男形象,由於我是第一個面試,可能時間比較久,持續一個小時時間。
進門以後,面試官把簡歷整體掃描一遍,接著開始面試,首先從c++語言特性問題,
一問你對c++的語言特性有怎樣的認識,balaba一堆,
二問多型特性有什麼用?有沒有用過多型特性,
三問多型怎麼實現的?
四問虛擬函式是怎麼實現的?
五問虛擬函式指標有幾個?
六問虛擬函式表存在哪裡?
七問有沒有遇到過使用虛擬函式程式宕掉的情況?為什麼宕機?
八問memset初始化類物件會出現什麼情況?
九問如何除錯程式?有沒有使用過core檔案除錯程式?
十問什麼情況下引起程式宕機?
十一問對於大型程式,正在執行,且不可停止檢錯,有個邏輯錯誤,執行幾萬次才會復現一次,怎麼找出這個邏輯錯誤?
十二問設計模式幾個原則是什麼意思?
十三問網路通訊TCP UDP 如何選擇?
十四問TCP出現粘包怎麼處理?自己使用中有沒有出現過粘包的現象?
十五問多執行緒程式設計如何進行分執行緒?
十六問網路程式設計模型區別
十七問如何學習的?看過哪些書?通過什麼途徑學習?
十八問平時逛什麼論壇?
十九問現場手寫程式碼
二十問邏輯推理題。
整體面試下來,感覺面試官技術很深入(面試官很年輕),有些東西會的不一定能說上來,不會的更是不可能說上來,知識的深度和廣度同樣重要。
在這裡強調一點是,當時面試設計模式問到里氏替換原則,我的答案回答正確,但是面試官突然一句是不是說反了?在當時的環境本能反應肯定會認同他說的是對的,面試官一笑而過,
但是後來出來以後,證明我是對的,我意識到當時是不是故意的提出疑問,考驗我的紮實程度。
還是一個自己挖的坑,最終把自己埋了的事情是,為了”強調”自己的自學能力,作死提出自己不是科班出身,然後就被面試官抓住把柄,一臉嫌棄的說才學兩年程式設計?

4.14 複試

初試整個一個小時下來,感覺基礎知識自己回答的還算不錯,但涉及到linux系統大型程式除錯經驗時還是有所欠缺,特別最後一作,感覺應該與複試無關,但13號晚接到複試通知,
至此,已經心滿意足,感覺已經賺到,複試還是原來的酒店,只是人數明顯少了,換了一個很小的宴會廳。因為許多同學初試都會被問到專案,而我初試沒有問到專案,多次往專案上扯,
都被面試官無情的扯回來,所以在前一天很充分準備了專案經驗,然而,,,事實是:
來到面試官房間,也是一個看起來很年輕的面試官,但能感覺到技術氣息很濃厚,坐下來以後,遞交簡歷(其實初面面試官的材料他手裡都有,包括我的簡歷),一上來又是基礎,
(此處是重點)多型是什麼?虛擬函式表存在哪裡?(是不是很熟悉?對,初試時候沒有完全答對的問題,又被問了一遍,其實我有點心虛,回去以後我並沒有針對這個問題做總結,所以長點心吧)
上次答案是錯的,那麼這次簡單分析一下換一個答案,證明是對的,接下來又問,記憶體中有幾份虛擬函式表?怎麼分佈的?懵逼狀態勉強回覆,二問,客戶端往伺服器端連續傳送10個包,每個包100位元組,
伺服器端讀取一次,問讀到多少位元組?為什麼?這個問題同樣是對初試十四問的實際例子。接下來就是噩耗,三問邏輯題,(智商跟不上啊),紙牌類遊戲(後來從下一環節的面試知道,面試我的面試官是做遊戲開發的,也就是說我應該是被分到騰訊遊戲了)
A,B兩個玩家
A、B的牌面都是 3 4 5 66 77 88
規則是 鬥地主規則一樣,但是 對子不能拆開單出,A先出,問什麼策略可以保證A穩贏?給出策略。
博弈論?馬爾科夫鏈?心中一萬種猜想,面試官倒是很耐心的,說這是邏輯題,提示A的行為都會導致B產生相應的行為?而B的行為又直接導致A的輸贏?結果是退到二十分鐘也沒有推倒出來,現在想想應該是馬爾科夫鏈問題,但是至今不知道答案是什麼?
說實話此時有點緊張,面試官安慰說,沒關係的,很少人能推倒出答案。四問,原始碼!!!原始碼!!!接下來面試官遞給我膝上型電腦,展示一段程式碼,沒用過的電腦,沒用過的IDE,簡單教我幾個操作,
然後說,這裡是一個完整的工程(這句話有兩個含義: 一,這個工程檔案是完整的,可以編譯執行的,二是 程式碼量真的是超級大),這裡是主函式,你來閱讀原始碼,並儘可能的告訴有更多的資訊.
接下來就是一段沉寂,面試官就坐在旁邊看著你,而你在看著原始碼,時不時內心還要注意面試官的舉動,加上上一個問題沒有回答上來,可想當時的壓力有多大,看了二十分鐘後,
簡單彙報自己的結果,實現的功能應該是遊戲換場景的功能,其中是各種綜合,單例模式、命令模式、觀察者模式,類模板,繼承、多型、函式指標 巢狀使用。接下來繼續問,指了一個語句,(函式指標呼叫函式),問這個函式最終執行到哪裡?
上一個問題的回答面試官並沒有給出明確的對錯,心裡很是沒有底,然後這個問題已經忘我狀態(腦袋完全沒有一點邏輯可言),然後就按部就班的一步步向下走,最終死衚衕是進入到類模板中,此類模板又繼承自一個類,
然後進行不下去,面試官倒是很好,在這過程中一直很耐心的給提示給指導,給出提示找到這個類模板的一個實現就找到結果了,再一次提示所有的原始碼都在這個工程裡(這個提示很重要,然而我並沒有意識到),就這樣持續了很久,無疾而終,
面試大概持續一個小時20分鐘,面試結束,自己的面試表現能知道肯定沒戲,就讓面試官給個評價,很中肯,基礎不錯很紮實,但是閱讀程式碼能力很欠缺,尤其複雜的程式碼沒有一個完整的思路,需要加強。最後謝謝面試官的指導,離開。
出來以後才發現問題的關鍵所在,面試官一再提醒這是個完整的工程,也就是說可以編譯執行除錯的,其實當時最簡單的方式是設定斷點,單步執行,是肯定可以找到程式執行到哪裡的,這也算是一個教訓。
總結:
1.面試的失利終歸是自身實力不夠,平時閱讀程式碼量太少,其實面試官已經做了很大的指導。
2.心理素質太差,遇到一個不會的問題容易慌張,終究是太看重這個面試,面試其他XX公司時,完全抱著學習的態度去,反而表現的很好,所以心態要端正。
3.針對面試崗位準備相應的技能,一面面試官給的建議,報後臺就一定要會多執行緒、linux、網路程式設計。
4.基礎一定要紮實、深入,知其然知其所以然。
5.非典型網際網路公司注重你的是業務能力,也就是看重你整個系統實現的思路,並不看重你對某一技術特別的深入,只要你會用,而且基本原理知道;網際網路公司看重你的技術深度,因為在大系統中每個人都是一顆螺絲釘,幹著自己的精通的工作。
至此,止步。有失落,但沒有難過。縱是煙霧繚繞,我必奮然前行。