面試官喜歡什么樣的人,來(lái)自一個(gè)面試官的話
一個(gè)招人的部門或個(gè)人,如何從眾多的候選人中挑到真正比較優(yōu)秀的程序員?
面試是個(gè)技術(shù)活,其本質(zhì)上是一次溝通的過程。候選人要在限定的時(shí)間和條件內(nèi)向面試官展現(xiàn)自己的才能,而面試官同樣也要在有限的時(shí)間和條件內(nèi)發(fā)現(xiàn)候選人是否適合該職位。對(duì)于候選人的觀察,很多人存在誤區(qū),那就是:技術(shù)主導(dǎo),只要技術(shù)牛,那就是我要找的人。其實(shí)我認(rèn)為這樣是非常不靠譜的,為什么?因?yàn)槲艺J(rèn)為,無(wú)論什么行業(yè),作為一個(gè)部門負(fù)責(zé)人或者團(tuán)隊(duì)負(fù)責(zé)人,在選擇候選人的時(shí)候,應(yīng)該把德行放在第一位,其次才是技術(shù)水平,第三是身體狀況和其他因素。下面我就這三點(diǎn)展開來(lái)談一談。
-
==第一:德行==
對(duì)于一個(gè)程序員候選人來(lái)說(shuō)的話,如何評(píng)判一個(gè)候選人的德行呢?我覺得有以下幾點(diǎn):
==眼神==
注意觀察候選人眼神是否飄忽不定,是否總是不敢直視你的眼睛,或者回答問題的時(shí)候總是往左右兩邊瞟。一般來(lái)說(shuō),眼神是一個(gè)人性格的直觀表現(xiàn)之一,如果眼神不夠沉穩(wěn)堅(jiān)定,說(shuō)明此人不踏實(shí),心境飄忽,很有可能不誠(chéng)信(比如愛撒謊,不誠(chéng)實(shí),不講信用等等)。
==身體語(yǔ)言==
如果一個(gè)候選人在跟你聊的過程中,整個(gè)人吊兒郎當(dāng),身體左搖右晃,一會(huì)二郎腿,一會(huì)把腳放到大腿上(別懷疑,我真遇到過),那么說(shuō)明此人一定不沉穩(wěn),性格輕佻浮躁,最好謹(jǐn)慎考慮。相反,如果候選人坐姿規(guī)矩,談話間體態(tài)得體,自然,不緊張,不做作,那么該候選人應(yīng)該比較有家教,個(gè)人習(xí)慣很好,性格比較穩(wěn)定。
==溝通==
在跟候選人對(duì)話時(shí),注意對(duì)方的語(yǔ)氣語(yǔ)調(diào)。如果候選人語(yǔ)速平緩,吐字鏗鏘,說(shuō)明此人準(zhǔn)備比較充分,不急躁。當(dāng)遇到一些一時(shí)回答不上的問題時(shí),能夠保持冷靜,集中精神思考,如果實(shí)在不會(huì),沒有打算糊弄過關(guān)或者顧左右而言他,而是直接答復(fù)不知道,那么就說(shuō)明該面試人性格比較沉穩(wěn),而且比較誠(chéng)實(shí),不滑頭。甚至你可以故意說(shuō)錯(cuò)一些細(xì)節(jié),看看對(duì)方以何種方法給予糾正或者不糾正。你也可以直接故意用錯(cuò)誤去質(zhì)疑對(duì)方正確的表述,看看對(duì)方的反映,如果對(duì)方一下就被點(diǎn)燃了一樣蹦起來(lái),或者總打斷你說(shuō)話,說(shuō)明對(duì)方性格比較急躁,這是程序員的大忌。當(dāng)然此招能少用盡量少用,而且一次足矣,如果老這樣,會(huì)讓候選人覺得面試官不行,而心生鄙視。
==細(xì)節(jié)==
例如微笑,電話靜音或掛掉電話等,素質(zhì)體現(xiàn)。
-
==第二:技術(shù)==
技術(shù)排第二不是說(shuō)技術(shù)不重要,作為一個(gè)程序員崗位,技術(shù)當(dāng)然是非常重要的。很多企業(yè)喜歡讓程序員做卷子作為首面的內(nèi)容。我認(rèn)為這是不妥當(dāng)?shù)?,是面試官在偷懶的表現(xiàn)。不是說(shuō)做卷子不能反映問題,只是這種方式太死板,并不能真正過濾掉不合格的面試者。比如,我其實(shí)沒有什么技術(shù)能力,但是我面試前背了很多書,那么做卷子這一關(guān)我有可能可以過,到真正面試的時(shí)候才會(huì)被拒。所以,做卷子只能過濾那些真正沒有技術(shù),而且沒有背書的面試者。但是,即便是直接面試,面試官真的碰到這樣的面試者,又花的了幾分鐘就可以判斷出來(lái)再拒絕呢?所以,我建議,不要做卷子,直接面試,并且分成以下幾個(gè)內(nèi)容來(lái)考察面試者。
==過往經(jīng)驗(yàn)==
可以讓候選人介紹最近一個(gè)項(xiàng)目,并且描述自己的工作內(nèi)容。首先看看候選人是否能夠說(shuō)得清楚這個(gè)項(xiàng)目,比如有哪些模塊,每個(gè)模塊有哪些功能,實(shí)現(xiàn)了一個(gè)什么業(yè)務(wù)邏輯,自己負(fù)責(zé)的這一塊的詳細(xì)業(yè)務(wù)邏輯又是怎樣的,等等,如果連這些都說(shuō)不清楚,那么基本上可以判斷候選人在撒謊。了解了項(xiàng)目之后,可以通過候選人負(fù)責(zé)的內(nèi)容進(jìn)行深入技術(shù)提問,候選人說(shuō)使用了多線程,那么就多線程相關(guān)的知識(shí)進(jìn)行提問,但是注意要由淺入深,不要一上來(lái)就問一些很難很深的問題。一般來(lái)說(shuō)如果候選人沒有撒謊,那么應(yīng)該來(lái)說(shuō)還是可以回答一些不太難的問題的。
==基礎(chǔ)知識(shí)==
一定要考察候選人的基礎(chǔ)知識(shí)。很多候選人在說(shuō)起自己做過的項(xiàng)目的時(shí)候眉飛色舞,一套一套的,甚至滿嘴都掛著一些熱門的詞匯,比如大數(shù)據(jù),高并發(fā),云計(jì)算,等等。但是一問基礎(chǔ)知識(shí)就傻眼,最簡(jiǎn)單的值類型引用類型都不知道有什么本質(zhì)區(qū)別。很多候選人都會(huì)辯稱,自己會(huì)編程,能夠?qū)崿F(xiàn)業(yè)務(wù)邏輯,為什么還要去背那些概念性的東西,殊不知,那些他們認(rèn)為沒有的概念性的東西,正是我們構(gòu)筑大廈的根基所在。舉個(gè)例子,我造一所房子,地基打了10米,你造一所同樣的房子,沒有地基。我們都造好以后,在風(fēng)和日麗的時(shí)候,看上去一模一樣,你會(huì)笑話我,"看,我們一樣,但是我比你不知道省了多少工序",但是你要知道,并不是每天都會(huì)風(fēng)和日麗,總會(huì)遇到狂風(fēng)暴雨,等到考驗(yàn)真正來(lái)臨的時(shí)候,誰(shuí)的房子更不容易傾塌呢?
==分類考察==
在面試候選人的時(shí)候,最好是分類進(jìn)行考察,每個(gè)類別準(zhǔn)備5個(gè)問題左右,并且由淺入深。頂尖的互聯(lián)網(wǎng)公司就那么幾個(gè),一般的公司招聘沒必要搞那么高大上,兩個(gè)字,務(wù)實(shí)!。
-
==第三:身體狀況及其他原因==
為什么把身體狀況單獨(dú)拎出來(lái)說(shuō)呢?因?yàn)檎l(shuí)都不想剛招進(jìn)來(lái)的人三天兩頭的請(qǐng)假看病,面試官在招聘時(shí),一定要注意候選人身體狀態(tài),如果有明顯的身體狀態(tài)問題或者不正常,千萬(wàn)要慎重考慮。另外,需要考慮的還有下面的因素:
==候選人是否準(zhǔn)備創(chuàng)業(yè)==
有些候選人因?yàn)槭状蝿?chuàng)業(yè)失敗,需要找個(gè)地方打工解決一下生活問題,一旦緩過勁來(lái),就會(huì)離職重新創(chuàng)業(yè),太不穩(wěn)定。
==之前換工作太頻繁==
一般我認(rèn)為,正常情況下,IT行業(yè)換工作頻率在2年一次以上是比較正常的,當(dāng)然后寫不正常情況另當(dāng)別論,例如公司倒閉老板跑路,例如被收購(gòu)后辭退,等等。但是,如果正常情況下,連續(xù)3分以上工作的更換頻率在1年以下,那么這種候選人需要謹(jǐn)慎對(duì)待。
==其他==
比如提一些無(wú)理要求的,期望薪水過高的,完全不尊重人的,等等,這些候選人都要謹(jǐn)慎考慮。
面試的時(shí)候要做什么準(zhǔn)備,來(lái)自一個(gè)國(guó)外大牛的話
在直接切入問題之前,我們先討論下一些基本的要領(lǐng)來(lái)確保你的技術(shù)面試盡可能順利進(jìn)行。
為每個(gè)可能出現(xiàn)的問題準(zhǔn)備好答案是不可能的。所以需要更加關(guān)注基礎(chǔ)方面的內(nèi)容。確保你對(duì)Objective-C的特性都非常熟悉??梢圆碌牡綍?huì)有一些關(guān)于通知(messaging),協(xié)議(protocols),動(dòng)態(tài)類型(dynamic types),轉(zhuǎn)發(fā)(forwarding),分類(categories),posing, method swizzling等方面的問題。面試者想考察你對(duì)現(xiàn)有的或者是之前出現(xiàn)的問題了解有多少?;◣讉€(gè)小時(shí)去 StackOverflow 或國(guó)內(nèi)網(wǎng)站上看下最近經(jīng)常提問到有關(guān)iOS方面的問題會(huì)對(duì)你有很大幫助。
讀一遍Apple’s Objective-C guides,確保你沒有任何覺得比較薄弱的主題。像google式問法的那種問題,比如說(shuō)一個(gè)小車需要多少個(gè)高爾夫球才能填滿(250,000),或是在舊金山有多少扇窗戶(大于10億),現(xiàn)在大部分公司都停止問了。當(dāng)你要面對(duì)這些類型的問題的時(shí)候,你的思路比你的答案要更重要,關(guān)于這個(gè)問題你是如何思考的 - 這才是面試官關(guān)心的問題。
==準(zhǔn)備好在白板上編碼==
如果你是面對(duì)面的面試,他們可能希望你在白板上直接編程。確保在你面試之前做了一些練習(xí),因?yàn)樵谝蝗喝嗣媲爸苯泳帉懘a會(huì)非常有壓力,沒有代碼自動(dòng)補(bǔ)全功能的編碼難度遠(yuǎn)遠(yuǎn)大于你的想象。
為你在簡(jiǎn)歷上寫的熟悉的編程語(yǔ)言做好在白板上寫代碼的準(zhǔn)備。我的一個(gè)朋友在面試中被要求在白板上用Erlang來(lái)編程,Erlang是他在簡(jiǎn)歷中列出來(lái)的編程語(yǔ)言。他得到了那份工作。地球上知道Erlang的僅有三個(gè)人,我確定他是其中的一個(gè)。
==面試禮節(jié)==
如果是進(jìn)行面對(duì)面面試,先詢問下公司的著裝要求。如果面試官穿短褲T恤,而你穿著西裝,這樣就會(huì)比較尷尬,而且面試官也可能會(huì)很不愉快。如果你穿球衣而其他人穿西裝的話也會(huì)是同樣的結(jié)果。關(guān)于這點(diǎn),可以事先詢問招聘經(jīng)理,他會(huì)很樂意給你一些相關(guān)建議。
確保手機(jī)調(diào)成靜音。如果你知道我在面試的時(shí)候聽到過多少次電話響起的聲音,你一定會(huì)驚訝的。大多數(shù)情況下你都不應(yīng)該在面試中接電話或者查看下你的手機(jī)。如果有一些潛在的緊急情況,例如你的妻子馬上要分娩或者是你的丈夫正在做手術(shù),請(qǐng)?zhí)崆案嬖V你的招聘經(jīng)理,這樣的話你接電話的行為還可以被接受。
在面試過程中,無(wú)論是身體還是精神都需要放輕松。盡量把面試時(shí)間定到一段你相對(duì)空閑的時(shí)間(之后你不會(huì)有其他的事情需要做)。如果你把面試定到你目前工作的午休時(shí)間,那肯定不會(huì)達(dá)到最好的效果。有時(shí)我甚至需要縮短面試時(shí)間就只因?yàn)槊嬖囌叩默F(xiàn)任老板需要他去工作! 請(qǐng)避免增加你目前已有的壓力。
進(jìn)行面對(duì)面的面試,請(qǐng)?jiān)绲?5分鐘左右,但不要太早。對(duì)于電話面試,如果是在線會(huì)議的話,確保提前兩分鐘撥號(hào)進(jìn)入。直接打電話來(lái)的,確保能按時(shí)準(zhǔn)備好。
==準(zhǔn)備好問題==
在面試的結(jié)尾,面試官通常會(huì)問你關(guān)于公司和工作,你還有哪些問題。請(qǐng)事先準(zhǔn)備好你的問題,把你想要問的問題寫到紙上。這會(huì)表明你對(duì)這份工作真的感興趣而不是僅僅走走過場(chǎng)。很多面試者在這個(gè)環(huán)節(jié)中都不會(huì)問任何內(nèi)容,這讓我感到很驚訝。如果你覺得這個(gè)工作適合你的話,這是一個(gè)了解公司的很好的機(jī)會(huì)。
==面試題目==
你期待已久的內(nèi)容到了 - 題目!
我們的技術(shù)性面試通常持續(xù)1個(gè)小時(shí)。有一張包含75個(gè)問題的表單,剛開始我會(huì)從里面隨機(jī)抽取題目。之后我根據(jù)對(duì)候選人知識(shí)方面的了解,有選擇的縮小問題的范圍。例如,如果我懷疑候選人哪塊兒有薄弱的知識(shí)點(diǎn),我會(huì)繼續(xù)深入的問那塊兒內(nèi)容。
當(dāng)回答這些問題的時(shí)候,盡量使你的答案簡(jiǎn)明扼要,如果必要的話解釋下你的思路。面試官不是因?yàn)椴恢来鸢付鴣?lái)問你這些問題的,他們要知道的是你對(duì)你所說(shuō)的內(nèi)容了解程度有多少。
如果你還不是很了解這些內(nèi)容的話, 記住學(xué)習(xí)的過程是極富有樂趣的一個(gè)過程!
直接進(jìn)入正題,這些是技術(shù)性面試的一些樣例題目。
請(qǐng)解釋下method swizzling,并說(shuō)出你一般什么時(shí)候會(huì)用到它?- 我喜歡問這個(gè)問題因?yàn)檫@屬于較為深層次的語(yǔ)法。大多數(shù)人都沒有使用swizzling的需求(言外之意會(huì)用到swizzling的一般開發(fā)過一些核心的內(nèi)容了)。而且通過開發(fā)者關(guān)于這個(gè)問題的回答,我還可以了解他們對(duì)復(fù)雜代碼的執(zhí)行有多大程度上的約束。一個(gè)人如果說(shuō)他 swizzle所有的代碼,那比那些說(shuō)從來(lái)沒用過swizzle的人更可怕。
假設(shè)有三個(gè)對(duì)象,一個(gè)父類的父類,一個(gè)父類和一個(gè)子類。父類的父類持有父類的引用(retain),父類持有子類的引用(retain),子類持有父類的引用(retain)。父類的父類釋放(release)父類,解釋下會(huì)發(fā)生什么。 -——即使有ARC,我依然喜歡問一些內(nèi)存相關(guān)的問題,這顯示了這個(gè)人有一定時(shí)間的開發(fā)經(jīng)驗(yàn),而且明白核心的框架是如何運(yùn)作的。
當(dāng)一個(gè)空指針(nil pointer)調(diào)用了一個(gè)方法會(huì)發(fā)生什么?——了解處理基礎(chǔ)的Objective-C相關(guān)問題是很重要的,有好多次我都聽到了錯(cuò)誤的回答,這很令我震驚。
為什么retainCount絕對(duì)不能用在發(fā)布的代碼中?請(qǐng)給出兩個(gè)相對(duì)獨(dú)立的解釋?!?考察這個(gè)問題會(huì)有兩個(gè)好處:一是可以確定面試者目前確實(shí)沒有使用retainCount,并且看看他們是否知道為什么他們不應(yīng)該使用。
請(qǐng)說(shuō)明一下你查找或者解決內(nèi)存泄露的處理過程。這個(gè)可以深入了解面試者對(duì)內(nèi)存管理方面的知識(shí),instruments的運(yùn)用及其調(diào)試的處理過程。——有時(shí)候我會(huì)聽到一些可怕的回答:“注釋掉部分代碼直到內(nèi)存泄露問題被修復(fù)”。
解釋下自動(dòng)回收池(autorelease pool)在程序運(yùn)行時(shí)是如何運(yùn)作的。 -——這類型的問題已經(jīng)超出代碼基礎(chǔ)了,一個(gè)程序員只有閱讀過一部分開發(fā)類書籍才能學(xué)到這些內(nèi)容。這些問題也同樣能考察他對(duì)程序底層代碼運(yùn)作的了解程度。
當(dāng)處理屬性申明的時(shí)候,原子(atomic)跟 非原子(non-atomic)屬性有什么區(qū)別?-——好多人都不知道這個(gè)問題的答案,我又一次震驚了。很多人他們都是看別人是怎么聲明的,他們就怎么來(lái)聲明。類似這種的題目會(huì)暴漏出來(lái)很多問題。
在C語(yǔ)言中,你如何能用盡可能短的時(shí)間來(lái)倒轉(zhuǎn)一個(gè)字符串?—— 我不大喜歡深入問計(jì)算機(jī)的核心內(nèi)容, 但是通過這個(gè)問題可以讓我了解到他們是如何思考的,同樣也可以了解到他們的C語(yǔ)言背景。深入詢問時(shí)間復(fù)雜度(big O notation)也能讓我了解面試者的水平。
遍歷一個(gè)NSArray和一個(gè)NSSet,哪一個(gè)更快? ——另一個(gè)深入的提問。有時(shí)候一個(gè)類解決了問題并不能代表你就應(yīng)該用這個(gè)類。
解釋代碼簽名(code signing)是如何運(yùn)作的。 —— 很多候選人都完全不了解代碼簽名是如何運(yùn)作的,然后抱怨說(shuō)他們一直被一些代碼簽名的一些問題所困擾。
Objective-C中的posing指的是什么? —— Posing是一個(gè)Object-C的小眾語(yǔ)法特性。像 swizzling那個(gè)問題一樣,這個(gè)問題可以讓我了解面試者對(duì)語(yǔ)言的深入程度。
列舉標(biāo)準(zhǔn)Xcode版本中的6個(gè)工具。 —— 通過這個(gè)問題我可以大致的了解到面試者會(huì)在這些工具上花費(fèi)多少時(shí)間。提示:至少得用10%的寫代碼的時(shí)間來(lái)用這些工具。
**copy跟retain有什么區(qū)別? **—— 最近好多開發(fā)者都開始用ARC了,內(nèi)存方面的問題就更能反映出一個(gè)開發(fā)者的知識(shí)水平了。
frames跟bounds有哪些區(qū)別? -——我不會(huì)問很多界面相關(guān) (GUI-type)的問題,我應(yīng)該問的多一些,不過通過這個(gè)問題我差不多能了解到一個(gè)開發(fā)者做了多少界面工作。
執(zhí)行如下的代碼會(huì)發(fā)生什么情況?
Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];
另一個(gè)內(nèi)存相關(guān)的問題,這個(gè)問題的答案不能單用會(huì)崩潰來(lái)回答,我想要知道為什么崩潰,何時(shí)會(huì)崩潰。
列舉5個(gè)iOS app的狀態(tài)。—— 幾乎沒有人能正確的回答出這個(gè)問題,通常我會(huì)給出一個(gè)例子,諸如后臺(tái)運(yùn)行的狀態(tài)(background state),這樣他們就知道我在說(shuō)的是那塊兒內(nèi)容了。
你認(rèn)為這次面試能很好的體現(xiàn)出來(lái)你作為開發(fā)者的能力么?—— 一些人說(shuō)可以測(cè)試的很好,但是有些人不這么認(rèn)為。我傾向于給面試者一些表達(dá)他們自己想法的機(jī)會(huì)。自信是非常重要的品質(zhì),而對(duì)應(yīng)這個(gè)問題的回答也能很好的反應(yīng)出一個(gè)人的自信程度。
我在提問這些問題的時(shí)候順帶會(huì)附加一些問題,類似“為什么會(huì)發(fā)生這種狀況?”或者是“請(qǐng)解釋下你的解題思路”。技術(shù)性面試的關(guān)鍵取決于面試者對(duì)語(yǔ)言跟平臺(tái)方面了解的程度,這不僅僅包含技術(shù)的廣度,還有技術(shù)的深度。
實(shí)際編碼的面試
這是我們最重要的面試,這場(chǎng)面試可以直接反映出面試者是否可以勝任工作。我們將提供給面試者一個(gè)名為 The Dragon’s Test的app,目前已知這個(gè)app有很多問題。然后給面試者一個(gè)bug清單,根據(jù)面試者解決問題的能力和時(shí)間來(lái)評(píng)定面試者的等級(jí)。
我們公司給一些大的企業(yè)法人提供iOS開發(fā)服務(wù),我們旨在用最快速的轉(zhuǎn)換模式來(lái)給客戶提供最可靠的結(jié)果。所以實(shí)際編碼的面試是有效評(píng)估面試者開發(fā)能力的重要面試, 因?yàn)樗茏屛掖_定在公司盈利的前提下,應(yīng)該支付給這個(gè)面試者多少薪水。對(duì)軟件面試本身來(lái)說(shuō),能找出快速解決問題的開發(fā)者就是最大的幸事。
在完成細(xì)節(jié)跟完成時(shí)間之間,有一個(gè)微妙的平衡點(diǎn)。如果有個(gè)人用1/3的時(shí)間完成了95%,另一個(gè)人用了更多的時(shí)間完成了100%的話,那我傾向于選擇前者。還有一個(gè)秘密可以告訴你,我們也是堅(jiān)持通過這種實(shí)際編碼的測(cè)試來(lái)選擇員工主管的。
幸運(yùn)的是(或者也可以說(shuō)這是不幸的,取決于你是如何看待這個(gè)問題的),準(zhǔn)備實(shí)際編碼的面試的最好的方式就是勤練習(xí)。你做的app越多,你越有可能更快的開發(fā)出更穩(wěn)健的代碼。所以要堅(jiān)持練習(xí)和學(xué)習(xí)!
該何去何從?
總結(jié)一下:
請(qǐng)熟練掌握計(jì)算機(jī)語(yǔ)言的基礎(chǔ)知識(shí),這樣可以讓你幫助你在面試中放松自己。在面試中,談?wù)撃阋獞?yīng)聘的公司跟公司旗下的產(chǎn)品。始終保持面試答案簡(jiǎn)明扼要、直奔主題。
在做編碼工作的時(shí)候,保持頭腦的快速運(yùn)轉(zhuǎn)。你完成任務(wù)的速度會(huì)決定項(xiàng)目的成敗。如果你能更快速的編寫好優(yōu)秀的代碼,那你就更有價(jià)值,你更有價(jià)值,公司就更愿意給你更多的薪水。