如何面试程序员
最近被“Homebrew作者因為不會在白板上翻轉二叉樹而被谷歌面試拒絕”這事各種刷屏,知乎、Quora都是熱門問題,連LeetCode都專門增加了這道題。
說到面試這種事,一般網上討論的熱點都是如何去應對面試的方法技巧,很少有文章去講如何面試別人,而在工作幾年后,去面試別人很有可能變成日常工作的一部分,而大多數時候是沒有經過什么培訓就被趕鴨子上架了,只能是自己逐步摸索。所以一直想整理總結一下如何去面試程序員。
找什么樣的人
招聘的本質,就是需要找到適合團隊的人。所以在招聘面試前,首先要想清楚,團隊需要的是什么樣的人,對候選人需要有哪些基本要求。后面的面試,就是看候選人是不是滿足這些要求。
一般招開發人員,我的基本要求是:
- 當前技能是不是滿足團隊要求
- 是不是有較強的學習能力,在未來可以繼續成長
- 是不是有很好的自我驅動力,不需要跟在屁股后面催著干活
- 團隊協作,是不是能融入團隊
篩選簡歷
在明白自己要找什么樣的人,對候選人有什么樣的要求后,就可以根據這些要求來篩選簡歷。篩選簡歷是第一步,從簡歷上可以大致對候選人有個了解,并且過濾掉明顯不合適的候選人。在篩選簡歷時,我一般會重點關注這幾點:
技術方向
雖然理論上來說,技術思想都是相通的,但是真要做開發,差別還是有一些的,比如我是招.Net開發人員,一般不會考慮Java的。但這不是絕對的,如果學習能力強,這并不是太大的問題。
項目經驗
從簡歷上描述的項目經歷,可以大概看出求職者之前的開發方向,經驗水平,比如我要招大型網站開發人員,如果簡歷上的項目經歷都是辦公OA等企業開發項目經歷,那么基本上是不適合的。另外參與過的項目和擔任的角色也能側面反映開發者水平,同時項目經歷也是面試時提問的一個重要依據。
工作經歷
工作經歷一般指的是換過幾家公司,根據每一家公司呆過的時間長短和職位,能側面反映求職者的心態,如果工作變換頻繁,每次工作時間都很短,那么說明這個人可能比較浮躁;如果面試者在公司的職位一直是在上升,那么也能側面說明一些能力。
開源項目
有參加過開源項目絕對是重要的加分項,如果簡歷上有github賬號,必然要上去查看一下ta貢獻過的項目代碼,代碼風格質量,關注的項目是什么。
薪資水平
薪資是實力的一個側面反映,不一定準,但是可以作為篩選的一個可選依據。一個簡歷寫起來很牛的候選人,工資要求四五千,這就值得懷疑了。
年齡
年齡和所謂青春飯無關,首先要招聘的目標崗位哪個年齡段更有優勢,然后要看候選人的年齡和其工作經歷是不是匹配。如果說做了十年程序員,所有的項目經歷還只是做簡單的數據庫增刪查,所謂十年經驗也不過是一年經驗重復十次。
筆試機試
對于程序員的面試,一個最基本的要求就是要有基本的編程能力,筆試機試自然是最簡單直接的方式,可以簡單直接的甄別候選人的編程水平。
筆試的話,一般只適合校園招聘這種一下子大量簡歷,又沒有條件上機測試,這種情況下只能用筆試快速篩選出來一部分,然后再安排面試或者機試。
對于實際的工作中,不太可能用紙和筆寫代碼,所以上機測試是蠻好的方式,可以盡可能的模擬實際工作中的情況,完整的觀察候選人如何去編碼、調試、優化自己的代碼。在機試時有些注意事項:
原來我在飛信Team的時候,我們剛開始面試必做的一道機試題就是做一道CSV文件解析的題目,那題滅人無數,肯定也有不少誤傷的,但是能順利做出來那道題的那撥人,編程功底都非常好,后來都是團隊的中流砥柱。
還有像Thoughworks的面試,面試前先給你發機試題,完成后郵件發過去,根據代碼質量決定要不要面試。面試的時候,很重要的一環就是面試官和候選人一起,基于完成的代碼,完成升級版的需求。通過對需求的變更,觀察候選人的設計和應變能力,同時也通過公共編碼,觀察候選人的團隊協作能力如何。
對筆試和機試的使用,需要合理的運用,因為這種方式很容易導致一部分候選人的反感和排斥。搞不好人家就會去發微博了:“我寫的Homebrew辣么多人在用,結果被你一道上機題給擋住了!”。
面試
面試環節對面試官的要求很高,需要在較短的時間內對于候選人有個相對客觀的了解,并有個明確的是否錄用的結果。關鍵就是要盡可能多了解候選人,并且判斷對方是不是團隊所需要的人。這些年來,我自己總結的一些面試方法:
1. 尊重候選人,平等對待,盡可能讓候選人能真實展現其優點和缺點
2. 盡量基于候選人做過的事情和熟悉的領域去提問,避免預設一些固定的問題去提問
3. 對于候選人做過的事情去深入了解細節,從而推斷他做事的風格和態度
4. 通過一些非技術問題去觀察候選人性格特點,看是否能融入團隊
一般來說,我主要是通過這些問題和步驟。
被面試的人一般多少是會有些緊張的,一個人在非常緊張的狀態下,是比較難正常發揮其真實水平,所以如果想要有好的面試效果,就要盡量在面試過程中營造一個相對輕松的環境,讓候選人可以真實的展現自己,從而更好的了解其真實的水平。
在開場的時候,面試官可以先做自我介紹,介紹下公司和團隊,甚至可以聊聊天氣路況等話題,讓候選人盡快消除緊張感,進入角色。
另外還有些小細節也是可以注意的,比如給候選人倒杯水,適當調整空調溫度,這些會人感覺更好一點。
雖然在簡歷上已經有寫項目經歷,但我一般還是會讓候選人自己再說一遍他做過的項目。一方面可以甄別簡歷的真假,一方面也可以通過他的介紹,了解他的陳述能力。通過他對項目描述的詳細程度甚至語速,可以大致了解他對于哪些項目是比較熟悉的。
同樣是做一個項目,不同的人做的結果肯定是不一樣的。所以對于候選人做過的重點項目,需要對一些細節進行深入挖掘。比如項目的時間周期、參與人、其扮演的角色、項目的運行情況等。比如說候選人說是項目的架構師,那么可以讓ta在白板上簡單花一下項目的架構圖,并說明一下關鍵模塊的作用。通過對幾個項目細節的了解,可以知道其在項目中真實的角色是怎樣的,其大致的水平如何。
需求變更或環境變更在項目中是常見的現象,一個優秀的程序員在設計程序的時候,往往會考慮到一些可能的變化,在需求發生或變化時能快速應對。舉例來說,如果某個候選人說自己設計開發過用戶管理系統,當前用戶量大約十萬的規模,那么我會讓他考慮下如果用戶量達到百萬甚至千萬的時候,他的設計要做哪些修改;如果對用戶資料進行擴展,需要做哪些修改。等等這些。在候選人回答這些問題的過程中,能很好的考察出其工作的態度,其技術能力和解決問題的能力。
一個人在業余時間做的事情很能反映其學習能力和自驅力。學習能力,天賦是一方面,個人的努力也是必不可少,如果一個程序員業余時間不會再考慮其技術和工作相關的事情,那么他可能只會把編程當成一個普通的工作來做,很難做到優秀。在項目相關問題問完后,我一般會問問候選人都看過哪些書,平時上哪些網站,做些什么事情。如果有很好的閱讀習慣,參加過一些開源項目,都會是很好的加分項。
一個員工離開公司,可能是公司的原因,也可能是候選人自己的問題。通過問一些“為什么離開上家公司”、“評價下以前的領導同事”、“覺得自己運氣怎么樣”等相關問題,可以看看候選人是否太過浮躁,是不是喜歡以自我為中心,是不是負能量過重。沒有人愿意和一個整天抱怨,斤斤計較的人一起共事。
在面試時,總有機會遇到一些在某個領域比自己更優秀的人,面試就是個非常好的向別人學習的機會,這時候可以巧妙的把一些日常工作學習中遇到的問題,偽裝成面試題目去提問,也許可以得到一些意想不到的答案。
在面試結束的時候,一般都會以“有沒有問題問我的”這個經典問題結尾。面試本身是對等的,一方面是招聘方了解候選人,同時也應該給候選人機會去了解公司和團隊。另外也可以通過這個問題考察候選人對崗位是不是重視。但對于候選人提出的一些敏感話題還是要合理回避,可以讓他和HR溝通。
其實面試并沒有什么固定的模式,每個人都可以根據自己的特點總結出自己面試的套路和習慣,甚至可以根據候選人的情況靈活做出調整。
如果候選人明顯不合適,也建議不要太早結束,耐心的保證一個基本的面試時間,這是對候選人的基本尊重,也體現面試官的修養和公司形象。
不建議當場給出面試結果,這可能會導致不必要的糾纏和沖突,可以后續由HR進行郵件或電話的通知。
決策
在面試結束后,需要有個明確的結果來表明是不是愿意錄用候選人。對于是否決定錄用,我一般會這么做:
1. 列出候選人的優點缺點
每個人都有優缺點,關鍵是看其優點是不是正好是我們所需要的,其缺點是不是我們所能接受的
候選人在現有團隊中處于什么樣的位置,是不是滿足團隊需要,對公司有價值
我們招人的目的是為了找到適合團隊的人,如果他不能給公司創造價值,不能勝任團隊要求,那么就沒必要招ta。
是不是愿意和候選人一起共事,能不能融入團隊
如果候選人通過面試順利入職,今后將會一起公司,所以一定要問自己的一個問題就是:“我是不是愿意和這個人一起共事”。如果答案是否定的,那么就不要再猶豫。
順便提一下,在面試時,候選人的衛生習慣也最好要考慮一下。
有時候,面試完了之后你就能很明確的知道這個人行還是不行,但是大多數時候,你會很糾結,覺得似乎有可取之處,團隊又很缺人,但又不是那么好。一般這種情況下,我的建議是:“糾結就是不通過"。只有保持一個相對較高的招聘標準才能保證團隊的整體水平。
最后
回頭說到Homebrew作者被Google拒絕這事,就我觀點來看,這事跟Google應該關系不大,還是作者自身有問題可能性比較大。在一個成熟的面試流程中不太會因為一個問題就否定掉候選人,多半還是有些其他原因在里面。
要成為一個好的面試官,關鍵還是多面試多總結,尊重每一個候選人,用心最好每一次面試。
拋磚引玉,歡迎大家一起分享。
最后祝大家都招到合適的人!
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: Sublime配置
- 下一篇: 《构建之法》读后感之项目计划