再談“我是怎麼招聘程式員的”

來源:互聯網
上載者:User

(請勿用於商業用途,轉載時請註明作者和出處)

 

來自酷殼 http://coolshell.cn

原文:http://coolshell.cn/articles/4506.html, http://coolshell.cn/articles/4490.html

 

 

 

我以前寫過一篇“我是怎麼招聘程式員的”的文章(在CSDN那裡有很多人進行了回複)。今天,我想再談談關於招聘和面試這方面的東西,主要是以下這些原因:

  • 近半年來我在進行了大量的招聘工作,對面試有一些新的體會。
  • 酷殼最近發布了幾篇趣味面試題(面試題一,面試題二,面試題三),從回複中讓我有一些思考。
  • 我有一個同事最近面試了一家公司,他和我分享了一個博士專家對他的面試,也讓我思考了一些。
  • 在豆瓣上看到“知乎上某人寫面試豆瓣產品經理的經曆,很歡樂”(亮點是面試官現身知乎親自作答)

所以,我很想把自己的這些新的想法再次寫下來的。還是和以前一樣,這篇文章同樣是獻給面試官的。我認為,面試的好壞完全在面試官而不是面試的人。下面是我對“我是怎麼招聘程式員的”一文中的一些加強性的觀點。(關於一些點評,請參看本文下篇)

為了讓我的文章有連續性,請允許我重申一下前文的幾個重要觀點。

  • 只有應聘者真實和自然的表現,才能瞭解到最真實的東西
  • 重要的不是知識,重要的是其尋找知識的能力
  • 重要的不是那個解題的答案,而是解題的思路和方法
操作,知識,經驗,能力

我們有很多的面試官似乎分不清,什麼是操作能力,什麼是知識,什麼是經驗,什麼是能力,這導致了我們的面試官經常錯誤地對面試者下結論,我認為分不清這些事的人是沒有資格做面試官的。所以,我有必要在這裡把這個問題先講清楚。

 

  • 操作。我們的面試官分不清楚什麼是操作技能,什麼是知識,他們甚至認為操作技能就是知識甚至經驗。比如他們會 問如下的問題,請問Java中的 final是什麼意思?怎麼查看進程的CPU利用率?怎麼編寫一個管道程式?怎麼查看進程的程式路徑?VI中的拷貝粘貼命令是什嗎?包括物件導向的XX模 式是什麼。等等。我以為,這些能夠通過查況相關操作手冊或是能夠google到的東西只能說明這個人的操作技術,並不能說明他有知識或有經驗
  • 知識。知識是一個人認知和學習的體現,可能會是一些基礎概念和知識。比如這些問題:TCP和UDP的優缺點比 較,鏈表和雜湊表的優缺點的比較。什麼是堆什麼是棧?進程間是怎麼通訊的?進程和線程的優缺點?同步和非同步優缺點?物件導向的XX設計模式的主要原則是 什麼,等等。我以為,“知其然”只是操作技術,“知其所以然”才是真正的知識。知識不夠並不代表他不能工作,會操作技能就可以應付工作,但是知識的欠缺一定會限制你的經驗和能力,同樣會影響你的開發品質。
  • 經驗。經驗通常跟一個人的經曆有關係。一個人的知識範圍,一個人經曆過的事,通常會成為一個人經驗的體現。面 試中,我們會問這些問題:你解決過最難的問題是什嗎?你是怎麼設計這個系統的?你是怎麼調試和測試你的程式的?你是怎麼做效能調優的?什麼樣的代碼是好的 代碼?等等。對於工作年限不長的人來說,經曆和做過的事的確會成為其經驗的主要因素,尤其是業務上的有行業背景的東西。但是,我更以為,經驗可能更多的是你對知識的運用和駕馭,是你對做過事情的反思和總結,是你對他人的學習,觀察和交流
  • 能力。一個人的能力並不會因為知道東西少而不行,也不會因為沒有經驗而沒有能力。一個人的能力是他做事情的一種態度,性格,想法,思路,行為,方法和風格只要有熱情,有想法,有好的行為方法,以及好的行事風格,那麼知識和經驗對他來說只是一個時間問題。 比如:學習能力,專研精神,分析能力,溝通能力,組織能力,問題調查能力,合作能力等等。所以,對於一個新手來說,也許他的知識和經驗有限,但並不代表他 能力上有問題,但是對於一個老手來說,如果其存在知識和經驗欠缺的問題,那麼通常都是其能力的問題。你可能暫時懷才不遇,但我不相信你會長期懷才不遇。如 果是的話,那麼你必然些問題其讓你的能力發揮不出來。而此時,“沒有經曆過”只會是你“沒有能力”的一個借口。

