文|柔軟的胖紙
每年校招的季節(jié)總會(huì)有這種討論,有人覺得考算法題沒意義不如考實(shí)戰(zhàn)考項(xiàng)目考 XX 。有人大學(xué)的時(shí)候做了很多個(gè)網(wǎng)站寫了很多項(xiàng)目然而就是做不出這些“沒有意義”的算法題拿不到 offer ,有人覺得太簡單做算法題區(qū)分度不大。
先來看一下,在大公司來說,程序員日常的開發(fā)工作是怎么樣的。就拿騰訊來說,比如你的職位是 qq 的后臺(tái)開發(fā),那么你的日常開發(fā)語言是 C++,你日常的工作是維護(hù)一大堆已經(jīng)上線的用 c++寫成的 cgi 和后臺(tái)的邏輯 server ,有新需求的時(shí)候用 C++去開發(fā)新的邏輯 server 和 cgi 來實(shí)現(xiàn)這些功能。而這其中, cgi 有現(xiàn)成的庫,邏輯 svr 也有現(xiàn)成的庫,存儲(chǔ)方面用公司內(nèi)部開發(fā)的 CKV 或者其他組件,它們有專門的運(yùn)維團(tuán)隊(duì)來維護(hù),其他像發(fā)布數(shù)據(jù)統(tǒng)計(jì)日?qǐng)?bào)等全部都有現(xiàn)成的組件。你只需要把產(chǎn)品的邏輯組織好填到框架中就行。
那么你工作之外接觸的其他技術(shù)哪部分跟你工作中用到的東西有關(guān)系?你開發(fā)網(wǎng)站用的 php/python ?或者是做存儲(chǔ)用的 redis 和 mysql ?甚至更時(shí)髦的 docker ?
事實(shí)就是,越成熟的大公司,內(nèi)部有越多的內(nèi)部組件內(nèi)部系統(tǒng),你在里面工作,你不需要擔(dān)心應(yīng)該采用什么數(shù)據(jù)庫用什么語言什么發(fā)行版的 linux ,你只需要選擇現(xiàn)有的組件設(shè)計(jì)好架構(gòu)組織好代碼就足夠。
那么回到面試題目這個(gè)問題上,特別是校招面試上面,假如一個(gè)應(yīng)屆生非常聰明和刻苦,每天都是專研計(jì)算機(jī)課程的專業(yè)課程(算法、編譯器、 os 、 etc.),里面的每個(gè)算法都倒背如流,甚至能在一場面試內(nèi)寫個(gè) LR1 的 parser 算法出來,那么你問他一些實(shí)際項(xiàng)目是考察不出他的潛力的和實(shí)際的學(xué)習(xí)能力的。而對(duì)于一個(gè)沒怎么學(xué)過算法,但是做了幾十個(gè)外包網(wǎng)站的同學(xué),他的項(xiàng)目能力很強(qiáng),但是你確定他能在入職后應(yīng)付到工作中遇到的挑戰(zhàn)?
所以說,面試考算法是一個(gè)基準(zhǔn)點(diǎn),因?yàn)樗惴ㄊ怯?jì)算機(jī)科學(xué)里面最基礎(chǔ)的學(xué)科,其他更高級(jí)的學(xué)科都是在這個(gè)基礎(chǔ)上面展開的。在過了這個(gè)基準(zhǔn)點(diǎn)的基礎(chǔ)上,再考其他的東西,例如更復(fù)雜的算法,實(shí)際的項(xiàng)目經(jīng)驗(yàn),知識(shí)廣度等。這也是目前國內(nèi)大公司面試的標(biāo)準(zhǔn)形式。但這其中有個(gè)問題是面試官的知識(shí)水平不一,所以有時(shí)候面試官水平不夠甄別出水貨和牛人。說白了就是不夠標(biāo)準(zhǔn)化。就比如我試過一次面試,面試官連珠帶炮問了我兩個(gè)小時(shí),但是全都是問的各種基礎(chǔ)概念,假如我當(dāng)時(shí)對(duì)著電腦打字速度夠快的話,他這種面試方式有何意義?
而說到面試的標(biāo)準(zhǔn)化,那就得說回微軟 /google/facebook 以及灣區(qū)眾多 hot startup 的面試方式。這些公司的 onsite 面試一般是四輪,應(yīng)屆生大多數(shù)情況下不會(huì)有設(shè)計(jì)題,幾乎都是算法題。在現(xiàn)在刷題網(wǎng)站越來越多的時(shí)代,靠考算法題還有沒有篩選度?
這里我拿 facebook 來舉例,因?yàn)?facebook 的面試太過標(biāo)準(zhǔn)化了。 facebook 的面試分為四輪,其中一輪 culture fit ,兩輪算法,一輪設(shè)計(jì)(應(yīng)屆生不會(huì)有這一輪)。 facebook 的算法題不難,幾乎不會(huì)有 dp 題目,大概就是 leetcode 上面中等難度及以下的題目。有人說,這么簡單的題目,隨便一個(gè)英語好點(diǎn)的搞過 acm 的學(xué)生都能過。實(shí)際上去年 facebook 在中國招了多少個(gè)應(yīng)屆生呢?不超過 30 個(gè)。
為什么?一道簡單的算法題,你現(xiàn)在對(duì)著電腦想,可能沒什么難度,一下就能寫出來,但是面對(duì)面試的時(shí)候的壓力,你能否在十幾分鐘內(nèi)在紙上能寫出整潔無 bug 的代碼?另外,簡單的題目只是一道開胃菜,后面幾乎可能有稍難的 follow up 。而且還有非常關(guān)鍵的一點(diǎn),就是溝通能力。以前在知乎上面看過一個(gè)是清華的一個(gè)競賽出身的學(xué)生問為什么 google 問的問題那么簡單他答出來了還被拒了,你搞競賽出身你有一身牛逼的 coding 本領(lǐng)熟悉各種奇技淫巧,但是要你解釋思路的時(shí)候卻三言兩語就糊弄過去,換你做這樣的同事你愿意不?一道算法題你覺得做出來不難,但是試試自己用語言描述出你的思路,然后證明你的算法是對(duì)的,可不一定那么簡單。
而對(duì)于社招來說,算法題是一個(gè)考查方面, design 題目也很重要, design 題目很大程度會(huì)影響你的入職的級(jí)別和工資。