美國軟體工程師求職心得

來美國的時間也邁入第五年了,這五年度過了求學、求職、工作,去過大部分的城市,也在東西岸還有中部住過。

我花了八個月的時間尋找我在美國的第一份軟體工程師工作,投了幾百個職缺,經歷了幾十場的面試,也有了該如何準備軟體工程師面試的一套方法。

在這邊我就會來分享一些我的經驗,包括該如何準備、面試流程、應該要有什麼樣的心態等等。

背景

先來介紹一下我的求學背景吧!

我大學是在台灣的交通大學念電子工程 EE,研究所來美國的 UCSD 念機器人學 Robotics,沒有在台灣工作的經驗。

我除了在大一大二的時候學過一點 C 跟 C++ 以外,基本上所有的程式語言基礎跟軟體工程知識都是自學還有在研究所學的。

  • 台灣交通大學 電子工程學
  • 美國 UCSD 機器人學
  • 英文程度的話基本上日常談話都沒問題

接下來講講我的求職結果!

  • 投了 300+ 個職缺
  • 經歷 20+ 面試
  • 2 個 offer。

最後我選擇在一家總部在東岸的自駕卡車公司工作!

準備方法

在討論該如何準備之前,我會將他拆分為三個面相:

  • coding 面向
  • 知識面向
  • 個人面向

接著讓我們來分別討論該如何為這三個面向做準備!

coding 面向

想當軟體工程師,首要的技能當然就是要會寫程式啦!

當然,在學校的修課以及作業可以精進我們寫程式的技能,但是我會說,他並不會快速地增加你在面試時寫程式的技能

學校的作業通常都是給你一段時間,可能一個禮拜,去完成一個比較大的專案,比如說建立一個遊戲。

但是在面試時,面試官為了在短時間內快速的評估我們的程式能力,99% 的時候並不會要我們在短時間內寫出一款遊戲。而是給我們一個簡短的問題,問我們會如何去解決。

這類的問題通常可以在 15 – 20 分鐘內解決出來,難一點的可能半小時。比如說:

  • 給你一個數列 [5, 9, 10, 1, 4],請由小到大進行排列,並試著給出不同的解法。
  • 這裡有一串英文字母 asdfasjdfekvd,請用最快速的方法求出每個字母分別有幾個。

這樣的題型是我們在學校中練習不到的,那我們應該怎麼辦呢?

首先我們在這裡介紹一個非常棒的網站:leetcode

這個網站對於軟體工程師來說絕對不陌生,他裡面有幾千道題目,題目也分為難中易三個等級,甚至也有公司的分類,讓我們知道哪些公司喜歡出哪些類型的題目。

每一道題目基本上也都會有詳解,如果沒有的話也可以到討論區看網友的討論,很多時候都會在討論區看到非常意想不到的答案。

我自己在練習的時候,就算這題我會了,我還是會點進詳解或是詳解看看其他的解法,我認為這非常重要!因為很多時候在面試時面試官會問我們可不可以提供另一種解法,這時候平常累積的經驗就會在這邊體現了!

另外我也會去參加每週的 leetcode 競賽,這是一個全球的人都可以參加的競賽,參加的人會被要求在一定時間內解出  3 到 4 道題目。我認為這個訓練對面試時的抗壓能力也非常有幫助。

我也非常建議大家可以將題目在練習過後寫成筆記,用自己的方式記錄下這個題目,以及各種不同的解答,還可以記錄下自己的思維過程,這個筆記會在之後複習時非常有用!

我自己就是利用 GitHub 紀錄,GitHub 上也有很多人做這樣的紀錄,比如說 haoel/leetcode 就是非常好的例子。

第二個增進自己面試時的程式能力就是和朋友互相面試!

這個方式除了可以增進自己的程式能力以外,也可以增加自己的面試能力以及抗壓力,我認為非常好用!

我自己和朋友面試的方式就是相約一天,一人半個小時,然後我會從 leetcode 上或是最近的面試挑選一個題目,並用螢幕共享開始模擬面試。

在這個過程中,如果你是面試者,你可以向你的朋友尋求解題暗示。

如果你是面試官,你可以藉此機會體會到面試官的角度和心情,並給予適度的提示。我相信這對真實的面試一定會給你減輕不少的壓力。

第三個則是國外非常有名的華人論壇:一畝三分地

我平時不會特別上去這個網站,但是當我收到公司的 Online Assessment 時,我就會跑到上面去搜尋一下。

