本文由 Yi-Hsiang Kao 授權轉載
其實我想說的是,疫情下的軟體工程師面試,聽起來就像坐著Zoom一整天一樣容易呢(想像起來)。
想要面試其他公司的理由,要認真說起來永遠說不完 — — 追求更大的Project Impact / Scale、更有興趣的Domain、更好的職位和薪資,總結來說就是想要了解更多的選項以及自己在勞動市場上的定位(Package LOL)。
在準備的過程中蒐集了許多資料也得到了許多朋友的協助,因此將這些面試Machine Learning (ML)相關職位的經驗和資源整理起來,希望能夠幫忙到同樣也想要在北美面試ML相關職位的人。
先說明一下我的背景:在這篇文章整理時,我從NYU CS MS program畢業兩年,也在紐約的新創公司Text IQ工作了約莫兩年,職位是Machine Learning Engineer。在Text IQ時我負責的專案大多是優化核心產品中的Natural Language Processing / Understanding / Machine Learning模型效能,也是興趣所在,因此面試時鎖定的職缺都至少與ML相關,而等級大約是落在大公司的Level 4(通常Level 3是Junior / New Grad)。但我也有收過Level 5的面試,所以最後會落在什麼級別主要還是看面試表現。
順帶一提我的前東家是間好公司:有很好的Product market fit、充足的現金流、盈利、優良的工程團隊、應有盡有的福利;此外,start-up的緊張感、高工時、高報酬以及快速迭代和高參與度的產品開發流程也都可以體驗到(美國start-up的工作體驗可以另寫一篇了)。會選擇轉職很大的原因還是在於自己想要學習大公司的工作制度、經手高流量2C產品的ML Project、以及更穩定的工作體驗。對Text IQ的產品和市場有興趣的話非常歡迎聯絡我,我們聊聊!
總而言之(Disclaimer!),這篇整理主要是針對至少有1–2年經驗的Machine Learning Engineer面試,而不是轉職Machine Learning Engineer或是Distributed System / Backend / Full Stack / Software Engineer。適用範圍也僅限於北美。
Machine Learning Engineer? Data Scientist?
說到Machine Learning Engineer(MLE),每間公司可能也會有不同的定義和職位名稱,有的公司會有Applied Scientist、有的公司會有Software Engineer, Machine Learning、有的公司會有Research Engineer、甚至更fancy的AI Engineer也會有。而ML Research的合作模式也會略有不同,最古典的兩種Model是R&D或是R+D,前者例如Google,Engineer or Scientist從research / POC到production / deployment可以全期負責,end to end(e2e)一肩扛,後者例如IBM有專門的Research Scientist or Engineer搭建模型研究,再有Production Engineer負責scale up。
但隨著ML模型應用日漸普遍,ML作為一種服務與產品本身的耦合性也越來越高,更多的職位要求是e2e一肩扛的MLE:從Data engineering、ML modeling一直到model deployment / scale up都需要涉獵。
以上的這些職位敘述都是我特別鎖定且有得到面試的MLE相關職缺;不過在與HR聯絡或投遞履歷時,我並沒有排除掉純Research導向的職位,但缺乏出色的publication & research profolio應該是沒有得到面試的原因。
怎麼開始的?
我們都該負責任
得到面試的管道不外乎就是三種:海投、獵頭、與內推。
海投是最沒有效率但是最有趣的方式,對我來說有趣的點就是可以看看不同公司對MLE的定義和需求完全不同——我曾經看過有公司MLE的需求是要懂javascript,原來是因為主要產品將ML model部署在browser extension上;也曾經看過MLE的需求ML不是requirement,而是good-to-have,原來該公司合作的模式是MLE負責搭建machine learning platform給data scientist進行實驗,MLE的直接客戶是內部的scientists。
即使不一定會有回音,我每天還是會花個數十分鐘投遞在LinkedIn上順手滑到有興趣的相關職缺。
我的第一份面試與有得到offer的面試都是透過獵頭進行的,通常獵頭們會在LinkedIn上找到你的資訊直接聯絡,有些不是很專業的獵頭會把所有看起來很像軟體工程師的職位通通塞過來,而有些獵頭只跟有美國永久居留權的人選合作。
在與獵頭合作時要注意是第三方招募者或是公司代表。比較起來,公司代表的獵頭可靠性高非常多,而且這位聯絡人很可能就是整個招聘流程的coordinator以及最後發offer與你談判的人。
至於第三方招募者的獵頭,在聯絡上會是公司與你之間的橋樑,常常他們也沒有很多的資訊,溝通上很沒效率。但我也有透過他們得到一些知名Hedge Fund的面試,所以好的第三方獵頭確實有可能帶候選人得到稀有的機會。
有一次的獵頭經驗非常有趣:一開始聯絡的獵頭是公司代表,但是後來似乎是職缺關閉,結果公司獵頭將我交給了另一個第三方獵頭繼續面試該公司其他職缺,整個流程裡我重複申請了同公司三個不同的職位,神奇地感覺像是被詐騙集團騙去面試一樣。
疫情下的面試
疫情對於科技業來說是幸運的,更有可能是個大發國難財的商機。
同樣的道理,對於科技業的軟體工程師,大部分的公司早已將工作流程全遠端化,包括所有的招聘和面試流程 — — 這代表面試不再是一件受到地理因素限制的事,甚至時間許可下不請假一邊工作一邊面試都是可以達成的事:實際上的面試體驗,就跟一般(遠距)工作或開會一整天相去不遠。
而我因為不是很喜歡長時間視訊的疲憊感,通常都會跟Recruiter詢問能否將超過4小時的面試拆成兩天。
而幸運地,我遇到的recruiter都很通人情地把超長的onsite video call拆成兩個通告發。
所有遠距面試的共通點就是會用到那些遠距協作很常使用的工具,對於已經習慣的遠端工作者來說是不需要特地再練習的。
Google Doc
Zoom and Zoom whiteboard
Google Hangout
技術面試時,通常會使用常見的線上IDE在共同編輯的區域寫code並執行:
HackerRank
Codesignal
Codility
有些公司會很用心地製作Remote Interview Guide
至少面試前十分鐘確認器材:耳機可以聽、麥克風可以收音、鏡頭可以開
遠端面試最重要的就是要在至少面試前十分鐘確認器材一切正常:耳機可以聽、麥克風可以收音、鏡頭可以開。平常在自己公司meeting遲到還可以sorry I was on another call搪塞一下,但遠端面試比面試官還要晚加入Zoom是滿失禮的事。而且耳機連線、打開鏡頭這些小動作連續做起來其實會讓時間損失非常多,說不定這浪費掉的兩三分鐘就是能不能讓面試官impressive的關鍵。
時間線
我的時間線從開始編修履歷到開始面試,大致上進行了半年。
2020.8:修履歷、準備面試資料、 第三方獵頭聯絡、LinkedIn隨手海投
2020.9:開始安排電話面試、開始有許多公司獵頭聯絡(應該是因為招聘季)、一邊面試一邊修正準備方向、LinkedIn隨手海投
2020.10:大量電話面試、以戰養戰
2020.11:大量onsite、以戰養戰
2020.12:Negotiate、簽約
2021.01:處理簽證事宜(H1B Transfer)
現在回顧起來,我其實會想要在安排電話面試以前花再稍微多一點的時間準備面試資料讓自己在最佳狀態,但一方面因為開始準備的時候毫無方向,也不知道MLE面試的內容和看重的到底是什麼,再加上我是一個需要目標導向才有動力的人,因此最後選擇了以戰養戰的方式:先安排「有興趣但失敗了也不會覺得可惜」的公司面試來練手,然後一邊修正準備方向。
在準備「準備方向」時,我將工作上的Scrum哲學應用於此:安排每日準備資料的進度、作coding practice的時間,並在每次面試後都進行retrospective,把做得好和做不好的點統整起來,作出action points調整daily working item。收集了幾個資料點之後很容易就可以發現自己的弱點在哪,並把準備時間花在相對應的痛點上。
面試種類
一般來說,MLE的面試種類分為以下五個大方向:
1. Coding
這部分相信大部分的SWE都滾瓜爛熟了,除了熟練演算法實作外別無短徑。我在實際面試前一直很好奇MLE的coding bar會不會比較低?其實並沒有,MLE就是SWE,在大部分公司兩者對coding interview的要求是一樣的。
2. ML Theoretic / Practical
這部分是我準備起來花費最多時間,也是每個公司、每個職位要求最不一樣的環節。就像MLE職稱百家爭鳴一樣,我遇過很多種不同的面試名稱:有的叫Practical ML coding、有的叫Theoretical ML interview、有的叫ML Fundamental、有的叫ML / DL deep dive⋯⋯但其實內容大同小異,就像是大學或研究所修的Machine Learning課的期末project:會問問基礎觀念,給你一個case study然後你可以用什麼model當baseline、如何evaluate model等等。
這邊我列出幾個經常被問到的面向:
A. ML Basic
第一個大方向是ML的基本觀念,就是在第一堂ML課上會學到的基礎。
還有幾個面向很常在一畝三分地的面經上看到,像是SVM、Clustering(Kmeans)和Dimension Reduction(PCA),但我的經驗裡很少被問到,有被問到的時候也沒有問到很深入。不過這些知識對於MLE來說算是必備技能,工作上也很常用到。
以上這些基本觀念在面試被問到時都必須要像膝跳一樣反射,Andrew NG的Machine Learning Course Note和Google的ML crash course都是很不錯的準備資源。
Tree model在面試時對我來說是比較不熟悉的部分,因此特別花了一點時間將林軒田老師的講解複習一次;我也十分推薦這門課程,每過一陣子重聽都會有不同的體悟。
B. ML Domain (NLP / Deep Learning)
第二個大方向就是ML domain,不同領域的MLE需要針對不同的資料特性實作不同架構的模型。因為工作經驗和履歷的關係,我時常被問關於NLP和Deep Learning的問題。
偶而會有面試官問我Computer Vision、Learning to Rank或是Graph Learning等等我在工作上沒有實際接觸過的領域,通常我的回答就是我沒有做過,但在NLP上有個類似的問題可能可以這樣解,以及我有讀過一些相關的paper也有興趣等等。
這邊列出幾個需要熟悉的關鍵字。
Deep Learning:MLP、CNN、RNN、LSTM、GRU、LSTM-CRF、Transformer、Sigmoid / Tanh / ReLu、Dropout、batch-norm、early-stop、SGD、mini-batch training、Adam(2nd-order optimizer)、focal loss、triplet loss、model distillation
NLP : Sparse feature (BoW、Tf-Idf)、Dense feature(Embedding)、static word embedding(word2vec:CBOW / skip-gram、GloVe、fastText)、contextual word embeddings(Elmo、BERT)、seq2seq with attention、sentence embedding、triplet loss、常見task作法和baseline(Text classification、NER、POS tagging、NLG、LM、short / long text similarity)
這部分算是吃老本以及個人興趣,網路上有許多很不錯的資源,例如Deep Mind Lecture、Stanford Natural Language Processing with Deep Learning、CMU Neurel Nets for NLP
另外也很推薦Dan Jurafsky的Speech and Language Processing,是NLP必讀經典。
C. ML Case Study
ML Case Study是很常見的面試內容,面試起來的感覺其實有時很像system design,但不會深入到system的部分。
常見的case study有Text Classification / ranking problem,一般來說會給一個情境,例如今天想要Detect hate speech in user’s post,我們可以怎麼做?或是今天要設計一個newsfeed ranking的feature給user,我們要怎麼rank?Case study其實非常看重domain knowledge,因此在我的經驗裡有相關的背景知識和經驗面試起來會非常愉快,就像在討論公司的新project一樣,但若是遇上自己不熟悉的領域,可能就會綁手綁腳 — — 但不論case study遇上的是什麼問題,最重要的還是systematic thinking:
Business Goal:定義商業目標和project的價值
Metrics:如何選定能達成目標的指標並優化
Features / Feature Engineering:從high level到detail討論哪些feature是可能可行的
Modeling:選定演算法,討論不同演算法的trade off
Model Evaluation:如何線上及線下評估模型的效能
Deployment:如何部署及維護模型
按照設計流程走很容易就可以畫出project的大方向,和面試官討論起實作細節也會有效率地多。
D. 奇行種
這裡列出一些印象深刻的奇行種面試經驗,標題是Recruiter提供的面試名稱
Practical ML:給一個Google Colab在90分鐘內寫出一個POS tagging的model baseline,可以用任何framework,但不能直接import model
ML fundamental:導完logistic regression後面試官問我:你想被問什麼?Tree model?Deep Learning?SVM?選一個。
ML Experiment:整場都在討論不同的metric該怎麼用。
NLP:不廢話,不問基本,直接討論BERT和Transformers該怎麼用。
3. (ML) system design
這部分也是常規SWE面試常常遇到的,而MLE與SWE面試著重的點不同的是問題全部都會是圍繞著machine learning solution打轉(廢話)。
這個環節的面試很著重於經驗,如果在工作上有實際搭建過ML system的話就能夠聊得非常輕鬆加愉快。
而準備ML system design別無他法,除了大量閱讀和吸收別人的經驗外,如果有自己實際部署模型的經驗,就會了解到過程中有許多可以深入討論的技術點。ML system design是我仍在不斷學習的方向,十分推薦Grokking the Machine Learning Interview:
這門線上課涵蓋了大量而且多元的Machine Learning Project System Study,有興趣的話,歡迎使用我的refer推薦連結(安利一下)
https://educative.io/signup?referralCode=gau820827-B8GgVvpr4PY
另外,Stanford新開的CS 329S以及MLSys Seminar也是很值得關注的資源
最後,一些大公司的tech blog或是publication也是很有趣的參考資源:
Facebook — Embedding based retrieval in Search
LinkedIn Search / Recommendation
4. Behavior Question
BQ是常規面試輪,基本上就是問一些工作上如何協作和解決問題等等的問題。我自認為唬爛還算是我的強項所以就沒有特別準備了(笑)。
這部分面試要稍微注意的點是每一個問題,例如最經典的老問題What’s your strength and weakness或How do you solve conflict with your coworker?(真的都遇過)最後都要想一到兩個自己工作上實際遇過的情境和結果,以及自己如何step-by-step的過程。
5. Software Engineering (Object Oriented Design / System Design ……)
以及grokking the OOD interview
再次安利一次自己的邀請碼:
https://educative.io/signup?referralCode=gau820827-B8GgVvpr4PY
流程
大部分的面試流程會從HR call 開始,然後一到兩個technical phone interview,接著Virtual Onsite,最後在offer批下來前還有個manager call。
(OA)
偶爾還是會有OA——有的公司會有MLE專門的OA,可能會寫寫選擇題或是建個簡單的模型、有的公司的OA就跟SWE一樣寫演算法題目。
HR call
這關通常是聊聊為什麼想換工作、怎麼對敝司有興趣、聊聊大方向的工作經驗等等。我曾經遇過「一個」HR問我什麼是over-fitting,但很顯然對方是拿著一張小抄在旁邊等我說出幾個關鍵字——在我說完一個句子的時候他對幾個直接相關的單字例如high variance / not generalized well不斷點頭說好,但其他不那麼直接相關的單字例如cross validation / regularization就毫無反應。
technical phone interview
通常為時45分鐘到一小時,內容通常是Coding + ML Theoretic。常見的組合是一題leetcode加上logistic regression開始的ML基本觀念討論,最後依據面試官的專業會有不同的domain ML問題,先上LinkedIn蒐集一下面試官資訊會很有幫助。
Virtual Onsite
真正的面試。VO就是以前的onsite,只是把所有面試都改成視訊會議舉行,常見的軟體有Zoom、Google Meet、Microsoft Team等等。每個VO都至少會有四到五輪,一開始HR都會塞到同一天,但拆成兩天進行也是可行的。另外,大部分的公司都會告知每一輪面試的面試官資料和面試內容,如果有任何的不清楚或是太籠統,比方說HR只說This round is about machine learning,發個信問一下他們是會告訴你方向的(雖然實際作法上他們只是直接去問面試官然後轉達訊息)。
準備VO除了複習資料外,讀一讀你即將面試的公司或是組的tech blog也是很好的準備方式,通常tech blog上發表的問題就是這個公司正在解決的問題,因此很容易就在面試裡討論到。如果對公司正在解決的問題有很深的domain knowledge,會是一個很強烈的strong hire signal。
再次安利一次自己的邀請碼:
https://educative.io/signup?referralCode=gau820827-B8GgVvpr4PY
流程
大部分的面試流程會從HR call 開始,然後一到兩個technical phone interview,接著Virtual Onsite,最後在offer批下來前還有個manager call。
(OA)
偶爾還是會有OA——有的公司會有MLE專門的OA,可能會寫寫選擇題或是建個簡單的模型、有的公司的OA就跟SWE一樣寫演算法題目。
HR call
這關通常是聊聊為什麼想換工作、怎麼對敝司有興趣、聊聊大方向的工作經驗等等。我曾經遇過「一個」HR問我什麼是over-fitting,但很顯然對方是拿著一張小抄在旁邊等我說出幾個關鍵字——在我說完一個句子的時候他對幾個直接相關的單字例如high variance / not generalized well不斷點頭說好,但其他不那麼直接相關的單字例如cross validation / regularization就毫無反應。
technical phone interview
通常為時45分鐘到一小時,內容通常是Coding + ML Theoretic。常見的組合是一題leetcode加上logistic regression開始的ML基本觀念討論,最後依據面試官的專業會有不同的domain ML問題,先上LinkedIn蒐集一下面試官資訊會很有幫助。
Virtual Onsite
真正的面試。VO就是以前的onsite,只是把所有面試都改成視訊會議舉行,常見的軟體有Zoom、Google Meet、Microsoft Team等等。每個VO都至少會有四到五輪,一開始HR都會塞到同一天,但拆成兩天進行也是可行的。另外,大部分的公司都會告知每一輪面試的面試官資料和面試內容,如果有任何的不清楚或是太籠統,比方說HR只說This round is about machine learning,發個信問一下他們是會告訴你方向的(雖然實際作法上他們只是直接去問面試官然後轉達訊息)。
準備VO除了複習資料外,讀一讀你即將面試的公司或是組的tech blog也是很好的準備方式,通常tech blog上發表的問題就是這個公司正在解決的問題,因此很容易就在面試裡討論到。如果對公司正在解決的問題有很深的domain knowledge,會是一個很強烈的strong hire signal。