這段時(shí)間負(fù)責(zé)新部門(mén)人員招聘工作,感覺(jué)壓力山大。
從網(wǎng)上查找了一些關(guān)于招聘方面的知識(shí),記錄在偶的 BLOG 中以方便以后學(xué)習(xí),有三篇文章。
你要面試一個(gè)程序員,應(yīng)該問(wèn)他什么問(wèn)題?怎么才能在面試中發(fā)現(xiàn)合格的人?相信這是很多管理者關(guān)注的問(wèn)題。
如何面試程序員?
一、提問(wèn)之前的準(zhǔn)備
你應(yīng)該想清楚:
1.需要新員工完成什么樣的任務(wù)?
2.怎樣的人能完成這樣的任務(wù)?
3.哪些途徑和方法可以發(fā)現(xiàn)這樣的人?
只有明確這些根本性的問(wèn)題,才能正確高效地完成面試。
二、提問(wèn)的原則
假定你對(duì)上一節(jié)的三個(gè)問(wèn)題,已經(jīng)有了清晰的想法,那么接下來(lái)就可以設(shè)計(jì)如何提問(wèn)了。
有一些提問(wèn)的原則,是你應(yīng)該遵循的:
1.每一個(gè)面試問(wèn)題都有明確的目的。你不僅自己了解,還能向其他面試官解釋清楚。
2.多提一些開(kāi)放性(Open-ended)的問(wèn)題,而不是那種用Yes/No就可以回答的問(wèn)題。
這樣做使你有機(jī)會(huì)與面試者展開(kāi)討論,并且提出后續(xù)的問(wèn)題,盡可能多地了解對(duì)方。
3.不要問(wèn)宗教、家庭、健康、個(gè)人隱私等方面的問(wèn)題。
4.不要問(wèn)太復(fù)雜的問(wèn)題。因?yàn)槊嬖囌邲](méi)有太多思考時(shí)間,所以無(wú)法周全地回答,你也就無(wú)從判斷他的能力了。
三、考察專業(yè)能力
為了確認(rèn)面試者是勝任的,你可以問(wèn)一些與職位相關(guān)的專業(yè)方面的問(wèn)題。(不過(guò)通常來(lái)說(shuō),一次面試不足以看出一個(gè)人的專業(yè)能力。)
比如,你的招聘職位是系統(tǒng)管理員,你可以問(wèn)"如何快速地在50臺(tái)機(jī)器上部署Linux?"(提示:正確答案不是刻錄50張安裝光盤(pán)。)
另外,你還應(yīng)該向面試者了解他的過(guò)去,因?yàn)檫^(guò)去是未來(lái)的最好預(yù)測(cè)依據(jù)。不過(guò),提問(wèn)的重點(diǎn)不要僅僅是他過(guò)去的成果,更要關(guān)注在當(dāng)時(shí)的環(huán)境中,他是如何決策和實(shí)施的。
四、考察綜合素質(zhì)
因?yàn)槿耸菚?huì)發(fā)展的,所以某種程度上,面試者的綜合素質(zhì)要比他的專業(yè)能力更重要。
所以,具體的技術(shù)問(wèn)題(如何調(diào)用API、什么是設(shè)計(jì)模式、編程語(yǔ)言的語(yǔ)法等等)可以少問(wèn)一些,更應(yīng)該關(guān)注面試者的事業(yè)心、對(duì)工作的熱情、進(jìn)取心、自律能力、毅力等方面。
下面是一些典型問(wèn)題:
1.Why did you get into development?
你為什么開(kāi)發(fā)軟件?
2.How many technical books did you read in the past year?
去年你讀了幾本技術(shù)書(shū)籍?
3.What was your favorite technical book in the past year? What did you learn from it?
去年你最喜歡的技術(shù)書(shū)籍是哪本?你從中學(xué)到了什么?
4.What websites do you read regularly, related to development?
平時(shí)你經(jīng)常訪問(wèn)哪些編程類網(wǎng)站?
5.Do you maintain any open-source projects?
你有自己的開(kāi)源項(xiàng)目嗎?
6.Do you code in your spare-time?
業(yè)余時(shí)間你編程嗎?
7.Do you love programming, or do you do it for the money?
對(duì)于你來(lái)說(shuō),編程是一種愛(ài)好,還是一種謀生手段?
8.Have you accomplished anything important in your career yet? Do you want to??
你的職業(yè)生涯之中有什么重要的成就?它是你主導(dǎo)的嗎?
9.What would make you feel that you have done something important?
什么事情會(huì)讓你很有成就感?
五、考察理性思維
某些情況下,你可能需要了解面試者的分析判斷能力,看他能否全面地思考問(wèn)題、客觀地評(píng)價(jià)自己。
那么,你可以依次提出這樣三個(gè)問(wèn)題:
1.What's your favorite programming language? Why??
你最喜歡的編程語(yǔ)言是哪種?為什么?
2.If you could add one feature to your favorite language, what would it be? Why?
如果允許你為這種語(yǔ)言加一種功能,你會(huì)加什么功能?為什么?
3.If you could remove one feature from it, what would it be? Why?
如果允許你取消一種功能,會(huì)是什么功能?為什么?
這里的重點(diǎn)是,讓面試者從正反兩方面評(píng)價(jià)一件自己熟悉的東西,看看他的思維是否片面。答案無(wú)所謂對(duì)錯(cuò),只要面試者有一個(gè)明確的立場(chǎng),能夠從正反兩方面說(shuō)出令人信服的理由,就可以了。比如,某個(gè)軟件的口碑不好,但是面試者說(shuō)他很喜歡,而且說(shuō)得出一大堆理由,清楚地解釋了這種軟件的優(yōu)點(diǎn)和缺點(diǎn)在哪里,這樣就很好。
你還可以把這些問(wèn)題,套用在其他東西上面,比如操作系統(tǒng)、文字編輯器等等。
----------------------------------------------------------------------------------------------------
怎樣去面試以找到適合自己需求的從才呢?
一、確認(rèn)簡(jiǎn)歷。
首先,閱讀一下別人的簡(jiǎn)歷是需要的。從簡(jiǎn)歷上,工作經(jīng)歷、項(xiàng)目經(jīng)歷、技術(shù)技能這三個(gè)事情是你需要了解的。一般來(lái)說(shuō),你可以先通過(guò)電話確定一下他的工作經(jīng)歷、項(xiàng)目經(jīng)歷和技術(shù)技能,然后,如果他和你需要的人條件相符的話,可以叫到公司做面對(duì)面的面試。千萬(wàn)不要把別人叫來(lái),你又說(shuō)你的經(jīng)歷和我們的工作有差距之類的話。(我有過(guò)一次面試經(jīng)歷,公司我不說(shuō)了,反正是那個(gè)號(hào)稱需要有良好溝通的公司,面試了我9次左右,從一般的程序員,PM,經(jīng)理,到總經(jīng)理,而最后一次直接告訴我,我以前的經(jīng)歷和他們的要求差距很大。我不禁要問(wèn)了,前面若干次的面試他們都在干什么呢?)
二、面試開(kāi)場(chǎng)。
把人邀請(qǐng)來(lái)公司面試,應(yīng)聘者到了公司來(lái)面試,有一點(diǎn)很重要,那就是你一定要讓整個(gè)面試過(guò)程變得很隨意,很放松,就像普通的聊天和一般朋友間的交流一樣。這樣應(yīng)聘者才會(huì)放松并拿出真實(shí)的樣子來(lái)和你談話和聊天,你才能在很短的時(shí)間內(nèi)了解得更多。讓?xiě)?yīng)聘者放下心理負(fù)擔(dān),讓其表現(xiàn)得自然一些,這是招聘方的責(zé)任。千萬(wàn)不要說(shuō),別人太緊張發(fā)揮的不好,有時(shí)候,招聘方得想想自己的問(wèn)題。
面試開(kāi)場(chǎng)的時(shí)候,千萬(wàn)不要讓?xiě)?yīng)聘者介紹自己,因?yàn)?,?yīng)聘者早就給你發(fā)過(guò)簡(jiǎn)歷了,而你也給其打過(guò)電話了。另外,應(yīng)聘者對(duì)這個(gè)面試慣例通常都會(huì)準(zhǔn)備得非常不錯(cuò)的,另一方面,這會(huì)讓整個(gè)面試過(guò)程太正式太嚴(yán)肅了。所以,不妨問(wèn)問(wèn)應(yīng)聘者是怎么過(guò)來(lái)的?最近怎么樣?還可以和應(yīng)聘者談一個(gè)大眾話題,比如喜歡什么體育,音樂(lè),電影,社會(huì)熱點(diǎn)什么的,自己也別板著個(gè)臉,說(shuō)說(shuō)笑笑,試圖讓大家都放松下來(lái)。另外,通過(guò)這些閑聊,你可以知道他/她的與人交往能力和一些性格。另外,不要讓桌子放在你和應(yīng)聘者之間,把環(huán)境搞得隨意一些。
三、多讓?xiě)?yīng)聘者說(shuō)說(shuō)他的經(jīng)歷。接下來(lái),如果你要覺(jué)得這個(gè)應(yīng)聘者是否是一個(gè)可以解決問(wèn)題,是一個(gè)可以把事情搞定的人,不用問(wèn)他/她會(huì)做什么,直接問(wèn)問(wèn)其做過(guò)什么?干過(guò)什么事?對(duì)于一個(gè)好的程序員來(lái)說(shuō),很難想像其沒(méi)有相關(guān)的實(shí)踐,就算你是在大學(xué)里,你也應(yīng)該做過(guò)什么。如果你有解決問(wèn)題的能力,那么,很顯然,今天你應(yīng)該解決了很多問(wèn)題,也搞定了很多事情,聽(tīng)聽(tīng)?wèi)?yīng)聘者說(shuō)一說(shuō)他的那些事。(不要使用一問(wèn)一答這種方式,應(yīng)該讓?xiě)?yīng)聘者多說(shuō),而多聽(tīng),多想)
在他講他的項(xiàng)目的時(shí)候,通常來(lái)說(shuō)你要注意下面幾點(diǎn):
1.溝通表達(dá)能力。應(yīng)聘者能不能把一個(gè)事情講清楚。如果這個(gè)人聰明的話,他就可以用最簡(jiǎn)單的語(yǔ)言把一個(gè)復(fù)雜的事情講清楚。而且,這是一個(gè)好的程序員最基本的能力。而且,你可以在應(yīng)聘者一邊描述其經(jīng)歷的時(shí)候,你可以和應(yīng)聘者有一些的良好的來(lái)來(lái)回回的交談,這樣就可以知道,他的溝通能力和溝通方式,從而了解他的性格。
2.角色和位置。也許他參與了一個(gè)很大的項(xiàng)目,但只是做了一個(gè)很簡(jiǎn)單的模塊。所以,了解其在項(xiàng)目中的擔(dān)任的角色和位置是非常必要的。當(dāng)應(yīng)聘者說(shuō)到“我們”或者“大家”之類的詞匯時(shí),一定要向下細(xì)化和明確。
3.做出的貢獻(xiàn)和解決了什么的問(wèn)題。這個(gè)很重要,通過(guò)了解這個(gè),你可以知道面試者是否聰明,是否有能力解決問(wèn)題,是否有好的技術(shù)底子。
4.演示。如果可能,你可以讓?xiě)?yīng)聘者展示一些其寫(xiě)過(guò)的代碼,做過(guò)的設(shè)計(jì),或是直接給你看看他寫(xiě)的程序的演示。(從設(shè)計(jì)上,代碼的風(fēng)格,重用性,維護(hù)性上你可以了解很多很多)
5.基礎(chǔ)知識(shí)。了解該項(xiàng)目中應(yīng)聘者使用的技術(shù)的一些基礎(chǔ)知識(shí),比如,通過(guò)整個(gè)過(guò)程,你可以問(wèn)一些網(wǎng)絡(luò),語(yǔ)言,面象對(duì)象,系統(tǒng)的一些基礎(chǔ)知識(shí)?;A(chǔ)知識(shí)是非常重要的,這直接關(guān)系到了他的能力。
6.流程和工具。了解應(yīng)聘者所熟悉的項(xiàng)目的流程(銀彈,瀑布,敏捷,……),還有流程中的一些工件(如:需求文檔,設(shè)計(jì)文檔,測(cè)試方檔等),以及在開(kāi)發(fā)過(guò)程中使用的工具(內(nèi)存測(cè)試,代碼檢查,BUG報(bào)告,版本維護(hù),開(kāi)發(fā)調(diào)試……)(關(guān)于程序員的基本技能,你可以參考——《程序員需要具備的基本技能》)
有人會(huì)說(shuō),應(yīng)聘者的經(jīng)歷可以被他自己編出來(lái)的,他可以把一些不是他做的事說(shuō)成是他做的。是的,的確是有這種可能。不過(guò),不要忘了,一個(gè)謊言背后需要用更多的謊言來(lái)圓謊的,所以,你不必?fù)?dān)心這個(gè)問(wèn)題,只要你在應(yīng)聘者的描述過(guò)程中逐步求精,細(xì)化問(wèn)題,你會(huì)知道應(yīng)聘者是否是在編故事的。
千萬(wàn)記住下面幾點(diǎn):
1.談話風(fēng)格要隨意和自然,不要正式。
2.在了解應(yīng)聘者以前做過(guò)的事的時(shí)候,不要太投入了。因?yàn)檎衅阜揭彩羌夹g(shù)人員,所以有時(shí)候,招聘者自己會(huì)因?yàn)閼?yīng)聘者所做的項(xiàng)目中的技術(shù)太過(guò)迷人而被吸引了。
要注意引導(dǎo)應(yīng)聘人。相信我,應(yīng)聘的程序員十個(gè)人有八個(gè)人講不清楚以前做的是什么。因?yàn)樗麄冎苯犹^(guò)了項(xiàng)目背景和要解決什么樣的問(wèn)題,而直接進(jìn)入具體實(shí)現(xiàn)。
3.不要一問(wèn)一答,應(yīng)該多讓?xiě)?yīng)聘者說(shuō),這樣才能多全方位了解一個(gè)人。
4.了解一個(gè)人的過(guò)去,了解一個(gè)人做過(guò)的事情,比其會(huì)做什么更重要。
5.了解一個(gè)人的性格,想法,思維和行為,比了解其技術(shù)技能更重要。
6.溝通能力,表達(dá)能力,語(yǔ)言組織能力,理解能力,等方面的能力,關(guān)系到了是否能和別人一起工作。
7.基礎(chǔ)知識(shí)比知識(shí)的點(diǎn)滴要重要得多。你可能不知道其個(gè)C++的關(guān)鍵字,但你應(yīng)該要知道C++的繼承和多態(tài)。
8.技術(shù)技能固然很重要,但比其更重要的是這個(gè)人獲取知識(shí)的能力,學(xué)習(xí)能力是在計(jì)算機(jī)這樣變化飛快行業(yè)中必需具備的。
9.是否可以進(jìn)行培養(yǎng),比掌握的技能更重要。
四、實(shí)際參與?
這一步可能是很不好實(shí)施的。因?yàn)?,這需要一些應(yīng)聘者付出一定的時(shí)間,如果是畢業(yè)生,那沒(méi)有問(wèn)題,先讓他來(lái)實(shí)習(xí)一段時(shí)間。但如果別人有工作,就不好了。也許你會(huì)說(shuō),這就是試用期的用處了。不過(guò),我個(gè)人覺(jué)得,你得要尊重應(yīng)聘者,人家把那邊的工作辭了,來(lái)你這邊工作,三個(gè)月試用期間,如果沒(méi)有什么原則上的問(wèn)題,你作為一個(gè)招聘方又反悔了,這樣做很是相當(dāng)?shù)牟缓?。如果發(fā)現(xiàn)這樣的事,只能是招聘者自己的問(wèn)題。
在面試過(guò)程中,一些招聘者會(huì)讓?xiě)?yīng)聘者們一起做個(gè)游戲,或是搞個(gè)辯論比賽,或是現(xiàn)場(chǎng)組個(gè)團(tuán)隊(duì)干個(gè)簡(jiǎn)單的事情,有的甚至讓?xiě)?yīng)聘者請(qǐng)一天假到自己的公司里來(lái)和自己的團(tuán)隊(duì)一同工作一天,并要完成某個(gè)事情(甚至給其設(shè)置上deadline),并通過(guò)這些來(lái)考量應(yīng)聘者的實(shí)際參與能力。
是的,如果沒(méi)有一起工作過(guò),沒(méi)有一些實(shí)際的事情發(fā)生,單靠幾個(gè)小時(shí)的面試很難了解一個(gè)人的。設(shè)置上這些面試的環(huán)節(jié),在最短的時(shí)間內(nèi)來(lái)了解應(yīng)聘者的一切,對(duì)于招聘方來(lái)說(shuō)無(wú)可厚非。而且有的時(shí)候也能得到不錯(cuò)的效果。在這里,我只提一點(diǎn),有時(shí)候這樣的周期拉得很長(zhǎng),讓?xiě)?yīng)聘者付出了很多,反爾會(huì)讓?xiě)?yīng)聘者產(chǎn)生反感和厭煩情緒,從某種意義上來(lái)說(shuō),這實(shí)在是對(duì)應(yīng)聘者的不尊重。
對(duì)于這一點(diǎn),我一直持疑問(wèn)的態(tài)度,所以,我在其后打了兩個(gè)問(wèn)號(hào)。老實(shí)說(shuō),對(duì)于實(shí)際參與這一環(huán)節(jié),我個(gè)人的意見(jiàn)是適可而止,因?yàn)闀r(shí)間太短了,無(wú)論你怎么做你都無(wú)法了解完整。即然無(wú)法了解完整,那就獲取你最需要的吧,就是本文開(kāi)頭的那三個(gè)問(wèn)題,以及上面所述的“第三點(diǎn)”(了解應(yīng)聘者的以往經(jīng)歷)。
也許這個(gè)文章中有一些你不同意的觀點(diǎn),沒(méi)問(wèn)題,歡迎批評(píng)。
----------------------------------------------------------------------------------------------------
如何在面試中發(fā)現(xiàn)優(yōu)秀程序員
我曾在一次面試中要求一個(gè)很有經(jīng)驗(yàn)的嵌入式軟件開(kāi)發(fā)人員寫(xiě)出一個(gè)反轉(zhuǎn)一段字符串并輸出到屏幕上的程序。他在這個(gè)題目上掙扎了很久,這個(gè)家伙是個(gè)很神奇的人。你給他一些沒(méi)用的零件,他能建造一個(gè)機(jī)器人,并能用程序控制它在屋里走來(lái)走去。他曾經(jīng)參與過(guò)研制衛(wèi)星,并且這個(gè)衛(wèi)星現(xiàn)在正在軌運(yùn)行。他只用左腦都比我能干。但是對(duì)于這個(gè)題目他卻從來(lái)、從來(lái)沒(méi)機(jī)會(huì)干過(guò):在屏幕上顯示什么東西。
有些人就有這種技能,能在面試中問(wèn)出正確的問(wèn)題,發(fā)現(xiàn)優(yōu)秀的程序員。而有些人卻害怕提問(wèn),畏首畏尾,問(wèn)一些從網(wǎng)上拷貝下來(lái)的問(wèn)題,自己沒(méi)主見(jiàn),只會(huì)跟隨其他面試官的意見(jiàn)。但面試對(duì)于大多數(shù)開(kāi)發(fā)人員來(lái)說(shuō)是一項(xiàng)很基本的技能。一次失敗的招聘會(huì)給一個(gè)組織造成很?chē)?yán)重的長(zhǎng)期的后果,因?yàn)楹芩墓蛦T會(huì)把其他很水的人也帶進(jìn)公司。另一方面,把優(yōu)秀的應(yīng)聘者拒之門(mén)外對(duì)公司也是一種傷害。
一場(chǎng)技術(shù)性的面試至少包括三個(gè)部分:
1.我們要做的是看應(yīng)聘者的簡(jiǎn)歷上寫(xiě)的是否符合實(shí)際情況
2.我們要評(píng)估一下候選者究竟有多少實(shí)際經(jīng)驗(yàn)
3.我們要用一些問(wèn)答選項(xiàng)或編程問(wèn)題來(lái)測(cè)試這些經(jīng)驗(yàn)。
一、測(cè)試簡(jiǎn)歷的真實(shí)性
有一次我跟一位同事面試一個(gè)候選人。當(dāng)面試完之后,我覺(jué)得這個(gè)候選人還可以,但不是十分出色。
可我的同事看起來(lái)很不滿意:“他撒謊,他說(shuō)他會(huì)XXX技術(shù),可很顯然他根本沒(méi)有做過(guò)這種技術(shù)。絕對(duì)不能要這種人。”
雖然這XXX技術(shù)對(duì)我們公司并不是很重要,“因?yàn)樗隽诉@個(gè)慌,”我的同事繼續(xù)說(shuō),“我就不會(huì)相信他在簡(jiǎn)歷上寫(xiě)的任何東西了?!?br />
應(yīng)聘人員應(yīng)該在簡(jiǎn)歷中用一種很積極的色彩來(lái)描繪自己。然而,這種積極的描繪應(yīng)該有個(gè)度,過(guò)了這個(gè)度,就表達(dá)的不正確了。在上面的例子中,我并不和我的同事一樣覺(jué)得這個(gè)事很?chē)?yán)重,因?yàn)槲沂孪染图僭O(shè)了,簡(jiǎn)歷上的任何東西都是假的,除非被證明。如果簡(jiǎn)歷上說(shuō),“擅長(zhǎng)于XXX技術(shù)”,那么我就認(rèn)為這個(gè)應(yīng)聘者可能僅是知道XXX技術(shù)這個(gè)名字。如果簡(jiǎn)歷上說(shuō),“在一個(gè)開(kāi)發(fā)多線程股票交易系統(tǒng)的團(tuán)隊(duì)里工作,”那我就會(huì)認(rèn)為應(yīng)聘者可能只是為這個(gè)系統(tǒng)挑選了一下背景的顏色。我的要求一向不嚴(yán)格,除非碰到了一位有十年工作經(jīng)驗(yàn)、已經(jīng)不再寫(xiě)代碼的家伙。如果有人說(shuō)他開(kāi)發(fā)了OpenOffice軟件的文本格式化工具,或擁有哲學(xué)博士學(xué)位,那我們就很容易假設(shè)他們有什么技能了。假設(shè)一無(wú)所有,一切都要證實(shí)。
對(duì)于簡(jiǎn)歷上每條相關(guān)的描述,我會(huì)首先估摸一下應(yīng)聘者的實(shí)際情況。然后,我通過(guò)下面的交談來(lái)證實(shí)。
例如:開(kāi)發(fā)過(guò)一個(gè)實(shí)時(shí)操作系統(tǒng)作為練習(xí)項(xiàng)目。
你工作的團(tuán)隊(duì)有多大?15個(gè)成員?哦,那么,你實(shí)際上負(fù)責(zé)哪部分的?消息隊(duì)列?很好!請(qǐng)描述一下一個(gè)高優(yōu)先級(jí)的任務(wù)向一個(gè)低優(yōu)先級(jí)的任務(wù)發(fā)送消息時(shí)會(huì)發(fā)生什么情況?
例如:完全自主開(kāi)發(fā)了一套為無(wú)線安全系統(tǒng)使用的音頻傳輸協(xié)議。
你的團(tuán)隊(duì)有多少人?只有你?哦,你是如何測(cè)試的?你為什么不使用RTP呢?
例如:給XXX引擎修復(fù)Bug。
請(qǐng)你描述一下你曾發(fā)現(xiàn)過(guò)的一個(gè)特別有挑戰(zhàn)性的Bug,以及你是如何修復(fù)它的。
第二部分:發(fā)現(xiàn)實(shí)際的經(jīng)驗(yàn)
擁有更多的經(jīng)驗(yàn)是一個(gè)優(yōu)秀人才的很好的指標(biāo)。有經(jīng)驗(yàn)的開(kāi)發(fā)人員都是從犯錯(cuò)誤中成熟的。他們知道何時(shí)該,何時(shí)不該使用設(shè)計(jì)模式。他們有第六感,能感覺(jué)到需求的哪一部分需要修改,哪一部分要保持原樣。他們知道何時(shí)該偷懶,何時(shí)該考究。是真實(shí)的經(jīng)驗(yàn)讓優(yōu)秀的開(kāi)發(fā)者和平庸的開(kāi)發(fā)者之間的差距大的無(wú)法跨越。
并非所有的經(jīng)驗(yàn)都是等效的。很有可能,對(duì)于某個(gè)人,他通過(guò)多年的工作,在很多的任務(wù)中寫(xiě)或重新無(wú)數(shù)的代碼,犯了許多的錯(cuò)誤,就能獲得扎實(shí)的技能。而另一種情況,一個(gè)人會(huì)在十年的時(shí)間里只在一個(gè)項(xiàng)目里修改了一行代碼,沒(méi)有學(xué)到任何新的東西。
發(fā)現(xiàn)隱藏的時(shí)間
很多偉大的程序員都是在他們大學(xué)的第二年就開(kāi)始編程了。當(dāng)他們離開(kāi)學(xué)校時(shí),他們就已經(jīng)有了幾年的工作經(jīng)驗(yàn)了。還有,有些很神奇的程序員在他們很小的時(shí)候就開(kāi)始學(xué)習(xí)編程的藝術(shù)了。我也認(rèn)識(shí)好幾個(gè)人在他們十幾歲或更小時(shí)就寫(xiě)出來(lái)一些不算小的程序了。這些信息你是在簡(jiǎn)歷上找不到的,需要你在面試中把它們引誘出來(lái)。
1.你是怎么進(jìn)入到軟件開(kāi)發(fā)這一行的?
2.你曾經(jīng)學(xué)過(guò)的第一種編程語(yǔ)言是什么?
經(jīng)驗(yàn)的密度
很多神奇的程序員只是在他們工作的時(shí)間里編碼。這很好,工作生活很平衡,你沒(méi)有理由不雇傭這樣的人。然而,在工作和學(xué)習(xí)之余做一些個(gè)人的編程項(xiàng)目是一個(gè)優(yōu)秀的人才的很好的指標(biāo)。有業(yè)余編程經(jīng)驗(yàn)的應(yīng)聘者很明顯有更豐富的經(jīng)驗(yàn),更適合公司。沒(méi)有個(gè)人項(xiàng)目?這里有其他幾點(diǎn)也能做這方面的指標(biāo):
1.在很小的團(tuán)隊(duì)或小組里工作。
2.參與過(guò)很多各種各樣的項(xiàng)目。
3.對(duì)一個(gè)大型項(xiàng)目的各個(gè)抽象層面上都有很詳細(xì)的了解。
4.在一個(gè)項(xiàng)目組里作為主要開(kāi)發(fā)者。
第三部分:驗(yàn)證經(jīng)驗(yàn)
在對(duì)應(yīng)聘者有了一個(gè)基本的真正經(jīng)驗(yàn)水平的感覺(jué)后,就開(kāi)始對(duì)他們進(jìn)行重要的實(shí)際編程經(jīng)驗(yàn)的驗(yàn)證了。幾分鐘的時(shí)間對(duì)于一個(gè)真正的測(cè)試肯定是很不充分的,但也只有這樣了。我們可以通過(guò)對(duì)編程開(kāi)發(fā)的各個(gè)領(lǐng)域進(jìn)行提問(wèn)來(lái)認(rèn)識(shí)應(yīng)聘者對(duì)這些知識(shí)掌握的深度和廣度。當(dāng)然了,你對(duì)應(yīng)聘者技能水平的看法會(huì)由于你自身的經(jīng)驗(yàn)水平而有所偏向。對(duì)于你不太熟悉的領(lǐng)域你不可能對(duì)答案做出正確的判斷。所以我們一般同時(shí)會(huì)有好幾個(gè)面試官。
工作職務(wù)的不同會(huì)有不同的面試主題。然而,下面幾個(gè)領(lǐng)域是很常見(jiàn)的:
1.數(shù)據(jù)結(jié)構(gòu)和算法
2.多線程
3.字節(jié)操作
4.內(nèi)存分配
5.對(duì)象,繼承,設(shè)計(jì)模式
6.遞歸
7.匯編知識(shí)和程序運(yùn)行原理
我選擇的每個(gè)領(lǐng)域都有一個(gè)精心挑選的很基礎(chǔ)的問(wèn)題(“什么是一個(gè)信號(hào)?”)。問(wèn)題很基礎(chǔ),只要應(yīng)聘者在這個(gè)領(lǐng)域做過(guò)一些工作就能回答上這些問(wèn)題。每個(gè)領(lǐng)域都有一些其它的較深入的問(wèn)題。候選人對(duì)這些問(wèn)題的回答能證明他們到底是不是專業(yè)。例如,如果你問(wèn)一個(gè)有經(jīng)驗(yàn)的嵌入式軟件開(kāi)發(fā)人員如何把0x4c轉(zhuǎn)化成二進(jìn)制,他寫(xiě)出一個(gè)4×16+12,這就不是很對(duì)了。
編碼問(wèn)題
在完成了上面的步驟后,我通常就已經(jīng)能認(rèn)定了這個(gè)候選人是否能過(guò)關(guān),如果還有困難,那編碼問(wèn)題會(huì)幫我掃除最后的障礙。這個(gè)很重要,即使在電話面試?yán)镆膊荒苈┻^(guò)。為了行之有效,在面試之前,你要好好的思考和計(jì)劃要提出的編碼問(wèn)題。問(wèn)錯(cuò)誤了,回答也就沒(méi)意義了。
1.問(wèn)題的選擇必須基于應(yīng)聘者的工作經(jīng)驗(yàn)之上。如果你想起來(lái)3D飛機(jī),想把所有問(wèn)題都圍繞著它進(jìn)行,這樣會(huì)有很妙的問(wèn)題。但你還是省省吧,吃午飯時(shí)跟同事說(shuō)說(shuō)還行。如果招聘的工作跟3D圖形沒(méi)一點(diǎn)關(guān)系,那這個(gè)候選人就肯定被不公平的排除掉了。
2.問(wèn)題必須精確的表達(dá)出來(lái)?!皩?xiě)出一個(gè)用來(lái)移動(dòng)一摞卡片的函數(shù)”,這個(gè)表述就十分的含混不清。要給出功能性標(biāo)題,避免誤解,這種事情經(jīng)常發(fā)生。如果你不小心,面試者有可能回答的是一個(gè)比你提出的問(wèn)題更難或者更簡(jiǎn)單的問(wèn)題,而不是你想要問(wèn)的。如果回答的是更難的問(wèn)題,那還好,除非難題讓他目瞪口呆。如果回答的是更簡(jiǎn)單的問(wèn)題,那沒(méi)有什么用處。為了防止浪費(fèi)大量的時(shí)間,在他們答題的幾分鐘后問(wèn)一下他們的答題綱要,看看他們的理解是否在正確的方向上。
3.上面的指導(dǎo)并不能解決所有問(wèn)題。這些主要是針對(duì)工作經(jīng)驗(yàn)。你也許會(huì)錯(cuò)過(guò)一些沒(méi)有多少經(jīng)驗(yàn)但有非常大的潛力的優(yōu)秀程序員。特別是當(dāng)面試官想通過(guò)一些不用編碼的難題來(lái)考察應(yīng)聘者解決問(wèn)題的能力的時(shí)候。
這里所說(shuō)的這些面試技巧都是要基于一種假設(shè)、可能性、內(nèi)部直覺(jué)。假設(shè)候選人是一個(gè)很出色的開(kāi)發(fā)人員。那一個(gè)出色的開(kāi)發(fā)人員應(yīng)該具有哪些品質(zhì)呢?你沒(méi)法直接的測(cè)量這些品質(zhì),所以你需要想:一個(gè)具有這些品質(zhì)的優(yōu)秀開(kāi)發(fā)人員對(duì)這樣一個(gè)特定問(wèn)題進(jìn)行快速回答的可能性是多少?你不可能通過(guò)面試對(duì)一個(gè)候選人進(jìn)行100%正確的評(píng)價(jià),但通過(guò)盡量周全的提問(wèn),你會(huì)做到很接近這個(gè)結(jié)果。





