如何面試程序員?
阮一峰 整理
一、提問之前的准備
首先,最重要的是,你自己一開始就應該想清楚:
1. 需要新員工完成什么樣的任務?
2. 怎樣的人能完成這樣的任務?
3. 哪些途徑和方法可以發現這樣的人?
只有明確這些根本性的問題,才能正確高效地完成面試。
二、提問的原則
假定你對上一節的三個問題,已經有了清晰的想法,那么接下來就可以設計如何提問了。
有一些提問的原則,是你應該遵循的:
* 每一個面試問題都有明確的目的。你不僅自己了解,還能向其他面試官解釋清楚。
* 多提一些開放性(Open-ended)的問題,而不是那種用Yes/No就可以回答的問題。這樣做使你有機會與面試者展開討論,並且提出后續的問題,盡可能多地了解對方。
* 不要問宗教、家庭、健康、個人隱私等方面的問題。
* 不要問太復雜的問題。因為面試者沒有太多思考時間,所以無法周全地回答,你也就無從判斷他的能力了。
三、與職位相關的問題
為了確認面試者是勝任的,你可以問一些與職位相關的專業方面的問題。(不過通常來說,一次面試不足以看出一個人的專業能力。)
比如,你的招聘職位是系統管理員,你可以問"如何快速地在50台機器上部署Linux?"(提示:正確答案不是刻錄50張安裝光盤。)
另外,你還應該向面試者了解他的過去,因為過去是未來的最好預測依據。不過,提問的重點不要僅僅是他過去的成果,更要關注在當時的環境中,他是如何決策和實施的。
四、考察綜合素質
因為人是會發展的,所以某種程度上,面試者的綜合素質要比他的專業能力更重要。
所以,具體的技術問題(如何調用API、什么是設計模式、編程語言的語法等等)可以少問一些,更應該關注面試者的事業心、對工作的熱情、進取心、自律能力、毅力等方面。
下面是一些典型問題:
Why did you get into development?
你為什么開發軟件?How many technical books did you read in the past year?
去年你讀了幾本技術書籍?What was your favorite technical book in the past year? What did you learn from it?
去年你最喜歡的技術書籍是哪本?你從中學到了什么?What websites do you read regularly, related to development?
平時你經常訪問哪些編程類網站?Do you maintain any open-source projects?
你有自己的開源項目嗎?Do you code in your spare-time?
業余時間你編程嗎?Do you love programming, or do you do it for the money?
對於你來說,編程是一種愛好,還是一種謀生手段?Have you accomplished anything important in your career yet? Do you want to?
你的職業生涯之中有什么重要的成就?它是你主導的嗎?What would make you feel that you have done something important?
什么事情會讓你很有成就感?
五、考察理性思維
某些情況下,你可能需要了解面試者的分析判斷能力,看他能否全面地思考問題、客觀地評價自己。
那么,你可以依次提出這樣三個問題:
What's your favorite programming language? Why?
你最喜歡的編程語言是哪種?為什么?If you could add one feature to your favorite language, what would it be? Why?
如果允許你為這種語言加一種功能,你會加什么功能?為什么?If you could remove one feature from it, what would it be? Why?
如果允許你取消一種功能,會是什么功能?為什么?
這里的重點是,讓面試者從正反兩方面評價一件自己熟悉的東西,看看他的思維是否片面。答案無所謂對錯,只要面試者有一個明確的立場,能夠從正反 兩方面說出令人信服的辯護理由,就可以了。比如,某個軟件的口碑不好,但是面試者說他很喜歡,而且說得出一大堆理由,清楚地解釋了這種軟件的優點和缺點在 哪里,這樣就很好。
你還可以把這些問題,套用在其他東西上面,比如操作系統、文字編輯器等等。
從程序員到架構師
前兩天跟着項目經理參加了一個面試。雖然不是第一次參加面試,但是還是有點緊張:)
我覺得我們面試的題目已經基本的不能再基本了,但是還是找不到一個合適的人。現在真的成了一種普遍的困境,很多人找不到滿意的工作,很多公司找不到滿意的人。
閑話不多說了,說說我們的幾個題目吧。同時也說說對即將參加面試的兄弟的建議,從一個面試者的角度。
第一個題目:自我介紹。
自我介紹,幾乎是每個面試的必備的題目(99%以上)吧。但是,我仍然遇到非常多的人連這個題目都“不准備”。我說的是“不准備”,而不是“准備的不好”。這個題目要准備的出色,是比較難的。我們是外企,我知道很少參加外企面試的 兄弟參加外語會緊張,特別是剛開始。所以會出現這樣的開頭:“Thank you for giving me this oppertunity. It’s my honor to talk with you. The following is my self-introduce”。沒關系,面試官會理解你,但是,你要背熟,至少要背完。我遇到過好幾個連自我介紹都沒有背完的,你說怎么會有心情繼續!
通常,很難靠自我介紹給你加多少分。但是自我介紹給你減分卻非常快,快得出乎你的意料。第一,如果自我介紹沒有准備充分,說明你對面試不夠重視,當 然面試官也會覺得自己不受重視;第二,如果自我介紹沒有條理,說明你的總結能力不夠;第三,如果自我介紹和簡歷里面有哪怕一點點的沖突,說明你的人品有問 題,不夠成熟,或者不夠細心。一般來說,說明自己的姓名,年齡,工作年限。再說一下上一家公司就職期間的一兩個項目就好了。項目這塊是重點,不要雲山霧 罩,如果你里面有太多的術語,面試官多半是不了解的,除非你們在一個非常相近的領域。說的越簡單易懂越好。
第二個題目:你最近在讀什么書?或者你畢業后都讀過哪些書?
這個是很難作弊的題目。你讀過什么就說什么,千萬別吹噓。如果真的沒讀過也就說沒讀過好了,如果讀得一知半解,自己衡 量,碰上面試官讀過那本書可能會以為你不誠實,或者至少自學能力差。人文類的書也可以說,但是只提一句,看面試官的表情再說。如果面試官一臉茫然,見好就 收,不要企圖用這個時間向面試官灌輸你關於文藝復興的認識。多說一些經典的書,當然前提是你要多看書。或者你實在沒看過什么書,也可以說經常上的網站和論 壇或者郵件列表。CSDN這個年頭最好不要重點提,因為大抵專心做事的沒有多少時間泡在上面。
第三個題目:你認為OO和面向過程的區別是什么?(OO有哪些特點?)進而,多態是什么意思?能不能寫一段代碼展示一下多態?
這個題目的關於多態的部分是我們項目經理的保留題目,所以別人跟他一起面試通常會跳過這個題目。或者問完了OO的特點,就轉過身用期望的眼神看着他?他也就知道該自己了:)。這個問題很基本,OO的特點基本上都能回答上來。至於和面向過程的區別,卻比較難回答,但也很難出錯:)仁者見仁,智者見智。
多態,我覺得是OO里面一個很基本的概念了,從某種程度上過去我們有些過於強調多態和繼承,甚至有說法說理解了多態就理解了OO。寫代碼的部分,能完全沒有錯誤的很少。不過也減不了多少分,但是要是完全沒有體現多態就不好了。
到此為止基本上是個分水嶺,如果前三個問題答得好,后面多半不會為難你了。如果答得特別不好,后面的也不會為難你了。
第四個題目:你最熟悉的設計模式是什么?能不能隨便找其中一個畫個類圖或者序列圖或者協作圖?
這個題目我幾乎每個面試都可以問。因為幾乎每個人的簡歷里面都回寫上“熟悉OOD”,后面緊跟着“和設計模式”,下一條則是熟悉UML。對於大多數 人,所謂的熟悉設計模式不過是Factory(而且是簡單工廠,而不是GOF所說的工廠方法或者抽象工廠)、Singleton(千刀萬剮的設計模式,被 最廣泛誤用的模式之一)、Observer(因為jdk里面有Observer和listener)、MVC(好有名啊,但是你問到C的幾種用法和適用情 況就傻眼了,所以我也幾乎從來不問)、Visitor(不知道為什么這個也這么出名)。
畫類圖,絕對不是要求背過GOF的書上的原圖。只要差不多能反映模式的含義即可,因為我也記不清楚那么多經典圖。順便會問一下這個圖里面的幾個箭頭表示什么。以經常被選中的Factory為例,要能看出返回的是接口(不管是那種工廠模式,除了簡單工廠)。
第五個題目:OO的設計原則能說上幾個?隨便找其中一個說說。
這個題目用的比較少,一般是前三個題目答的比較好,所以有興趣繼續聊聊稍微深入的話題。或者前面的問題時間太短,用來占用時間:)OO的設計原則有很多,也不要求局限於bob列出的OCP、DIP、SRP等等。像什么面向接口編程啊、封裝變化啊等等都可以說。可是就這樣能列出一兩個的很少,能進一步說兩句的就更少了。
說了半天,我希望這是我們公司遇到的特殊情況。如果國內的程序員真的這么不禁面,實在是一個不好的事情。我曾經跟國外的一個實習生一起做一個項目,他所表現出來的素質比我不知道高多少。我們公司雖然在軟件行業沒有什么名氣,但是開發實力在全球還是很靠前的。公司正在把很多的開發移到中國來,但是從我們的面試情況看卻很不樂觀。