PhD面試Software Engineer心得

PhD面試Software Engineer心得

這篇文章是針對找美國Software Engineer職位的心得,特別是針對即將念完PhD的人而寫。因為我簽了很多NDA,所以這篇心得不會提到特定公司的面試題目等等,而只是分享面試的準備方法。

時間安排

“提早一年開始準備”

以前有個學長跟我說找工作要提前一年開始準備,通常phd從prelim完後一年畢業,所以prelim完之後就可以開始準備了。現在景氣很好,不需要一年準備就能找得到software engineer工作,但如果想要找到更好的工作,提前一年準備肯定沒錯。

我的時間安排是這樣:2014年5月 prelim, 9月去job fair投履歷,開始練leetcode,讀Cracking the Coding Interview, 一開始先找幾間公司練練等。之後專心把研究搞定後,2015年4月底開始瘋狂找工作:真正找工作花了約2個月,修履歷,投履歷,刷題,電話面試,onsite,等offer,到了6月底就大勢底定, 準備7月final defense,8月準備搬家!

PhD的優勢

重點是position yourself(就跟做研究必須要position your problem)知道自己的專長是什麼,針對公司裡面相關專長的職位或team去投。當然也可以走一般的new grad hire,但這種我覺得通常比較適合大學剛畢業或碩士畢業,沒什麼專長做什麼都可以的。唸了一個PhD一定有專長,不要浪費這個優勢!念了PhD,一定有自己的sales pitch,很有自信地把自己推銷出去,機會就大很多!

另外,有些公司針對PhD會有不同的面試,例如多加一個research presentation。我面試的公司10間裡面,4間公司排1個interview特別加上research presentation。Microsoft與Akamai是一對多的presentation,Google與Facebook是one-on-one的research討論。

比起碩士畢業,PhD在美國待的時間更長,所以英語語文能力應該要比碩畢要更好,尤其如果在學時曾擔任過TA的話,已經很熟悉被問問題,回答問題,這些經驗就默默地在這幾年累積起來了。

我念PhD期間沒有做過internship,原因之一是因為認識不少人做完intern後就放棄不念PhD了。In retrospect,我不認為沒有做過internship對於找工作會有什麼問題。

投履歷

一份寫得好的履歷是找工作的敲門磚!我的履歷從頭到尾修過幾百次。建議請已經在工作的朋友幫忙看履歷,會找出不少問題!

我總共投了三十幾間公司吧(幾間比較熱門的大公司是透過朋友internal refer的),大約十二、三間公司有回應,透過internal refer的幾乎都有拿到phone interview的機會,其他大約六間公司都是我自己在網站上投履歷找到的機會。所以如果有機會能透過朋友介紹的話,絕對要把握機會。但另一方面我自己在網站上投履歷拿到面試機會後,最後拿到offer的機率反而比較高,或許在網站上投履歷的話,比較容易找到跟我專長相符的職位吧。透過internal referral的面試機會,被分配到的position未必適合。

Phone screen

一般software engineer電話面試都考寫code,需要用線上協作編輯系統,像Google, HortonWorks用Google Docs,Twitter用HackerRank,Facebook, Amazon用Collabedit,Cloudera用CoderPad,基本上都大同小異。我面試的公司裡面,只有Synopsys與Akamai沒有寫code(不過Akamai我應徵的是Performance Engineer,不是Software Engineer)

Phone screen通常會問leetcode上easy/intermediate等級的題目,所以不用太擔心。

Onsite interviews

onsite大約¼~⅓ 的coding問題會問leetcode上hard等級的題目,但真的不需要去背hard等級的題目答案。

這一年下來,從頭到尾總共面試了10間公司:Hulu, Facebook, Synopsys, Microsoft, Amazon, Cloudera, Twitter, Akamai, Google, HortonWorks。大部份集中在六月,花了3週全國跑透透,排了7個onsite。我覺得這樣的行程算相當緊湊了,平均一週排二至三個面試,如果再多會受不了,更別提同一週的面試也未必都在同一個地區,需要移動日。

我個人感覺,幾間很有名,或者很紅的公司,比較會考general的coding/algorithmic problems。其他的公司則比較愛考需要domain knowledge的問題,像是database, multi-threading, design pattern等等。原因之一也是因為,比較小的公司的職位都是一個蘿蔔一個坑,必須要符合特定專長。

Leetcode

Leetcode這幾年變成interview必備的工具,準備面試可以在Leetcode上練習題目,但無形中似乎拉高了錄取的門檻。為了準備,我常看mitbbs工作面試的文章(http://www.mitbbs.com/bbsdoc/JobHunting.html),不過看完之後一直有種想法,就是感覺中國人好像把面試當作考試一般準備,拼命刷題記答案。可是面試真正看得並不只是寫出正確的答案,更重要的是如何回答問題的過程。如果面試就是考寫題目的話,那大家就直接比看誰ACM解題解最多就直接給offer啦,方便又省事,還不用onsite呢。

必考題型:

因為經歷過太多phone screen + onsite interviews,發現很多題目都被問過不只一次,被問到都能背答案了!電話面試很愛問 binary tree traversal 相關的題目, 基本的linked list也容易考。recursion+backtracking 幾乎每間公司onsite都會問至少一題。hash table implementation也常考 (phone interview or onsite,我總共被問過5次)。

必須要知道的data structure: trie (prefix tree), min/max heap,不用知道implementation,但要知道如何善用這些data structure解題。hash table面試時超好用,一定要熟練如何用hash table解題提升程式的time complexity

Hulu很愛考dynamic programming。但除此之外,大部份公司頂多onsite只會有一題DP,通常是沒有。

其實大部份的interview coding question可以分成幾類解法:divide and conquere, greedy, dynamic programming, recursive backtracking 等,所以真的想不出來的時候,就一個一個strategy試看看,有時候就會有不錯的答案!

brain teaser: 面試了這麼多公司,只有Synopsys考我brain teaser,所以我想現在一般純軟體公司都不重視這類題目了吧,可以放心跳過。

小撇步

如果interview的問題一開始不會解,先想出一個暴力解的算法,並且求出time complexity。之後想辦法套用幾種常見的解法strategy去試(猜答案),問看看interviewer有什麼意見。有時候interviewer會要求先寫出暴力解的code,然後再慢慢給提示。

總而言之,暴力解比答不出來還要好!

參考書

Cracking the Coding Interview:又稱CC150,這本是面試者人手必備一本的書,如果要找tier 1的大公司,一定要看這本書

Cracking the Tech Career 也是CC150作者寫的書,這本比較著重於non-tech的部分,如撰寫履歷等等

Programming Interviews Exposed: Secrets to Landing Your Next Job 這本書我覺得太簡單了,可能適合非CS本科出身的人參考,要不然的話裡面沒什麼參考價值,我看過一遍就放棄了。如果是CS本科的朋友,不要浪費錢買這本書。

Leetcode的電子書Clean Code Handbook,強烈建議一定要買!裡面列出的題目都很有代表性,範例程式碼也很精簡易懂

其他參考資料

GeeksForGeeks 有很多面試題目的答案分享,一定要看!

CareerCup 這是CC150作者所設立的網站,可以找到最近別人po的面試題目(雖然這很不道德,都已經簽了NDA還洩題)

Leetcode 線上程式解題

HackerRank 類似Leetcode, 線上解題

GlassDoor 查公司的年薪,還有面試經驗

拿到offer之後

以PhD學歷拿到的offer薪水應該都不差。PhD畢業,一般會比大學畢業的底薪高個$20 K 左右。據說根據研究,年薪超過7萬美元之後,一個人開不開心與年薪多寡就沒太多關係。所以要如何選擇哪個公司的offer,應該要根據工作內容,還有未來團隊成員決定

7 thoughts on “PhD面試Software Engineer心得”

Leave a Reply to Wei-Chiu Cancel reply