2020 SDE New Grad疫情下的北美軟體工程師正職面試心得分享 (VMware/DoorDash/TuSimple/NextDoor/Akuna)

Joey
19 min readJan 7, 2021

--

前言

接續上次的台灣實習面試分享,這次要來介紹美國找正職的旅程。大家都知道找工作不容易,2020的COVID-19把這個難度直接昇華,就像是問桃園人哪裡好玩一樣 (至今仍然無解)。

就像前一篇文章一樣,我不會告訴你面試考的是Leetcode哪一題,或是BQ問了你什麼奇耙狀況題。我會著重在大觀念,如何事前準備,並且事後檢討。然後也想解答一些PTT常看到的謬問,畢竟十個人有十種說法,如果有想聽我的說法的歡迎在下面留言。

先說結論:

  1. 越早投越好,最好是職缺一出來你就投那種,別怕履歷還不夠好。
  2. 不見得要投到500甚至1000個職缺,但中大公司請投好投滿,即使你不想去,拿來compete都爽。
  3. 找好一群戰友,不管是互通資訊,還是情感支援都很有用,找工作的牢騷就跟感冒一樣,要傳染給別人才會好XD

背景

上次提了一些,這次就快速帶過。低GPA轉專業選手,台灣中字EE,美國Ivy CE,兩段外商Intern經驗,一段台商短期sde經驗,中研院產不出paper的小RA。

喜歡Machine Learning/Computer Vision,母語Python,第二外語是C,最近JS也寫不少。沒有特別專精的領域,硬要選應該是ML+Backend。

LeetCode有買Premium,因為從大四就有開始慢慢寫,找工作之前大概200題,拿到offer時題數大概在250。

數據

九月初結束在台灣的實習,接著馬上開始投履歷,十一月上岸,Onsite Interview全部都是Virtual,本來還想說能趁面試周遊美國的QQ。

投遞大約150~200個職缺,多數海投,內推大概找了30個,有效的可能只有10個,來源為學長姐和一畝居多。

OA含白嫖的大約30多個,Video Interview邀請7個,上岸後還有再收到Wepay,Bytedance,Amazon的OA,效率慢的驚人。

FAANG今年十分慘烈,F有開職缺但聽內部朋友說他內推的三十幾個連Stanford Google仔都得吃履歷拒。Amazon面試變得頗難拿,身邊只有一個七月就投的朋友九月才有拿到OA。Apple老樣子難拿面試。Netflix沒new grad的事。Google連開都不開,你的職缺連結呢?!

因為以上的情況,只有本來就在內部Intern的有機會拿Return Offer,導致今年就業市場異常火爆,上岸難度exponential上升。還好小弟運氣不錯,還是分到一杯羹了。

Ok I admit I am the lucky one…

面試體驗

1. VMware

其實之前就有請學姊幫忙內推,但可能投遞時間太晚導致過了很久都沒下文。後來看到台灣人社團有位前輩剛好在發組內招募人的訊息,我就馬上毛遂自薦的跟他自我介紹並尋求內推。前輩非常給力,解答了我許多的問題,之後運氣很好的收到了面試!

這邊要呼籲一下,很多人覺得使用LinkedIn去主動自我介紹尋求內推十分難為情或是認為對方根本不會搭理就完全放棄了connection這塊。我覺得這樣非常可惜,當然大多數都是已讀或是不讀不回,但十個裡面只要有一個回你,就能有很大的機會獲得面試,尤其是組招。所以千萬別認為找工作就是刷題就好!平常多與人connect交換訊息才能兵來將擋水來土掩。

新石紀 千空: 戰爭中最重要的 是資訊傳遞!

切入正題,在跟HR phone screen寒暄了一番後,VMware直接給了我五關的Video Onsite Interview,平台是Hackerrack,大致上是2 coding+1 OS concept+1 ML System Design+BQ。說大致的原因是其實兩關coding裡面也有問system design跟OS concept,只是比重不同。一個下午過五關是真的累…面完後大概廢了兩天才乖乖回去寫功課準備下個公司的面試。下面簡述一下各關:

第一關寒暄一下就上了一題Server local backup問題,畫了一個簡單的scheme後問你如果server沒回應可能發生了什麼問題?這種問題很像之前Amazon Cloud Support Engineer會問的那種如果客戶回報網站掛了,要如何解決。要知道的是這其實沒有標準答案,給的資訊一定也不足,所以你要跟面試官來來回回作一些假設和確認細節,提供你的debug SOP後再給出一個合理的solution。自認回答的還行,接著他就考了兩題coding,第一題是叫你寫個從server蒐集client執行完一個task後的output回來,我大概寫到要check 每台client的process PID後他就說我抓到重點了不用寫完。第二題則是一個不太難的parse json問題,我體感是Leetcode easy。

第二關也是一上來就問我懂Cache嗎? 只好把之前寫Flutter app時對cache的理解亂講了一遍XD 然後問了我能不能舉個例子,我頓時喜出望外,因為剛好前幾天都在練習LRU Cache,講完後他感覺還算滿意就讓我把他實作出來(灑花~) 。後面就再問了兩題medium左右的coding,一個是像遊戲的投票問題,蠻像Google的出題思維。另外一題則是一個類似flood fill的題,BFS秒掉。

第三關是我表現最差的一關,這關的面試主要是考OS concept。面試官問了我有沒有對什麼領域的OS比較熟悉,我腦袋當機後竟然回答了Hadoop(可能Cloud Computing的作業剛好用到)。問了一些Mapper和Reducer的優化方式,我可能因為心裡沒底,回答的"非常積極",分別往hardware、software、network的面向舉了幾個例子,但非常naive,自己都想給自己一拳那種。後來有follow up像如果發現所有task花了超過預期時間完成怎麼辦,這裡提供一個我自認還不錯的解法(?): 對每一個reducer設一個timeout checker,只要超過那個時間就把task reassign到其他reducer,確保不是因為某個分區壞掉。只能說千萬別找自己不熟悉的方向去深究,很容易自爆XD 明明可以往cache的方向帶的QQ 後面還問了一些判斷ML system performance的metric。

第四關則是讓我設計一個anomaly detection system,聽說我這關的feedback算最好,所以就把我在設計時會用的flow寫在了下個section,有興趣瞭解可以看一下 (參考了眾多教學,如有雷同,純屬正常XD)。Follow up大概就是解釋一下L1/2的regularization。其實憑良心講,new grad根本不會有機會做到這種ML system,大部分都嘛是現成dataset,管他memory多少占滿GPU從paperswithcode選第一個model就對了,kafka、SQS看了就忘了XD 多數還是得真的實習或是工作後才有機會學到(或是體會到),都是慘痛經驗呀~(當好不容易串好的data pipeline被要求用kubeflow試試時….)

第五關則是hiring manager BQ,跟亞麻那種要你14條軍規塞好塞滿的面試不一樣,比較像是聊天。比如你為什麼會想來我們的team,是否跟你的career path match?你希望的氣氛或是想藉此得到什麼(心理OS:$$$$$)。你有任何的問題都可以在此得到解答,千萬不要直接回答I am good就結束這回合!

2. DoorDash

請一畝三分地的好心陌生人幫忙內推,OA不算難拿,當我拿到面試時已經有朋友拿到offer了冏。過了OA後他們家也是直接給我連續三關的VO,使用hackerrank,分別是兩個tech跟一個BQ。身為一位外送app愛好者,Doordash是我想吃Jolibee炸雞時的好夥伴,又是當時pre-ipo寵兒,薪水香爆,自然就把Leetcode DoorDash tag刷了十題,結果十中二,真香真香…

第一關是BQ,詳細問了什麼我有點忘記了,但我完全就是把亞麻軍規搬出來使用,讓他知道我是”Indepenent team player”。談話的過程我覺得非常愉快,我們中間甚至討論了NBA一陣子XD 有題是問我覺得自己有什麼缺點,我回答我有時對偷懶的組員會有點harsh,沒想到他竟然超級認同瘋狂跟我分享他遇到的雷組員XD