很多時候,相同公司的 Online Assessment 都大同小異,因此有很高的機率會在上面找到一模一樣的題目。

當然,這個網站除了有不同公司的 OA 之外,還會看到很多人在上面分享他們自己面試這個職缺的經歷。如果你要面試相同的職缺,你也可以在上面看看別人的經歷,讓自己提前知道可能會面臨到怎麼樣的面試。

第四個我想要分享的是,善用網路上的各種資源!

雖然這樣講很老套,但是網路上真的已經有很多很多資源了!可以讓我們免費學習各種相關知識。

我自己是在這個網站 LearnCpp.com 補充 C++ 方面的知識,這真的是我看過最齊全的 C++ 教學網站了!

另外我也有買一本面試聖經 Cracking the Coding Interview 來死磕,裡面的題目我覺得偏簡單,但是裡面提到的面試觀念我覺得非常有用。包括如何練習、遇到不會解的題目該怎麼辦、該保持的心態等等。

也有人會用網路上的雲端學習平台做額外的學習,有名的比如說:

這上面除了可以學到程式技能以外,也可以學到更多專業知識,比如說雲計算、機器學習、資料分析等等。我自己跟其他很多朋友也是在上面學習機器人學相關的知識。

知識面向

這邊的知識面向指的是除了 coding 以外的技能跟知識,這和你要找的職位跟領域有絕對的關係。

比如說你想當一個自駕車工程師,那你除了要會寫程式碼以外你當然還要會一些其他的專業知識,像是雷達跟光達的差別、不同的路徑規劃演算法等等。

如果你是想找全端工程師,那你可能就要會不同的資料分析演算法、資料庫、前後端框架知識等等。

前面提到了我們可以利用網路學習平台的資源以外,我們還可以從哪裡去取得呢?

第一個當然就是從自己學校本身的課堂中學習。

這一點看起來很像廢話,但相信我很多人都忽略這點!很多人會覺得肯定學的越多一定代表越好,所以會去前面提到的網路公開學習平台去上一堆課。

並不是說這樣不好,但我認為應該先把重點放在學校的課業上,將課堂中老師上課的投影片、課本講義等等都認真讀過好幾遍以後,有空閒餘力再去網路上上額外的課程。

在還沒有讀熟學校的東西就去網路上上一堆課,最後只會囫圇吞棗,讓自己更焦慮而已!

第二個就是強大的 Youtube。

Youtube 真的是很偉大的發明!讓人們可以免費的在上面發布以及觀看各種影片。

我自己會在上面尋找各種免費的 bootcamp,比如說那時候我在惡補我的控制理論,就是在 Control Bootcamp 中上的。

美國很多知名的大學比如說 Stanford,他們也會將自己的課程上傳到 Youtube 給全世界的人免費觀看。有名的課程比如說 Andrew Ng 的 CS229 Machine Learning,或是 Harvard CS50 等等。

另外 Youtube 也有很多專門講解 leetcode 題目的頻道,我自己特別喜歡 花花  這個頻道,覺得他講得特別好,而且又是中文的。常常我在 leetcode 討論區看半天還是看不懂時就會去看看他有沒有特別講解這一題。

個人面向

接下來我要來講講個人層面。

當我們擁有好的程式技能,完善的領域知識,有時候可能這樣還不夠。

有時候面試官或是人資可能會問我們有沒有一些可以更瞭解我們的網站,包括我們之前做過的專案,我們的經歷等等。

這時候我們就要能夠拿出比較專業一點的東西,比如說自己的 GitHub、LinkedIn,甚至如果有自己的 portfolio 那更好了!

首先我們來講講 GitHub。

對於軟體工程師來說,有一個好的 GitHub 是非常加分的事情。

因為 GitHub 能夠看出一個人平常的打程式習慣跟邏輯,每一個專案有沒有一個好的 Readme 也可以讓我們知道這個人在寫紀錄時是不是井然有序。

而且面試官常常會在面試前先去面試者的 GitHub 上面掃描一輪,看看這個面試者的經歷以及能力,可能在面試還沒開始前就已經加分了。

因此有一個好的 GitHub 是非常重要的!

那要怎麼樣有一個好的 GitHub 呢?首先我們可以將我們的經歷顯示在個人首頁上,比如說 我的個人頁面

這非常簡單,只需要建立一個和自己使用者名稱相同的 repo 並在裡面創建一個 Readme 就好了,你們可以直接複製我的當範本。

另外,每個 repo 下面都要有一個完善的 Readme。什麼是「完善的」Readme?

