編譯 | 云昭
在招聘開發人員時,我們需要考核多輪面試來確保候選人的能力合格。在眾多的能力之中,我認為,原始編碼能力,幾乎可以說是最重要的品質。我可以很快地訓練一個人掌握某個領域的知識,但即便再廣泛深入實踐的訓練,也很難彌補缺乏原始編碼能力的短板。
那么如何在面試中,較快測試出候選者的原始編碼能力呢?我發現傳統的 coding 辦法并不好用,反而某些別的方式更能發掘到人才。
傳統方法的弊端
典型的 Coding 筆試是這樣開始的:“編寫一個函數,反轉字符串中單詞的字母順序。”然后在接下來的半小時或更長的時間里,候選人在白板上劃掉一些東西(或者也可以是共享的線上文檔)。
這種方法看起來能篩掉不少人,但其實作用很“弱”,根本達不到測試能力的要求。
首先,同樣的問題也會被傳來傳去,考生通常會非常努力地練習記憶答案。你是在考核他們的編程技能還是記憶答案的能力?
其次,這些問題通常是“吊詭”問題,需要某種深刻的洞察力才能提出 O(log(n)) 解決方案。在面試的時間范圍內,即使是最聰明的候選人,也幾乎從來沒有真正的洞察力。
這樣,面試主動權的天平向有利于面試官的方向傾斜。誰喜歡在法官面前笨拙地編寫代碼,而面試官卻將決定你未來幾年的職業前景?
最后,在白板甚至文本文檔上編寫代碼既不自然又緩慢。沒有人在白板或記事本上“畫”代碼作為日常工作的一部分。大家真正做的是:在一個 IDE 中用大量的 Google 來編寫代碼。
我在實踐中是如何做到這一點的
在實踐中,我面試候選人的過程一般是這樣的:
對于每一個新的面試周期,我都會創建一組預測輸出的練習,這些練習一開始很容易,然后變得更難。我當前的設置從一個基本函數調用開始,然后是多級函數調用,然后是遞歸,然后是 side effects 。這些通常都是“假裝”的功能,旨在讓應聘者迅速取得成功,并為我提供面試剩余部分的一些線索。
對于更高級的問題,我會從我寫的東西中提取代碼。目前,我考核的“難題”,是探索對“讀”操作和異步操作的同時進行的抽象能力,其他的,比如閱讀一段未標記的例程,它們執行大家相當熟悉的算法,例如排序或樹遍歷,以及從錯誤輸出中查找錯誤等。
舉個具體的例子
在向應聘者提問之前,我會根據與同事校準面試題,以便對如何衡量應聘者的技能有一個現實的期望。校準這些問題也有助于我完善它們,剔除令人困惑的部分。
在面試開始時,我會提前解釋:
一、我不是在考核語法知識。可以把我當成真人版的“谷歌”,我會告訴你一些函數或操作符的功能。
二、我不指望你能完成,因為沒人能完成。20 分鐘后我們會停下來。
三、我也不希望你得到正確的答案。如果答案是錯的,我很想看到你回去調試你的想法。這對我來說和其他東西一樣有價值。
面試過程如下:
- 我展示了一行被注釋的代碼,它將調用某個函數并返回一個輸出。
- 候選者閱讀代碼并預測輸出。
- 我取消對這行的注釋并運行程序,這樣他們就可以看到答案了。
- 如果答案與他們的預測不同,他們會回去解釋原因。
我會給候選人 20 分鐘的時間,讓他們盡可能地去運行更多的代碼。這給了我額外的時間去問后續問題。在面試報告中,我寫下他們運行了多少行代碼,以及他們表現出的優勢和劣勢。
顯然,這些編碼技巧并不是面試中唯一需要考查的東西。領域知識和文化契合度很重要,但我發現,閱讀代碼能很好地剔除那些不具備最重要的基礎能力的應聘者。
面試者如何提升技能
每年都有大量的開發者前來應聘,他們可能想知道如何提升自己的技能,以便在這樣的面試中表現出色。我的答案很簡單:多動手寫代碼,因為常規的練習是無法替代的。
如何練習?最簡單的方法是啟動一些你感興趣的、非瑣碎的次要項目。一個游戲,一個網站,一個應用程序等等。每周花 4-8 個小時研習這些代碼,讓它成為你喜歡使用的東西,并能引以為榮。此外,這樣也方便應聘者將來的面試呈現,比如將源代碼放在 github上,以便未來的雇主可以看到候選人平時的功底積累和工作方式。
希望這能有所幫助。
面試應當結合實際
事實上,所有編程工作都更需要代碼閱讀,而不是編寫代碼。能夠清晰地思考,并辨別出別人的胡說八道是至關重要的。
通過讓某人反轉字符串或排序數組來面試他們,簡直是在考核錯誤的能力。我不在乎你以前是否見過這個問題,是否像許多算法測試一樣記住了答案——唯一重要的是你能否思考、理解問題、設計和實施解決方案。能夠閱讀真實世界的代碼并說出它的優點和缺點,這比粉碎一個冒泡式的練習更能說明你的能力。
基于瀏覽器的編碼環境使情況變得更糟。在工作中,開發者所習慣的編輯器使用自動完成的建議、腳本、宏、代碼片段等進行調整。而在代碼考試中,卻經常使用 CoderPad 之類的東西,它不具備上述調整功能,而且不時會造成瀏覽器窗口關閉或其他情況,浪費更多的時間。
后記
開發者參與面試時,往往會被要求手寫一段代碼,這種做法在網絡上一直持有反對的聲音:“考察的背題能力”、“代碼寫得好,不代表能當面寫算法”等等。通過文中“閱讀一段代碼,要求候選人預測輸出”的面試過程,不失為一種有效的初步技術篩選手段,能節省淘汰不適合者的時間成本。 輸入代碼是工作中最不重要的部分。閱讀、理解和解決問題才是工作中更被重要的能力。畢竟如果讓面試者參加40-60 分鐘的編碼挑戰,你實際上只是在選擇速度最快的打字員。
從這種角度上看,面試時,閱讀代碼比手寫代碼更重要!