我不否認這四樣東西對於一個優秀的程式員來說都很重要。但是,通過上述的分析,我們可以知道,能力和經驗和知識需要分開對待。當然,這些東西是相輔相成的,你的能力可以讓你獲得知識,你的知識可以讓你更有經驗,你的經驗又會改變你的想法和思路,從而改善你的能力。在面試中,我們需要清楚的認識到,應聘者的操作技能,知識和經驗只是其能力的必要條件,並不是充要條件,而我們更應該關注於應聘者的能力

  • 如果面試只是考查這個人的操作技能的話,那麼這個面試完全失敗。這是一個沒有資格的面試官。
  • 如果面試只是在考查這個人的知識和經驗的話,那麼成功了一半。因為你瞭解了基礎知和做過的事,但這並不代表你完全瞭解他的真正能力。
  • 如果你能夠在瞭解這個人的知識和經驗的過程中重點關注其能力(態度、性格、想法,思路,行為,方法和風格),並能正確地評估這個人的能力,那麼你的面試算是非常成功的。

也許用這四個詞來描述定套東西並不太合適,但我相信你明白我想表達的。

不要膚淺地認識演算法題和智力題

很多公司都會在面試的時候給一些演算法題或是一些智力題或是一些設計題,我相信演算法題或是智力題是程式員們在面試過程中最反感的事了。很多人都很BS面試官問的演算法題,因為他們認為面試官問的這些演算法題或智力題在實際工作當中用不到。但我想在這裡說,問難的演算法智力題並沒有錯,錯的很多面試官只是在膚淺甚至錯誤地理解著面試中的難題的目的。他們認為,能做出演算法題和智力題的人就是聰明的人就是有能力的人,這種想法實在是相當的膚淺。

其實,能解難題並不意味著這個人就有能力就能在工作中解決問題,你可以想想,小學奧數題可能比這些題更難,但並不意味著那些奧數能手就有實際工作能力。你可 以想一想你們班考試得高分的同學並不一定就是聰明的人,也不一定就是有能力的人,相反,這樣的人往往者是在應試教育下培養出來的書獃子。

所以,我認為解難題的過程更重要,你要主要是通過解題查看這個應聘者的思路,方法,運用到的知識,有沒有一些經驗,和你一起互動時和溝通得是否順暢,等等,這些才是你重點要去觀察的。當然,最終是要找到答案的。

我想,讓面試者解決一個難題的真正思路是:

  • 看看他對知識的應用和理解。比如,他是否會用一些基礎的資料結構和演算法來解決演算法題?
  • 看看他的整個解題思路和想法。答案是次要的,他的想法和行為才是重要的。
  • 看看他是如何和你討論交流的。把面試者當成你未來的同事,當成你的工作夥伴,一起解題,一起討論,這樣可以看看大家是否可以在一起工作。

這些方面才是考查應聘者的能力(思路,方法、態度,性格等),並順帶著考查面試者的經驗和知識。下面是一些面試的點:

  • 應聘者在解演算法題時會不會分解或簡化這個難題。這是分析能力。
  • 應聘者在解演算法題 時會不會使用一些基礎知識,如資料結構和基礎演算法。這是知識。
  • 應聘者在解題 時和你討論的過程中你有沒有感到應聘者的專研精神和良好的溝通。
  • 應聘者在對待這個演算法題的心態和態度。如,面試面是否有畏難情緒。
  • 應聘者在解題時的思路和方法是否得當,是否是比較科學的方法?
  • 等等。

在解難題 的過程中考查應聘者的能力才是最終目的,而不是為難應聘者,不然,你只是一個傲慢而無知的面試官

類比實際中的挑戰和能力

作為面試官的你,你應該多想想你的工作,以及你的成長經曆。這會對你的面試很有協助。你在工作中解決問題的實際情況是什嗎?你寫代碼的實際情況是什嗎?你的成長經曆是什嗎?你是怎麼獲得知識和能力的?你喜歡和什麼樣的人工作?相信你不難會發現你工作中的實際情況和面試的情況完全是兩碼事,那麼,你怎麼可以用這種與實際情況差別那麼大的面試來評估一個人的能力呢

所以,最為理想的面試是一起工作一段時間。當然,這個在招聘過程中,操作起來幾乎不可能,因此,這就要求我們的面試官儘可能地把面試的過程類比成平時工作的 過程。大家一些討論來解決一個難題,和應聘者一起回顧一下他已經做過的事情,並在回礎的過程中相互討論相互學習。下面舉一個例子。

