程序員面試什麼最重要
程序員面試一直是社區樂於討論的熱門話題。我自己從06年實習以來,先後經歷了4家軟件公司,全部是外企,其中有世界500強的通信企業,有從事期權期貨交易的歐洲中等規模的金融公司,也有為大型汽車製造商開發Android智能汽車的新興公司。跨入IT行業以來,我在求職過程中經歷過多次面試,最近兩年也有過多次面試別人的經驗。我感覺現在到了對這個問題發表自己看法的時候,這篇文章是我站在面試官角度對於程序員面試問題的一個階段性反思和經驗總結。
【目標】
相信和不少朋友一樣,有了幾年工作經驗成為Senior後就開始了面試別人的經歷。我在最初這個階段只是按照自己的想象把”找到基礎好的程序員“,”找到算法能力優秀的程序員“,”找到有Android開發經驗的程序員“等作為面試的目標。但是,實際的經歷告訴我,尤其是按“基礎好”,“算法好”這些目標招到的人最終效果並不好。比如,有的面試者基礎知識和算法掌握情況不錯,進程、線程、內存等概念清晰,基本的Hash,二叉樹,快速排序等數據結構和算法也比較熟悉,但是進公司後在實際工作中表現得很糟糕。後來,我才發現原來是我的面試目標出了問題,我原先的面試方法更像是大學的算法或操作系統期末考試,按照這種方法讓許多並不合適的人通過了面試,同時也可能錯過了許多合適的人。
後來,我的反思是,從公司的角度講,面試的根本目的是找到"能夠幹好工作"的人,而“高學歷”,“算法好”,“基礎好”,“有經驗”這些都是表象而不是根本,它們並不能直接和“工作好”劃等號。
【方法】
目標明確了,但接下來的問題是假設面試者是一個黑盒系統,“工作好”不是直接可觀測變量,你所能直接觀測的變量是基礎、算法、經驗、學歷、性格、談吐、年齡等等。所以,實際上,你只能從“基礎好”,“算法好”等可以直接觀測的量去推測“工作好”的概率,這就是一個在“X好“條件下"工作好“的條件概率問題:P(工作好 | X好)。
根據這個模型,面試所應該考察哪些方面就很明顯了,那就是選擇那種有區分性的方面來考察。比如,考察面試者的體型特徵沒有太大意義,因為P(工作好|高),P(工作好|矮),P(工作好|胖),P(工作好|瘦)的概率都差不多;所以,體型特徵不具有區分性,這不是面試所應該關注的內容。
面試官應當結合職位的要求明確哪些因素具有比較好的區分性。比如,如果要招一名技術門檻比較高的3D遊戲引擎開發工程師,面試者A具有3D遊戲引擎開發的經驗,但是在基礎知識和算法面試方面表現一般;面試者B相反,基礎知識和算法面試表現很好,但沒有遊戲開發經驗,而你只能選擇其一。你選誰呢?其實,這就是兩個條件概率問題P(工作好|經驗好,基礎一般,算法一般)和P(工作好|沒經驗,基礎好,算法好)。這個問題就留給面試官來判斷了,就我個人而言,對於技術門檻較高需要技術積累的職位,經驗更加説明問題,因此,我更傾向於面試者A。
下面,我再結合自己的經驗談談對面試中常見方面的看法。
【算法】
算法是Google和MS等大公司面試所重點考察的內容。我個人很喜歡算法,曾經參加ACM/ICPC拿過北京賽區的13名。但是,就個人經驗來看,我所接觸過的絕大多數開發職位而言,算法都不適合作為考察面試者優劣的主要因素。對於普通的非算法性開發職位,考察面試者的算法就相當於考察他打乒乓球好不好一樣,與目標“工作好”的相關性太低。就我個人的經驗來看,差不多P(工作好|算法好)=50%,也就是算法面試沒有太大的區分性。
甚至,還有一種很不好的情況特別多地出現在算法好的面試者身上,我稱之為“只磨刀,不砍柴”。什麼意思呢?有類人只對什麼A*算法,異步編程,JVM類加載機制這種純技術問題感興趣,對實現用户需求毫無興趣。這類人看起來有一定的技術能力,但是對公司來講貢獻十分有限,甚至不如技術一般但認真負責的人。所以,一旦遇到面試者算法好,我就特別留意考察會不會是這種“只磨刀,不砍柴”的人。
另外,雖然我個人不瞭解Google和MS,但我對於其特別重視考察算法能力的面試策略是持懷疑態度的。即使在這樣的大公司,算法雖然重要,但可以想象在項目實施過程所遇到的各種各樣問題中,算法問題絕大多數時候不會是主要瓶頸,沒有到那種需要每個人都是算法高手的情況。實際上,絕大多數項目真正難點並不是一兩個算法瓶頸,甚至也不是單點的技術瓶頸,而是系統性的組織、協調、設計、開發問題,有大量的看起來不是那麼有技術含量的髒活累活,也有許多問題是由於信息不足,並不是技術能力強就能克服這些困難。一個團隊優勢互補,有人算法強,有人業務分析能力強,有人擅長後端服務,有人擅長前端界面,有人聰明,有人踏實,這是的。如果按照“算法好”的單一標準選材,必定會把許多優秀的人才拒之門外。
補充:在更多地瞭解了Google和Facebook等一流公司的面試細節之後,我對這個問題的認識有了一定的改變,實際上這些公司在面試過程中並不完全強調技巧性很強的算法,而是更加註重編碼(Coding)能力,只是在進行編碼測試的過程中往往是通過一些簡單算法題來進行的。我對於這種面試方法越來越欣賞,並且也作為了我們公司面試過程中的重點環節,因為編碼能力的測試是十分必要的,它有着知識性問題無法取代的作用,如果一個面試者連“判斷一個字符串是否是另一個字符串的子串”這樣的題目都無法正確並快速地實現,那麼基本上可以直接排除了。我這裏所強調的是不必考察高難度的算法問題,並非不重視編碼能力測試,請讀者不要誤解。
【基礎】
基礎面試是指考察諸如指針使用、進程線程概念等基礎知識的面試,十分類似於大學期末考試題。我曾經以為基礎面試十分重要,但是現在不這麼看了。在工作中基礎的確是重要的,但是在面試過程中,它必須具有區分性才有意義,也就是説P(工作好|基礎好)的概率要高,那麼考察指針使用,進程線程區別這樣的基礎題目才有它的意義。我的實際經驗是,基礎面試並不具有很好的區分性,和算法一樣, 差不多P(工作好|基礎好) = 50%。同時,基礎面試是最容易準備的,中國人有長期的應試教育經驗,要準備幾個把玩指針題目太容易了。
我曾經遇到過這樣的面試者,他的C語言基礎和編譯、鏈接等原理掌握得非常好,給我留下了深刻的印象,我給的面試結論是:知識面不寬,只會C語言,但基礎很紮實,建議錄用。後來的事情證明了那個結論的前半部分是對的,但是”建議錄用“錯了。他在實際工作中表現得一塌糊塗,不理解需求,不理解整體架構;同時,上班時間不是花在項目上,而是花在閲讀諸如《程序員的自我修養》之類的書籍上。最後,這位同事由於長期“不出活”離開了公司。
基礎不是不重要,而是“基礎好”不足以説明面試者能幹好工作,因為基礎是屬於局部性知識,而實際工作需要綜合性能力,二者有天壤之別。C語言、操作系統能考高分,但是不會寫程序的人在大學我們還見得少嗎? 軟件開發就像蓋房子,綜合能力是設計和搭骨架,基礎知識是碼磚。張小龍原先Foxmail是Delphi開發的,他它不懂C#,你如果要招聘一個開發 Email客户端的人,你考察他對CLR掌握得好不好有意義嗎? 讓張小龍來開發一個C#版的Foxmail真的會有困難嗎? 你招一個精通C#但沒有Email客户端開發經驗的人來真的比張小龍靠譜嗎?
我説基礎知識不重要,和古人説的“不積窪步無以至千里”是不是矛盾呢?不矛盾!“窪步”與“千里”是一種可累加關係,但再多的“基礎知識”都累加不成“綜合能力”。學習軟件開發要像持續集成一樣,一開始就是一個完整的系統,雖然規模不大,問題很多,但它麻雀雖小五臟俱全,從小系統到大系統,從簡單系統到複雜系統逐步演化。
所以,基礎好本身不足以説明太多的問題,必須進一步考察綜合能力。對於基礎面試表現不好的面試者,如果時間允許也要進一步考察,有的面試者其實是有能力的,只是沒有進行充分的準備。最理想的狀態當然是基礎和綜合能力俱佳,若不能兼顧,應當綜合能力優先。
【經驗】
這裏所説的經驗不是通過工作了多少年來衡量的,而主要是指面試者的經歷,比如,是否完整地實現過一個軟件,或作為主要開發者完成過一個項目。經驗的重要性在於它能説明一個人的綜合能力。從項目的性質、規模和難度,面試官就可以大致判斷出面試者的綜合能力。如果一個面試者一直在大公司負責一個小模塊的開發維護,那麼基本可以判斷他不具備獨立或作為主要開發者承擔一個項目的能力,只適合在另一家大公司做類似的事情。對於門檻較高需要長期技術積累的職位,相關經驗更顯得尤為重要,比如,Linux內核開發,JVM開發,遊戲引擎開發,數據庫實現,高級UX等。對於這類職位,沒有經驗的面試者即使綜合素質不錯也是需要長時間的學習和積累才能勝任。所以,基本上如果確定了你的職位屬於此類,那麼相關經驗毫無疑問應該成為首選因素,換句話説,P(工作好 | 相關經驗好)的概率是非常高的。
通過項目經驗判斷面試者的優劣比通過基礎和算法測試更加靠譜,所以,面試過程中面試官應該花比較多的時間聽面試者介紹項目經驗,並進行深入地探討交流,瞭解面試者的知識面、思維能力、表達能力等。同時,可以結合項目提一些基礎知識和算法的問題,比如,如果面試者做過C++相關的項目,那就可以問他如何進行內存管理?是否熟悉智能指針?如果面試者的回答不能令人滿意,那麼就基本上可以判斷他的項目做得不是很好。
要注意的是,經驗也是一個多維度的事物。比如,C++股票交易中間件系統,這就涉及(C++,中間件,股票) 3個維度。假如面試者A做過C++股票交易客户端,面試者B做過C的股票交易中間件。從語言角度看,A最匹配,從項目性質看,B最匹配,你如何選擇?這就是在多個維度中,哪個維度更重要的問題,就這個例子而言,我個人更傾向於B,因為我認為中間件開發經驗是主要矛盾,而從C切換到C++並不是問題。所以,面試官需要判斷哪一種經驗是主要的,而哪一種經驗是次要的。比如,我們招聘Android應用開發,這個職位的Android技術門檻並不高,它的真正難點在於做出好的用户體驗(UX)。所以,如果一個面試者沒有Android的經驗我們是可以接受的,但是我希望他在UX方面有經驗,至少做過其他平台的移動應用開發。
-
面試中常見的十二種高級錯誤
求職面試中,沒有人能保證不犯錯誤。只是聰明的求職者會不斷地修正錯誤走向成熟。然而在面試中有些相當聰明的求職者也難免會一犯再犯的,我們權稱之為“高級”錯誤。人和獵頭顧問總結經驗,列舉出常見的十二種高級錯誤,以饗讀者。1.不善於打破沉默面試開始時,應試者不...
-
面試的多方位應對攻略
面試前:掌控時間兵書上有云:“養兵千日,用兵一時”,現在真的要上戰場了,你準備好了嗎?求職者務必在面試前,瞭解一下未來公司的具體地址和方位。提前十分鐘到達是最為理想的。在面試時遲到或是匆匆忙忙趕到都是致命的,而提前半小時以上到達,往往會影響hr其他工作的開展。...
-
問到薪水問題,有多少人會誠實地告知?
面試時,被問及“目前薪資(或上一份工作的薪水)”時,有多少人會誠實地告知?根據權威網站的調查結果,45.36%的網友表示自己還是會如實回答目前的薪水的,但也有逾4成網友表示會在目前薪資上加點水分,“説得比目前薪資稍高一些”,希望為自己爭取到更高的薪資。“如實相告”...
-
盤點面試中常犯的五個超低級錯誤
求職面試是職場新人開始職業生涯的第一步,也是必須面對的考驗。面試過程中有些人會由於怯場而結結巴巴,也有人會因為太過緊張而不知所云,也有些人一不小心就掉入了面試中的陷阱,這些不自信或不謹慎的表現,都給主考官留下了負面的印象,從而影響了自己的錄用結果。求職...