我的上一份工作是在一家世界500強(qiáng)金融集團(tuán)擔(dān)任架構(gòu)師囊拜,當(dāng)時俱恶,公司的IT團(tuán)隊規(guī)模將近2000人兔港。與其他IT公司一樣庸毫,程序員的流動性也比較高,而作為架構(gòu)師衫樊,我需要為所在的部門招聘各個層級的開發(fā)人員飒赃,當(dāng)然也包括外包。在這長達(dá)5年時間里科侈,我面試了大約400名程序員载佳。我并沒有參加過任何人力資源方面的培訓(xùn),也沒有正式研究過如何面試程序員臀栈,但是我通過對大量程序員的面試蔫慧,以及錄用后效果的觀察,得出了一套自己的面試策略权薯,去找到那些真正靠譜的程序員姑躲。
1. 簡歷看人
閱讀簡歷永遠(yuǎn)是面試的第一步睡扬。好的簡歷一定是正確、清晰并且能夠體現(xiàn)候選人最有價值一面的黍析。我首先會過濾掉那些包含錯別字卖怜,文句不通或沒有邏輯性的簡歷,因為如果一個程序員連自己的簡歷都不愿意去仔細(xì)檢查并完善的話阐枣,很難想象他寫出來的代碼質(zhì)量會如何马靠。接著,我便會重點(diǎn)閱讀簡歷中的項目經(jīng)驗部分侮繁,在這里我能夠看到面試者的開發(fā)經(jīng)驗,技能棧如孝,并且判斷他們熟悉的技術(shù)框架宪哩、工具是否與目前公司要求相匹配。
這里第晰,我還會特別關(guān)注面試者是如何來寫這部分項目經(jīng)驗的锁孟,你需要用盡可能簡練的文字來描述項目的背景,你在項目中承擔(dān)的角色茁瘦、參與項目的時長品抽,你用到的技術(shù)、以及你在項目中的亮點(diǎn)等信息甜熔。優(yōu)秀的程序員們往往有一個共同的特質(zhì)圆恤,那就是善于歸納,并能夠一針見血的發(fā)現(xiàn)問題或把一個問題說清楚腔稀。我經(jīng)撑桕迹看到面試者在簡歷中像寫故事一般地描述他們的項目經(jīng)歷,光這一個章節(jié)就有好幾頁焊虏,其實(shí)這反而會給你減分淡喜,因為這會讓面試官判斷你缺乏必要的歸納能力。
最后你的一些與編程有關(guān)的社會化活動诵闭,如:你在GitHub上的開源項目炼团,在知乎、V2EX中給他人的解答以及你的個人技術(shù)博客等等都會給你加分疏尿,因為這說明你對所從事的工作有著極大的熱情瘟芝,并愿意在業(yè)余時間去學(xué)習(xí)和提高自己,就像在我之前的 “給職場新人的10點(diǎn)職業(yè)建議” 一文中提到的褥琐,如果你要成為一個領(lǐng)域的專家模狭,那你必須花費(fèi)超過10,000小時,而這光靠工作時間是遠(yuǎn)遠(yuǎn)不夠的踩衩。
2. 給面試者10分鐘介紹自己最擅長的
當(dāng)面試者通過了筆試和HR面試之后嚼鹉,你就需要面對面地對候選人進(jìn)行面試贩汉。我遠(yuǎn)不是什么面試專家,但我有一些自己的獨(dú)特方法锚赤。我討厭問一些很個人的問題匹舞,比如你的職業(yè)規(guī)劃是什么?你為什么想換工作线脚?等等赐稽。我更愿意給面試者10分鐘時間,讓他介紹自己最擅長和最感興趣的領(lǐng)域浑侥。這往往能幫助我很快作出下面的判斷:
- 這個人對他所做的事情是否充滿激情
- 他們是否能在團(tuán)隊中很有效地進(jìn)行溝通
- 他們是否在專業(yè)領(lǐng)域足夠擅長
- 你的團(tuán)隊是否會樂于和這個人一起工作
這一招我在面試中用得很多姊舵,而實(shí)踐證明也確實(shí)非常有效。
3. 基礎(chǔ)打牢了嗎寓落?
一般括丁,有一定規(guī)模的公司都會為面試者安排機(jī)考或筆試,從而能首先篩掉一批未能通過的面試者伶选。另一些規(guī)模較小的或初創(chuàng)公司則會讓面試官直接進(jìn)行技術(shù)面試史飞。其實(shí),我覺得這兩者的差別不大仰税,有經(jīng)驗的面試官往往能夠通過幾個最簡單的技術(shù)問題构资,判斷出面試者的技術(shù)基礎(chǔ)是否牢固,這不是為了證明他有多優(yōu)秀陨簇,而是用來判斷他是否是一名合格的程序員吐绵。對于我來說,并不看重機(jī)考的成績河绽,因為機(jī)試的考題很多能夠在網(wǎng)上得到拦赠,特別對于一些外包公司,他們總是能夠通過各種途徑得到考題葵姥,從而使得他們推送的外包能夠順利通過筆試荷鼠。
下面是我經(jīng)常會問的幾個問題(JAVA):
- HashTable與HashMap有什么區(qū)別?
- Servlet是線程安全的嗎榔幸?
- JSP中 @include跟jsp:include的區(qū)別
- HTTP的response code 403和500分別代表什么
......
這些問題都很簡單允乐,但一些基礎(chǔ)不牢的程序員往往會在這個時候露餡。當(dāng)然削咆,根據(jù)面試崗位的不同牍疏,你還可以有針對性地問一些問題,例如拨齐,你需要找一個能寫核心算法的程序員(比如 銀行的總賬計算鳞陨,或者保險公司的保費(fèi)計算),那么你可以問一些算法相關(guān)的問題瞻惋。
4. 技術(shù)深度夠嗎?
具備牢固的技術(shù)基礎(chǔ)厦滤,一般就可以滿足項目中普通程序員的要求了援岩,但如果你需要找的是一個資深程序員,那么你還需要對面試者的技術(shù)深度進(jìn)行考察掏导。我們現(xiàn)在做項目時都會大量使用框架享怀,這能使我們的開發(fā)效率和質(zhì)量都得到提升和保障,但同時也降低了對于程序員開發(fā)技能的要求趟咆。因此我一般會詢問面試者下面的問題添瓷,來考察他對所使用框架的掌握程度。
請你描述一下值纱,在這個項目中鳞贷,從一個HTTP請求發(fā)起,到最終的Response返回虐唠,它在你的系統(tǒng)和框架內(nèi)部是如何流轉(zhuǎn)的搀愧?
這個問題往往能夠判斷出面試者對于相關(guān)技術(shù)掌握的深度。較初級的開發(fā)人員描述的層級往往比較淺凿滤,比如使用Spring MVC框架的妈橄,只能說到實(shí)現(xiàn)一個Controller繼承BaseCommandController(甚至很多開發(fā)人員只知道繼承了一個公司內(nèi)部框架的基類)庶近,至于再往下Spring框架是如何進(jìn)行內(nèi)部流轉(zhuǎn)的翁脆,就再也說不清楚了。而更資深的開發(fā)人員鼻种,往往能說出框架內(nèi)部的實(shí)現(xiàn)機(jī)制反番,以及如何調(diào)用和處理的。在面試者描述的過程中叉钥,你還可以穿插詢問一些比較有深度的問題罢缸,比如框架中某個類這樣設(shè)計是哪一種設(shè)計模式的體現(xiàn),采用這樣的設(shè)計有什么好處等等投队。這比讓面試者默寫一個設(shè)計模式代碼要有效枫疆、自然得多。
除了技術(shù)層面上的考察之外敷鸦,對于資深開發(fā)人員息楔,還需要考察他們的設(shè)計能力。說到軟件設(shè)計扒披,大部分面試者都能熟練地背出面向?qū)ο蟮娜齻€基本特性:繼承值依、封裝、多態(tài)碟案,也能把它們的概念描述清楚愿险。但我一般會問下面的這個問題來考察他們的面向?qū)ο笤O(shè)計能力。
請用一段程序代碼描述我們所在的這間房間价说。
我驚訝地發(fā)現(xiàn)至少有一半的面試者都很難準(zhǔn)確使用Interface和Class來給房間建模辆亏,也有一些人會將最基本的代碼語法或關(guān)鍵字寫錯风秤。
5. 選擇適合所在企業(yè)文化的人
這一點(diǎn)也曾是我經(jīng)歷的一個誤區(qū),我總是希望能為團(tuán)隊招到技術(shù)能力最強(qiáng)的人褒链,而忽略了他是否與整個公司和團(tuán)隊的文化相匹配唁情。這往往會造成,雖然招到了人甫匹,但沒過多久就因為理念不同不歡而散的結(jié)果甸鸟,反而給公司帶來了損失。讓我們看看GitHub的負(fù)責(zé)人是怎么說的兵迅。
我們很嚴(yán)肅地看待我們自己關(guān)于招聘流程的哲學(xué)抢韭。我們希望每一個GitHub員工都了解他們所要面對的環(huán)境,并保證他們是能夠很好適應(yīng)的恍箭。這包括我們所創(chuàng)造的文化刻恭、哲學(xué)、計劃扯夭、錯誤甚至是晚餐鳍贾。比起他們的技能是否滿足要求,我們更看重他們的潛力以及是否能夠適應(yīng)我們的企業(yè)文化交洗。
我曾在具有鮮明文化差異的不同公司或團(tuán)隊工作骑科,看到許多崇尚開放、開源的程序員在一個相對封閉构拳,具有很多流程以及規(guī)范限制的公司中很難發(fā)揮咆爽,最終選擇離開。因此在招聘程序員時置森,選擇合適的往往比選擇最優(yōu)秀的更重要斗埂。
6. 行為面試法
行為面試法可能是我在整個面試過程中唯一用到的教科書面試方法。一個程序員是否能夠很好地工作凫海,不僅取決于他能否順利地完成開發(fā)任務(wù)呛凶,更重要的是在遇到一些特殊場景或問題時,他能否合理有效地處理和解決行贪。行為面試法能夠幫助我們從面試者描述的過去某一具體事件中漾稀,預(yù)測未來他在工作中可能的表現(xiàn)。下面便是一個我經(jīng)常用到的問題瓮顽。
請談?wù)勀阍谶@個項目中遇到的最大困難或挑戰(zhàn)是什么县好,你是如何解決的。
從面試者對上面這個問題的回答中暖混,我能夠很好地判斷他是否有較強(qiáng)的獨(dú)立解決問題的能力缕贡,而我認(rèn)為這是除技術(shù)能力之外,程序員最應(yīng)具備的能力。
7. 給他們一個虛擬任務(wù)
經(jīng)過上面的這些環(huán)節(jié)晾咪,你可能對面試者的整體情況已經(jīng)比較滿意收擦,但先別急著下結(jié)論。我曾見過能夠順利通過上面所有面試步驟谍倦,并且被雇傭的程序員塞赂,當(dāng)他們進(jìn)入實(shí)際工作后卻沒能把事情做好。
在你確定是否錄用他們之前昼蛀,可以給他們一個虛擬任務(wù)宴猾。我不是說一個抽象的程序問題,而是指一個真實(shí)的叼旋,可能就存在于你當(dāng)前項目中仇哆,并且需要在一兩個小時之內(nèi)完成的一個開發(fā)任務(wù)。我曾經(jīng)出過這樣的考題:
寫一個小程序?qū)⒁粋€以特定格式(如CSV)存儲的文本文件轉(zhuǎn)換為XML格式夫植,并存儲為另一個文件讹剔。
你可以給他一臺已經(jīng)配置好開發(fā)環(huán)境以及IDE的電腦,讓他當(dāng)場編寫代碼详民。當(dāng)然如果時間有限延欠,你也可以直接詢問面試者的實(shí)現(xiàn)思路,并簡單用偽代碼來描述處理過程沈跨。通過這個測試由捎,你能夠看到很多細(xì)節(jié),比如面試者是否有良好的編碼習(xí)慣谒出,異常處理是否規(guī)范隅俘,代碼邏輯是否縝密高效邻奠,以及他的開發(fā)效率是否足夠高笤喳。如果面試者給出了非常優(yōu)秀的解答,那么你就應(yīng)該能夠判斷他確實(shí)是一個優(yōu)秀的候選人了碌宴,因為我從沒碰到過能夠通過上面的測試杀狡,卻在實(shí)際工作中無法做好的人。
8. 以上絕不能保證你招到合適的程序員
你可以在面試程序員時參考上面的這些步驟贰镣,對于我來說大多數(shù)情況下它們都是有效的呜象,但偶爾也會出錯。你需要結(jié)合你所在公司和團(tuán)隊的實(shí)際情況碑隆,提煉你覺得有用的面試步驟恭陡,并忽略其他的,最終形成屬于你自己的面試策略上煤。另外休玩,你還需要根據(jù)面試時的實(shí)際情況,隨機(jī)應(yīng)變,因為人是最復(fù)雜的動物拴疤,而面試過程卻是需要雙方互動的永部。
想象一下,在你退休之前的未來幾十年時間里呐矾,你都需要每周40小時地工作苔埋,因此無論是公司還是應(yīng)聘者都應(yīng)該互相尊重,建立充分的信任蜒犯,并充分判斷是否適合對方后组橄,再確定是否雇用某人或接受一個公司的職位。你的目標(biāo)不應(yīng)該是簡單的獲得一份工作或者雇傭某個人罚随,而應(yīng)該以獲得更多的工作樂趣和建立更良好的工作關(guān)系為目的去看待招聘這件事晨炕,切忌不要急于求成,就像談戀愛一樣毫炉,當(dāng)雙方都有感覺時瓮栗,一切就水到渠成了。
又到了一年中的招聘熱季了瞄勾,希望每一位年輕的程序員朋友都能找到一份讓自己快樂的工作 -
稀土掘金聯(lián)合編輯:技匠费奸,以上內(nèi)容歡迎大家分享到朋友圈/微博等,如需轉(zhuǎn)載請通過我的微信公眾號聯(lián)系进陡。謝謝大家愿阐!