我們知道,對於軟體開發來說,開發軟體不難,難是的下面是這些挑戰:

  1. 軟體的維護成本遠遠大於軟體的開發成本。
  2. 軟體的品質變得越來越重要,所以,測試工作也變得越來越重要。
  3. 軟體的需求總是在變的,軟體的需求總是一點一點往上加的。
  4. 程式中大量的代碼都是在處理一些錯誤的或是不正常的流程。

所 以,當我們在考查應聘者的代碼能力時候,我們為什麼不能類比這樣的過程呢?比如,讓應聘者實現一個atoi()的函數,實現起來應該很簡單,然後 不斷地往上加新的需求或新的案例,比如:處理符號,處理非數位字母的情況,處理有空格的情況,處理十六進位,處理二進位,處理“逗號”,等等,我們要看 應聘者是怎麼修改他的代碼的,怎麼寫測試案例的,怎麼重構的,隨著要處理的東西越來越多,他的代碼是否還是那麼易讀和清晰。如果只是考查編碼能力,一個小時,就問這一個問題,足矣。真正的程式員每天都在和這樣的事打交道的。

如果要考查應聘者的設計能力,同樣可以如法泡製。不斷地加新的功 能,新的需求。看看面試者的思路,想法,分 析的方法,和你的討論是否流暢,說沒說在 點上,思想清不清晰,會應用什麼樣的知識,他在設計這個系統時的經驗是會是什麼樣的,面對不斷的修改和越來越複雜的需求,他的設計是否還是那麼好?

當然,因為時間比較短,所以,你不能出太複雜的問題,這需要你精心設計一些精製的有代表性的問題。

 

把應聘者當成你的同事

有些公司的面試官,在面試過程中問你一個演算法題,然後等著你解答了,如果你給出一個答案,然後就會問你有沒有更好的答案,如果你給出了正確的答案,他們就會問你一個更難的問題,如此迴圈下去。他們基本上很少給你提示,甚至不停地質問你,挑戰你,搞得應聘者很緊張。

另外,有很多問題是沒有標準答案的,或者說是,同一個答案的描述方法有多種,很多面試官會覺得你沒有回答到他想要的答案,因此表現得有對你不屑,並表現出你不行的樣子,並覺得你的能力有問題。真是可笑了。比如我一個朋友在回答什麼是非同步問題時,舉例說明了非同步呼叫就是不能處理完就返回,並且需要傳遞一個回呼函數給調用方以便完成後回調通知結果。這樣的回答並沒有錯,但是這並不符合面試官心裡想要的答案,面試官對此並不滿意,進而認為我這個朋友還需要去多讀讀書。

我相信大多數面試官都會這樣乾的。我想問問這樣的面試官,你們有沒有用面試的方式對過你的同事?在你的工作情境中,你會不會用面試的風格和你的同事進行交流和說話?不妨讓我們來問我們自己下面幾個問題:

  • 你在工作當中遇到難題時你是怎麼解決的?你會和人討論嗎?你只用15分鐘就能得出最優解嗎?
  • 你在工作當中解決難題時是否會有一個人在旁邊質問你並給你壓力嗎?
  • 你在工作當中會為難你的同事嗎?會讓你的同事緊張嗎?你覺得在緊張的狀態下能做好工作嗎?
  • 你在工作中覺得同事的回答並不是你想要的答案,不是符合你的答案,你會認為你的同事不行嗎?
  • 你的成長過程是什麼樣的?在是壓力和天天被人質問的情況下成長的嗎?
  • 大家都知道學校裡應試教育的弊端,你覺得你的面試是不是一種應試呢?
    (看看這麼多的應聘者們都在做各種各樣的演算法題,這不就是一種應試嗎?)

想一想你的日常工作,問自己一下上面這些問題,想一想你自己的成長過程,想一想你和你的同事是怎麼相處的,想一想你的日常工作中是什麼樣的,相信你自己也能得出結論的。

如果你把應聘者當成自己未來的同事,那麼你的面試會有下面的收穫:

 

  • 面試的氣氛會很不錯,應聘者會放鬆,表現自然,更接受於真實的狀態。
  • 面試中的交流和互動(而不是一問一答)會讓你更全面的考查和瞭解一個人。
  • 非應試的面試,會讓你瞭解得更多。
  • 真實的瞭解一個人,你才能做出真正正確的結論。
嚮應聘者學習

下面有幾個觀點

  • 面試的過程是一個相互學習的過程,並不是你為難面試者的過程。
  • 一問一答是很一種呆板死板的過程,相互討論相互學習,有良好的互動才是好的面試過程。
  • 面試官要證明的不是你有多強有多聰明,而是要挖掘應聘者的優勢和能力。
  • 面試官用為自己的問題預設好一個標準答案,看看應聘者能為你帶來什麼。
  • 向來應聘的人學習,而不是刁難。

