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