為什么時至今日編碼面試依然這么糟糕?
作為候選人,最重要的是要記?。?5 分鐘的編碼面試并不能準確評估你是否會勝任這份工作。 高錯誤否定比率意味著你絕不應該為被拒絕而感到難過。拒絕通常只意味著在一個人工設定的、時間緊迫的環境中,你需要更多練習來展示你已具備的技術能力。
“我們有 90% 的工程師在用你寫的軟件,但你不能在白板上寫出反轉二叉樹的代碼實現,所以你被拒了!”
Homebrew 的創始人 Max Howell 在 2015 年的這條推特吐槽了谷歌的編碼面試,收到了 1 萬多個贊,引發了熱烈的討論。但是一直到 2019 年的現在,編碼面試仍然在互聯網面試中占據重要地位,一直被吐槽,從未被動搖。本文作者曾是一名經歷編碼面試被拒的候選人,后來又成為了一名 Facebook 的編碼面試官,他在文中分享了這種視角的變化,深入分析了編碼面試占據重要地位的原因和一些改進的想法。
你很緊張。電話面試即將開始。這可能是你今年獲得理想工作的唯一機會。這一切都歸結為一點 —— 你要在 45 分鐘內證明你解決問題的能力和編碼水平。
電話突然響起。
你接起電話,只能聽到心跳的聲音。在簡短的寒暄之后,面試官將第一個問題粘貼到你的共享編碼環境中,并開始解釋問題。
你的大腦一片空白。你太緊張了,在巨大壓力下你無法清晰地思考。
你不停地看表。5 分鐘過去了。
沉默。
你知道面試官一直在等你說些什么。你試圖用你的想法打破沉默,但這只會破壞你的思考過程。你又看了看表。20 分鐘過去了。
你很驚慌,不知不覺面試官說時間到了,你有機會向他們提問。
你的心情很低落。
你沒有機會進入下一階段。但你還是心不在焉地提了幾個問題。
通話結束,幾天后你收到一封拒絕的郵件。
理性上,我知道我已經足夠好了。但經歷過幾次這種可怕過程之后,我開始失去信心。
我可以告訴自己,我比大多數人更懂得如何編寫代碼。我已經搭建了多年的網站和應用程序,其中一些被成千上萬的人使用。我以良好的成績獲得了牛津大學的計算機科學學位。但在感性上,一連串被拒絕的痛苦仍然困擾著我。
我把這種痛苦轉化為擅長編碼面試的決心。我買了一塊白板、一些馬克筆和一本《程序員面試金典(Cracking the Coding Interview)》。
幾周后,我完成了書中所有的題目。對于每一個問題,我都在白板上寫出代碼,并且說出我的思考過程,然后把代碼輸入到筆記本電腦的 IDE 中。我寫了一些測試用例來保證我的解決方案是有效的。我也看了書后的參考答案。對于我犯的每一個錯誤,從小的語法錯誤到算法使用錯誤,我都把它記錄在文檔里。在開始下一個問題之前,我會復習所有的錯誤。
下一輪面試進展順利。我收到了多個 offer 并決定加入一個倫敦科技創業公司——Improbable。
在 Improbable 工作了一年后,出于各種原因我決定再找一份工作。我不得不再次進行編碼面試,但距離上次訓練已經有一段時間了,所以我需要更多練習。我對 LeetCode 和 HackerRank 上的題目重復了同樣的過程。LeetCode 高級訂閱提供了一個巨大的題庫,里面的題目按提問的公司分類,并且按提問頻次排序。這種方式非常好,我可以把精力集中在最常見的問題上。
在這輪面試之后,我收到了 Facebook 的 offer。
我現在已經在 Facebook 工作兩年多了,發現自己變成了在手機另一端面試其他候選人的角色。我經??吹胶蜻x人不能克服自己的緊張情緒,犯下和我相同的錯誤。我知道這不能代表他們作為軟件工程師的能力,也不是衡量他們未來工作表現的一個特別好的指標。
那我們為什么還要這么做呢
對我來說,我在工作中表現是否良好并沒有因為我學習并通過編碼面試而改變。但是我能夠學習和通過編碼面試的事實證明了我擁有工作所需的原始技能。
如果有人可以通過編碼面試,他們很有可能擁有在工作中取得成功的技術技能 —— 他們將會是一個很好的員工。如果有人沒有通過編碼面試,他們仍然很有可能成為一名出色的雇員。
讓我們再進一步分析一下。本質上講,面試是一種從候選人中提取信號的方法,這些信號可以預測他們是否會在工作中取得成功。像任何涉及分類的預測任務一樣,預測結果有時是正確的,有時候是錯誤的。
當你和候選人時間有限時,你可以提取的信號是有限的,你的評估準確性會降低并且會犯更多錯誤。
當你錯誤地認為某人是一個出色的員工時,這是一個錯誤的肯定。當你錯誤地認為某人是一個糟糕的員工時,這是一個錯誤的否定。
事實上,對于公司而言,錯誤的肯定是比錯誤的否定的問題要大得多。招聘錯誤的人的成本非常高,新員工最初是公司的凈損失,因為他們必須經歷昂貴的入職上手期,這段時間他們不僅沒有生產力,而且還會占用其他人的時間,與此同時仍然要拿著報酬。如果新手期過后,你必須要解雇候選人,你將永遠收不回這項成本。如果由于該國的就業法律很難解雇員工,那么成本還會飚升。
另一方面,拒絕一個好的候選人的成本非常低。隨著優秀候選人數量的增加,拒絕一個好的候選人的成本會更低。
在任何二元分類任務中,都有錯誤肯定比率和錯誤否定比率。你可以更改分類閾值,預測某人為肯定而非否定的閾值,以優化這些比率。
在這個情況中,
- 錯誤肯定的比率是:(你招聘的不良候選人數)/(你招聘的人數)
- 錯誤否定比率是:(你拒絕的合格候選人數)/(你拒絕的人數)
當你提高閾值(雇用要求)時,你以增加錯誤否定比率為代價來降低錯誤肯定比率。這意味著那些擁有大量求職者并在新員工中投入大量資金的公司更傾向于提高他們的門檻。
這個系統通常對公司很合適,這就是它沒有一直沒怎么變化的原因。但它對候選人個體就不太合適了,單個候選人只是求職者大池中的一個分子,在這個系統中運氣變得很重要。
由于面試表現與工作表現并不完全相關,因此經常會發生公司拒絕的那些候選人,比他們招聘的人能更加勝任這份工作。
編碼面試的情況尤其如此。在解決傳統編碼問題方面花費更多時間的候選人可能更有優勢,而他們在現實世界中解決真實問題的經驗比較少。
看看 Homebrew 的創始人 Max Howell 的這條推特:
如何改進系統呢?
面試的目的是從候選人那里提取足夠的信號,以預測他們是否能夠勝任工作。如果你有完全準確的預測,你可以招聘到所有勝任本工作崗位的人,這對公司和候選人來說都很完美。
一種幾乎完全準確的方法是在一段固定的時間內給候選人一份工作,如果他們成功了,就給他們提供一份永久的工作。這就是實習,延長版的面試。問題是這對公司來說是一項風險投資。這就是為什么實習機會也依賴于編碼面試。
實際上,公司從候選人那里獲取信號的時間和資源有限。候選人通常只有有限的時間進行面試。在這些時間限制內,公司希望收集作為軟件工程師成功所必需的幾個關鍵信號。
作為一名面試官,我希望看到候選人掌握基礎的數據結構和算法知識。通過討論其他方法和利弊權衡,他們可以利用這些知識為問題提出算法解決方案。我希望看到他們用編程語言編寫解決方案代碼,解釋時間和空間的復雜度,走查他們的代碼并予以測試。
因此,如果你只有 45 分鐘,這種編碼面試的普遍形式確實是有意義的。
改進編碼面試
話雖如此,白板是不必要的。如果你沒有在白板上編碼過,你會感覺有點奇怪并且被干擾。因此,如果候選人更喜歡使用鍵盤,公司應該讓他們用鍵盤。你不會想因為候選人不喜歡在白板上編碼而拒絕他們的。
作為面試官,另一件要改進的事是選擇問題。最好不要選擇在一些數學或計算機狹窄領域中的問題,同時這些問題還需要重大的創造性思維或特定領域知識才能解決。理想情況下,候選人應該能夠邏輯推理并逐步迭代得出最佳解決方案。你不會想因為候選人在 45 分鐘的面試中沒有靈機一動得出答案而拒絕他們的。
最后,讓候選人放松是很重要的。當你的思維在競爭和壓力之下時,很難做到合乎邏輯有條不紊。通過幾個他們過去最喜歡的項目的快速問題進行面試,可以很好地平息候選人的緊張情緒。你不會希望因為候選人發現時間緊迫、編碼壓力很大導致沒發揮出應有水平而拒絕一個候選人。
但除此之外,如果不放開時間限制,很難提高面試信號的準確性。
獲得更多信號
一些公司會請候選人把一個任務帶回家來做,以消除時間壓力,并會設想一個更復雜的編碼問題,以提供更多的信號。
有些公司會通過多個階段的面試來收集更多信號,所以期望候選人能休幾天假來進行面試。
有些公司會進行更多種類的面試,測試更多實用技能,例如瀏覽大型代碼庫或者構建與某些公共 API 交互的 React 前端程序。
雖然這些方法提供了更好的信號,讓公司向優秀候選人提供更多 offer,但也需要占用候選人的很多時間,這會使面試經歷不太愉快。問題是,如果候選人一次申請多家公司,而每個公司都有極其耗時的面試流程,那根本就不可行。
面試即服務
對此的一個解決方案是統一多個公司的編碼面試流程。獨立的編碼面試服務可以比任何一家公司花費多 5-10 倍的時間面試候選人,讓他們能夠更清楚地了解候選人的技術能力,減少錯誤否定比率,同時保持很低的錯誤肯定比率。這將為候選人提供更有效更愉快的體驗,因為他們可以避免在多個公司重復相同的面試過程并且避免依靠運氣。這樣可以釋放公司的資源,使公司專注于最終的非技術性面試,如團隊和文化契合度面試。像 Triplebyte 這樣的公司已經在努力嘗試這一做法。但他們似乎更多地將其用于篩選,而不是完全取代技術面試。
我認為用更準確、統一和獨立的版本替換大公司自己的技術面試流程的主要挑戰是獲得他們對流程的信任,同時允許在評估特定技術技能和應聘水平方面進行定制。
最后的想法
作為候選人,最重要的是要記?。?5 分鐘的編碼面試并不能準確評估你是否會勝任這份工作。 高錯誤否定比率意味著你絕不應該為被拒絕而感到難過。拒絕通常只意味著在一個人工設定的、時間緊迫的環境中,你需要更多練習來展示你已具備的技術能力。