想進 Google,Facebook 等公司,校招前一段時間是用來實習還是刷演算法題?
各位大牛好,我現在是研二,從事自然語言處理,現在距離校招還有一段時間希望能夠充分利用起來,現在手上拿到幾個實習(有搜狗,百度等)offer,但是聽人說如果想去google,facebook之類的公司演算法基礎非常重要,想知道我應該怎麼進行準備,或者大家還有沒有更好的意見,十分感謝。
-------------------------------------20150123------------------------------------------
感謝大家積極的回復,認真考慮了大家的建議,很謝謝大家真誠的回答。
當然是找份實習,然後下班之後刷刷題。
道理很簡單:編程是門手藝,手藝的提高要靠實戰。但是實戰需要和跟隊友溝通需要智商和工具,刷刷題能體會到解決問題的樂趣和某些演算法的精妙,還能提高點點智商,有何不好?
刷題還能幫助人重溫數據結構和演算法基礎,說不定以後工作的時候還能受到刷題經驗的啟發。當然,實習也是很能啟發人的。
去Google實習真真是極好的啊!
Google裡面各種福利不說。公司文化比較自由開放,靠譜高智商的工程師一大把,想學什麼隨便問,當年做的一個涉及machine learning的項目一直令我受益匪淺。而且Google強調work life balance,不提倡加班有木有,下班吃飽飽還可以在公司刷題有木有!邊實習,邊刷題,有錢又漲技能點,好開心的!
——————————————但對於有些答案,我還是不贊成的————————————
答案中似乎有人比較反感刷題者:
如果他們還面純演算法面能刷出來的題,我在後繼的committee review里會直接忽視他的這輪面試成績,給他一個負面反饋,然後要求HR加面一輪。
對於一輪純演算法的面試,直接忽略該輪成績我覺得不妥。如果該輪成績很醜陋,那本來就在很多人心中造成了一個負面的印象了;反之如果該輪成績漂亮,直接忽略掉有何益處?挫的銘記在心,好的忽略不提——這種做法,客觀上來說首先就真的不是太公平。
再說,如果純演算法的面試成績漂亮,面試者何罪之有?有可能別人是底子好,Google不想要這樣的人嗎?當然按照某些人的觀點,更有可能是那個人刷了大量的題再來。BUT面試前刷刷題有什麼問題?相親之前就不給打扮下?如果某些Googler鄙視那些只會死磕努力的老黃牛,刻意不讓他們進入Google,那我覺得那些人的氣量未免太窄。做人吶,最緊要就是開心,裝逼可是要遭雷劈的嘛。個人認為,Google再偉大也不能讓Jeff Dean親自搬磚吧?很多優秀的科技大公司都聲稱We need genius!但大公司畢竟是部大機器,難道他們真的不需要踏實肯乾的螺絲釘?包郵呢親~
每輪面試都是純演算法當然坑爹,但如果只有一兩輪(總輪數已經是5、6輪了),都要強行忽略,加面,那就真的……但Bad case下為什麼5、6輪的工程師都只面了演算法?難道這不是面試培訓人員和公司都需要思考的點嗎???
當然,很多人可以說:我司有錢,任性。Candidates多,不差人~勞資就在hc,還是hire manager,左青龍,右白虎,鐮刀鋤頭交叉在胸前,就是逼格高……這些都沒錯。
但「面試殺手」這種光環就不要拿出來曬了吧?有空晒晒太陽,晒晒代碼,多愉快。殺一百個馬謖何用?招一個韓信才牛逼啊!
-------------------------------------------------------
大家熱心的評論令我意識到招聘的時候的確要兼顧效率和質量。儘管我依然不贊同直接粗暴地忽略一輪演算法面試的成績,但依然感謝 @楊帆 和 @潘劼 的補充和評論。
正如我個人不喜歡「面試殺手」這種title,面試官或者一個招聘機構的決策人也有自己的喜好。個人認為,一間公司應該用制度來保證招到自己想要的人而不是讓老大的喜好左右決策過程。
—————————————————
表達下不同意見就被上綱上線成「噴子」,唉……
只刷題不好,但是不刷題想去google/facebook或者是微軟這種外企都是不可能。至於google/facebook這種公司對刷題的態度,google的hr會給你發郵件交你介紹面試流程和怎樣準備面試,後面附了leetcode/hackerrank之類的刷題網站,而facebook的hr還直接給我發了個cracking coding interview的pdf鏈接,然後onsite前還搞了個教你做題的講座。可以認為google、facebook默認是鼓勵刷題的。
另外對於@楊帆 說到「然後告訴他們你們這些題在中國學生面前沒有區分度,連刷題的都能答上來,請換題」這個說法表示好奇,我想知道什麼樣的題目算是刷題的答不上來的。區分度不夠難道要上ACM級別的題目?但是大多數ACM選手也是靠大量刷題把解題能力訓練上來的,只是他們刷的除了leetcode之外還多了poj、topcoder等網站的題目,那麼這種candidate算不算是要被咔嚓掉的刷題選手?假如不算的話,考這種有區分度的難度大的題目是不是對非acm選手不公平?就算不考acm那種亂七八糟的題目,要人手寫rbtree、btree甚至手寫parser,要寫得熟練,還得重複寫很多遍,這種算不算變相的刷題?反正只要面試問到一類的題目總會有人會泄漏出去,那麼應聘者肯定會做相應的準備。你覺得那道題是那些光靠刷題的人肯定不會做的,但保不准他在哪裡看過這道題目做過幾次。那麼最後想要通過面試,還是得靠刷題。
總而言之,只要這種面試還在考亂七八糟的演算法題而且要白板coding,就逃不了刷題這個怪圈。就像高考一樣,題目總共就那幾頁紙,但是能上好大學的有幾個不是靠做了幾斤試卷的題目熟悉各種問題的解法記住各種概念才能考上去的?而考綱每年都在變化,每年做的試卷題目不一樣。面試也是這樣,你考更難的題目,那麼應聘者自然也會刷更難的題目去準備面試。你們啊,就知道踩自己人,被三哥三姐爬到頭上來了還鄙視刷題?趕緊多招點同胞進來吧~ 劈柴已經是儲君了你們還不長點心,唉~
我個人建議實習。
個人覺得要拿google,facebook的offer太靠運氣了,沒必要為了這種渺茫的機會而無聊的刷題。還是實習學東西實在。
實習是需要的,但是刷題是必要的。你可以在一邊實習,一遍刷題,這樣會比較好。
你現在需要做的是填補空白
你所需要增強的是編程技能。你可以在http://www.jiuzhang.com,尋找自主學習的資源。
*解決編程問題。搜索一些編程練習題,提高編程能力。*嘗試寫一些應用程序、小遊戲等等,增加實踐能力。
*深入學習演算法設計。演算法設計是Google面試中的重要測試內容。但學習演算法設計並不需要四年的時間,四周甚至更少的時間便可以掌握。實際上演算法設計是可以學習並且非常有趣的,不管你是否想要參加Google的面試,這都將提升你的編程能力。
後期,針對FLAG面試,要找大量的FLAG面試題進行練習。
這裡推薦http://www.lintcode.com,一個可以實行演算法題在線評測的網站,搜集了很多 IT 企業的面試題目。
FLAG的面試題並不神秘,都是編程的練習題,大多數IT界知名大公司的面試題類型沒什麼區別,都是演算法練習題。
儘管如此,也並不意味著這些題非常簡單。其實這對每個人來說都是難題。但是如果你多加練習,掌握規律和技巧,你就知道如何去解決、攻破它們。
接下來,你要尋找最佳解決方案
為什麼FLAG面試題這麼難?因為FLAG面試官並不只是為了尋找題目的答案,而是為了尋找最好的答案。最好的代碼面試題有三種答案:a bad answer, a good answer, 以及 a great answer。每種答案都是正確的,決定它們是否比別的答案更好的因素是運行時間長短。
每一場FLAG面試,一個面試者在面試官的幫助下想要得a bad answer都得花一個小時,調整和改善才以得到a good answer,進一步努力才能得到a great answer。如果不考慮運行時間,這三種答案無疑都是獨特並且正確的。但是我們的最終答案是遠遠優於其他答案的,尤其當我們投入了巨大的精力,收穫的不僅僅是a bad answer,而是a great answer。
優秀的程序面試表現不僅僅是能夠誤打誤撞得到正確的見解,而且要能解釋為什麼這個答案是最好的。面試時,你需要能夠向面試官解釋:某個函數是如何有效解決問題以及如何找到更有效的解決方案。
最後,你需要對比學習
解決問題的過程是一個可學習的過程。想要加快學習進程,最好的方法是去看樣例。悶頭做題的進步是很慢的,多看樣例,參考別人的思維方式,思考如何寫出更高效的代碼,縮短程序運行時間,才能更快提升自己的編程能力。這裡推薦一個提供優質的演算法題答案的網址:http://www.jiuzhang.com/solutions/ ,有助於對比學習,看到自己的差距所在。
不管你是在哪裡面試,提升演算法思維都會大大提高你的編程件工程技能。只要練習,你就會有進步。每當你寫代碼時,你需要在頭腦中思考,什麼樣的代碼能縮短運行時間,集思廣益,進行優化,你就能得到最優代碼。這是從好工程師到偉大工程師的開始之路!
做實習吧。靠刷題想在中國通過Google的面試已經越來越不可能了。
這兩年校園招聘有不少美國工程師來面試,我都事先review他們的題目,然後告訴他們你們這些題在中國學生面前沒有區分度,連刷題的都能答上來,請換題。
本地的面試官就更不用說了,如果他們還面純演算法面能刷出來的題,我在後繼的committee review里會直接忽視他的這輪面試成績,給他一個負面反饋,如果去掉這輪之後不能證明candidate足夠優秀,就要求HR加面一輪。
// 這問題這麼多人討論,補充幾句好了
- 正如很多人說的,實習和刷題不矛盾。如果二選一,一定是實習;如果實習了還有時間,那刷題肯定比玩魔獸好。如果你玩魔獸還寫自己插件那就更好了...
- 刷題的作用在於刷熟練度,使得自己在面試的時候出現意外情況無法體現自己能力的概率變小,而不是刷自己的能力。能力是實踐中出來的不是刷出來的
- 從招聘者角度,要儘可能杜絕只靠刷題來取得面試高分拿到offer的情況,否則招來的人不會幹活,吃虧的是自己
-在刷題者面前,很多題是沒有區分度甚至會有利於只刷題的人,這種就是面試官要避免的題。比如寫個全排列吧,寫不出來殺掉沒問題,但是寫出來又如何?還是不能證明這個人水平啊。比如寫個btree吧,寫出來又如何?證明acm過或者刷過題,寫不出來呢?只能證明沒有刷過題但是不證明能力不行啊。如果我來問,可能就是一個開放性工程問題,然後經過分析和各種演算法比較,發現用btree做數據結構來搞是最優的,那就不錯,不會讓手寫的。當然更可能的是這人列舉了好幾種可能的方法,比如atree,ctree,dtree(瞎起名),告訴我他們分別的優點缺點,但是他沒學過沒見過btree真心想不出最優解來啊。這種也是高分通過的,因為他能熟練地把自己會的演算法和數據結構應用到實際場景中並且能知道它們分別在這個場景里的優劣,只不過沒攀ACM的技能樹而已。這比刷題刷到高端演算法輕鬆手寫但是給個只要會搜索就能做的實際問題立刻傻眼的人要好多了。我能說我用標準DFS就能解的題殺過好多ACM金牌嗎...
// 補充結束
利益相關:Google Engineer Manager,Hiring Committee成員,過去若干年的面試官上崗培訓師,以及,刷題者的面試殺手...
另外,我們組在招自然語言處理的暑期實習生,樓主想來試試不題主和各位答主好,我是小白是來請教的,請輕些鄙視哈...
題主你的問題,我覺得如果你離找工作還有半年,一邊實習一邊刷題是最好的。實習和刷題不是互斥的,閉門在家整天刷題的人我還沒見過,大家都是一邊投簡歷一邊狂刷,如果你在美國的話這至少是大部分中國碼農的情況了。而你有了專業對口的實習就跟純刷題的拉開了一個檔次,而且工作過更能明白自己應該提高什麼。
答案驚現google hc大神也讓人很慶幸美國的面試水平還是比國內仁慈些的...我希望美國的面試官不要過度看重實習,因為這很有利於轉專業的人進入這個行業。進入了以後做得好不好還是看個人,並不是轉專業的就註定做不好?作為一個小白,我不希望IT行業也變成投行業那種從高中就要開始對口實習一步踏錯就沒有未來的行業。當然這個還是看需求的,僧多粥少的時候肯定要提高門檻,想到這就不禁脊背一陣冷汗,滾去做作業...我是微軟前員工,在之前被Google面試刷掉了。
體會是,微軟你只要基礎好就行了,實習經歷會加分。Google你必須要能做acm,工作經歷啥的基本無視。
都可以,身邊有個哥們做開源項目比較多,不刷題,拿了谷歌offer; 還有個無實習經歷,專門刷題的,拿了谷歌offer,還有不刷題,不實習的,也拿了谷歌offer。(我說的實習是兩年內的,太久遠的就不算了)還是看HC對你的綜合評估吧,各方面均衡,有一兩個方面有亮點最好了。
谷歌聽說缺人,難度應該會比以往低不少。
如果缺乏實習經歷,就實習個,沒有實習經歷其他方面再好都會減分,短板要補上。不缺的話,題目刷熟練性價比更高,記得那個誰說過,進谷歌,只要會做題就行了,此話也許有些過時,但也不無道理。
實習加刷題,全力以赴,都不可荒廢!
除了演算法,你還要問自己,除了大家都搶著去Google,FB以外,你為什麼想去?這個真的最重要!
1. 把leetcode過一遍還是很有必要的。樓主沒必要在POJ刷好多題,但是刷leetcode 150道題可以顯著的提升(a)寫代碼速度(b)對邊界情況的考慮能力(c)對c++ stl使用能力(d)對一些簡單數據結構,常見的面試題(nth-element,max subarray sum)熟悉程度(e)自信心。這些都是對面試很重要的。
2. 一份實習可以帶給你一個好故事講,也是你出彩的地方。不過你要是有特別拿得出手的的個人項目經歷的話,效果也不會差很多。
//利益相關 本科生,2015屆,有Google,Hulu,Microsoft,Baidu,Ali offer,覺得刷題幫助不小。//沒有面過Facebook
其實我一直覺得,如果公司內部員工 互相面試,很多人過不了。。。。
當然是刷題。對於應屆生,除了你簡歷上寫你刷題的成就(譬如說ACM金牌什麼的)以外,其他部分google是不看的。
話說居然有人幹了這麼多年還以面試殺手來炫耀,low爆了
提早一天到達。google方面還是非常貼心的,安排了住宿的地方,條件不錯,提供早餐,對google的崇拜又添了一分。可惜當晚不能好好享受google提供的住宿服務,雖然之前已經把Lintcode上的題目好好刷了一些,但依舊不放心,利用晚上的時間又過了一下幾道被自己重點標記的難題。十一點一到,就開始逼自己睡覺,以求第二天能有最佳的狀態面對面試。
第二天早早出門,比預計時間早到了20分鐘。到達面試地點門口首先會有人讓你check in,check in 之後和門口的負責小哥閑聊了一會,有一個招聘小姐姐來帶著去了面試的會議室。因為此時離約定的時間還有十來分鐘,面試官還到。等待的時候觀察了會議室,發現有一個白板,大約是用來寫程序的,但是感覺較小,決定一會程序寫的小點,夠看就行。等待中途,招聘小姐姐還貼心的給倒了水。
面試官差不多是踩著點來的。是個印度小哥,年紀不是很大,但口音略重。剛開始就隨便問了一些簡歷上的東西,比如我寫著擅長C++,那麼對我來說是如何定義擅長一類編程語言的?然後讓我簡單介紹對我來說印象最深的一個項目。期間好幾次有點聽不清楚他說的內容,問了好幾次sorry,所幸面試官頗具耐心。大約十多分鐘之後就進入了演算法考察環節。
1、 子數組之和
Lintcode原題鏈接:subarray-sum
Solution鏈接:subarray-sum solution
聽到題目的時候蒙了,因為僅是Lintcode上難度標識為簡單的題。很快寫完,仔細檢查、確定是bug-free後就請求查驗。無驚無險,過。
2、 編輯距離
隨機給出兩個不同的數字組合,通過插入、刪除、替換三種操作對其中一個字母組合進行操作,使其與另一個字母相同,求最小操作數。
在lintcode上有類似的題目,因為做過的時間距離略長,印象不是很清晰,憑著邏輯又重寫了一遍。但被指出存在bug,改過。
Lintcode原題鏈接:edit-distance
Solution 鏈接:edit-distance solution
最後問我還有什麼問題,就問了他的日常工作情況。他簡單給我介紹了下自己的日常,順便表達了對編程的真愛。
一面結束。
中間休息一會之後,第二個面試官就來了,是一個很漂亮的白人姐姐,說話的聲音也很好聽,不過做事頗有雷厲風行之勢。一上來就扔給我一道「跳躍遊戲」的演算法題,讓我講思路。
Lintcode原題鏈接:jump game
Solution 鏈接:jump game solution
這道題目我用動態規劃的方法來做的,花了一點時間整理思路,給出演算法。當然,這道題目也可以用貪心方法來做,由於時間有限並沒有使用。之後就是編程。
寫的時候覺得演算法方面還可以改進以提高時間複雜度,所以臨時改了一些地方,最後出來的程序比之前表述時在時間複雜度上提升了一些,感覺白人姐姐還是挺滿意的。後來又在白人姐姐的引導下對時間複雜度進行了進一步的修正及空間複雜度的改進。
二面結束。
二面結束時差不多到了飯點,隨面試官去了一個大餐廳,體驗了一把google的伙食,憑心來說,不好不壞。吃飯的時間和面試官討論了很多,從對演算法的理解到谷歌給這個世界帶來的變化,一直在亂侃。飯後休息了一下,就開始第三輪面試
這一輪的面試官是一個亞洲的中年男子,有點像中國人,非常nice。先是很詳細的問了我簡歷上寫的兩個項目情況。和之前電面問的問題比較像,都是技術方向的,所以答的不錯。然後就是演算法。問了「鏈表排序」問題。
Lintcode原題鏈接:sort list
Solution 鏈接:sort list solution
這道題目理論不難,但寫代碼時我依舊留了一個bug沒檢查出來,被面試官提點之後改正。之後被要求寫test cases。總的來說沒什麼大問題。
面試官是一個年紀稍長的印度人,口音較第一個印度小哥好點,至少交流無障礙。首先,簡單就我簡歷上的內容問了幾個基礎演算法概念題,之後就直入主題。
Android手機手勢解鎖的所有可能性,其中要求至少使用4個關鍵點,當使用的三個點可連成一條線時,該設置無效。
這個問題用二叉樹的方法可進行處理,只考慮圖形的結構,不考慮構成圖形各點的數值。
花了大約二十來分鐘給出演算法,可惜之後被面試官指出代碼有bug三次,所幸每次都能較快找到bug並且處理,雖然被喊錯三次,但面試官對我總體完成速度依舊較滿意。
之後面試官看時間還有五分鐘,就問我還有什麼問題。問了他們組的主要工作內容。面試官特別自豪的和我講了很久,感覺google招的人都是真心愛好自己的工作,特別棒。
面試完出來尚早,離晚飯也還很遠,感覺不是很累。對自己這一天的面試表現不算滿意也不能說不滿意,只能說發揮平平。目前已經接到通知,說一輪的Hiring committee已經過了,在等待下一步的結果通知。願好運。
以下回答,純屬胡謅,尤其是對公司的猜測。
其實從大公司的角度來講,招人無非為了幹活。能不能幹活,我覺得取決於兩個方面,態度和能力。態度,也就是說你願不願意認真幹活了;能力,我這裡主要是指智力,當然有些行業有其特定的能力證書要求。而態度這東西,面試者如果想掩飾,盡可以撒謊嘛。剩下可考察的也就是智力了。說白了,公司就是想招聰明人。工作中所需要的知識,可以到時候再學,對於應屆生而言,更是如此。
前面 @楊帆 或者 @陳萌萌 的答案,看起來相反,從招聰明人的角度來講,都是一樣的。楊是說不要出模板題,而是要考察根據實際情況分析問題的智力。陳則說刷題也可以訓練思維。從工作的角度出發,無疑楊的觀點更加正確。從目前北美面試的現狀來看,陳的說法可行性和可操作性更強。如果從工作所需要用的東西出發,你是理解不了為什麼面演算法題的。大部分時候的確用不了自己去實現演算法,用用庫就行了。而演算法題現在也多是要分析的,也就是楊所說的那種類型,因此可以考察人的智力。不過,其實我是不太贊成的,因為搞沒搞過acm這方面差別真的很大。
像Google這樣的公司根本不怎麼關心你做過什麼東西。你要是真做了什麼牛逼的東西,會來投我們公司嗎?大部分不過是模仿別人的東西又做了一個類似的,甚至還沒原來的東西好。這方面的典型就是輪子哥了(如果我沒搞錯你們稱呼的輪子哥是誰的話),有段時間總提他寫的Haskell編譯器,可也沒見什麼人用他的,也許是沒發布吧。如果只是想進Google,Facebook這類公司,題主還是刷題吧,畢竟,總是出新題也不是什麼容易的事情。我自己的經驗是不怎麼刷題也可以,我身邊有刷題進的。不建議模仿我,我面試大部分靠運氣。
======================================
說一些無關的話,我其實更喜歡赤裸裸地問智力題的面試。公司的態度明確,我們就是想招聰明人。而作為面試者的你,也不用介意刷不刷題。我所說的智力題,並不是說那些腦筋急轉彎類型的。舉個例子,兩個人輪流在一張圓桌上放一元硬幣,誰先放不下誰輸,問誰會贏?(別問我哪個公司的題)這種問題的特點就是,非常簡單,不需要知道複雜的先驗知識;然而區分度很大,智力比較好的人可以在幾秒鐘之內給出回答,而智力平平的可能十來分鐘都想不出來。當然,公司也知道,自己並不需要那麼多聰明人,這種面試策略只會被極少數公司採用。有些公司即便採用,智力題問得也比較少,感覺答出來可能會對offer的好壞有影響,而不會影響給不給offer。
更無關的,為了避免無謂的爭論,我還是普及一下智力的概念吧。智力分為神經智力,經驗智力和反省智力。神經智力,也就是我們所說的智商,包括邏輯推理,工作記憶和快速處理的能力。即便是這個,也具有一定的可塑性。比如經常接觸組合數學的東西,上面的智力題可能很快就反應過來;經常刷刷題,演算法題大部分也很輕鬆。不是邏輯推理方面有什麼改變,而是你記得更多的pattern了,神經智力的可塑性,心理學研究的證據是在工作記憶方面。而反省智力,如果沒記錯的話,按心理學家的說法,22歲以後才能習得。
根據我身邊的找工作的研究生的經歷來看,刷題吧。
如果你的目標真的是且僅限於谷歌臉書微軟,或者再低一點百度阿里花旗等等,刷題比實習來的有用。
實習的時候會被各種瑣事忙不完的工作所羈絆,而且別人還不一定理解你為啥要做演算法,讓你覺得「工作不過如此」。
刷題是學習,備考,中國人的強項。還是學生時代做這個最有效果。
在實習的地方找人一起涮題
別鬧了,說的好像不刷題能找到實習一樣
刷題不是萬能的,不刷題是萬萬不能的。
如果投北美這邊的,努力刷題吧
推薦閱讀:
※目前常用的自然語言處理開源項目/開發包有哪些?
※各種機器學習的應用場景分別是什麼?例如,k近鄰,貝葉斯,決策樹,svm,邏輯斯蒂回歸和最大熵模型。
※自然語言處理的學習路線?
※金融市場計算機化的交易程序是如何根據新聞進行自動交易的?目前這種技術的應用廣泛嗎?
※自然語言處理怎麼最快入門?