第二關則是Tech1,這個面試官跟前面的判若兩人,上來就貼一題coding,連測資都貼完那種,看來是個老江湖。題目有點像實作一個browser。我也不浪費時間跟他確認題意後就開寫了。有個黑特點是他竟然要我講解全部十組測資,其實大部分概念根本就一樣,害我覺得自己有夠像機器人。因為這題我寫過,我寫得非常之快速且bug free,他可能為了填滿時間,follow up連問了兩道。第一道是想要我對某個功能作優化,但我當時反應不過來,認為不可能有優化方法,這邊跟他要了有點多hint,算是我自己蠻後悔的點,明明可以take my time然後完整消耗45分鐘的><第二道是針對空間,問題不大。

第三關是Tech2,印象深刻是個很年輕的女面試官(我感覺甚至比我小),有別於前面見面就亮刀,他跟我聊了很多他覺得DoorDash給他發揮的舞台,看得出來他是真的很喜歡這家公司。考的題目也是我寫過派送員問題的變種,算是蠻輕鬆就秒掉。不過之後follow up讓我列出所有可能性時卻不讓我使用permutation lib,我一時又想不到怎麼implement最低複雜度的,時間就這樣結束了><

3. TuSimple

一家在SD作自駕卡車的中資新創,一開始聽朋友說裡面中國人比例極高,甚至面試有可能用中文!不過我自己過了OA後是遇到英文面試就是了。他們家也用hackerrank,比較特別的是他們家使用內建的純語音而不是像zoom or Google meet的視訊軟體。

面試也是廢話不多直接一題coding,內容有點像是給一個rectangle list和hole list,能不能完整allocate到given rectangle。我體感是leetcode hard (BTW他們家本來就很愛出hard),一開始直接給了個brute force去解,花了不少時間在debug上。好不容易過了幾個自己寫的testcase後他請我優化time complexity,我到時間結束之前才想了個multi-source bfs的解法,也不知道是否為最佳解就結束了QQ 也許這家的bar真的挺高,據說連master都有機會做到ML research!

4. NextDoor

NextDoor是一家做鄰里社交的新創,我覺得有點像Yelp,只是他是更focus supporting local businesses。當初是在Mason大大社團看到此職缺然後請他幫忙內推的。OA難度普通,之後跟recruiter安排了一場phone screen。

Phone Screen內容蠻神奇的,首先recruiter養的狗非常活潑,大概每五秒就會"加入"一下談話XD 過程大概就是問一下為什麼想加入,對自己的期許和排出前三有興趣的team。有趣的是他還跟我聊了一下幫我內推的前輩,然而我其實不太認識那位大大>< 結束後過了幾天就安排VO了。

VO一開始面試官先跟我聊了30分鐘介紹彼此,像他是從UCB CS剛畢業幾年的大學生然後非常喜歡這家公司給他發揮的空間,我想這就是大家常說的大公司擰螺絲小公司造大船吧。之後就進行了常規的coding,題目大概是implement一個像FB的留言版,因為之前在G家做的project就有留言板功能,所以還算熟悉。input是一個裝json的comment list,我被雷打到竟然用linked list node來建tree,搞得超複雜。之後他問我能不能只瀏覽一次comment list就建好tree,給了些hint我才想到我幹嘛不直接用一個dictionary就搞定了。迅速改寫完後也算是勉強完成所有testcase。

這裡分享一個使用python dictionary的笑話: 千萬不要取什麼myDict、yourDict的變數,不信的話你念看看…

5. Akuna

事實上我一開始不知道這家到底在做什麼,只是看到一畝上超級多這家的面經,搞得好像全民面試保底一樣。後來才知道他算是做hedgefund的quant,失敬失敬。我投的職缺是JUNIOR QUANTITATIVE DEVELOPER,也算是我唯一收到不是純sde的面試,寫完OA後很快地給了面試。

面試又是使用hackerrank(這些公司到底多愛),第一題問了一個replace value with not in keep indices list,不誇張地說,大概寫10秒講一下複雜度就解掉了。本以為如果都問這種等級的題目就穩了,結果第二題考了個flip coin相關的變種題,題目本身簡單,但後面follow up問了越來越多統計相關的問題。像是如何確保這是fair coin,如果確保random,然後崩潰的地方在叫我寫一個能證明random geometry distribution的function(那是什麼…)。後面的時間基本上就在無限鬼打牆了,後面即使他讓我查wikipedia,我短時間還是無法消化這個distribution在幹嘛。看來Quant還是乖乖留給Data Science或是Statistic的大神去好了…

如何練等

能看到這裡的鐵定都是毅力堅強、感同身受又有耐心的讀者,事實上這部分才是我認為最能給new grad們幫助的,我會分幾個面向介紹。

面向一: Resume

履歷部分能給的建議比較少,畢竟學歷與經歷明擺在那,比較有進步空間的部分大概在Selected Project,這部分是唯一能證明你其他技能的地方。比如我Django寫得不錯想投相關職缺,卻沒任何工作經驗能佐證,這就是你能讓自己履歷被撈到的唯一機會了。另外什麼Leadership還是社團經驗真的還是別寫了,浪費版面XD 能做的就是多跟朋友互相切磋,請大家幫忙給建議。不用全部都聽,自己精粹幾項即可,有獨立思考的能力非常重要。

找不到原版,隨便拿一張XD

面向二: 如何準備 LeetCode

這裡先講解為什麼要準備,現今的公司大多都是以考演算法作為面試的核心,寫LeetCode有點像寫gre的考滿分面經網站,多寫不見得有用,但只要面試矇到一題就賺翻。說寫了幾百題沒有太大參考意義,我寫200題,但我大概重複了三輪左右,我之前在Google同期的intern甚至好幾個都沒寫超過100題。我會建議寫題目只要做到所有主題無死角就好,例如Tree跟DP是我的弱項,我就各寫個10題就差不多了,把時間留給你要面是公司的高頻題才是CP值最高的選項(或是寫FB高頻題也不錯)。

題目寫完可以跟朋友或是前輩Mock Interview,我自己在Google時找了前輩練了三次、PTT跟好心的某Oracle面試官練了一次、然後自己沒事就喜歡投台灣的公司當練習,應該有超過20次的coding interview經驗。如果比較沒經驗的人可以用以下的flow來幫助練習:

1. 先跟面試官確認題目的理解、input/output、需不需要考慮某些edge case。

2. 在開始coding前,先闡述一下你希望使用的方法,估計一下你的時間複雜度,如果面試官覺得不錯或是沒意見再開始寫,我基本上是每寫一行嘴巴就跟著講我在幹嘛(當然廢話就別講了XD),這樣的好處是有在交流,會大大影響你的面試表現。

面試官就會覺得我不善於溝通><

3. 寫完後主動帶著面試官過一遍你的code,測資可以用註解的方式寫在每行後面,有助於雙方on the same page。即使面試官沒要求,你也應該主動分析時間複雜度,或是你用某個data structure的理由(比如我很愛用dictionary or set,因為在找裡面是否包含某個元素時只要O(1) time)。

畢竟不是每個面試官都是"合格"的面試官,我就遇過好幾個非常被動,好像隨時想掛你電話的。根據我mock interview的feedback,主動講解自己的code是非常加分的,有時你沒達到他的最佳預期,但也會因為你是個比較好溝通的人而給你strong hire。

面向三: ML System Design

這裡應該ML Engineer比較容易遇到,我先拆成幾個部分:

  1. Data source/pipeline

Data從哪來?使用歷史數據還是在現有服務增加蒐集方法?如何把資料存到DB?Scaling?需不需要考慮log data過大的問題?DB table大概有什麼,什麼信息是有用的?需要準備metadata嗎?

2. Feature Engineering + Model Choice

有碰過ML或是DL的應該對這塊不陌生,要解釋你選擇這個model的考量。值得注意的是我們在學業或是打比賽時都喜歡用最猛最準的model,但這是industry,除了準確度與模型複雜度的trade off,你還得考慮data的特性、latency、memory。這裡有幾個好用的推薦模型: (a) Rule based model (b) Linear Regression/Classification (c) Matrix factorization (d) Deep Learning。Feature Engineering最簡單的例子可以參考Kaggle著名的Titanic,然後怎麼定義Label,是否存在False positive等等。Model Choice除了解釋以上提到的地方,最好也延伸一下之後如果model不準要怎麼retrain或是調整,作一個long term的規劃。

3. Evaluation/Metrics

這裡分兩種,一種是模型本身的統計型metric例如ACC、F1-score或是ROC。另一種更為重要:商業型metric。畢竟你的system是要解決問題的,不是刷榜,可以想一些有實際意義的metric比如今天如果是要作零件瑕疵檢測,Overkill/Leak就是不錯的指標。這邊一般還會再問到如果optimize metric,所以平常就要想一些自己會嘗試的方法,kaggle依然是個很好的挖寶聖地。

Negotiate Offer

看到了周圍許多朋友好不容易找到了工作,卻怕被revoke或是純粹不好意思negotiate offer覺得非常可惜,決定還是來討論一下。

首先介紹一份offer package(TC)的組成:

  1. Base Salary (本薪)
  2. Target Bonus (根據Base的百分比)
  3. RSU/Stock Options (通常攤四年,也要注意vest schedule,某A廠的5/15/40/40實在奇葩…)
  4. Sign on bonus (很有趣的文化,台灣該學一下)
  5. Relocation fee or other benefits (這部分就很minor了,可以忽略不計)
  6. H1B與綠卡政策(Day 1綠卡根據各公司,也是有機會談的)

通常一開始recruiter會主動給你一個初始包,這時候千萬別一口說好!一定要說我覺得不錯,我也喜歡貴公司,可以給我幾天或週跟家人考慮看看嗎之類的話。公司為了留住人才一定會還藏有能上升薪水的空間,即使你沒有Compete offer。教你怎麼談薪水的文章網路上很多,我這裡就只分享個人經驗:

收到offer後跟HR要了七天考慮,三天後第一次跟HR Raise了總包的20%(給範圍),理由是知道別人頂包的行情以及同時還有其他面試(不透露公司)。隔天HR砍了一半給了10%,我再要了3天考慮然後deadline前說我預期會收到別家offer,但如果你給我額外10% 我就一口簽,隔天HR又砍一半給了5% ,開心簽約😄最後總計大概多要了15%。

我覺得這個過程非常像德州撲克:永遠別掀自己的底牌。一方面要表現出自己最喜歡貴公司的態度,一方面也要表示自己不是非去貴公司不可。要不要Bluff則是看個人修行,小弟概不負責XD

反思

今年本來想拼個滿手FAANG offer然後解解人生成就的,沒想到連面試都拿不太到QQ 但已經感到很幸運了,一是我其實還有半年才畢業,二是準備進去的組跟我很match! 三是剩下的最後一學期只剩6學分,可以跟女友到處玩了(這篇文章甚至有1/3是去滑雪的空檔寫的XD)。今年觀察到一個有趣的現象,我很多轉專業的朋友反而offer狀況拿得比跟他同學校的同學好不少,雖然也伴有一些倖存者偏差,但反過來想也有可能是當初若能申請到同一檔學校,轉專業者的條件都必須比本科的更豐富才有機會被考慮?

結語

我覺得成功的經驗不一定能複製,但一定有跡可循。說到認真讀書,勤奮刷題小弟完全不行,但說到查資料和勇敢reach out尋求機會小弟應該做的比九成的人更好! 大家策略五花八門,有人只海投、有人找內推、有人linkedin找recruiter自薦、有人參加GHC找機會、也有人躺在家就收到的海量面試邀請。你嘗試得越多管道,就越有機會,即使一個offer的錄取率只有0.1%,當你投100個後拿到offer的機會也有將近10%!

最後感謝我的家人、老婆(剛開始寫這篇時還是女友XD)、學長姐、紐約和加州的戰友(Mason校友圈讚讚)、幫我內推和分享資訊的各位前輩!

如果覺得對你有幫助就賞個clap,也許會讓我想寫更多以前的實習體驗(?

偷偷安麗一下本斜槓小弟的youtube channel: 紅茶拿鐵紅茶覺得重https://www.youtube.com/channel/UCJxbqIpVuzSKzKbXw7rgCbw

目前放一些switch的遊戲~也許未來會放一些科技業相關(?

--

--