最簡(jiǎn)單的解釋:典型的工人去面試工程師職位,通不過(guò)面試是應(yīng)該的。(假設(shè)如描述所說(shuō)最難只問(wèn)到二叉樹(shù)。)
我反對(duì)面試官隨便網(wǎng)上找一道題就拿來(lái)問(wèn)的做法,我也反對(duì) @歸辰 所說(shuō)的只應(yīng)該考察工作上實(shí)際所需知識(shí)的做法,因?yàn)檫@兩者都基于一個(gè)錯(cuò)誤的面試思路,那就是用面試來(lái)考察你懂不懂什么的。面試不是用來(lái)考察你懂不懂什么的,而是用來(lái)考察你有沒(méi)有解決問(wèn)題的能力的,以及將來(lái)和你一起解決問(wèn)題是否容易。我知道中國(guó)絕大多數(shù)人在經(jīng)歷了十多年應(yīng)試教育后,無(wú)論是站在面試者的角度來(lái)看,還是若干年后成為面試官了從面試官的角度來(lái)看,都只會(huì)用這種方式來(lái)思考問(wèn)題——「面試」嘛,有個(gè)「試」字不就應(yīng)該跟「考試」差不多咯,而我們習(xí)慣的考試就是考察你是否懂某個(gè)知識(shí)咯,只要死記硬背就可以了。然而真正好的面試不是這樣做的,有興趣的可以去看我之前寫(xiě)的那篇《理想的技術(shù)面試過(guò)程》。
回到問(wèn)題上來(lái),我認(rèn)為正確的面試方式是這樣子的:現(xiàn)在你來(lái)我這里面試,我就告訴你我們?cè)谧鲆惠v車(chē)子的原型,現(xiàn)在少了一個(gè)輪子問(wèn)你怎么辦。沒(méi)錯(cuò),我就是要讓你重新發(fā)明輪子。誰(shuí)不知道樓下 7-11 有輪子賣(mài),但我就想知道你會(huì)如何解決沒(méi)有輪子的問(wèn)題。
你可以從各種聽(tīng)起來(lái)非常愚蠢的方法開(kāi)始,例如問(wèn)我這個(gè)原型是不是只是用來(lái)展出的,是的話把車(chē)子放在展廳一角然后讓缺了輪子的一側(cè)對(duì)著角落,這樣子隨便拿幾塊磚頭把車(chē)撐起來(lái)就可以了,反正沒(méi)人會(huì)去看車(chē)子的那一側(cè)。然后我會(huì)告訴你,展廳的天花不可能打開(kāi),所以我們不能直接用吊車(chē)把原型放進(jìn)去,最終原型在展廳外面卸下來(lái)后你還是是要想個(gè)辦法把它弄進(jìn)去。你可能會(huì)說(shuō),那就用埃及人用圓木搬動(dòng)大石塊的方法咯,在原型的底下放幾條滾動(dòng)的圓木至少能讓它推得動(dòng)吧。這聽(tīng)起來(lái)還是比較蠢,但我會(huì)告訴你這個(gè)思路的方向是正確的。這個(gè)討論延續(xù)下去,最終你還是會(huì)提出用金屬做輪子外面再包一圈橡膠的做法,從而完成了重新發(fā)明輪子的過(guò)程。
之后我會(huì)把你帶到車(chē)間里,告訴你這里有你所需的所有電動(dòng)工具和原材料,你把你剛才發(fā)明的那個(gè)輪子造出來(lái)吧。有些人手藝非常好,一下子就能做出來(lái)一個(gè)非常好的輪子。有些人無(wú)論說(shuō)得輪子有多圓,做出來(lái)的東西永遠(yuǎn)只能是方形的。大多數(shù)人介乎兩者之間,對(duì)此我會(huì)說(shuō)你不如把你造出來(lái)的輪子裝到原型上試試看是否合適,不合適的話拿下來(lái)再調(diào)整一下。
這是正常的面試流程。我不指望你一開(kāi)始能夠給我一個(gè)輪子,我也知道外面賣(mài)的輪子很便宜,但我需要驗(yàn)證你有沒(méi)有遇到問(wèn)題后解決問(wèn)題的能力,這包括思維和動(dòng)手兩方面。在這個(gè)比喻的基礎(chǔ)上,我們可以來(lái)探討一下面試過(guò)程中遇到的各種面試者。
那些不懂算法同時(shí)也非常拒絕面試算法的面試者,就如同一條汽車(chē)流水線上的工人來(lái)面試汽車(chē)工程師一樣?!笡](méi)有輪子?老板你這不是耍我么。我能夠純熟地把輪胎和軸承對(duì)齊,然后用電動(dòng)工具把所有螺絲都擰緊。但沒(méi)有輪子這就不是我的問(wèn)題了。這要么是采購(gòu)的問(wèn)題,要么是倉(cāng)管的問(wèn)題,反正輪胎沒(méi)有出現(xiàn)在流水線上我就什么都做不了。如果說(shuō)沒(méi)有電動(dòng)工具,我可以去找兩把手動(dòng)工具來(lái),用腳踩兩下也能擰緊,但沒(méi)有輪胎真的不是我能負(fù)責(zé)的?!?/p>
當(dāng)然這都不是最搞笑的,還有更搞笑的類型。ACM/ICPC 競(jìng)賽選手或者是面試前專門(mén)在網(wǎng)上刷題的面試者,基本上一上來(lái)就「哦,你要個(gè)輪子是吧。我知道怎么造輪子,你給我工具和材料就行了」,然后就以極快的速度造了一個(gè)輪子出來(lái),裝上去也沒(méi)有任何問(wèn)題。有一定的概率我在仔細(xì)檢查后發(fā)現(xiàn),這個(gè)輪子是用鉚釘裝上去的,所以拆不下來(lái)了,橡膠是一次充氣后完全密封的,因此漏氣之后不可能再打氣。不過(guò)想想也合理,這類工程師專業(yè)做撞擊測(cè)試,所以在他們的世界里面任何東西造出來(lái)都不是長(zhǎng)期使用的,而是拿去測(cè)試一下,通過(guò)或通不過(guò)都立即變廢品。
還有一些情況是這樣子的,例如我問(wèn)超大整數(shù)乘法然后對(duì)方說(shuō)用 Python 直接用乘號(hào),又或者說(shuō)我問(wèn)快速排序?qū)Ψ秸f(shuō)用 Haskell 一行寫(xiě)完。這就如同一個(gè)面試者打開(kāi)公文包掏出一個(gè)輪子說(shuō)「我這正好有一個(gè),不知道是否合適?」呃……你的百寶袋里面還有什么?
最后從面試官的角度來(lái)說(shuō),面試 ACM/ICPC 競(jìng)賽選手往往都很無(wú)聊。他們能夠給出一個(gè)完美的輪子,但我不覺(jué)得我能從他們身上學(xué)到新東西。(面試過(guò)足夠多的人后,要見(jiàn)到一個(gè)比已知完美輪子更完美的輪子其實(shí)非常難。)更有趣的面試者會(huì)說(shuō),「你知道嗎,其實(shí)中國(guó)古代獨(dú)輪手推車(chē)的輪子設(shè)計(jì)得比古羅馬戰(zhàn)車(chē)的輪子要合理」。其實(shí)我不知道你在說(shuō)什么,但如果你能夠把整套理論說(shuō)得自圓其說(shuō)的話我覺(jué)得你至少有點(diǎn)思維能力,同時(shí)你還真的對(duì)輪子感興趣。事后我可能會(huì)去搜索一下看看你說(shuō)的理論是否正確,但至少我會(huì)學(xué)到點(diǎn)新東西。