5. 求職面試 - terry77228/UCSC-extension-for-Taiwanese GitHub Wiki

求職

在修完3學期9個月的課程後,可以申請OPT合法在美國工作一年,這也是我念這個學程最主要的目的。OPT申請日期為I-20課程截止日前3個月到截止日後2個月這段期間,OPT可以自己選擇想要的開工日,範圍為I-20結束日隔一天起60天內。這部分在最後一學期的時候UCSC extension的行政人員會有說明會講解。

以我個人這9個月的CS求職經驗來說,最重要的條件是有無在美國合法工作的身分,再來是工作經驗,再來則是學歷。由於Certificate program是屬於比較特殊的無學位學程,所以我經常得跟人資們說明清楚我的情況,像是我已經有碩士學位也有工作經驗,念這個學程是為了合法身分等等,試圖說服人資不要把我當作new grad看待。我在2015年9月到美國時就開始嘗試著投履歷了,但絕大部分都是沒下落的,然後會有一些獵人頭和人力資源公司的人聯絡,但這些人一開始就會先詢問有無合法工作的身分,需不需要VISA Sponsor,由於現在H1B競爭激烈,需要靠運氣才能取得,所以這一點變成很多公司徵才的第一要件。願意忽略身分問題而給面試機會的公司基本上都是跨國大公司如Google、Amazon、Apple、Bloomberg之類的,所以相較之下沒身分的人要拿到面試的機會非常的低。我個人到美國的前半年只拿到了JP MORGAN和Google的面試機會而已。直到我快要取得OPT前的三四個月,面試機會才開始增加。

我的求職策略是能請人幫忙內推就請人,沒有的公司就海投,投個一兩百家不為過。看到有HR在FB社團發文就傳訊息問,Hacker News上的職缺適合的就寄信,LinkedIn上職缺都給他申請下去,總之就是免錢似的投履歷就是了。不用想說這個職缺是否適合你,或你認不認識這家公司,因為八九成的公司是連理都不會理你,所以不用想太多。這個策略主要的目的其實是想辦法拿到面試的練習機會而已,能夠有越多的面試機會,才能讓剛從美國來、連英文都還不是很熟悉的人多一點練習的次數。不過即使是我這樣的策略,我拿到非內推的面試機會也是寥寥可數,內推的面試機會則是有50%左右。

此外LinkedIn上面的履歷盡量更新的豐富一點,有時候會有一些Recruiter寄信來問,不妨多跟一些HR聊聊,即使他們公司最後沒打算給你機會也沒關係,只要你有跟他加到好友,那他的HR的朋友就可以從他那邊看到你的履歷,能見度還是會增加的。

美國CS雖然職缺也很多,但想應徵的人更多,而且大多數公司都想找有合法工作身分的人選。所以不要認為會寫程式就可以輕鬆來矽谷找到工作,那是完全錯誤的。

面試

矽谷大多數公司的面試流程都是

  1. 線上測驗或電話面試(或兩者皆有)

  2. 通過第一關後邀請On site面試,連續1 ON 1車輪戰面試4~5關

  3. 通過On site interview的話,如果經理同意錄用,則進入談薪給offer

如果你過去對英文沒有下過很大的苦心去練習,那來美國遇到的第一關電話面試就會讓你吃足苦頭。在CS界遇到印度人面試官是家常便飯的事情,印度腔英文、電話通訊的品質以及無法使用肢體語言的限制,會讓電話面試成為初來美國求職的一大挫折。

以軟體工程師的面試而言,刷leetcode練習是必要條件,但不是充分條件,絕對不是像鄉民說的leetcode刷完就一定找的到工作,面試中解出題目其實只是評分的一部份,你如何跟面試官互動討論,說明你的思考,如何測試你的程式等等都很重要。就算真的全都解出來,也不一定會拿到Offer,還得看同時間的競爭者的程度如何。

練習leetcode可以熟悉一些面試常考的基礎演算法和資料結構,但如果只是單純背題目的話,一但遇到沒遇過的題目就很容易慌,所以要練的是心法而非架式,要懂的是演算法而不是解題方法。除此之外,在面試前也可以多參考一下glassdoor、一畝三分地、CareerCup上面的面試心得,會有一些最近該公司考的題目,可以稍微思考一下如果被問到的是你,你會怎麼做。