就是這份 Readme 至少要包含以下幾點:

  • 專案介紹
  • 如何開始
  • 專案架構
  • 如何執行
  • 參案人員

在一開始的「專案介紹」中,我們可以簡略的提及這個專案的大致目標是什麼,最好的話可以放圖片,或是 gif 檔顯示成果。

在「如何開始」中,我們要聲明執行此專案的先決條件是什麼,可能是特定的作業系統,或是特定的程式語言,程式版本等等。

在「專案架構」中,我們可以用支線圖畫出這個專案的檔案系統,包括什麼資料夾會有什麼資料。

在「如何執行」中,我們要提供確切的執行步驟,讓其他人可以依照此步驟成功的得到相同的結果。

最後的「參案人員」則是提及在這個專案中有貢獻的其他人,如果是團體專案那就會有很多人,可以列下他們的 GitHub 帳號等等,如果是自己的專案那就只要寫自己就好。

接下來讓我們來看看 LinkedIn。 

LinkedIn 也常常是一個會被要求給予的個人網站,因此上面的資訊寫的越詳細越好。

首先第一個就是大頭貼,要求不用到特別正式,但是要能夠看到你的臉以及五官,背景也盡量不要太過雜亂。

第二個就是 About 的部分,在這個部分中我們要以簡潔的語氣概述自己目前的身份,想要找什麼樣的工作,專精於什麼領域,目前擁有什麼技術等等。

我認為這個部分特別重要,因為人家點進來第一個看到的就是這個概述,透過幾句簡單的話語就能大概了解你這個人的技術背景。

接下來則是工作經歷和做過的專案,這部分我覺得就是越仔細越好,如果已經有履歷的話就可以將在履歷中的 bullet points 給照搬過來。

另外還有一個我覺得也是非常值得放的,就是如果你有上過 Coursera 或是 Udemy 等線上學習平台的課並拿到證書,LinkedIn 有一個「Licenses & certifications」可以讓我們放上證書。

LinkedIn 也有自己推出能力測驗,我自己就有去考了 C++ 的測驗,通過了你就會得到一個 LinkedIn 頒發的證書啦!

最後就是也可以請你前同事或前老闆給你在 LinkedIn 上寫推薦信,這個好處我相信大家一定都知道!

找工作方法

接下來就來看看我們可以利用哪些管道來找工作!這邊我總結了四個管道:

  1. 學校 Career Fair
  2. LinkedIn
  3. 親朋好友內推
  4. 各大求職網站

學校 Career Fair

每個學校都會在開學後左右辦一場 Career Fair,在這場 Career Fair 中,學校會邀請各大公司來學校徵才。

學生就會準備好自己的履歷,去自己有興趣的攤位(公司)聊天。

在攤位的人有些可能會是主管,但大部分基本上都是公司的 Recruiter,他的工作就是收履歷並排除不適當的人選。

我自己的個人經驗是除非你真的很厲害,不然有點難在 Career Fair 就拿到面試機會,大部分情況都是跟 Recruiter 聊聊天,講講自己的背景了解一下公司文化,然後就回家等待面試通知。

所以我自己是只去過一次學校的 Career Fair 後就不去了哈哈,我覺得花幾個小時的時間去排隊不如在網路上投多一點職缺。但我也有看過很厲害的人就跟在攤位的主管正式面試並當場拿到工作,所以有可能是因為我自己太爛都拿不到面試哈哈。

要注意的點我覺得大概就只有要簡單準備一下自我介紹,英文叫做 elevator pitch,可以看看這個 30 Second Elevator Pitch 做為參考!

LinkedIn

我們都知道 LinkedIn 是作為找工作還有做 connections 的一個很重要的平台,但實際上要怎麼做呢?

其實很簡單!這邊我拆解為幾個步驟:

  1. 找到你想投的職缺
  2. 找到正在做那個職缺的人
  3. 聯絡那個人並詢問可以不可以內推

就這三步!簡單吧!

我們來仔細講一下,首先我們要先找到想投的職缺,假如我們想投的是 Google 的 fullstack engineer,那我就到 LinkedIn 上的搜尋欄搜索「Google full stack engineer」。

我們會在結果看到很多人在 Google 做 full stack engineer

找到這些人之後,我們可以隨機挑一兩個傳送訊息!訊息內容基本上就是在簡潔的說明自己的背景以及用意。

有些人可能會想說會部會太直接,但真的不會!大家都知道 LinkedIn 是拿來幹嘛的,密就對了!