無論你多牛,要難倒你實在是太容易了。出難題不是目的,難倒人也很容易,出難題只不過是用來瞭解應聘者能力的一個手段,而不是面試的全部

我不知道你喜歡不喜歡一些競技類的運動?比如踢球,打籃球,羽毛球,下象棋等,你一般想和什麼樣的人玩?是差的,還是強的?所以,能夠從面試者那裡學到東西,喜歡和面試者一起工作,這才是面試真正的目的

對於一個團隊來說,如果大家都是一樣的想法,一樣的主張,一樣的傾向,那麼這個團隊最終會是一個閉塞的團隊,你如果不能真正接納不同想法的人,不同主張的人,那麼你也將失去進步的機會。如果你的團隊總是在招入和你一樣的人,那麼你的團隊怎麼可能會有out-of-box的想法呢?世界因為不同而美好

另外,對於公司來說,如果你招進來的人還不如已經有的人,作為一個公司,你又怎麼能有更好的人讓你的公司進步呢

所以,面試應該是向面試者學習的一個過程。當然,如果你從他身上學不到什麼,那麼你就教他一些吧。這樣,就算是面試不通過,面試者也會欣然接受的。不然,讓面試者產生一些負面情緒,出去說一些不好的話,也有損你和公司的形象。

一些相關的點評

下面是我根據酷殼的一些面試題的文章後的回複、還有我朋友的經曆,還有這篇有關豆瓣的產品經理的這篇文章的一些點評。大家可以看看我從這些地方看到東西靠不靠譜。

酷殼的面試題中的回覆

先說酷殼的那篇“火柴棍式的面試題”,這個面試題其實很沒什麼意思。主要考查你對代碼邏輯的瞭解程度。因為設定了回複可見答案,所以這篇文章的回複量達千把條。從回複中,我看到:

  • 一些朋友想不出來就直接看答案了。我可以看出,有一些朋友習慣獲得知識,而不習慣獨立思考。甚至有畏難情緒,從另一方面來說,可以看出我國的教育還真不是一般的差。
  • 一些朋友想不全。從這點來看,我覺得很正常,尤其是想出兩種來的,我可以感覺到他們的努力思考了,可能還做了一些嘗試。挺不錯的。可惜我看不到你思考的方式,是在紙上畫了畫,還是編譯了個程式跑了跑,還是別的什麼。這樣我會瞭解你更多。
  • 一些朋友給出的答案中有錯的。這說明了這類朋友可能不喜歡做測試,時常想當然,或是做事比較衝動,並不足夠嚴謹。這麼簡單的程式,驗證能花多少精力呢?
  • 還有少數的朋友沒有看明白題目要求。這說明了這類朋友太粗心了,在工作當中可能會表現為誤解需求和別人的話。溝通有問題。

再說說那篇“火車運煤”的問題,這個面試題我覺得主要是看看大家的解題思路,表達能力。

  • 首先,我很驚喜有人很快就用數學做瞭解答,很不錯,這個人的數學功底很不錯。能用數學解題的人一般來說都是演算法比較強的人。
  • 有人說抱怨我沒有說火車可以調頭回去,所以沒有想到這樣的方法。如果是在面試中我會做提示的。我不會因為你不知道調頭這個潛規則而否定你的。當然,如果你能想到的話說明你的腦袋還是比較靈的。
  • 還有很多人說他的方法比較土,只運了400噸煤,416噸的或333噸,一看就是沒有看提示的,我覺得這些人能夠通過獨立思考找到方法,這類的人其實已經不錯了。順著這個思路最佳化也只是時間的問題了。
  • 更可喜的是,我看到了有一些朋友在看到別人的更好的方法後和自己的方法進行了比較,並找到了為什麼自己的方法不如他的原因。這樣的人我認為是懂得“總結”和“比較”的,這樣的人總是在不斷地學習和改善自己的。
  • 還有人說到了動態規劃,如果是在面試的時候,我很想向這位朋友學習一下用動態規劃來解這題。
  • 還有朋友說到了火車調頭只能在有站的地方。這個朋友一看要麼就是搞需求分析的人,要麼就是較真的人。需要進一步瞭解。但不管怎麼樣,這樣的朋友的觀察能力是很不錯的。
  • 還有一些朋友給出的答案是正確的。但是表達方面比較複雜,有些沒有看懂。可見,解題 的能力是有的,只是表達能力還有待提高。

豆瓣產品經理的面試

再說說豆瓣上的這篇文章,那篇文章裡,面試官問了一個比較大的問題,那是仁者見仁,智者見智的問題,並且面試官並不滿意應聘者給出的答案,並在用其主觀意識強加一些東西給應聘者,並不斷地和應聘者糾纏。後來,面試官回複到“重點測了兩個問題:一是判別事情的標準和方法;二是在多種PK下產品經理的壓力反應”。

下面是我觀察到的:

  • 其一、這種似事而非的仁者見仁,智者見仁,一萬人有一萬個答案。所以,這種怎麼答可以的問題是很難有標準的,我認為豆瓣的面試官以這種問題來考查面試者的標準太有問題了。更好的問題是:比較一下新浪和twitter這兩個產品。
  • 其二、多種想法PK的壓力反應。這點沒有問題,如果有機會我想問問這位面試官,豆瓣產品經理們的PK各自的想法時是以這種糾纏的方式嗎?如果是這樣的話,那我很為你們擔憂啊。
  • 其三、很明顯,應聘者不知道面試官想說什麼,所以應聘者總是給出一些模稜兩可的回答。回答得很政客,呵呵。
  • 其四、問的問題都是一些假設性的問題,假設技術人員不可溝通。人家說了,還沒有見過不能溝通的情況。結果還要繼續追問。這樣你既要觀察不到你想要的,也搞得大家不愉快。更好的問題的:“請你給一個你和一個很難溝通的人溝通的樣本”,或是當應聘者說了“堅持己見”的時候,也應該追問“能給一個你堅持己見的例子嗎?”。
  • 其五、整個面試過程完全是在談一些虛的東西,就像天上的浮雲,一點實實在在的東西都沒有。比如:“你以前設計過什麼產品?”,“你和你的技術團隊是怎麼合作的?”

這是一個完完全全失敗的面試,這個面試官根本不懂面試,甚至工作方法也可能很有問題。也許他只是想找一個能夠在工作中附和他的人。

朋友的面試

最後說說我那個朋友的面試,我的這個朋友學習能力很強,也很好專研,工作中解決了很多很困難甚至很底層的問題。他做軟體開發時間並不長,但是他對這個行業很有熱情,也很執著,並有著相當不錯的技術功底。這天他遇到了一個面試官,這個面試官的技術是很強大的,在Linux下研究核心 ,也為Linux的核心貢獻過代碼,熱愛開源的人,同時也實現過一個很強大的圖片的分布式檔案CDN系統。博士。根據朋友的描述,這位面試官,主要問題了三個問題,一個是關於非同步,一個是關於效能調優的,還有一個是關於學習能力的。

  • 問到非同步問題,我這個朋友說到了多線程中的非同步呼叫,但是他可能問的是網路或是業務中的非同步,要不然就是Linux 核心中的非同步,當然他也沒有說清楚,但他很不滿意我朋友的答案,並讓我朋友回去多看看書。
  • 問到效能調優的問題時,我這個朋友說了效能調優分三級,業務級,指令級和CPU級,並舉例說了使用了一個叫VTune的效能分析工具。面試官卻說原來你只懂Windows,有點不屑,並說他只會使用商業工具,更不屑。
  • 當我朋友向他澄清問題時,面試官只是搖頭,歎氣。並在應聘者作答的過程中不斷的打斷對方。

我的看法如下:

  • 對於非同步來說,我認為這是一種設計或是一種想法,可能會有很多種不同的實現方式,在不同的情境中會有不同的用法。面試官並沒有考查應聘者對非同步方法呼叫的理解,也沒有考查非同步方法呼叫可以用來解決什麼,非同步方法呼叫的優勢和劣勢,等等。只是覺得應聘者沒有給出他想要的答案。
  • 對於性調優的問題,我認為應聘者的思路和知識都很不錯,還有使用VTune的經驗。無論使用Windows還是Linux,無論使用商業的還是開源的Profiler,很多東西都是相通的,怎麼能夠因為這個東西不對自己的口味而下結論。為什麼不向人家學習一下VTune呢?使用工具只是操作技能啊。
  • 面試官應該是用微笑來鼓勵應聘者的,而不是用搖頭和歎氣,頻繁打斷對方也是一個相當不好的習慣。看來這個面試官很不能接受不同的東西。

這位有很不錯的技術能力的人,看來並不適合做一個面試官,因為他面試的東西都只在知識層次,而且這位面試官有強烈的喜好和傾向,所以,他必然會錯過那些有能力但並不合他口味的人。

哎,面對這樣的面試官,大家傷不起啊!

(全文完)

(請勿用於商業用途,轉載時請註明作者和出處)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.