刷Leetcode的時候不要單純的一直刷一直寫,而是邊寫邊想辦法用英文說明你的想法和Code,想像成你正在解釋你的程式碼給面試官聽。有些人刷題刷得很勤但面試不見得面的好,是因為雖然Code都寫得出來,但解釋給面試官聽他卻聽不懂,這時候他就可以合理懷疑你寫過同樣的題目了。最好一剛開始就先跟面試官說你打算怎麼解這個問題,用白板畫一些示意圖和測資,演練給面試官看,等他理解你打算怎麼做之後再寫程式會輕鬆很多。不過畫示意圖這部分在電話面試的時候就很吃虧,所以口說還是得好好練習才行。

有不少人問我關於system design到底會考什麼呢? 這個問題其實很難回答,因為這類題型範圍太廣,很難有辦法將他們歸類,不過還好還有一些脈絡可循。我推薦可以到這個網站HiredInTech看看,裡面會有很多關於面試問題的介紹以及練習方式。在美國現在軟體公司的環境之下,我認為研究distributed system的架構是CP值最高、最容易被考到的,因為火紅的服務基本上都是幾億幾千萬的使用者在用的,要怎麼設計一個能夠支援這麼多使用者的架構非常重要,所以看一下像是Instagram、Twitter、Facebook等等的系統設計的架構會讓你對於這類的問題有很好的想法可以跟面試官討論。我個人面試的經驗是一開始先跟面試官討論Use case、和User Scenario,然後先從大方向開始,例如有Front-End負責接收使用者資料,然後有Back-End sever從Front-End收資料,收到資料後要做甚麼處理,要如何存放到Database等等。先譜出一個架構後再來討論可能會遇到的問題,像是

  1. 使用者多的時候,伺服器服務無法負荷要怎麼辦(增加伺服器)

  2. 伺服器怎麼增加?(Horizontal and vertical scaling)

  3. 如何確保伺服器運作正常? (Load balance, failure detection)

  4. 資料量太大,Query數量過多導致服務response變慢怎麼辦? (使用Cache)

  5. 要使用什麼類型的Database? (SQL vs noSQL)

這類的面試大致上都不出這些範圍,所以可以花點時間把這部分弄熟,即使真的被考到了也能回答出一些不錯的想法。

以下是我個人的面試經驗

拿到offer: Nutanix, Microsoft

Onsite interview後被拒: Cisco, Facebook, Google, Two sigma, Youtube

Phone interview被拒: Apple, Yelp, JP Morgan, indeed

人資 screen後不符資格: linkedIn, dataminr, sportsvision ... 很多新創公司

履歷直接被拒或無下文: twitter, uber, airbnb, oracle, mozilla... 太多了記不清

其中靠內部推薦的有Facebook , Google , Yelp, Cisco , Microsoft , Apple , Nutanix

以下為一些公司的面試心得:

Cisco: 我是透過朋友直接內推給部門主管而拿到面試的,所以流程比較不一樣,我完全沒有接觸到人資,從頭到尾都直接跟用人主管接洽。一開始是先用webex來一場電話面試,是一個印度小哥,問的問題很多很雜,從網路基礎osi model, switch到資料結構演算法的coding problem都有,面了約一小時才結束。過一個禮拜後聯絡主管而拿到onsite, onsite共有五關,基本上全都是coding problem, 只有一關是偏system design。午餐是由朋友帶我去吃公司的cafe。寄信詢問主管後主管說兩個禮拜內會有決定,然後會通知我,但後來就完全沒有消息了,所以最後其實拿到的是無聲卡XD。不過Refer我的朋友有跟我說面試官們對於我的Coding能力都覺得不差,只是有一兩位面試官覺得英文能力還得再加強。同時那個職缺有另一個面試者因為還有QA的經驗,所以當時比較傾向於錄取那位有QA經驗的面試者。

