百度一面(八十分鐘)
面軟件研發(fā)工程師。
自我介紹后,面試官開始問我項目。大概流程是:從項目到數(shù)據(jù)結(jié)構(gòu),到內(nèi)存管理,再到提升程序效率的技術(shù)。期間穿插了很多知識點。數(shù)據(jù)結(jié)構(gòu)相關(guān):鏈表,紅黑樹,哈希表等。內(nèi)存管理相關(guān):STL allocator 模型,new 和 malloc 的區(qū)別,重載 operator new,placement new 等。提升效率相關(guān):緩式評估和超急評估等。
面試官問了自定義 lib 后名字沖突的問題。聊了一下名字空間和 extern C 關(guān)鍵字。
面試官問了多線程訪問文件的問題。我問他能不能理解成讀者寫者問題,他說所有線程對共享文件都是只讀的。我說父子線程會共享文件描述符中的“文件當前的訪問位置”,各個線程需要維護自己的文件標志。
面試官問了一個大文件排序問題,我說是不是可以理解為海量數(shù)據(jù)的排序,他說可以。我就簡單說了一下外排。
個人感覺以上部分是答的比較好的。
接下來,面試官問了 C 語言平臺移植需要注意的細節(jié),以及當程序出現(xiàn)“不確定性 bug”時應(yīng)該如何處理。這兩個問題答的不好。第一個問題沒有回答出來,他提示了一下 32 位和 64 位機上,尋址空間不一樣,我就順著說指針長度不同會導(dǎo)致程序出問題。第二個問題,我說能不能輸出程序日志,他說實際應(yīng)用時中間變量可能難以輸出且無法分析;我說能不能分模塊調(diào)試,他說程序是串行的各個模塊沒法分開,而且可能存在多個模塊都有 bug 的情況;我實在答不出來,他把問題換成了“你推斷一下可能會出現(xiàn)什么問題”,我說 C 中容易出現(xiàn)指針訪問越界及指針懸空的問題。
接下來是寫程序。先是一道拷貝字符串的問題:給定一個字符指針,返回一個拷貝過值的新指針。先和面試官聊思路,之后寫代碼。完后面試官看代碼,指出了兩個問題:第一,沒有判斷 malloc 函數(shù)十分執(zhí)行成功;第二,對新申請到的地址沒有做清零處理(比如,定義變量,最好寫成 int a=0; 而不是 int a;)。當時面試時沒什么感覺,事后回想起來確實不應(yīng)該犯這種錯誤,心有點虛。事實上,這種問題很有可能是致命的,所以今后一定要謹慎再謹慎。
第二題,是一道讀寫文件的題:給定一個值 N。從一個 M 行的文件(M 未知)中取出 M/N 行(只要求取出行的總數(shù)為 M/N 行即可),存入文件 test 中。將剩余行存入 train_1,train_2,...train_k 中,其中,第 train_i 個文件中的行數(shù)需為 (M/N )*i。剛看到題時有點懵,接著在紙上舉了幾個例子,研究了一下,弄明白了解決方案。把思路說了一下,開始寫代碼。期間也有遇到不少細節(jié)問題,基本上都是一邊探討一邊寫,花了不少時間。
最后閑聊了一會兒,面試官問了我就業(yè)地點選擇、職業(yè)規(guī)劃以及崗位選擇的問題。因為面試時間過長,所以省去了面試者提問這一環(huán)節(jié)。
我的感受:
1.可能是因為正好面試官也是做 C 的,所以他的大部分問題,我都能夠說出來。師兄送過我一句話,“適合自己的才是最好的”,所有事情都一樣。
2.簡歷上寫了“期望工作地點:北京”,面試官后來有和我聊這個話題。事實上,簡歷中的每一個詞語都有可能成為面試官的發(fā)問點。
3.這次面試時間確實太長了,但面試官還是很禮貌地陪我聊了很久。很謝謝他對我的尊重。其實目前我所遇到的每個面試官都挺客氣的,只需放松心態(tài)即可。