「8000字攻略」如何創建有效的技術面試流程


導讀


成功的技術面試需要三根支柱:TCP,Tool(工具)+Challenge(問題)+Process(流程)。服務全球100多個國家、數千家企業的全球知名技術面試平臺——HackerRank經過對平臺上著名企業和頂級工程師實操案例的分析,針對技術面試流程梳理出了一份詳盡的實踐指南。八哥君(小編)吐血翻譯,全網獨家,粉絲專供!

「8000字攻略」如何創建有效的技術面試流程



步驟一:在你開始動手做之前


“問題並不重要。首先重要的是清楚地明白你想要什麼。” Interview Kickstart CEO Soham Mehta 說。花80%的時間想清楚你要什麼,再用20%的時間設計面試中要給候選人出的問題。
思考能力和技術經驗是優秀工程師兩項最重要的核心價值。算法方面的問題最適合考察思維能力,而技術經驗則要通過知識性的或者基於工具的問題。
但是大多數管理人員沒有意識到,最好是將上述兩個維度的考察分開來進行。在相同時間段同時評估這兩方面素質會有帶來很多的限制,進而縮小你候選人的可選範圍。那怎樣才能知道你的需求是什麼呢?這很大程度上取決於你的公司規模。

A.挑選聰明的高級工程師

像Google和Facebook這樣的大公司,他們在面試中所問的算法和數據結構方面的問題不太有名。如果你有比較大的團隊,候選人思考能力的重要性要高過技術經驗。因為你可能擁有很多高級工程師來培訓資歷尚淺的新人。畢竟那些聰明的人才會非常快地學會具體技術。


這是被一項有85年曆史的組織研究理論所支撐的:“認知能力(或智力、思考能力)測試是對各個領域的成功進行預測的最好方式。”算法問題,比如說問二叉樹問題,在編程領域就相當於是認知能力的測試,因為它們評估的是推理、問題解決能力和批判性思考技能。


有意思的是像簡歷上的文憑,包括教育程度、年齡(或經驗)和學習成績等則是最差的預測指標。
有人可能會爭論說,基礎性的問題更適合於新人或者說年輕的工程師,畢竟他們的經驗尚淺。不過我的意思是,如果是一個資深的工程師,怎麼可能在他所處的位置上還需要用到二叉樹呢?McDowell, Mehta和其他我們所認識的技術經理幾乎都強調,要考察高級工程師的基礎性問題是基於兩方面的原因:
第一、 如果算法問題是對初級工程師的認知能力的標準測試,那麼你需要對高級工程師也要一視同仁。否則,你的團隊當中既有聰明的初級工程師,也有不那麼聰明的高級工程師。
第二、Sonos的開發主管David Taylor喜歡問資深一些的工程師關於數據結構和算法的問題,他說因為“如果候選人避開這些問題,你就要打一個大大的問號。”這是一個淘汰掉那些自認為厲害到不願捲起袖子親自幹並且不斷心態歸零的傢伙們的方法。

B.尋找有經驗的人才

小規模的公司,很可能關注實戰的經驗勝過認知能力的優劣,因為他們等不起招那些資深的工程師來臨時學習項目所需要的技術。通過設計便於反映技術經驗的問題,能夠幫你招到能夠在入職第一天就可以著手開發一個新應用的人。所以,如果你是一個名不見經傳的初創公司,你最好把注意力發在構思非常具體的問題上。

步驟二:設計有效的問題

在步驟1當中,我們已經指出你需要評估哪一方面是你更看重的:思考能力還是技術經驗?現在我們將討論設計相關問題的關鍵。一般來講,我們發現有三個方面的技術能力你需要考察候選人:

  • 他(或她)的基本功是否紮實?
  • 技術經驗積累的深度如何?
  • 對問題的思考深度如何?

前兩個問題可能都不需要通過代碼面試就能評估。第三個問題最好是親自來溝通。這也是這份指引最長的部分,因為我們提供了每類問題相關的具體案例以及企業最容易犯的錯誤。

設計算法問題