Facebook: Facebook在去年底我剛開始唸書的時候就連絡我了,當時我跟他說我OPT隔年六月才生效,不知道能不能先面試先抽H1b,人資說還是希望我OPT開始前幾個月才來面試,並跟我約隔年四月再連絡。原本以為Facebook只是應付我一下,沒想到隔年四月真的連絡我了。面試的流程一樣是電話面試然後onsite面試,由於當時剛好拿到Nutanix的Offer,所以問看看人資能不能加快面試流程,不得不說Facebook的標語move fast真不是蓋的,效率極高的結果就是將兩個禮拜後的電話面試提早成兩天後。電話面試完隔天就說要安排Onsite,Onsite完隔兩天就發Thank you letter。Facebook的辦公室很寬敞,一整棟超大辦公室連在一起,而且全都是開放式空間,頂樓還有個花園可以逛。Onsite面試內容有兩關是純粹考Coding problem,一關為culture fit和coding,由於我是以experienced role來應徵的,所以還有一關是專門考system design。收到感謝信後人資說雖然這次很抱歉沒有錄取,但希望未來還是有機會能夠繼續合作。

Nutanix: 一家穩定成長的pre ipo 公司,由朋友幫忙內推而拿到面試。一開始電話面試有兩次,第一次是印度人主管,考兩題跟binary tree有關的問題。第二次運氣很好遇到同學認識的中國同事,所以就用中文聊聊天就過了XD 接著就接到onsite的通知,公司位於san jose airport旁邊的新創區,離downtown很近。這邊onsite總共有五關,內容也是coding problem居多,但有一關是考數學證明題,算是比較特別的問題。公司裡面雖然沒有廚房,但公司㑹提供午餐,我那天的午餐是美國蠻有名的一家pizza,帶我去吃飯的同事剛好是第二關電話面試的中國人,就跟他到個謝聊個天後結束午餐。面試完後隔了一陣子都沒消息,所以寄信詢問人資,人資收到信後就打電話一直問我對那個部門有興趣之類的,卻又不跟我說面試結果如何。最後我跟他說如果我的面試回饋是偏正面的話我想要取消其他小公司的面試,人資就聯絡我說要給我offer了。Nutanix是間很不錯的公司,package也開的不差,可惜我因為opt簽證只有一年,選擇新創公司在未來簽證和身份取得的問題上㑹比較不方便。

YouTube: YouTube 是由Google 人資轉介紹給我的,因為當初我跟他們說我對YouTube 比較有興趣。由於這時候我已經拿到微軟的offer,所以跟他們說我希望可以加快面試流程。結果對方就決定直接跳過電話面試直接邀請我onsite。公司本部在San Bruno ,辦公室區域不大,約只有三棟建築物,但裡面還挺開闊的。這邊我總共有5關面試,而且題目類型比較多變。雖然也都需要白板coding, 不是單純的leetcode類型,而是system design和討論。面試完後人資㑹通知說要不要送hiring committee, 如果面試平均分數過低就不會送,送的話才有機會進入下一步。我最後是在hiring committee 被刷掉,人資說雖然被刷掉了,但覺得我很有潛力,所以希望未來我能再去面試看看。

Google: 在YouTube 結果通知之後,我原本已經打算就去西雅圖微軟了,結果隔天YouTube 人資說Google 有另一個部門對我有興趣,所以想問我要不要再試試看。於是我又在面試地獄裡多打滾了一個禮拜。這次人資只幫我安排了三場面試,遇到的題目就是很標準的leetcode形式,面試官也不太廢話,進來寒暄一下就開始寫白板。這次我依然是掛在hiring committee這關,人資說有一個面試官覺得我的程式能力很強很好,但另一個覺得我沒寫出最佳解,所以hiring committee 覺得我的能力還不夠穩定,於是決定不錄用。最後人資希望我能夠再多練習一些題目,10個月後再跟她聯繫看看是否能夠再度面試。

