在LinkedIn做面試官的故事
問題:硅谷公司的招人的渠道有哪些,跟國內有何不同?
一般公司都有自己的Refer和面試系統,HR人員尋找候選人,在LinkedIn上就有豐富全面的簡歷庫,通過對畢業學校,就職公司的過濾去挖掘潛在員工。還有一些高水平的學術會議,工業界愿意支持和參與,像SIGMOD,VLDB頂級數據庫大會;也喜歡舉辦公開技術講座,邀請社會各界參加,注冊時留下聯系方式。或者寫一些技術博客,開源產品,通過他們做的有意思的項目來間接吸引人才。有時也舉辦一些hackathon比賽,24小時做出一個小產品原型,歡迎各類技術人才挑戰。當時我也參加LinkedIn的編程馬拉松,每人發一件T-shirt,寫著 Eat, Code, No Sleep。我記得內部統計表示,2/3的人都是通過內部推薦進來的。
其實國內的思路更厲害,比如最近雅虎北京一裁員,忙壞了各路IT公司,某創業公司也湊熱鬧一起去搶人,派出2個高級工程師去面試,結果,負責面試的2個員工都被人挖走。還有一些無節操HR,偽裝成下面這個,我接觸過的妹子不多,你們不要騙我。
問題:硅谷公司招聘流程是什么,跟國內有和不同?
我剛好在國內外都工作過,我可以做個對比。
國內:如果是在校生,一般都要有個筆試,通過率也不高,可能就百分之幾,然后在校園里面試3輪左右,分別對技術,基本功,價值觀的考察。然后就會大規模發offer,一些大公司如百度,阿里一年招上千人是很常見的。
硅谷公司:一般是沒有筆試。如果HR發現簡歷的一些關鍵字和背景符合職位需求,簡單介紹公司,安排1,2輪電面,如果通過,邀請onsite面試,里面會有4-7輪,里面涉及到不少白板編程,雖然很多人爭議,參見附錄,但目前為止還是有些無奈的選拔手段。
How to Conduct a Better Coding Interview « Eric Elliott
LinkedIn會花很大代價去組織,包括報銷來回機票,吃穿住行,贈送小禮物,給候選人一種非常受尊重的感覺。比如附帶禮物中有一個inMap, 把你在LinkedIn上面的聯系人聚類可視化呈現出來。非常酷。
這里面成功率非常低,真的是千里挑一,雖然代價很大,但很多公司都是強調人才是第一位的,在宣傳企業文化和價值上也是起到積極作用。然后就是收集反饋,一般是2個面試官back to back同時給出評價,按1-4打分,最后取平均分,Yes = 3.0 ; Very Yes = 3.5; No = 2.5 招聘委員會通過投票和辯論來確定是否發放Offer。
上圖是LinkedIn內部招聘流程圖
我記得印象深刻的面試:面試者歲數大些,當時我面的時候也沒出眾,我準備給他一個一般的分,但他回去馬上給我寫了一篇長信,解釋當時我問的問題,給出詳細參考,我對他的回答非常佩服,至少態度很積極,也許是當場沒有發揮好,我立馬改變了印象,給他很高評價,但其中有個初級面試官居然給他1分,什么概念(if you hire him, I will go), 這樣就把他平均分給拉下來,我覺得這樣不公正,就在招聘會議上為他說話,最后他也拿到Offer順利來到公司,事實證明這是一個挺優秀的技術人員。
問題:簡歷怎么寫才能規范并吸引人呢?
下面這個是很有趣的程序員是如何讀簡歷的:
問題:硅谷公司是如何選拔技術人才的?
硅谷公司對基礎架構很重視,注重基本功,員工素質和價值觀認可。技術人員還是需要關注生產力的,其實也很難短時間考察,公司也考慮過是否通過一些做小項目,直接上機模擬真實環境來評價。但真正實施又難度很大,LinkedIn 有個專門負責招聘Staff Engineer Jacob Kessler寫過文章闡述面試理念:Interviews are not Exams 主要是想保持自然,一起應對一天工作中場景。
我總結成3C (Culture, Communication, Curiosity),下面也展開一些重點。
技術:平常扎實的技術積累,包括系統知識點,不同編程語言,開源工具,團隊合作工具,比如, Restful架構有哪些特點,動態語言的優劣。我在知乎上也給出了硅谷跳槽工具箱指南
基本功:代碼簡潔優美沒有bug,常見算法的應用,優化技巧,比如如何把一個O(n^2)的算法優化成線性。好的編程習慣一定要堅持,格式:縮進可以良好排版,括號要對齊,變量名起的有意義。邊界檢查,參數檢查,異常處理,單元測試。主動寫出合理的Test case,一些常見的null檢查。不管你之前做過多少年,只要申請工程師職位都要經歷過編程的基本考核。
交流:實技術人員用到的英文都比較淺顯,聽和讀應該問題不大,但最好在說和寫方面下大功夫,這能突破一些天花板,更多融入團隊交流。
系統設計:包括設計大型系統的架構選型,各種不同組件的tradeoff,數據庫系統,網絡系統,分布式系統。比如什么時候適合用NoSQL,如何做一個推送系統,緩存系統如何搭建。
問題:您在面試中會重點考察面試者除了技能之外的哪些點?面試者身上哪些特點往往會是各公司認為不能接受的?
首先,看背景是否符合職位的需求,比如做分布式計算的工程師,對系統底層,大數據架構就要有一些涉獵。
第二,聰明,如果我交流的時候發現他們能很快意識到我說的意思甚至補充我心里想的,這種人非常討喜。如思路異與常人,很快給出最優解,能挑戰一些難度大的問題。
第三,好奇和熱情,如果面試者說不清為啥要申請,或者沒啥主動提問的,我會覺得對公司興趣不大,沒有好好做功課,態度上不夠積極,而就算最后技術很出色,在評價上也是要打折扣。另外如果他技術面很狹隘,技術興趣不廣泛,可能也要考慮是否能勝任創業公司不斷變化的環境。
不能接受的
不愿意學習,對他說的或者寫的很自大,但卻不虛心接受其他人指出的問題和建議。
企業文化不合,對公司的使命和價值觀有一些偏差,這個比技術功底更致命,主要是找志同道合的。
給大家附錄中推薦的,Coursera的CPO分享的 “像談戀愛那樣去招人”說的很有啟發。
問題:對于初級程序員的面試,最難的部分可能就是所謂的設計題。這部分是什么流程?
設計題可以分成兩個部分,系統架構設計和利用面向對象編程原理進行程序設計。前者所涉及的技術往往包括數據庫,并發處理和分布式系統等等,對于經驗要求和知識要求比較高。系統面試的流程如下:
1. 題目描述
往往非常簡單,如:設計一個XX系統。 或者:你有沒有用過XXX,給你看一下什么界面和功能,你來設計一個。
2. 闡述題意
面試者需向面試官詢問系統的具體要求。如,需要什么功能,需要承受的流量大小,是否需要考慮可靠性,容錯性等等。
3. 面試者提供一個初步的系統設計
4. 面試官這對初步的系統中提出一些Follow-Up的問題:如果要加某個功能怎么辦,如果流量大了怎么辦,如何考慮Consistent怎么辦,如果機器掛了怎么辦。
5. 面試者根據面試官的Follow Up逐個解決問題
總體特點是以交流為主,畫圖和代碼為輔。
問題:從面試官的角度給出一些系統設計上的考量標準是什么?
我先給一個內部培訓面試官的方法,大致說了考量環節。根據我的經驗,也列出一些關注點
- Adapt to the changing requirements (適應變化的需求)
- Produce a system that is clean, elegant, well thought (設計干凈,優美,考慮周到的系統)
- Explain why you choose this implementation (解釋為何這么實現)
- Be familiar with your experience level to make decisions (對自己的能力水平很熟練)
- Answer in high level of scale and complexity (在一些高層結構和復雜性方面有設計)
其實大家大可不必追求完美,在真正的面試中,沒有人能對答如流,往往面試官也會給出善意的提示,就算你沒回答某個子問題,在面試后的評價中也會綜合衡量,跟其他的面試者比較,最終打出一個分數。很多人在2到3分左右,目標是盡量在3分以上。
問題:我不是算法大牛,不是ACM隊員,聽說Google,Facebook有很多牛人才能進,那我怎么能拿到好Offer?
首先要是要有信心,算法不是想象那么難。
第一:因為面試常見的算法就那么幾種。只有你努力去總結歸類相似題目,才能只做很少的題就可以會很多的題。不要盲目關注數字。做題質量非常重要。標準是:你做過的題目,讓你再做一次,你就能“完美解決”。
第二:即使你知道一題的解法,你未必能寫好。因為你可能每次寫出來的程序都很隨性,這樣會漏洞百出。程序員是一個非常講究嚴謹性的職業,如果你在總結題目的時候能夠找到這些題目的模板,你把模板提煉好,碰到類似的題目,可以一邊寫模板,一邊想想怎么在模板上做一點簡單的改動。這樣節省時間又保證不會出錯。
問題:如果本科不是學計算機的,又想轉行該怎么準備?
1. 讓自己更Professional。比如你的簡歷只能放和計算機有關的東西,其他東西再牛也不能發揮用處(比如學生會主席)如果Resume還是很空,就多去做項目。在Github上面多去follow項目,然后參與到感興趣的當中。
2. 在某一方面達到工程師實力。臨時轉行時間短,找一個容易入手的準備,如果你以前做的事情跟數據有關,就申請Data Analyst。本來就會一些基本技術的,可以做前端,JavaScript, HTML, CSS,去真正做一個自己博客。如果對產品感興趣,就玩Django, ROR這樣的網站框架,了解一個網站是怎么搭建起來的。如果對Mobile感興趣,就用IOS或者Android寫2個APP。這樣做的好處是,簡歷不空,如果問到,可以駕輕就熟。如果不相關,坦誠相見,說由于我是轉行的我這方面不熟悉,可以嘗試猜猜看。也可以直接告訴面試官,我是轉行的,我對計算機很感興趣,做了這么這么幾個項目。于是面試官不會問你難題。結果你早就準備好了,超出面試官預期,就是一個高分!
問題:面試時候如何表現自己體現溝通能力?
首先你要站在面試官的角度,面試官招你進去當同事,他希望同事怎么樣的人就決定了他的立場。學會換位思考。
讓面試官時刻明白你的意圖,不要閉著眼睛不停寫。對于面試官來說,他根本不知道你的解題進行到哪一步了。你可以反復和面試官交流自己的想法,得到面試官認可以后再動手寫。可以講講你怎樣想到這個思路的。記住,你并不是要說服他接受你的想法,而是要把你的想法解釋給他聽。面試官提出質疑的時候,第一,不要覺得面試官什么都不懂,怎么這都不知道(其實他只是看一下你是否真的懂),第二,面試官比你經驗豐富得多,很有可能就是你犯錯了,趕緊想想是不是真的有問題。
問題:面試中出了Bug怎么辦?
BUG Free很重要,這個需要我們平時不斷的練習,按照我們方法的準備,還是可以避免一些坑。但碰巧你可能不在狀態,寫出了BUG被面試官指出,是不是就掛了呢?
別擔心,出BUG很正常,也許面試官來面你之前正在DEBUG:( 衡量一個程序員能力的標準,并不是他能想出多牛的算法(那為什么還要面算法題?)而是當遇到問題的時候,程序員去分析和解決問題的能力。而出BUG的時候,正是展現你是否是一個合格程序員的時候。
DEBUG流程:
1. 通過TEST CASE定位BUG所在位置
2. 不要立即修改代碼,重新梳理邏輯。因為很有可能還有其他BUG。
3. 走完所有邏輯之后,心里有數怎么改了,再動手開始改
4. 用TEST CASE再走一次新的代碼。
5. 在整個過程中,不停的告訴面試官你在干嘛(在不影響正常寫程序的情況下)
這樣,成功排解BUG,不但不會減分,還會因為你優秀的DEBUG能力和與此同時展現出來的溝通能力而加分。
問題:面試中不同人考察的內容都有哪些?
給一張表大家可以了解:
最后希望大家在找工作方面能有所收獲,不用多久,就會升職加薪,當上總經理,出任CEO,迎娶白富美,走上人生巔峰~想想還有點小激動呢,嘿嘿~~ 同學,夢醒了么,該去搬磚了。
參考資料
How to Conduct a Better Coding Interview « Eric Elliott