至於要傳什麼內容,這裡是我的一個範本,歡迎大家拿去用~

另外再在底部附上職缺的連結和自己的履歷!這點很重要一定要做!

我遇到很多人會找我內推,但都打一長串的字然後沒有履歷也沒有職缺連結,這讓我根本不會想回他因為我還要花時間詢問他到底確切是哪一個職缺,然後還要請他傳給我履歷,來來回回我覺得很浪費時間。

附上職缺連結跟自己的履歷可以省下對方很多精力,讓他更願意回覆你。

這邊我建議可以開通 LinkedIn Premium,因為有些人會設置只有好友或 LinkedIn Premium 才能傳送訊息。

雖然密十個人大概只會有兩個人回你,但是會回你的人基本上都願意幫你內推,甚至把你的履歷直接拿給組內的主管。

所以這個方法也是我認為最有效拿到面試的方法!

我自己大概有一半以上的面試機會是透過這方法拿到的,所以勇敢密人做做 connections 吧!

親朋好友內推

這點我就覺得沒什麼好講的了,單看你自己平常朋友多不多,有沒有親人或是親人的朋友在相關產業。

就算是不熟的朋友跟親人也大膽去問吧!說不定以後會變成你要幫助他們呢!

各大求職網站

這個就是最簡單粗暴的方法了,透過各大求職網站海量投遞職缺。

我平常會用的網站大概就是這些

我覺得沒什麼差,就只是使用者介面的區別而已。我基本上都是一個網站的職缺投完後就轉到另一個網站繼續投。

我平常基本上會花個至少一個小時在上面投履歷,反正不需要用到腦袋,按鍵點一點就好了對我來說也是一種舒壓!

面試流程

如果你收到了面試,那恭喜你,接下來有更困難的關卡在等著你!

我們來了解一下面試會有哪些流程吧~

Recruiter 聯繫

在這個階段你會接到一通來自 Recruiter 的電話或是 Email,內容大致上就是介紹你自己的背景還有會的技術,介紹公司的背景、文化、想要找的人等等。

但這種聯繫一般分兩種,一種是確定要面試你,這種就簡單約一約面試時間就好了。

第二種則是不確定要不要面試你,因此先用 Recruiter 來試一下你的水溫。

Recruiter 有了你的基本資訊後會回去和組內主管確認是否還是對你有興趣,如果有的話才會進入正式面試。

在這通電話中,請把亞洲吹捧的謙虛文化丟掉!盡量把自己描述的很厲害!如果覺得自己只有 5 分也請把自己描述成 8 分!

這才會讓 Recruiter 回去後跟主管說你很厲害,主管也才會想要面試你!拿到面試才是正解啊!

線上評測 OA

有時候在正式面試前,公司會給你發一個線上評測 Online Assessment,這是用來篩選掉候選人的一個簡單方式。

OA 的模式分為兩種,一種是給你幾天甚至一個禮拜的時間,給你去完成一個專案。

第二種是給你 1 – 2 小時,並給你可能由選擇題跟 leetcode 題型組成的試卷。

前面提到的一畝三分地在這裡就很好用啦!

記得打開 OA 前先去一畝三分地看看是不是已經有別人做過啦!

正式面試

接下來我們來到正式面試,一般來說正式面試會有 2 – 3 輪,大一點的公司比如說 Google 甚至會到 5 輪以上。

除了檢視基本的程式碼能力以及專業領域知識以外,有時候還會問你會不會一些基本的軟體工具比如說 GitDocker 等等。

或是問你一些系統設計層面的知識,在這方面通常會要你畫一個 Flow Diagram(如下),解釋各個不同零件之間的關係和功能。

或是給你一個系統,問你應該如何優化等等。

如果你成功面試到最後幾輪,那就會遇到主管階級的人物。

這個階段就比較不會再問你底層或是專業的領域知識了,更偏重的是你對整個產業的看法跟各個系統之間的互相作用,或是我們所熟知的 Behavioral Question (BQ)。

BQ 的話我覺得在面試前準備一下就好了,不外乎就是問你如果遇到衝突的話會怎麼解決、遇到不會的問題怎麼辦等等的。

至於對產業的看法跟個系統間的相互作用,我覺得就沒辦法在短時間內補救了。

更重要的是你平常會不會去看一些相關的產業新聞,擁有自己的看法。另外在做學校的大型專案時也要仔細的去思考各系統之間是如何相互影響、如果我改變這個參數會對整個系統造成什麼影響等等。

