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