Google工程師對(duì)學(xué)生朋友的一點(diǎn)建議
自去年春天加入谷歌,我曾多次隨公司校園招聘團(tuán)隊(duì)一起走訪各地院校,幫助公司發(fā)掘人才。利用這樣的出差機(jī)會(huì)到處走走看看,飽覽祖國(guó)大好河山,是我一點(diǎn)小小的私心。但更具挑戰(zhàn)性、更激動(dòng)人心的,還是和我未來的同事們過招,不打不相識(shí)嘛。一想到馬上就要和這樣優(yōu)秀的人才一起工作,我就興奮不已,真恨不得現(xiàn)在就買一張單程機(jī)票把他/她拽回北京。
然而,在面試過程中,我也相當(dāng)惋惜地看到,由于種種主客觀原因的限制,很多青春韶華的學(xué)子未能充分發(fā)揮出他們應(yīng)有的潛力。這里我不講成績(jī),只把我遇到過的一些普遍的問題歸納一下,希望對(duì)即將踏入社會(huì)的學(xué)生朋友們能有些許幫助。
實(shí)戰(zhàn)!實(shí)戰(zhàn)!
紙上得來終覺淺,絕知此事要躬行。對(duì)于一個(gè)未來的軟件工程師來說,實(shí)際編程經(jīng)驗(yàn)是相當(dāng)重要的。我們會(huì)要求應(yīng)聘者在緊湊的時(shí)間內(nèi)編寫大量的代碼,從中考察應(yīng)聘者的分析能力,編碼速度,代碼可讀性,對(duì)所用編程語言的掌握程度,對(duì)邊界條件與異常狀況的處理,數(shù)據(jù)結(jié)構(gòu)與函數(shù)接口的定義,程序運(yùn)行的效率和應(yīng)聘者查錯(cuò)糾錯(cuò)的能力等等。一口氣列出這么多要求,聽上去似乎過于苛刻,其實(shí)只要積累了足夠的實(shí)戰(zhàn)經(jīng)驗(yàn),每一個(gè)應(yīng)聘者都完全可以滿足這些最低限度的要求。
我記得開復(fù)對(duì)于青年學(xué)子們有一個(gè)建議,大學(xué)四年,至少要編寫 10 萬行代碼。不是每一個(gè)人都期望進(jìn)入谷歌這樣的頂級(jí)技術(shù)公司,但即使對(duì)開復(fù)的建議打個(gè)三折,也還有 3 萬行呢,不努力,能行嘛。前來應(yīng)聘的學(xué)生們?cè)诰帉懘a時(shí)暴露出這樣那樣的問題,大都可以歸結(jié)到同一個(gè)原因:鍛煉太少。比如"for (int i = 0; i < strlen(s); ++i)",沒有實(shí)戰(zhàn)經(jīng)驗(yàn)的人,怎么可能意識(shí)到暗藏其間的效率陷阱。再比如內(nèi)存泄漏,就和初戀一樣,沒有親身經(jīng)歷過的人,不會(huì)有刻骨銘心的感受,而一旦經(jīng)歷,終身難忘,根本用不著你有多聰明。遺憾的是,我看到許多相當(dāng)聰穎的學(xué)生寫出來的代碼只能用慘不忍睹來形容,真讓我懷疑這是不是就是他們的第一次。大家不要怪谷歌要求高,恕我直言,
如果不能持之以恒,下點(diǎn)兒苦功夫,不光谷歌一家,其它公司恐怕也是進(jìn)不去的。
北京、上海等地的學(xué)生,往往有更多實(shí)習(xí)、兼職機(jī)會(huì),接受鍛煉之余,還能攢下一筆小錢作零用之資。其它一些地區(qū)的學(xué)生也許就沒有這么幸運(yùn),這就尤其需要積極主動(dòng),尋找機(jī)會(huì),創(chuàng)造機(jī)會(huì),把握機(jī)會(huì)。世界正在變平,互聯(lián)網(wǎng)的發(fā)展改變著地球的面貌,讓不發(fā)達(dá)地區(qū)的學(xué)生也能相對(duì)容易地接觸到發(fā)達(dá)地區(qū)的資源。前不久我在西安遇到一個(gè)學(xué)生,他半年來一直堅(jiān)持在北京大學(xué)的 ACM 網(wǎng)站上參賽、做題,我看他寫出來的程序就確實(shí)比他大多數(shù)同學(xué)都要好一些。我相信,只要他能夠持之以恒,還會(huì)取得更大的進(jìn)步。我聽說浙江大學(xué)的 ACM 網(wǎng)站、TopCoder 網(wǎng)站也都是不錯(cuò)的教育資源,感興趣的同學(xué)不妨一看;雖說做競(jìng)賽題距離真正的軟件開發(fā)還有著顯著差別,但也不失為一個(gè)不錯(cuò)的出發(fā)點(diǎn)。
在積累一定編碼量的基礎(chǔ)上,我建議大家總結(jié)經(jīng)驗(yàn)教訓(xùn),不斷提高自我。如果幾萬行代碼寫下來,學(xué) C++ 的不知道 const 怎么用,學(xué) python 的沒聽說過 GIL,我看也沒什么意思。到了這個(gè)階段,我推薦大家讀一些經(jīng)典的進(jìn)階書籍,例如《Effective C++》、《Effective Java》等,即使地處偏遠(yuǎn)地區(qū),也可通過網(wǎng)上書店買到。(我建議編碼量太少的同學(xué)就先不要讀了,會(huì)走火入魔的。我見過有學(xué)生連引用和指針都沒搞清楚,就在那里重載操作符的。)交流也很重要,如果能夠與網(wǎng)上網(wǎng)下志同道合的朋友互相幫助,共同進(jìn)步,當(dāng)收事半功倍之效。在這一方面,各校的 Google Camp 也許能夠起到一定作用。
"我會(huì)寫代碼呀,為什么谷歌不要我?"
在谷歌,研究與開發(fā)融為一體,軟件工程師與計(jì)算機(jī)科學(xué)家當(dāng)然也合二為一。計(jì)算機(jī)這幾年算是比較熱的,能夠得償所愿擠進(jìn)計(jì)算機(jī)科學(xué)相關(guān)專業(yè)的學(xué)生都是全中國(guó)頂尖的人才,如果大學(xué)四年荒蕪學(xué)業(yè),未能取到真經(jīng),浪費(fèi)了這一來之不易的學(xué)習(xí)機(jī)會(huì),是不是太可惜了呢。
遍歷一個(gè)數(shù)組或鏈表的時(shí)間復(fù)雜度是多少?對(duì)于這樣一個(gè)不是問題的問題,竟然各地都有相當(dāng)數(shù)量的學(xué)生回答說是 O(logN)!有一次我實(shí)在忍不住了,提示應(yīng)聘的學(xué)生說:"你是如何理解'遍歷'一詞的涵義呢?"他立刻做恍然大悟狀,回答說:"哦,對(duì),應(yīng)該是 O(NlogN)"。我當(dāng)時(shí)失望得一句話都說不出來。類似的例子還有很多。坊間一直傳說谷歌的面試題有多難,其實(shí)大多數(shù)學(xué)生都卡在最基礎(chǔ)的問題上。少數(shù)人費(fèi)盡氣力要收集谷歌曾經(jīng)用過的面試題,其實(shí)我們大多數(shù)題目都來自或改編自經(jīng)典計(jì)算機(jī)科學(xué)教材的習(xí)題。
順便提一句,上面提到的那個(gè)答錯(cuò)的學(xué)生乃是一流大學(xué)中成績(jī)名列前茅的優(yōu)秀生,門門功課(包括所有計(jì)算機(jī)專業(yè)課)均在 90 分以上。反差何其大也!
誠(chéng)信為本
我曾服務(wù)于多家公司,注意到不同的公司之間,乃至同一公司內(nèi)不同的面試官之間,對(duì)應(yīng)聘者的要求都會(huì)有所差別,或看重潛質(zhì),或偏好經(jīng)驗(yàn),或強(qiáng)調(diào)態(tài)度。但有一點(diǎn)大家是共同的:如果應(yīng)聘者在誠(chéng)信上有疑問,誰也不敢要。
總體而言,現(xiàn)在的學(xué)生其誠(chéng)信還是相當(dāng)不錯(cuò)的,大大超出了我們的期望。然而,不和諧音也還是有的。我們?cè)谀持咝_M(jìn)行筆試,就發(fā)現(xiàn)有學(xué)生嚴(yán)重作弊,他們毀掉自己的機(jī)會(huì)不說,整個(gè)學(xué)校的名聲也受到拖累。面試中偶爾也能遇到誠(chéng)信堪憂的學(xué)生。有一次我出了一道題,前來應(yīng)聘的學(xué)生明明以前見過這道題,卻告訴我說沒見過,自以為得計(jì),可他那一縱即逝的狡黠一笑哪里逃得過我的眼睛。兩點(diǎn)之間直線最短,說真話最簡(jiǎn)單。
做最好的自己
不是每一個(gè)人都會(huì)加入某一家具體的公司,但每一個(gè)人都可以成功,成為最好的自己。我這里所談,既不系統(tǒng)亦欠簡(jiǎn)練,但確實(shí)是我在幾次校園招聘之旅中發(fā)現(xiàn)的一些具有共性的問題,故不避好為人師之譏,羅列于此。我當(dāng)然知道,本文的首要目標(biāo)讀者——大一新生是不聽勸的,他們更愿意把所有的錯(cuò)誤親自重犯一遍。話雖如此,只要能夠?qū)σ粋€(gè)學(xué)生有所啟迪,我的時(shí)間就不算白費(fèi)。
【編輯推薦】