北美 2020 Summer SDE Intern 面試心得

Adrian Hsu
4 min readDec 5, 2019

--

2019 Fall 求職季終於結束,很幸運自己能成為 Twitter 的一員。謝謝一路上扶持我的每個人。(https://careers.twitter.com/en/university.html)

前言

赴美求學三個月,很幸運地能在感恩節前夕就找到 SDE (Software Development Engineer) 實習。這不只是靠刷題,更大多是靠運氣與人脈。收到 Twitter offer 後,我的 2019 Fall 求職季終於結束,很幸運自己能成為 Twitter 的一員,謝謝家人朋友一路上的扶持與鼓勵,尤其感謝幫我內推 Twitter 的 @Scott 學長一路幫忙。本文會紀錄我這三個月的心路歷程,包含 Leetcode 刷題心得、時間分配、如何內推、以及我個人的一些想法。請不吝給出建議,謝謝。

另外,我朋友 Daniel You 卓伯鴻 Shang Yun Yeh 也寫了心得,我們切入的角度不同、看法與關注的點也不同,歡迎各位也點進去讀讀。

時間分配

感謝 UCLA CS MS 的制度,我在這學期修的課不多,讓我有足夠充裕的時間準備刷題還有練習面試。雖然我們是 Quarter 制、時間很緊湊,但可能是因大多人都是就業導向,這個 program 的課程規定比較寬鬆(相較於 UCLA ECE 他們是真的累…)因此除了小組報告要討論,我絕大多數的時間都關在房間練習 leetcode。

我當時的規劃是,我從五月初退伍後先耍廢一陣子,然後六月初收心後開始念 這本書,想說以一個砍掉重練演算法的心態去學,然後也想說時間充裕、能多準備些難題、到時候準備 Leetcode 就會相對覺得容易。當時就是抱著一個 chill 的心態、當作增廣見聞在唸的。結果並沒有很好,因為我唸這本書花的時間比預期長,一直到九月才整本讀完,而且說真的…書上的很多 Dijkstra, Prim, Graph Theory 根本就不考,因此我雖然讀懂了那些知識,但短期內卻看不到成效,而面試已經迫在眉睫。如果重來一次,我應該還是會念這本書(我很喜歡他的內容哈哈),但我會更早把它念完並開始刷題。如果在八月初就開始寫 Leetcode 我有信心我能在開學前就寫到 200 題、然後一路刷最後寫到 500 題的程度。

我從 Sep. 17 開始寫 2-sum,然後一路寫到 Nov. 19 的 Twitter 面試結束前一天。每天因為沒什麼事、所以都是一起床就刷題、寫到上床睡覺。

https://leetcode.com/adrianhsu/

誠心建議不要學我的時間規劃,因為我自己也覺得有不少可改進的…。就跟之前 學校申請、或者 GRE 心得 一樣,我的工作模式一向都是排開任何事務,每天起床到睡前都在為同一個目標輸出。我在申請學校時只修 1 學分的課,在準備 GRE 時都修涼課、一整個月沒去過教室…。

對我來說全職做某件事一小段時間,相較於把時間軸拉長然後分散參雜一些平日任務,前者會讓我更容易專注。但這通常不適用於其他人,而且要一直蹺課並不是個好現象,所以參考參考就好 lol。

申請結果

*** 拿到 Offer *** 
Cloudera SDE, Apache Hive Team
Twitter SDE, Revenue Science Team
*** 面試被拒 ***
Facebook (On-campus 面對面白板 interview 表現不好)
PlayStation (電面表現不錯,但掛了)
PureStorage(Online Assessment 寫不好)
*** 已經接了 Offer 而來不及走完面試流程 ***
Google(太晚收到 OA)
Amazon(太晚收到 OA)
Uber(收到面試通知,但是沒被回覆)
Pinterest(面兩輪之後,被告知 SDE 職缺滿了)
*** 履歷關就被拒絕(可能是太晚投、可能是不適合)***
Microsoft, Apple, Nvidia, LinkedIn, SAP, Robinhood, Stripe, Indeed, Cisco, VMWare, Walmart, Spotify, ...
*** 無聲,投遞後無消息 ***
Adobe, Verizon, Oracle, Tesla, Lyft, Yelp, RedHat, Slack, Github, eBay, Hulu, ...
*** Final Decision ***
Twitter @ NYC

我在 Cloudera 和 Twitter 之間猶豫了很久,也問了很多業界的前輩。雖然最後沒有去 Cloudera 覺得有些不好意思,但我對這家公司的印象很好,以後有機會也會想去工作看看。

十一月初的那陣子,幾乎每個禮拜一的早上都會收到好幾封拒絕信,當時自己真的被拒到覺得很摸不著頭緒…。也因此拿到 offer 後更覺得真的很幸運,能被一家好公司撈上岸。找實習是天時地利人和才有的結果,三分天注定、七分靠打拚。

關於刷題

網路上的刷題指南太多了,重點還是刷得多、不如刷得有效率。以下的三點對我來說受用超級大(謝謝 Pu-Chin 嗚嗚),希望大家能在刷題之餘多花點心思做這些。

  1. 建立一個 Google Spreadsheet,把寫過的題目整理起來,下次複習時試著只看自己的筆記,不看寫過的 code 重新做一次。每次寫完一題就加一筆 entry 進去。共分為 10 個 columns:
Tag,#,名字,URL,Technique,核心概念簡述,延伸題,時間複雜度,空間複雜度,完成日期

2. 按照 Tag 去刷題,每次寫完一題通常 Leetcode 會推薦你一些延伸題,就把他一次做完。

3. 寫一個 Markdown 筆記,把模板整理好,模板就是題型跟技巧做總結,類似這樣的東東:

### BFS  Q = []
Q.append(S)
visit = set([])
level = 0
while len(Q) > 0:
cnt = len(Q)
while cnt > 0:
cnt -= 1
top = Q[0]
visit.add(top)
del Q[0]
for nei in neighbors[top]:
if nei in visit:
continue
Q.append(nei)
level += 1
### QuickSort def partition(self, nums, l, r) -> int:
pi = random.randint(l, r)
nums[l], nums[pi] = nums[pi], nums[l]
p = nums[l]
while l < r:
while l < r and p <= nums[r]:
r -= 1
nums[l] = nums[r]
while l < r and p >= nums[l]:
l += 1
nums[r] = nums[l]
nums[l] = p
return l

def quickSort(self, nums, l, r) -> int:
N = len(nums)
if l < r:
pi = self.partition(nums, l, r)
self.quickSort(nums, l, pi - 1)
self.quickSort(nums, pi + 1, r)
return nums
### Inorder Traversal def inorderTraversal(self, root: TreeNode) -> List[int]:
if root == None:
return []
st = []
ans = []
while len(st) > 0 or root != None:
if root != None:
st.append(root)
root = root.left
else:
root = st[-1]
st.pop()
ans.append(root.val)
root = root.right
return ans
### ...

整個檔案超級長,各種模版都在裡面。寫這一堆模板的目的在於,當你在面試時通常只有 60 min 要完成兩題,而最要不得的就是明明知道是 QuickSort 但你忘記他的架構長怎樣。如果是想不到解法就算了,明明知道解法卻實作不出來、這種才是最難過的。因此先完成一份又一份的基本型模板,然後按照 tag 練習,就能讓你對模板掌握度越來越好。

想不到解法怎麼辦

一開始一定會想不到、然後猶豫要不要直接看答案。會擔心說看了答案好像就沒有練習到,到時候一遇到需要融會貫通的題就掛了。我的建議是把刷題分成兩階段:

面試心態

(謝謝 Scott 學長在我面試 Twitter 之前給的建議)

實習生只要刷題的基本功夠好就可以了,不會問太刁鑽、也很少問特定 CS 的知識(例如: OS, Network 通常都不考)面試的時候不用想太多,題目一定都不難。重點是要跟面試官討論,提出自己的看法、討論一下自己的方法的優缺點然後看能不能改進。或是也可能考設計一個系統,要能指出 bottleneck 然後想辦法改進。
我覺得只要願意討論,通常面試官都不會太機車。這有點像大學同學一起做作業 XD 在系 K 或是總圖讀書之類的,可以想像就是跟另外一個同學討論功課這樣,兩個人對等討論、提出自己的看法、然後一起想辦法,當然自己還是要有想法才行。面試就是在討論之中把面試官「從不會教到會」

第一階段

在這個階段我寫的是 Top 100 liked questions, hard 題跳過。因為才剛開始,常常會想不到,所以我通常是想了 10 分鐘發現腦袋在空轉時,就直接看答案。這階段什麼都還不熟悉,就是撿到一題算一題。等這 100 題寫得差不多,就會有足夠的 sense 了。這階段就是背熟各大模板…認真打基礎。

第二階段

在這個階段我寫了 Top 100 每一題的延伸題、FB 高頻、Microsoft 高頻、還有一些 Google 高頻。跟前面講的一樣,最重要的是按照 tag 去刷、把 easy 和 medium 的題目練好,我這次找實習下來一題 hard 都沒有遇到,個人覺得他們還是喜歡考 有多種解法、而且是重要觀念的,例如 BFS、Meeting Rooms II、Least Common Ancestors…etc。然後不用一直害怕 DP 而只花時間在 DP 上面,我覺得除了 Google 以外,其他公司都不太會拿 DP 刁難。

如何拿到內推

  1. 電機系友(例如:NTUEE Chain,謝謝 Twitter 的 Scott 學長幫我內推)
  2. 多聽演講,參加活動認識學長姐(謝謝 Cloudera 的 莊博士幫我內推)
  3. MasonGRE
  4. LinkedIn 加不認識但有 connection 的人為好友,詢問是否願意內推
  5. 直接找 Recruiters 寄信(Tech Recruiter Email Sharing
  6. 一畝(沒用過)

除了內推也有其他的管道,例如:

  1. 學校辦的 Career Fair (真的不要期望 career fair,人太多了…但是去塞履歷倒是可以的)
  2. 學校系上的 Tea Time
  3. 自己上官網投(俗稱海投,雖然機率低但偶爾會踩到樂透)

這裡想分享一個廣用人脈的方法。首先找一個認識的學長姐,然後問問看他各大公司名單上,有沒有認識的人。拿到名單之後,就跟他說聲謝謝然後去把每位名單上的學長姐問一輪。如果有特別熱心的、可以再做一次問個大公司名單的動作 lol。像我問了哲佑之後,就問到五六個公司的內推了,其實沒有這麼難。然後多找幾個學長,就可以湊到二十間以上的內推了。

但主要還是自己不要怕啦,就大膽去問,如果真的對方太忙他就不會理你,不用自己在心中掙扎小劇場。多開發投公司的管道真的很重要。

給明年新生的建議

更早投出履歷、投更多家

猶記得 11 月初在跟 Pu-Chin 學長聊天時,我跟他說我只想去大公司,所以只有投 40 家左右,直接被他電爆…他說當時他實習投了至少兩百家…。被電爆之後,我那晚就卯起來投到 100 家 lol,填表單填到手軟。他有提到一個蠻重要的:專注在有效率的投公司,例如系上 Tea Time 來的中小型公司這種都幾乎拿得到面試,至於 Career Fair 就丟個履歷就可以走了,然後 Referral 是最重要的,一定要到處去開拓內推管道。

我當初的策略就想說,那些公司我投了也不會去,聽都沒聽過。但是後來慢慢才發現並不是為了拿到 offer 而投,而是為了累積面試經驗。美國 SDE 的競爭程度讓每家公司的處理速度很無法預期,因此我當初設想的幾家會拿到面試的公司都沒發給我,我就要面 Facebook 了…。直接挑戰大魔王的結果就是面試經驗不夠、被電翻。因此我會建議,在一開始就多投很多公司(我會建議投到 100 家)這樣你在大公司面試之前、先拿到幾個練手面試的機會就更高。然後,雖然每家都要重填 application 表單很麻煩、但是不要懶惰!不差你這些時間的。猛投就對了哈哈。

更早刷到 300 題

建議六月左右就可以開始刷題了,時間上不會這麼緊湊。一題一題刷到開學你就累積到可以面試的實力了。當然還是有讀進去才重要,除了寫出來、每一題的 complexity 也都要認真讀懂、並且除了 optimal 解以外多學幾個方法解同一題。

更積極、更早開始準備找 Referral

我相信很多被拒是因為我用海投、想說快沒時間了而盡快卡個名額,結果就是直接被刷掉。例如:Verizon, Quora, Yelp, eBay 這些公司都是這樣的情形。如果重來一次的話,我會多建立 connections 然後爭取每家公司都用內推。

一定要練 Mock Interview

謝謝幾位台灣同學跟學長姐、一天到晚陪我練面試。(p.s. shout out to my bro @YashMoondhra I wish you all the best) 我這學期大概練習了 7, 8 次的面試,每次都覺得很有幫助。我們會約在某人家、或是約在學校有白板的會議室,然後用 codeinterview.io、或是用白板練習有計時的面試。全程用英文、然後一個人當面試官、一個人解題。一開始會發現就算會寫、也不一定會講,但這個練習兩三次就好很多。最重要的是,我們會練習遇過的 / 沒遇過的題型,然後遇過的就是要順順的講解自己的解法,沒遇過的則是要想辦法問提示(Am I in the right direction? Is this your expected solution?)然後根據面試官的指引練習臨場反應。多練就對了,不要只懂刷題。

不要放棄 Behavioral Questions

有些人覺得 BQ 很不重要,覺得那些問人際關係、問專案的題目有什麼困難的。但你可以試想看看,如果現在問你 What is your biggest challenge 或是 What is your weakness,你真的有把握在幾秒鐘內想到一個好故事來舉例、剛好切合主題、然後在時間內完整地陳述這個故事嗎?更別提這些故事背後的影響,你覺得你的回答有讓你切合他要的人嗎?

舉例來說,當你被問到 What is your weakness,你不可能直接說「我對於制式的工作會容易疲乏,失去熱情」或者「我對於新的挑戰很害怕,我比較喜歡制式的工作」因為你不知道這兩個的權重在面試官心中哪個重要。

但你也不會想回答那種「我的缺點就是我做每件事都太認真了,認真到忘記吃飯睡覺」這種有講跟沒講一樣、卻以為有加到分的回答,這聽起來就只是在說謊而已。

因此我的建議是準備一份 docs 然後把常見問題整理好,寫一份 sample answers 帶著去約學校的 Mock Interview 跟學校老師練習一次,給他大力批評一番,你就會知道這些 BQ 哪些回答聽起來很加分、哪些很不著邊際、哪些像在說謊、哪些準備不充足…等等之類的。我 Mock Interview 獲得一個很有力的建議:準備五六個故事在腦中,把起承轉合記好,遇到各類問題都拿這些答案去回答就好了。當然更重要的是,在這次模擬面試我才發現一口氣講這麼多英文真的會害怕,於是更認真準備 BQ。

最後在面試前就把整份過一遍,然後臨場發揮就好了。我的 Twitter 的 BQ 聊了一個小時,大多都是已經思考過的題目(這裡因為 NDA 簽了就不多提了)。

給自己的:明年找正職的改進方向

更有效率地刷題

明年會以 50% 寫新題、50% 寫舊題的方式進行,然後把筆記都讀更熟。明年會從四月就開始刷題,一邊實習一邊準備。

背熟 Behavioral Questions

這次的 BQ 還是有點零零落落,英文的表達能力很不夠。接下來的日子要把英文變好一些、然後 BQ 時希望能以幾乎是 Native Speaker 的水準陳述我的故事。

What doesn’t kill you makes you stronger.

走到最後一關被臉書拒絕了,而且收到拒信的隔天,馬上就要面對新的挑戰:開始 Twitter 的一面。

關於面試,我覺得最重要的是不要放太多得失心,不要想成是孤注一躑的感覺 (雖然可能真的只有這家,但還是要試著說服自己)

我的第一家面試是臉書,當時覺得一定要上、得失心放得很重,一部分也是因為他會給 return offer 如果今年就拿到、明年等於完全不用找工作了。也因為如此,終面就有點慌掉、在白板前被站著電。面試還是保持腦袋清楚最重要。面試很吃運氣,但冷靜的腦袋就比較容易思考。要對自己有信心。

Visualize yourself doing exceptionally well. Stand like a superhero!

— Facebook interviewing tips

實習面試就是拿來練經驗值,失敗也沒關係的。我們真正的大關卡還是明年正職,那些 on-site 面對面的連環轟炸才是真的考驗。所以放輕鬆,就當作一次又一次的學習。要練習把解法清楚表達好、然後給人好印象、然後給人可合作的感覺,等到明年的這時候,這些經驗值就會用上。

#WelcomeToTwitter, @Adrian Hsu! 🐦💙

Please feel free to reach out! I’m more than welcome to help :-)

--

--

Adrian Hsu

Software engineer at X/Twitter@SF working on Recommendation System. Also an entrepreneur, enjoys financial analysis and cognitive/social psychology.