有個問題需要立即進行確認:候選人會編程嗎?這看起來像是個廢話。但是 ,多年來,那些著名的工程師不斷指出:“相當多數所謂的程序員在進行代碼面試時卻不能寫出最簡單的一行代碼。”Jeff Atwood說。他是業內非常有名的程序員,也是Stack Overflow的聯合創始人。你可以讓他們來解決一個基本的代碼問題來進行篩選。你的第一個問題可能像下面這道題一樣簡單:
01.給定N個不同的數字,您可以形成多少個子集?
答案:2^N
02.給定長度為N的字符串,該字符串存在多少個排列?
答案:N!, 或者 N x (N-1) x (N-2) … x 1

多項選擇題


多項選擇題對於候選人來講比較簡單和容易。提供一組問題,每個問題都有多個選項,減少隨機勾選就能選對答案的可能性。
下面是一個考察經驗的多項選擇題:

下面哪一項正確描述了載入程序?
A.加載程序使在活動或片段中同步加載數據變得容易。
B.加載程序使在活動或片段中異步加載數據變得容易。
C.加載程序使在活動或片段中異步加載數據變得不容易。
D.以上皆不是。

下面是針對算法的多項選擇題:

在具有n個元素的二進制搜索樹中搜索元素所需的時間為:
A.0(1)
B.0(log2n)
C.0(n)
D.0(n log2 n)


代碼補全


代碼補全是另外一種對候選人進行初步考察的簡便方法。代碼補全是指候選人需要把一段有空白的代碼補充完整。一些最出色的程序員會花費花費非常多的時間來看源代碼。你可以提供代碼給候選人,留出一些空白讓他完成,這對他來講比較有趣,在此過程中又可以考察他的批判性思考和審查別人代碼的能力。


另外,代碼補全是一種趣事兒。我們最近針對平臺社群裡的成員發起了一個代碼補全的系列挑戰賽。這是迄今我們組織的活動當中參與度最高的一個。你可以找一些代碼補全的問題作為自己設計類似問題的參考。

設計考察代碼經驗的問題


與基礎性的算法問題不同,針對編程經驗的問題會更直接,因為它們依賴於某個特定領域或技術的經驗。舉例來講,關於客戶端服務器、多線程和Sockets的問題對於評估候選人對分佈式系統的熟悉程度是很有效的。
思考能力是預測人才未來的成功最好的指標,但是針對新手和專家有一個明顯的不同之處。


設計考察思考深度的問題


這與經驗的長短無關,而是你對問題的思考有多深。Taylor 認為那些領導過大型項目,比如:服務器、應用或者框架的工程師才能算作專家。因為有了這些領導經驗以及方法,專家相比於新手能夠在更高的層面以直覺看待問題,這是被科學方法所證實的。Dreyfus & Dreyfus(德雷福斯兄弟)分析了技能水平與心智運作之間的關係:

新手:

“新手根據明顯的規則和知識基礎來行動。他們需要深思熟慮地分析,行動比較遲緩,因為需要決策或者選擇。”

專家:

“專家則根據成熟的、全局性的理解來行動,是通過直覺而不再需要有意識的深入思考。這是由經驗產生效果,他們不會把問題和解決方案分開孤立來看,而是直接採取行動。”

另外一個激動人心的發現是通過功能性核磁共振(fMRI)測量藝術家中的新手和專家大腦中的血液流動情況。實驗結果與我們之前看到的一致:

新手:

在處理事物特徵(淺層次)的大腦區域處理加工信息。

專家:

在處理深度意義的大腦區域加工信息。


“藝術家思考畫作,而不是簡單觀察它們。”


你是怎樣來考察候選人思考深度的?你如何來來判斷 工程師是思考軟件而不僅是在觀察代碼?前面兩類問題(算法和經驗)可以通過直接的問題來自動考察,但是關於思考深度的評估只能親自來進行。你可以從簡單的問題出發,逐步設計出複雜到你自己難以解答的問題。


下面有兩種類型的問題可以便於你評估思考的深度:


A.開放式的問題:


如果一組候選人都通過了技術問題的考察,你可以問有關開發的整體策略方面的問題以評估他們的思考深度。Taylor發現像類似下面的問題比較有效:
“告訴我你曾經做過哪些對項目產生重大並且積極影響的事情,你是如何思考和規劃的。又有哪些產生了負面的影響?”
“我發現錯誤容易發生在技術人員徑直地去思考如何開發一個東西而不是思考什麼是應該開發的與(站在用戶角度)思考如果產品成功應該是什麼樣子的時候。”他說。
還有一些針對經驗深淺和領導力的開放性問題的例子:
1.你會怎樣來開發Gmail的搜索功能?
2.告訴一些你曾經看過或用過的爛代碼的例子?
3.你怎麼來評估你的代碼可以放到生產環境了?


B.把你的問題分拆為多個部分:


Josh Tyler,在Coures Hero負責開發,最近出版一本書叫《創建卓越的軟件工程團隊》。他認為針對高級工程師設計問題時,最有效的方法是問題的表述要有足夠多的空間來深度挖掘候選人的思考過程。例如,這裡是一個典型的優化問題:


“給您許多單詞,並且您必須找到每個單詞的頻率。在這裡,簡單的映射、數組、列表將不起作用。相反,您應該使用Trie,這裡是一種有效的數據結構。”


Greg Badros,Prepared Mind Innovations的創始人,他會把問題拆分成如下幾個部分:

  • 告訴候選人你會從簡單的開始,逐漸提出更復雜的問題;
  • 詢問單詞的頻率;
  • 確定他們在沒有寫代碼的情況下獲得簡單的映射解決方案;
  • 告訴他們會擁有多少內存(RAM)以及數據庫有多大;
  • 叫他們估算一下根據他們使用的語言需要多少時間來完成;
  • 如果時間會過長,讓他們替換新的存儲效率更高的數據結構,否則他們的內存會不夠用;
  • 當他們超出設計構想時,請讓他們儘可能地寫代碼。


問題清單


截至到目前,我們一直在討論的是根據你的需求會涉及的不同問題類型。現在我們開始解決具體如何設計問題。我們查詢了不同公司的比較成功的代碼面試問題,梳理出核心的模式出來。基於這些模式,歸納出以下五個常見的需要規避的錯誤,以確保每個問題都能很好的評估候選人:


你有正確的答案嗎?


這個問題似乎有點腦殘。但是當你知道有多少公司的代碼面試問題是錯誤的時候肯定會很驚訝。McDowell經常給不同規模的企業提供招聘流程諮詢服務,“我收到的企業題庫中,有10%的答案是錯的。”他說。背後的原因不是因為粗心大意或者是在輸入答案時出了一點小bug。問題的設計者執意認為他們的算法是正確的直到他們被證明是錯誤的。花點時間確認你的答案是百分之百正確的。然後,你的注意力可以轉向下一個。

你的算法問題足夠有挑戰嗎?


對於算法問題,McDowell測算如果有5%的候選人很快就有了解決方案,那意味著過於簡單了。面對既有一般又有優秀的候選人,簡單的問題很難將後者篩選出來。你的問題需要有足夠的難度以將拔尖的人才挑選出來。
在算法類代碼面試當中,你應當保證至少有一個問題只有20%的候選人能夠很好地解答。一個好的算法問題至少有兩個及以上的解決方案。其中一個是最優的。結果會將候選人的表現分出三個層次:
第一層(Tier 1):最優秀的那部分候選人會拿出正確並且出色的解決方案通過所有測評。


第二層 (Tier 2):中等資質的候選人會解答大部分的問題,其中一個算法問題的答案正確,但解法可能比較普通。他們的代碼可以正確地運行,不過大多數情況下時間不夠用。


第三層 (Tier 3 ):那部分連一道算法問題都沒有解出的候選人你肯定是不願意要的。如果你使用了一個類似HackerRank的平臺,你可以有足夠的時間完成一個測試評估,當然是在綜合考慮逐步增加的難度和較少限制的前提下。並非所有的評估都要有時間的約束。這取決於作為問題設計者的你評估時效是不是重要的指標。

問題的表述是否具體同時又體現了你公司的特點?


問題的表述越是貼近你的行業並且具體,越是有可能吸引到能夠通過代碼面試的高質量候選人。
對此我們做了一項實驗,對比兩個公司同樣類型的問題,不過一個的表述比較籠統,另一個則很具體。我們發現後者面試問題的完成率要高出前者10%。更有趣的是,我們不斷看到這樣類似的相關性。相比於籠統的、冷冰冰的問題,候選人對圍繞他們的任務來設計的問題更感興趣。
例如,VMware創建了非常具體又複雜的問題庫並可視化。你會邏輯中心控制器(Logical Hub Controller)問題與他們日常在處理的典型虛擬數據中心問題。將針對性的代碼面試替代簡歷後兩年,VMware發現:


每個季度都會節省工程師數百個小時的時間,這些時間僅僅是花在電話通知候選人已經通過代碼考察上面;相比於手工篩選簡歷,邀約候選人參加現場面試的成功率也得到提升。


對問題進行恰當表述的工作可能比較艱鉅,但對於高級工程師來講,這可能是個如何表達的挑戰。一個工程師如果能夠很好拆分問題和解決細化後的問題並把這兩個步驟有機整合在一起,那麼他很可能成為你的組織當中一個成功的管理者。


對於任何一個高級工程師來講,能夠拆分問題、找到模式同時系統性地攻破問題都是關鍵並且高階的能力。在我們的經驗當中,非常聚焦而又具體的問題可能會有比較低的完成率,但是卻有非常高的招聘成功率。這一現象與前面的章節(“設計考察思考深度的問題”)有關。

你排除掉了運氣或偏見了嗎?


如果一個候選人在解答問題過程當中被卡主了,那麼他們是運氣不好嗎?
區分這些因素(實力or運氣?)是很重要的,最好的辦法就是獲取多樣性的數據點。操作辦法是,在問題中設置不同的障礙,候選人在其中一個點上卡住了,你可以幫助他越過去,然後他們任然可以有其他的路徑來解決問題(後面你還可以利用其他點的來進行評估)。
舉個例子,考慮如下問題:
給你一組人群,有他們出生和死亡的時間(年份),請計算出人口最多時是哪一年。這個問題會有一打的解法,每一種都會包含一個新的挑戰:
第1個障礙:會來自任何任何一個正確解法。大多數的候選人會想出一種暴力算法(例如,每一年當中活著的人,接觸並數遍所有在那一年活著的人),但是有一些不會這樣做。如果碰上這樣的候選人,給他們提供一點幫助,看看這個是否只是他們在推理過程中的短暫失誤還是連續性的行為。


第2個障礙:候選人可能會注意到其實沒有必要重複計算每一年。你可以使用哈希表緩存這個數據。


第3個障礙:可能會意識到你只需計算第一個出生的年份和最後一個死亡的年份之間的年數。候選人可能會首先獲取那個信息,然後核算這些年數的值。


第4個障礙:事實上你只需計算第一個出生年份至最後一個出生年份。你沒有必要計算只有人死亡的年份,因為這些年份肯定不會出現人口的峰值。

你確定去除掉了所有的計算機科學行話或術語?


我們繼續討論,直到得出一個最優解決方案。極其優秀的候選人可能會一次性越過前幾個障礙得出解法,這會是一個非常好的預兆。提出類似包含有多重障礙的問題,你可以更有效發現候選人的表現是否有一個模式。
為了實現好的評估,你可以找你的同事進行事先測試。在發送給候選人之前讓至少2至3個工程師來實際解決這些問題。這可以幫助你問題中包含了哪些障礙,以及你希望候選人有什麼樣的表現。


要成為一個優秀的程序員得先有個計算機科學的學位,這是普遍存在的誤區。事實上,在一份調查中顯示只有40%的在職工程師擁有計算機科學的學位。在我們撰寫這些內容的期間,在一次TechCrunch的活動上,Wavefront CEO Sam Pullara 告訴我們,他同意這點。尤其是高級工程師很有可能對計算機科學教材的術語不熟悉。所以,要避免使用類似“state machine”或“dependency injection”這樣的術語。因此,為了避免將那些沒有上過計算機科學的課(或者已經記不得課程內容)的高級工程師候選人淘汰掉,要儘量少用那些包含了晦澀算法知識的問題。


步驟三:設定期望,讓候選人活躍起來