長期來說這才會讓你發展出一個比較宏觀的眼光,而不會只著重在小小的零件,這我認為在個人發展上非常重要!

HR 聯繫

面試完後,最後就等待公司 HR 的聯繫啦!

如果收到正面回覆,那接下來就要進入重點環節了!那就是談薪水!

這裡就不聊美國工程師的薪水組成了,我們未來有機會再仔細聊這一塊。這裡我們來聊聊怎麼談薪水。

如果這是你在美國的第一份工作,而且之前也沒有相關的工作經驗,那我認為其實談 base salary 的空間並不會很大。

你只要確定自己沒有被 low ball 就好了,這裡就可以上 levels.fyi 這個網站先看一下同公司同階層的人的薪水大致落在哪裡。

但是有另一個選項可以談,那就是 sign-on bonus 和股票!

有些公司如果你沒有提出來的話那根本不會給你 sign-on bonus,這個 sign-on bonus 可是會多達幾萬塊美金!

股票也是一樣,尤其是新創公司更可能會給你更多的股票,而這可能就是你未來發財的機會!

所以談薪水的時候千萬一定要提到 sign-on bonus 和股票啊!

面試經驗分享

接下來我就來分享一下自己的面試經驗,好的壞的都跟你們分享,還有我是怎麼做紀錄等等。

面試經驗

第一個面試

我永遠記得我的第一個面試,是面試一家叫做 TuSimple 的公司。

因為是第一次真人面試,我超級緊張。還記得他出了一題要將車子根據不同的速度跟車牌做排序,題目不難,但我當下一直卡頓,程式碼一直打一直刪。最後也沒有寫出來。

面試結束我冷靜下來後,輕輕鬆鬆地就把那道題在十五分鐘內寫出來了…

但當然這沒有用,想知結果也是沒有被錄取。但這次的初體驗也告訴我們真的不要緊張!

最慘的面試

我也永遠記得最慘的面試,是面試一家叫 pony.ai 的公司。

他出了一道題,我花了二十分鐘才搞懂題目,但剩下的四十分鐘我一行程式碼都打不出來,因為我完全不會寫!

這真的是最痛苦的過程了,不斷地問面試官問題,提出可能的解法後被否決。想當然最後也是沒有被錄取。

但這次的經驗也讓我往後更輕鬆許多,因為我總會告訴自己再怎麼爛也不會像這次那麼爛了哈哈!

剩餘的面試就比較稀鬆平常,有一開始不會寫後來經過討論後還是寫出來的,也有一開始就會的。

還記得有一次我因為搞錯時差,直接睡過頭讓面試官們等了我不久哈哈,當然那次也沒上。

講這些是想告訴那些正在面試的人,你並不孤單!反正面試再怎麼差也不過就我最差的面試那樣對吧!

如何記錄

一定要記錄自己投過的職缺和有過的面試!

不管是利用 Notion、Numbers、Excel 等等都可以,一定要記錄。這樣才不會投到曾經投遞過的職缺,也可以查看目前不同面試的進度,之後想要復盤時也非常方便。要記錄的有:

  • 日期
  • 公司
  • 職位
  • 職缺連結
  • 目前進度

比如說這個 Notion 模板

心態

我想這個是最最最重要的了!除非你是超級超級厲害,各家公司搶著要你的那種人,不然你一定會經歷找工作地獄的。

找工作是一個長期奮鬥的日子,需要不斷地堅持努力,還有不斷的被打敗再站起來的毅力跟勇氣。

講這個聽起來很像在講廢話,但這是真的!只要你相信自己能夠找到工作,並且堅持下去,你一定會找到工作的!

我身邊的朋友沒有找到工作的都是一開始就不打算找工作的,有找到工作的都是打從一開始就努力並且堅持好幾個月的,而且他們全部都找到了!

所以你不孤單的!大家都經歷過一樣的過程,我自己也經歷了八個月的時間才找到工作!

就算身邊的朋友都陸續找到了工作,也不要灰心,最後一定會輪到你的!

總結

花了好幾個小時打這篇文章,終於來到總結啦!

我們花了一大篇幅講了要如何準備面試,包括程式技能和領域知識。還有一大篇幅在講找工作的各種管道以及面試流程。我也分享了一些我的面試經驗以及該保持的心態。

看到這篇文章的大家一定都可以順利找到工作的!

最後我在這邊列出這篇文章提到的連結,這些都是我平常會使用的平台,希望對你們有幫助!

程式能力:

網路學習平台:

找工作平台:

其他: