一般來說,一線成熟企業技術崗位的典型招聘流程分為以下幾個步驟:
初篩:一般由直接領導的技術經理或HR進行,重點考察教育和工作經歷
一面:一般由可能直接與之共事的工程師進行,重點考察基礎和工作能力
二面:一般由直接領導的技術經理進行,重點考察技術深度、廣度和發展潛力
HR面:由人力資源部門進行,重點考察入職時間、職業規劃、薪資要求等
當然,各個公司情況是不同的,有的公司可能會在面試前設置筆試或電話面試,有的公司會有兩輪以上的技術面,有的公司會有由兄弟部門再把關的交叉面,有的創業公司甚至可能只有CEO或CTO親自出馬的一輪面試……
在為58趕集集團工作的最後一年裡,我面試了近百位求職者。今天我想粗略地梳理總結一下,我關於技術面試所沉澱下來的思考。也許你應該先去讀讀我之前發表的這幾篇文章:《程式設計師最核心的競爭力是什麼?》、《N年工作經驗真的有用嗎?》、《怎樣才算「精通XX」?》、《工資真的越高越好嗎?》
給誰面試機會?首先要明白的是,發起招聘的並不是一家公司,而是一個具體部門的技術經理。技術崗的簡歷來源主要有兩個渠道:行業垂直招聘網站 、HR或員工內推,在特別緊急的情況下,還會啟用獵頭。
招聘部門總是更歡迎那些有過類似業務開發經驗並使用相同技術棧的員工,這樣溝通成本會低很多。在一線成熟企業(比如某度和鵝廠)呆過一年以上的求職者也更有機會獲得面試機會,這是因為信任背書的力量:能通過一線成熟企業的面試,並順利度過實習期的人,不會差到哪裡去。
另外根據招聘部門情況不同,有時需要能攻堅能帶團隊的資深工程師,有時需要進來就能幹活的一線工程師,有時需要的是基礎好可培養的新人。當時我所帶領的團隊由於部門整合剛剛進行大換血,嚴重缺少人手,所以需要的是進來就能幹活的人。
在剛開始招聘時,我認為所有人應該都擁有平等的機會,自己也缺乏從簡歷中篩選的經驗,於是採用海面的策略,只要不是應屆畢業生的求職者只要投簡歷就約面。在面試了數周后發現,面試的通過率實在太低,於是不斷總結思考,調整初篩策略,後期我所使用的策略是這樣的:
優先考慮2-3年工作經驗的人,因為工作才一年就跳槽的人大多不夠成熟,而工作多年還沒升管理崗又換工作的人大多古板平庸,技術棧僵硬,還自恃甚高;
不考慮從編程培訓班畢業的人,他們中的大多數人基礎不紮實,且缺乏自主學習能力;
不考慮一年內換過多次工作的人,因為這說明他浮躁且缺乏思考能力,經常做出不靠譜的決策;
不考慮在簡歷中多次提到「精通」字眼的人,因為這說明他不僅不精通,而且並不明白什麼是精通;
不考慮在簡歷中出現多處明顯拼寫錯誤和錯別字的人 ,因為連簡歷這麼重要的文件都不知道review的人,完全沒有責任心可言;
以上內容可能會讓部分朋友覺得不適,所以我需要特別說明一下:我並不是歧視工作經驗少或者從編程培訓班畢業的人。 近年來,大部分一線公司在招聘時對學歷的要求漸漸都從大專升級到了本科,但這並不是在歧視大專生,其邏輯是一樣的。
一年工作經驗、從編程培訓班畢業以及大專生群體中當然不乏出色的人才(我自己就是大專),但佔比實在太低。在做人員儲備的時候,標準可以適度放寬;但在鬧人荒的時候,有限的面試資源只能分配給合格概率更高的群體。
怎麼安排面試?程式設計師的面試一輪通常是一個小時,由於雙方的信息不對稱,對求職者的考察往往不夠全面。有些一面表現非常出色的人,二面就原形畢露;也有一面表現平平,二面卻有驚人之舉的。在有限的時間裡,必須儘量獲取更多的信息,才對求職者的能力作出更準確的判斷。
我會儘量避免在早上安排面試。一方面,面試雙方都可能因為高峰期堵車而導致遲到;另一方面,早上可能會有一堆積累的事務要處理,PM討論一下需求,QA提兩個BUG,回復完郵件,精力就已經消耗得差不多了,馬上又臨近飯點,飢腸轆轆下很難集中注意力進行面試。
因此,我一般會把面試安排在自己精力最充沛的時間,也就是下午3點-5點之間,在午休完處理完所有緊急事務之後。這個時間段也躲開了上下班高峰期,不太可能因為交通原因而遲到。
確定面試安排後,我會打電話通知求職者面試時間,並通過郵件發送面試地點、交通路線和注意事項,並要求對方收到後進行確認回復。在面試前1個小時,我還會再次打電話核實對方的安排。
有的求職者接受了一個Offer之後,就沒把其他公司的面試放在心上,然而這樣會浪費面試官的時間和精力,留下很差的印象。我甚至還遇到過個別奇葩求職者,完全忘掉了已經安排好的面試,居然還能厚著臉皮提出改時間再約……
面試時最應該考察什麼?面試經驗不豐富的求職者,往往一開始會表現得比較緊張。所以在走向面試地點的路上,我通常都會閒聊幾句前公司夥食如何之類的話,目的是拉近距離感,緩和一下緊張的情緒。在面試正式開始前,我還會先讓求職者進行簡短的自我介紹,讓他儘快適應這個陌生的環境,並調整到讓雙方都覺得舒服的聲線。而我則會認真地傾聽並不時點頭反饋,讓求職者感受到我們更像是在進行一場對話,而不是考試。
一場面試,不外乎是從能力和潛力兩個方面來考察求職者。
1、能力:主要考察求職者掌握了多少知識與技能,以及擁有多少實戰經驗。
事實上,這些在求職者的簡歷裡都已經寫得很清楚了,只多不少。能來參加面試的求職者,其簡歷上所描述的能力必然已經滿足了招聘者設立的基本條件,沒有人會願意在不夠格的簡歷上浪費時間。所以面試官的工作主要是驗證簡歷上面描述的真實性和可靠性。
只要求職者在面試中的表現能充分印證簡歷上的描述,最好再能表現出一點點超出預期的地方,就能讓招聘者滿意。因此求職者最忌諱的,就是在簡歷上對自己的經歷和能力進行不實的描述。比如明明只分擔了某系統中的一個模塊,非寫成整個系統是自己主導開發的;明明只是寫過一個demo,就說自己精通XXX……
由於面試的時間短暫,所以 面試官只能對求職者的經歷和能力進行抽樣考察。我在考察求職者的工作經驗時,一般會讓他先挑一個最有把握、最能展示自己實力的項目,然後讓他講解這個項目,並追問一些技術細節和實現方式。如果這個過程中發現他對這個項目其實並不了解,說不清楚核心邏輯是怎麼回事,那其他的就不用再問了。
另外,還有一個難以從簡歷判斷,只有當面才能考察的重要能力:溝通能力。溝通能力強的人很容易理解他人的意圖,也能清晰地表達自己的想法,和他們合作會讓人感覺很放心;而溝通能力差的人則是團隊的噩夢,你總得在他們身上多操份心,否則他們可能到了上線前最後一天才會告訴你任務完不成,你懂得。
2、潛力:主要考察求職者的品質、習慣和態度。
這個人是否誠實?是否能客觀地認識自己?會不會不懂裝懂?
這個人是否熱愛學習?喜不喜歡讀書?讀完有沒有行動?
這個人是否願意去琢磨事物背後的原理?有沒有刨根問底的精神?
這個人是否有總結和反思的習慣?曾經犯過哪些錯誤?
這個人是否有優化和控制風險的意識?是否有追求完美的精神?
……
以上任何一個話題展開來,都可以寫一篇長文,這裡限於篇幅不便一一細講,等我有機會再撰文和大家分享。
比如說, 我最討厭的就是不懂裝懂的人,這種人說話完全不負責任,想到什麼張口就來,還底氣十足。和對事實真相的探索比起來,更看重自己在別人心中的形象,演著演著連自己都相信自己真的已經懂了。這樣的人真的很可怕,因為關鍵時刻如果你不懂,他就把你給蒙了,到時候怎麼死的都不知道。
再比如說,我堅信學習力才是一名程式設計師的核心競爭力,如果有兩位能力相當的應聘者,那我一定會選擇更會學習、更會分享的那一位。因為能力只說明了他現在處於什麼位置,是一個衡量積累量的絕對值;而學習力決定了他今後能走多遠,相當於速度和加速度。能力可以通過時間來不斷積累,而學習力想要發生蛻變的難度是不可想像的。
什麼才是最有效的面試題?大公司很喜歡用算法題來面試,然而一來算法在工作中的實用性並不高,而來很容易被求職者提前刷題應試,所以一直被人詬病。而直接問一些知識類的問題,感覺又很low,容易被求職者diss。那到底什麼面試題才能有效地考察求職者的能力與知識面呢?
我特別喜歡下面這個從前任領導王磊那裡得來的面試題:
假設你所負責的一個api接口正常的請求響應時間在50ms以內,某一天突然監控報警,發現很多線上請求的響應時間都超過了500ms,該如何定位並解決問題?
要迅速定位一個未知的問題出在哪裡,這需要紮實的經驗基礎和清晰的思維能力,以及問題分解和隔離調試的意識。通過這個問題,能夠全面考察求職者的知識面及分析和解決問題的能力:
在招聘的後期簡歷大增,一一面試根本安排不過來,只能先進行15分鐘的電話面試。我就只問這一個問題,然後追問下去,很快就能判斷出這個人到底是行還是不行。只要節奏明快,層層遞進追問,也很容易辨別出求職者是真有經驗還是提前準備過。能通過電面的,當面面試的結果也都是很滿意的。
大家可能都玩過通過問「是與不是」來猜詞的遊戲,有一種比較無恥的合理策略是:記住對方問過的所有問題,在符合條件的所有答案集合中不斷地切換答案。其實這個思路也是完全可以用在面試中的。
一開始,我會先假設一個導致問題發生的原因,比如網卡故障、DB連接被打滿、某個同步調用的服務異常……如果求職者沒有對整個流程的主要環節進行分析判斷,那就算他憑直覺(或運氣)找到了我預設的問題原因,我也會合理地切換答案,讓他繼續進行思考和探索,直到他表示「沒辦法了」為止。
大多數人只知道按自己曾操作過的模式,去解決自己曾解決過的問題。最典型的是一上來就去翻SQL慢查詢,我說沒有慢查詢,他們就一籌莫展了。要知道,現實工作中我們遇到的問題,大多都是以前沒有經歷過的新問題,如果只會靠百度找答案的話那就完蛋了。
而優秀的求職者知道如何通過設計針對性的測試,來迅速縮小問題的範圍。他們會有條不紊地提出一系列問題,排除最有可能的原因:上線事故、遭受攻擊、流量變化、服務異常……這些都是多年處理問題的經驗沉澱,可以說是處理問題的「緩存」。然而優秀者並不依賴緩存,當緩存沒有命中時,優秀者也具備按索引查找的能力,必要時還可以啟動全表掃描。
該不該提前結束面試?不管面試進展如何,我每次都會用足一個小時,對此領導頗有微詞,認為我在浪費時間,有些人聊上15分鐘就可以打發走了。而我覺得面試是雙方共同選擇的結果,雙方的時間是等價的(實際上由於路途往返的原因,求職者時間成本會更高一些),所以我應該給求職者足夠的時間和展示機會。我總會把事情往好的方向考慮:
會不會我正好問到的是他不熟悉的領域?
他是不是有點緊張,沒有發揮好?
……
退一萬步講,儘管這個人明顯不能滿足招聘的要求,但由於每天下午的日程安排都很緊湊,就算提前結束了面試,多出來的一點點碎片化時間也無法拿來做高產出的工作,只能被無謂地消耗掉。
與其這樣,我更願意在接下來的時間裡,讓他多積累一點面試經驗,幫助他發現自己的問題出在哪裡,給他一些可行性的建議,對他產生一些好的影響,讓自己這一個小時變得更有價值一些。哪怕就算是幫求職者做下職業規劃,順便給公司做下正面宣傳也是好的。
沒有達到預期的目的,並不一定就在浪費時間。一次理想的面試下來,無論結果是否通過,面試雙方都應該得到了成長。在面試過程中,求職者和我的知識體系發生直接碰撞,雙方都有可能得到思路上的啟發,並認識到自己在某個領域的認識上不夠完整和嚴謹。通過向求職者追問和解說,我不僅鍛鍊了自己的表達和總結能力,也鞏固並強化了自己的知識體系。
不過,我回過頭來也需要反思:
為什麼這名求職者能夠通過我的初篩?
我在哪些環節還可以改進,以避免類似的情況再次發生?
……
面的人多了,我就不禁想在為數不多的通過面試者身上找到一些共同的特質,藉此提升以後面試的效率和準確率。結果發現,應聘者大致可以分為以下兩類:
有的人想讓自己變得更優秀。他們會把面試看作一次學習和成長的機會,當遇到不會的問題時坦誠自己不知道並謙虛求教。他們在說「不知道、沒用過、沒聽過」時,不會覺得不好意思。因為他們明白「全知全能」是絕無可能的,也是毫無意義的。
有的人只是想讓自己看起來很優秀。他們會把面試當作看作一次表演,為了維護自己的形象,即便不懂也要裝懂,演著演著連自己都相信自己真的已經懂了。當面試者指出他們的問題時,他們便進入防禦戰鬥姿態,千方百計要證明自己是強者。孰不知只有弱者,才會想用語言來證明自己很強。而真正的強者,只是默默地站在自己「做到」的結果旁邊。
下面這張圖引自劉傳的「認知學習法」課程:
不同的思維模式,決定了人是持續成長還是固步自封。然而只要你能意識到自己的思維模式,就可以改變它。就像給大腦刷一個新版本的作業系統一樣。
你,是哪一種?
(本文初稿寫於2017.3.13,經重新修訂與補充章節)
我堅信
一個人的價值
並不在於他得到過什麼
而在於他給這個世界留下了什麼