在步驟1之中,你釐清了自己的需求並且設計出可以幫到你篩選出能夠助你開疆拓土的工程師的問題。現在你應該聚焦在執行面試流程最重要的部分,那就是有技巧地與候選人溝通。
高級工程師喜歡有挑戰的,而不是無聊和浪費時間的問題。事實上,有幾把刷子的工程師會對那種冷冰冰的面試邀約郵件嗤之以鼻,因為需要花上他1到2個小時去完成一個之前聞所未聞的公司菜鳥級代碼面試。這是可以理解的,他們何苦呢?可能昨天晚上還在為一個正在(以這樣或那樣方式)改變我們世界的軟件加班到很晚。一個隨意設計和發送的自動化面試會被視作一種侮辱。因此在設計和發送面試邀約的過程中充分融入同理心是非常重要的。


如果面試郵件沒有很好的作解釋以及說明候選人為什麼會被邀約,那肯定會被一個高級工程師給忽略的。那些在不斷擴大招聘規模的同時還努力讓候選人感覺被重視的企業,才會贏得人才爭奪戰。
避免出現類似的問題需要注意以下幾點:
1. 要非常清楚你想問什麼和想得到什麼。不要讓候選人感覺你很唐突。這是確保不會把優秀的人才拒之門外很重要的一步。例如,你需要給候選人講明白你不會隨機選用那些在工作中用不著的問題來進行測試。反過來,類似二叉樹問題則可以考察候選人解決問題和批判性思維的能力。如果你發送的是沒有解釋和準備的代碼面試問題,你的面試工具會變成一種乾癟癟的知識測驗。你肯定會因此冒犯資深的工程師。


2. 評估面試的可能時長(一般在45分鐘到90分鐘之間),然後給候選人充足的時間來完成它。把面試的時長告訴候選人,說明面試不超過一個小時,你會有足夠的時間來進行面試。這樣可以簡單傳遞一個信息,你瞭解候選人非常忙,他們的時間是寶貴的,因此不需要特別倉促地答題。


3. 向候選人解釋為什麼要這樣做。例如,如果代碼面試替代了簡歷或者是前期的電話面試,告訴他們:“進行代碼面試意味著你不需要花更多時間和不同的工程師進行電話面試。”


4. 我們對大量的代碼面試題做了快速分析,發現相當比例的候選人沒有基本的計算機科學知識。大多數高級工程師並沒有立即去學習計算機科學知識。首先,在一項研究中,近60%的在職軟件工程師沒有計算機科學專業的背景;其次,即使他們有,也會因為時間太久而回憶不起那些在現實世界中無用的知識。


步驟四:面試結束後的評估

在步驟1~3中,你瞭解瞭如何針對你想招聘的工程師來設計出最合適的問題。但是當需要以不同的問題來考察不同的候選人時,怎樣的代碼面試問題才是好的?保持一致性會讓你收集到的信息有意義。


Memelli 發現,招聘企業經常在候選人進入下一輪面試時改變了之前設定的問題,從而把收集到信息破壞了。在完成前期的面試之後,需要把代碼面試的問題和接下來的面試需要考察的內容結合起來考慮。這是符合常理的——成功通過了線上的自動化代碼面試的候選人很可能在現場面試中也表現得很好。自動化的代碼面試是預測誰會在現場面試中表現得好的最好方法。


嘗試選擇之前在現場面試問過的問題,以觀察候選人會如何反應。這也可以幫助你把問題的表述設計得更合適。當然,這意味著在後面的現場面試中,需要把這些問題剔除掉。“所以,儘可能地把代碼面試的問題和現場面試的問題結合起來考慮。”


在面試過程中讓資深的工程師解答基礎性的問題可能會令其惱怒。簡單粗暴地給候選人發送面試邀約也會這樣。但是自動化的代碼面試是最客觀、有效地批量篩選候選人的方式。不僅考察候選人的思考能力,同時還通過算法和數據結構方面的問題評估他們對基本功的重視,是尋找最優秀的工程師的有力工具。

如果你設定好期望並意識到資深工程師可能有傲慢的複雜心態,你就可能會接觸到優秀的資深工程師候選人。你也要創建一套可複製的系統來組建和擴大工程師團隊。通過精心設計並且創建成體系的,可以考察基本功、技術經驗和思考深度的題庫,可以淘汰掉你原本寄希望於他來開發革命性的軟件產品但卻無奈缺乏基本技能的候選人。


分享到:


相關文章: