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