Microsoft: 微軟這邊的狀況比較有趣一點,其實原本靠朋友內推都沒有下文,自己在網路上投履歷也沒下文。直到我在一個fb社團看到一位微軟人資po文徵才,我就私訊聯絡她,然後經過一些履歷的screen之後我拿到了第一關的線上測驗題。線上測驗總共有三題,網頁很簡陋,就單純文字描述的題目和一個textbox給你寫答案。有兩題是演算法題,第三題是system design題。由於當時已經先有了Nutanix offer, 所以我就很放輕鬆的去寫,第三題因為題目描述太簡短,我直接回答說我看不懂題目XD,一小時的作答時間我只用了20分鐘就繳卷。不期不待的我就默默接到onsite的邀請... 微軟的onsite㑹直接幫忙訂機票住宿租車等等,餐費則是事後報帳。我參加的是現在微軟比較新的徵才方式,有點類似海選般的活動。所有獲得onsite的候選人會在同一天一起到微軟的面試building,然後一人分配一間會議室等著面試官進來車輪戰。我參加的是上午場總共四關,從8點到12點連續面試。題目也是演算法和資料結構居多,但最後一關考了題system design, 而且很類似第一關線上測驗的第三題那題我看不懂的問題... 有個有趣的點是上午場總共十幾位候選人,大概有1/3是從Amazon 來面試的。面試前人資跟我們說他們的opening很多,不用擔心其他人㑹是競爭者,只要能力夠就可以被錄取。面試完後隔幾天人資打來問說面試的感覺如何等等,然後說有兩個部門主管想跟我多互相了解一點,所以又多安排了兩通跟主管聊天的電話。聊完後人資請我選一個我比較喜歡的部門,最後獲得該部門的offer。

Two Sigma: Two Sigma是唯一一個我沒有靠Refer而拿到的on site,一開始是在hackerrank網站上寫該公司的線上測驗題,通過之後對方人資打來安排電話面試。電話面試問了不少問題,包含簡答題以及coding題。之後人資寄信通知說邀請我去紐約曼哈頓SOHO區的總部on site面試。面試為早上連續三關,中午吃完飯後會有早上的面試的回饋,如果有通過的話下午會再三關。早上的前兩關都是考system design相關的題目,第三個則是直接給你一台Ubuntu系統的電腦寫程式編譯跑過一遍,我是利用vim+gcc寫C++去實作問題。吃完飯之後人資通知說不好意思沒有適合的位置給你,所以下午我就去玩樂紐約了。Two sigma雖然是做程式交易的公司,但內部環境跟矽谷新創公司的風氣很像,也有開放式空間、micro kitchen免費食物等等,網路上是說這家公司開的package非常的好,所以要錄取也是頗有難度。

Apple: 雖然我沒有拿到Apple的onsite面試,但我覺得Apple這次給我的電話面試的方式我還蠻喜歡的。Apple這次的面試跟其他公司不一樣,不是考演算法和資料結構,而是利用線上偕同寫作的網頁來看我寫project。面試官一開始就在網頁上貼了一份小project的程式碼約300行,然後稍微跟我講解一下這個project有哪些components,然後叫我編譯執行、debug、新增功能等等。這樣的面試方式比較像是實際上在公司工作會遇到的事情,也比較能看出面試者在工作時遇到問題的思考方式和做法。這是我第一次也是唯一一次在電話面試遇到這樣的考法,所以做起來速度稍微慢了點。可能是完成的功能不夠多所以沒有進入下一關。

通常每一關面試完後都會有一小段時間可以問面試官問題,這邊建議是至少問個兩三題,讓面試官覺得你對於該公司是有興趣的,同時你也可以多了解一點公司的制度和風氣。我個人是有準備一些經典問題,當沒有特別想問的時候就拿出經典問題來問。我最常問的是工程師在貴公司的一天是怎麼樣度過的,或是問說貴公司怎麼樣衡量一個工程師的績效、貴公司對於剛進去的新人有沒有什麼幫助新人快速進入狀況的模式。

由於我的Offer數量不多,而且剛好是兩個不同地區的公司,所以要直接拿Offer去談薪資不太容易,而且過去在台灣的工作薪資在美國並無參考價值,所以我並沒有跟公司討價還價,Package跟我上網查的平均差不多後我就接受了。