更新於 2022/11/10閱讀時間約 38 分鐘

2022機器學習工程師面試經驗分享

這篇文章主要是紀錄筆者在2022上半年尋找機器學習工程師(ML Engineer)的一些經驗和心得。雖然網路上已經有非常多相關的資源和分享,但鑑於在親身經歷的過程中仍舊學習到很多新的觀念和想法,也受到非常多的幫助,希望透過分享這些經驗能夠回饋給大家,並或多或少的幫助有類似目標和想法的朋友。以下為筆者的相關背景和找工作的目標。分享的內容不見得可以完全適用每個人的情況,請大家自行斟酌:
  • 畢業後在美國軟體公司約六年的工作經驗。
  • 本身工作是和ML相關的軟體工程師,也希望找ML相關的職位。
  • 在senior level有兩年多的時間,目標找尋staff level的職位。
本文有點長,主要分成兩大部分: 1) 準備面試前的準備; 2) 面試實務層面。

準備面試前的準備

為什麼要找新工作?
這絕對是在一開始最應該問自己的問題。每個人對職涯的目標和要求各有不同,有人追求work-life balance、有人想賺更多的錢、有人渴望擁有更多權力、有人希望學到更多東西、有人注重做自己有熱情的事,沒有什麼對錯,端看自己的想法。而當現有的工作環境和想達成的目標有一段差距,這段差距又大到給你足夠多的動機,你才會下定決心去找新的機會。很多人(包括我自己)不見得真的很清楚現有環境缺少了什麼跟自己想要追求的是什麼,而只是單純的覺得對現況不滿意不開心, 這時花一點時間靜下心來仔細思考一個工作的各個層面以及在你心目中的排序會很有幫助。一方面可以在找工作的初期就過濾掉一些不適合的機會節省時間,一方面在真正拿到offer之後也可以幫助你做最後決定。
從實務上來看,至少在科技業,“忠誠”是不值錢的。公司不會因為你忠於公司待的時間久就給你更多的好處,甚至隨著市場的變化和通貨膨脹,你的薪資更有可能被變相的貶值或低估,常常聽到一些新進員工的薪資高過已經做好幾年的員工就是一個例子。簡單來說公司只關心在市場上它需要付多少錢才能購買到”你的能力”。但問題是”能力”是很難被量化和衡量的,最直接的方法就只有透過其他公司”出價”來證實自己的價值。“找工作”本身就是一個把自己的能力放到市場上待價而沽的方式,如果真的拿到其他公司的offer,很多公司也願意透過加薪的方式把你留下來。換句話說,這是一種對自己能力的市場價值重新評估的方式。
在瞬息萬變的科技業,天曉得你的部門會不會哪天突然因為公司決策的轉變或景氣的衰退而被解散甚至裁員。每經過一段時間重新讓自己複習並熟悉找工作的知識和技巧也可以在某種程度上當作自己職涯的保險。
不可否認的,找工作本身是一個十分耗費心力和時間的過程。同樣的資源花費在陪家人、學習新技能、side project、拚現在的工作、或是單純的享受人生都是一樣有價值的,沒有什麼高低對錯之分。因為在下定決心找工作前,花點時間想想自己追求的是什麼核心目標,為何而戰,是非常重要的。

時間是你的朋友
對於應該花多久時間準備面試大家可能都有不同的看法,但個人更傾向把這個過程看作是一場馬拉松而不是100公尺短跑,給自己至少一個月的準備時間,理想上把時程拉到三到六個月最好。當然你可能會聽說”誰誰誰只花了兩個禮拜的時間就拿到X公司的offer耶!”,但請不要把那些故事當作通例。事實上,不論你是在什麼頂尖的公司工作,在組裡呼風喚雨帶了多少人,還是個在幾年內就扶搖直上的新星,這些經歷到頭來都只是履歷上的幾句話,沒有哪間公司是願意單憑幾句履歷上的文字就願意提出肥美的offer邀請你去,他們更看重的是在面試的過程中能確認你有你履歷上寫的那麼好,跟你有沒有具備他們需要的能力。而在面試的過程中”證明”自己本身就是一個需要花時間準備並且和平常工作內容不完全相關的能力。舉例來說,你可以是一個談判技巧高超,在各組間穿針引線達成各項任務目標的強者,但你要怎麼在一個小時內說服面試官你有這個能力卻是完全另外一回事。
說了這麼多,只是想傳達: 請認真看待”找到自己滿意的offer”這件事,並投資足夠多的時間心力在上面 (Searching for a job itself is a full-time job)。一路上看過許多同事朋友(包括我自己),都曾經因為太過輕忽找工作這件事結果碰個一鼻子灰,因此才會在此提出這個建議希望大家從一開始就有正確的心態,並減少浪費自己時間和機會的機率。說到底,在這個過程中進步了多少和最後拿到多滿意的offer才是最重要的。用多短的時間達成這個目標充其量只是一個可以拿來和朋友說嘴炫耀的話題罷了。

Be strong,mentally!
找工作的過程絕對是一個充滿壓力和耗費心力的旅程,不管是從一開始和recruiter的攻防戰、面試、一直到談offer都不輕鬆。整個過程能在一個月內結束算是非常快速的,前前後後拖到三個月以上甚至半年更是常有的事,因此在這個過程中找到舒壓和調節心理狀態的方式比想像中的重要許多。每個人或多或少都會遭受一些壞消息的打擊,如recruiter刻意貶低你的價值、表現差的面試、表現好卻收到拒絕信、通過面試卻拿到很差的offer… 如何在接受這些打擊後對自己保有自信,努力不懈,並拿出好的一面面對下一次的面試往往是最後成功的關鍵。因此,請重視並安排時間和方式照顧自己的心理。假設你打算每天下班後花三個小時找工作,與其全部拿來念書或寫Leetcode,不如撥出其中的半小時來運動/冥想/或做任何其他紓壓及降低焦慮的方式。
從另一方面來說,面試本身就是一個具有高度隨機性的過程,從phone到on-site interview,一路上可能會和5~10個(甚至更多)面試官對談,即使是再有制度的公司,會嘗試教育每個面試官並為每個職級提供明確的參考標準,但每個面試官心中的那把尺畢竟不可能完全一樣,他們是不是有充足的面試經驗來校準自己的衡量標準,決定問的問題,甚至當天的心情,都很有可能影響到最終結果。再有實力的人也有可能因為運氣不好遇到不適任的面試官而導致結果不理想。因此,了解到充滿不可控變因的面試過程,可以幫助你在面對失敗的結果時不過度苛責自己,把重心放在自己可以改進的地方。當然,平常多做好事累積人品也是相當有幫助的。

了解你的對手
在找工作的過程中會接觸到公司負責招募的各種不同的角色,多了解他們有助於準備和他們的應對進退,這裡提到的情況主要適用於較有制度的公司,而不是小型的新創公司。
  • Recruiter: 主要的工作就是負責招募,協調面試過程及最後和你談offer的人。他們通常對相關產業有基礎的理解,大致知道要找具備哪些技能的人,但不一定懂技術。他們的目標(以及被評量表現的方式)就是找到人來填補職缺。站在這個角度,他們其實和你是同一個陣線的,因為只要你面試表現好,拿到並接受offer,就可以在他們的考績記上一筆。但從另一個角度看,他們也有動機想要用越便宜的成本招募到你越好,因此被recruiter刻意貶低價值也是常有的事,例如他們很有可能說: “就你的資歷,我們很難給你staff-level,不如我們把目標放在senior比較容易怎麼樣?”,或是”根據你的表現,我們願意給你X的年薪,在目前的就業市場應該算是很頂尖的” (但其實遠低於行情)。關於談判技巧,網路上有很多資源這裡就不贅述,重點是在事前想清楚自己的底線在哪裡,禮貌並堅定地表達出你的要求,及做好拒絕或被拒絕的準備 (如果你打從心底害怕談判破裂,那其實也不用談判了對吧?)。但請記得一定要保持良好的態度,不管你實力再強,一個被惹毛的recruiter是完全有能力/權力搞砸一切的。
  • Hiring manager: 就是想要招人的主管,也很有可能就是你如果加入後的主管。在招募的某個環節(通常是前幾次面試,但也不一定),recruiter會讓他和你面談。主要目的是聊一聊你的經驗,看看你的能力適不適合他的職缺,也順便大致了解一下你是什麼樣的人。如果他覺得你適合的話,hiring manager大概會是整個過程裡最希望所有面試一切順利,給你你想要的offer(反正不是從他的口袋裡出)讓你加入的那個人。Hiring manager對面試結果和offer有某種程度的影響力,例如向Hiring committee表達你是很適合的人選來把在邊邊差一點沒過的面試結果拉上來,或是幫你爭取更好的offer。因此給Hiring manager留下好印象是很重要的。當然,再喜歡你的hiring manager也沒辦法把一個搞砸的面試救回來,所以面試本身還是主體。反過來說,和hiring manager的面談也是你少數擁有可以在做決定前了解未來主管的機會, 因此趁機觀察對方是不是一個好主管也是不容忽視的課題。
  • Interviewer: 面試官,一群在工作中間被抓來面試的工程師(或相關職位)們。有些來自於即將要加入的組,有些則是具有相關背景的員工。他們通常是一群覺得面試人很浪費時間但又不得不做的人(當然也有些很樂在其中,享受折磨人的快感?)。他們被要求作為公司門面留給面試者好印象,但實際上不太關心你表現得好不好(畢竟你也不見得會去,去了也不見得會一起工作)。對他們而言,面試的過程就是代表公司盡可能地搜集評量你能力的訊號,整理成一個簡單的報告交給hiring committee做決定。身為一個面試者,除了回答他們的問題之外,最好可以幫面試官節省時間給他們留下好印象。舉例來說,在一段討論結束後,主動整理你們的結論,甚至把結論打出來讓他們可以複製貼上,就是一個加分的動作。
  • Hiring committee: 負責決定要不要發offer的人們。他們通常是一群比較有經驗或較高位階的工程師/主管們,recruiter會把他和你面談的筆記和各個面試官的報告統整成一份報告來和hiring committee們討論offer結果。在找工作的過程中幾乎不太會和他們有互動,因此也沒有什麼太多值得注意的地方。

到底什麼是ML工程師?
在機器學習(Machine Learning)崛起的過去這幾年,越來越多公司把發展重心投資到相關技術,同樣的也越來越多工程師想要學習和參與和ML有關的專案。也因為如此,近幾年專門為了ML/AI領域的職稱也如雨後春筍般冒出來,舉凡ML Engineer / Research Engineer / Applied Scientist / AI Designer / AI Architect / Data Scientist / Data Analyst / Research Scientist往往工作內容的描述或多或少都跟ML/AI扯上關係。就筆者的觀察,他們大方向上可以分成以下三類:
  • Research Scientist: 注重研究和學術層面,工作目標是研發新技術以發表論文和科學期刊為主,研究通常是離產品較遠但目光放得更長(3-5年以上)的項目。在為研究題目做假設和簡化過程比較不需要去顧慮到實際層面運用上的限制。
  • Data Scientist / Data Analyst: 注重實務上的數據分析,通常具有統計的背景,處理的問題和實際的產品有關。例如: 為某個即將推出的功能設計A/B test的實驗,分析現有訓練數據的品質,根據產品的需要提出適當的模型來分析或是預測。。等等。
  • ML Engineer / Research Engineer / Applied Scientist: 簡單來說就是具備ML知識的軟體工程師,實際的工作內容每個公司或甚至每個組都可以差異很大,處理的專案通常還是比較偏產品端,有相對較短的任務目標(1-3年)。本篇即是著重分享找尋這類型職缺的經驗
值得注意的是,一個ML專案從定義問題開始,數據搜集(data collection),設計/訓練模型(model design/training),部署(deployment/serving)及應用到產品上(productionisation)。等等。不同的ML工程師處理的可能是其中任何一個環節,從大部分都在寫Tensorflow/PyTorch到完全著重在ML Infrastructure都有可能。也因為如此,在找相關職位的同時建議多和recruiter及hiring manager確認內容,以免加入後才發現根本不是自己想像的工作內容。
而公司對於ML工程師一般期望具有下列的能力:
  • 有基本對於ML的認識,對幾種常用的古典ML方法或工具(例如: linear/logistic regression,SVM,PCA…)有所認識並了解他們的使用時機。
  • 對Deep Learning各領域大致了解並熟悉至少一個子領域(Computer Vision/ Natural Language Processing/ Recommendation System…)並對該領域有名或最新的技術(2年)有所了解。
  • 有能力把一個實際的問題轉化成ML問題並提出可行的解決方法。
  • 可以看懂 / 實作 / 改進 / 客製化已發表的期刊或論文。
  • 懂得利用平行運算(例: MapReduce)的工具來處理大規模(Large scale)的資料。
  • 了解研發一個ML系統具備有哪些要件和流程(例如: 資料搜集/儲存,模型訓練,表現評估。。。)。
不過以上所述僅供參考,主要還是因各職缺而異,也可以大概從面試的內容和題目對該職缺的工作內容略窺一二。

Senior vs Staff?
在找工作的過程中,除了公司本身,工作內容,職稱之外,職等也是一個相當重要的考量因素。職等除了決定薪水的範圍之外,也在某種程度上決定了之後專案的scope大小。每個公司對各個職等的要求和命名其實大不相同,大家可以參考Levels.fyi網站來大致了解公司彼此之間職等的對應及他們的薪資範圍,而這邊討論的Senior和Staff主要是參考Meta或Google的定義並參雜個人的一些看法,不一定完全正確也歡迎大家一起討論。一個常見的對於職等的誤解是”職等是由年資所決定的”,事實上年資只扮演了決定職等相對小的角色,更多取決於你過去參與/執行/領導的專案的scope大小,或是對公司的貢獻度:
  • Senior: 通常被公司認為是一個可以穩定為公司產出的工程師,不會強力要求要持續進步並往下一個職等邁進,因此這是一個理論上可以一路待到退休的職等,要不要繼續升遷完全取決於個人對職涯的規劃,我有遇過能力很強的同事,選擇長時間待在這個職等以換取更好的work-life balance。這個職等的工程師除了本身的工作外,會直接影響到1-5個其他工程師的工作內容,領導的專案大致需要幾個月至一年的時間完成,在組裡為至少一個領域的專家(大家有什麼相關問題都會去找你)。
  • Staff: 和Senior不同的是影響的人數擴展到10人左右。所謂的”直接影響”不只是“參與”一個多人的團隊,而是更接近於領導並推動一個多人的專案,制訂要完成的工作並指派團員去達成,推動的專案通常需要跨組或是跨部門的合作並需要一至多年的時間來完成,或是直接管理多人的團隊並成功達成一些目標。
當然以上只是一個很粗略的分類,職場表現還有很多其他的面向,有人可能沒有機會主導夠多人的專案,但因為成果為公司帶來豐厚的營收而被升等也不少見。
通常找工作會拿到的職等和你目前在公司的職等有關,最常見的就是拿到同(或對應)職等的職缺,但根據面試表現的狀況,拿到+1或-1職等都有可能。在面試的過程中,面試官的目的就在於在和你問答的過程中,去了解並評估你過去所執行過的專案大小,並最終決定你的職等。因此如何把自身過去的經驗包裝成和職等相對應的期望非常重要。
在準備找工作前,最好先花一點時間了解你目標的職等和你最低能接受的職等,在和recruiter一開始溝通的時候就確定對方知道你的底線。因為對於不同職等所需要的面試內容和面試官的職等會不一樣,通常會要求面試官至少和面試職等相同或是更高,因此如果打從一開始recruiter就沒搞清楚你要的職等,很有可能會安排到不合適的面試官們,到最後只能給你不是你要的職等,或是只好再加幾關面試,不管怎麼樣都是相當麻煩的,也會把整個過程拖得更長。另一方面來說,如果一開始就目標比較高的職等,即使表現不達標,還是有機會給你低一個職等的offer。別忘了,recruiter會想盡辦法用較低職等的offer來雇用你,所以最好從一開始就表達清楚你的底線,以免浪費雙方的時間。

面試實務層面

和recruiter接洽過幾次之後,如果雙方都覺得合適,就會開始進入安排面試的流程,對較有規模公司來說,時間上通常比較有彈性,你可以要求等一個多月之後再開始面,或是直接安排下週面都可以(當然也看公司對該職缺急不急)。個人的建議是可以早點(還沒完全準備好面試前)開始聯絡recruiter,但要求長一點的間隔時間準備,原因是recruiter那關就可能來來回回拖一陣子。
面試大致上會由2-3關的phone interview和5-6關的onsite interview (現在大概還是透過視訊而非直接去公司)組成。根據你的背景,有可能會問你要不要直接跳過phone interview,這邊我的建議是除非你趕時間,不然用phone interview練練手感,順便多了解一些公司其實是好事。面試的類型可以分成以下幾類:
  • Team match (hiring manager chat): 通常會有一到兩回這類型的面試,有的會發生在最剛開始,有的會是都過了hiring committee才做。主要目的是讓主管知道你的背景,看看適不適合,同時也讓你多了解未來的主管和工作內容。
  • Behavioral (bar-raiser / cross-functional / experience): 在onsite interview中可能會有1-2關這類型的面試。主要目的在瞭解你過去的經驗,看看你和公司的文化契不契合,並從中衡量你過去參與或領導過的專案scope大小。在某種程度上,這關的內容會幫助決定最後的職等。
  • Design (ML Design / System Design): onsite interview中可能會有2-3回合這類型的面試。個人覺得是整個面試裡面最重要的類型了,他不僅是考專業的技術問題,同時也幫助面試官衡量適合你的職等。
  • Coding (AI coding / ML coding): 在phone和onsite interview都會出現,總共大概2-3回。主要就是考你寫程式解決問題的能力。對senior以上的職缺,這類型的面試算是測驗基本能力,需要表現得好,但通常不太會用這關的結果來決定職等。
在時間的分配上,建議最好把重心放在design上,並且不要忽略了behavioral的準備時間。Design vs。behavioral vs。coding的時間分配可能應該更接近40% vs。30% vs 30% (當然是看大家狀況見仁見智)。但如果你發現自己花超過80%的時間在寫Leetcode上,很有可能過於輕忽其他項目了。
以下就各個類型的面試分享一些經驗和心得。

Coding
如前述所書,這類型的面試主要就是在考你基本的寫程式能力,以及對基本演算法和資料結構的理解和分析。準備的方式網路上已經一大堆了,但不外乎就是練習Leetcode。和申請senior以下的職等相比,這一關其實差別並不大,不會因為你要申請的是staff就狂考你hard的問題,因為說老實話能夠在面試中完整解完hard題目最佳解的人根本很少,和真正在職場上的表現相關性也不大。就個人經驗看起來,能練到面對90%以上的medium問題都順順解完,hard問題也可以在時限內寫出一個非最佳解的解法就差不多了。就算是hard的問題,大部分公司應該更傾向於考需要使用多種資料結構/演算法和實現上較複雜的問題(例如: Leetcode 269)而非需要特別巧思或是某種特殊演算法的題目。
至於到底會不會遇到hard的問題,就得回歸到前面提到的”隨機性”這回事,被安排來面試你的面試官是誰,想要拿什麼樣的題目來問,都很難說,公司也不會真的去限制到底要考多難的問題。重點也不在於被問到hard的題目能不能完美解完,而是”你在面試官眼中相較於其他面試者的表現”。一個喜歡拿hard問題到處問人的面試官,最終也會發現能完美解完的人非常少,進而調整自己對面試者合格的標準 (至於你是不是運氣不好發生在他前幾個校準過程中的倒霉鬼就是另外一回事了)。
對於申請ML想關的職缺,近年似乎冒出了所謂的”AI coding”或是”ML coding”。不同於上述的面試,可以讓面試者自己選擇想要使用的語言,AI coding通常會要求使用Python,畢竟現在幾個主流的資料分析工具和深度學習框架都是用Python。這類面試麻煩的地方是沒有類似Leetcode的題庫可以練習,遇到的考試題目也差異頗大。大致上來說他們想知道你對使用Python來做資料分析或建構模型的能力,並趁機衡量你對機器學習的一些基礎知識。
準備上,基礎知識的部分可以參考Ian Goodfellow的Deep Learning這本書的第一部分。實作上可以複習一下numpyTensorflowPyTorch的語法。如果有曾經利用這些工具實作一些論文的經驗(不是只是套用現成的套件而是真的實現某一部分的model architecture),或者熟悉用vectorization處理矩陣運算和熟練地處理高維度向量,應該不會有太大的問題。幾個遇過的考試題型如下,希望可以給大家一點感覺:
  • 給一篇跟Deep learning的論文,讓你讀完某一小章節,並用TensorFlow/PyTorch實現。
  • 給一堆二維的點(x,y),請推導piecewise regression (linear regression簡單版的變形) 的參數,並用Python實現該演算法。
  • 請解釋sparse vector怎麼實現的(用什麼資料結構),他們的一些運算(加減乘)是怎麼實現。
  • 如果給你一堆資料夾裡面有很多video,請設計並實現一個在訓練模型可以用的data loader。
  • 給你一個x的多項式,請你推導他的導函數並用數值分析的方法實現它。當x是高維度的向量時,同樣的問題會變成什麼答案。
以上的題目其實可能都會出現在研究所或是大學的機器學習作業中,只是工作一陣子後有可能一些基礎的東西就忘記了或是沒那麼熟練到可以在短時間內解出來,因此花一些時間重新讓自己熟悉這些應該就可以應付。
以下是一些個人學到的和coding面試相關的小經驗:
  • 不要浪費太多時間在自我介紹和問問題: 禮貌上,一開始面試官都會自我介紹也請你介紹自己,或問你有沒有什麼問題。請不要花過多時間講自己的豐功偉業,因為那完全不是這回合面試的重點。搞清楚面試的長度,如果東扯西扯把時間填滿導致最後code沒寫完,就算你講的是一些過去很了不起的成就,這關一樣是個fail。
  • 在沒有和面試官確認前不要寫任何一行code: coding面試考的不只是你有沒有寫程式的能力,更包括了你有沒有辦法清楚的表達內心的思路,和別人溝通的能力。一聽到題目就埋頭開始寫,即使完全正確,對某些面試官來說其實是red flag。
  • 在寫完之後不要直接說”我完成了”,而是提醒面試官你寫完初版了,請他和你一起瀏覽這些code並且逐步講解每行的作用。一方面是讓面試官能夠了解你的想法和實作內容,另一方面可以邊檢查有沒有發現bug並主動修改。
  • 可以適當的簡化問題,但要讓面試官清楚你的假設: 有些時候一開始不能馬上想到解法,可以試著透過一些假設讓問題簡化,例如: 可能題目要你解k是所有正整數的狀況,但你可以先從假設k很小或是1的情況開始解。一方面可以幫助你思考,另一方面就算沒解出一開始的題目,能夠對問題做簡化並成功解完也算是能拿到部分的分數。但切記讓面試官了解你做簡化的過程及假設,不然很容易讓人覺得你難以溝通。
  • 找同事或朋友幫你練習: 很多人沒有意識到自己悶著頭寫Leetcode跟有人盯著你要你邊想邊講邊寫是完全不同的兩回事。因此找朋友假裝當面試官幫你練習可以讓你習慣被面試的感覺。如果你覺得找朋友幫你聽很害羞又怕丟臉,相信我,真正面試時候的壓力和不適感只會更強烈。

Behavioral
對從前的我來說,總是以為這類型的面試就是打打嘴炮,和面試官聊聊天,講講自己過去的經驗,並讓對方覺得我是一個正向,上進,很好相處和合作的人就夠了。這對於剛畢業在找工作的人來說也許是真的,但當申請較資深的職缺時,就不是這麼一回事了。這類面試通常是透過一些開放式的問題來了解你過去的經驗和你在公司裡扮演的角色。舉例來說,他們可能會問”你在工作上遇到過最困難的問題是什麼?“ 想想以下的答案:
  • ”我接到的專案是一個離職的前輩交接給我的,該專案裡面的程式碼的開發者都已經聯絡不到,很多其他同事嘗試著想要接手但都失敗了,我臨危受命花了一個月的時間把他讀懂,重新整理並設計實現成新的套件,最後成功的達成專案目標.”
  • “我負責主導一個團隊開發一個產品功能的技術,目標在XX發表會上展示,在發表會前兩個月,我們突然發現有另外一個團隊也在開發類似的技術,在短時間內我們必須要和他們合作進行技術的比較,並且達成最終產品要用誰的技術的共識…”
上述兩個例子其實都是證明工作能力不錯的答案,但第二個例子的scope明顯要比較大,主要原因是他的項目牽涉了很多人,甚至好幾個團隊。而第一個聽起來就比較像是一個一人就可以完成的專案,即使他也很困難也對公司來說很重要,對面試官來說聽起來就不一定達到senior以上的要求。
在表達的方式上,可以參考STAR原則,基本上就是訓練自己的陳述能夠在短時間內傳達出一件事情的發生的情境(Situation),需要達成的目標(Task),你採取的行動(Action),和最終的成果(Result)。重點是讓對方能在完全不了解你跟你團隊的背景的情況下,了解發生了什麼事和你扮演著什麼樣的角色。
在陳述的結構上,個人覺得U-Shape是一不錯的模板。基本的概念就是用三個階段來回答問題:
  • 一開始用一兩句話講明這個故事證明了你的哪些特質跟經驗,尤其注意這些特質跟經驗是對準你想申請的職等。例如第一句就說: “我想分享的是之前身為一個超過X人專案主導者,在執行的過程中,如何和公司其他Y個部門合作,讓一個Z年計畫順利進行並為公司增加W營收的經驗。”
  • 再來利用STAR原則把整個經驗的細節解釋清楚,提出證據讓人相信那些是你真正完成的事情。
  • 最後再像開頭一樣用幾句話統整你達成的目標。
會推薦這個結構主要是站在面試官的角度來看待這件事情。如前所述,面試官的工作就是在你描述的故事裡面,捕捉他想知道的訊號(領導經驗,專案大小,時程長短…等等)來決定他的評比。而面試官又是一群覺得面試很煩卻又不得不做的人,因此幫助他統整好,直接把他想要聽的在一開始餵給他,節省他最後打報告的時間,在某種程度上就是在幫助你自己。
準備這類型的面試,可以先從網路上搜尋一下常見的behavioral問題有哪些,看多了會發現不外乎就是那幾個類型。然後針對每個類型,想出一到兩個過去的經驗來回答(同一個故事可能可以拿來回答幾個不同的問題),明確地寫出來每個經驗要傳達出的訊號有哪些(例如: A故事可以證明我的領導力,跨部門合作能力,B故事證明在被交付一個連主管都不清楚怎麼處理的問題時,我怎麼簡化和規劃適當的計畫來解決…)。多練習用上述原則來表達每個故事,並最好可以講給其他人聽確定整個故事是否解釋清楚。
總而言之,要想面好這關,花足夠多的時間整理過往的經驗並想好方式呈現絕對是必須的。其他一些小技巧:
  • 針對某些公司的題目或文化去做準備: 例如有些自駕車公司的文化特別重視”安全”,就可以想一下有哪些故事可以說明你是一個做事謹慎不求快,能完美達成目標的人。或是有的公司注重大膽創新,就想一下有沒有什麼經驗是你用非常規的方式解決遇到的問題。
  • 說故事時要明確,不要吹噓不屬於自己的經驗: 有人可能會把某個專案講得很籠統,但面試官需要知道的是你在該專案裡扮演著怎麼樣的角色,是主導者? 發起者? 執行者? 還是其中一位工程師? 透過一系列的問題,其實很容易發現到底是不是在說謊。當然,如果你覺得你對同事甚至是主管做事的內容有足夠多的了解,悄悄的把一些經驗說成是自己做的可能也不一定會被發現,就看願不願意賭一把就是了。
  • 掌控時間: 在回答問題的時候,注意時間並且察言觀色,不要講得太鉅細彌遺結果最後只答完一題。重點不是講多長,而是能不能讓面試官聽到他想聽的。寧願一開始講短一點,再視需要補充更多細節。

Design
設計類型面試大概是我覺得在這個職等範圍最重要的項目了,他不僅用來評量你的專業知識,解決問題的能力,也能透過思考問題的方式來評量你適合的職等。對一般的軟體工程師來說,大概會有兩到三關的系統設計面試(system design interview),而對ML工程師的職位,有些公司會把他們換成ML設計面試(ML design interview)。值得注意的是,某些公司ML工程師會需要兩種都考,所以最好兩個都有所準備。
系統設計面試通常是考官直接請你設計一個系統,例如: “如何設計一個縮短網址的網頁”。問題本身是開放性的(有時甚至刻意的模糊)。目的在於透過和考官的互動,以問問題的方式,逐步釐清系統的需求(但通常一定是處理大量的資料/使用者),並根據現有的資訊及假設,做出適當的設計和選擇(如要用relational database還是non-relational database)。這種問題沒有正確答案,主要看的是你是否可以流暢的討論並有足夠的專業知識為你做出的選擇辯護。
準備方式網路上的資源已經很多了,本篇就不贅述。主流都是看Grokking the System Design Interview的課程資源(現在似乎都要付費了…,裡面對於設計一個大規模系統會用到的一些模組,相關技巧及演算法,都有不錯的介紹,也給了很多設計的實例。如果要更扎實的補充相關知識,可以看Design Data-Intensive Applications這本書的前兩部分。雖然理論上在工作上就會遇到類似的設計問題,但是要在一小時內了解並呈現出一個好的設計其實還是很需要練習的。
另一方面,ML設計面試的目的和上述有些類似,只是設計的是ML的系統。根據你履歷上的專業,或是申請的職位,題目可能會專注在某些子領域,例如: recommendation system,computer vision,natural language processing…等等。題目一樣是開放式的,需要透過互動和問問題來了解系統的需求,並主動做出合理的假設來簡化問題,最終提出一個合理的解決計畫和方案。值得注意的是,面試官要的是明確的解決方案,每一步可以怎麼做,系統的輸入跟輸出是什麼,切記不要只是丟出一些ML相關的名詞,例如只說“這個問題可以用RNN來處理”,而不提這個RNN用的input feature是什麼,output prediction的格式是什麼,這都會被視為你對這些知識本身不夠瞭解。
除此之外,對不同職等的要求也有一些不同。從個人的經驗來看,對senior-level的要求是要能在沒有什麼提示的情況下,把一個開放式的題目轉化成一個ML問題,明確講出開發的階段和實際怎麼執行(如資料怎麼搜集,衡量的指標(metric)是什麼),提出兩種以上的ML model來解決問題,比較優缺點,並提出適當的建議。簡單來說,面試官希望看到的是你能夠在真正遇到這個問題時,不需要太多指導的情況下,從頭到尾主導開發。對staff-level的要求除了上述之外,能以更宏觀的角度來看待並規劃這個問題(例如該ML系統和產品其他系統的互動),更早的看出有可能失敗的地方,並分配資源去減低失敗的風險。簡單來說,面試官期待的是你能比senior的工程師更有效並更高機率的完成這個開發,甚至影響到互相關聯的系統
以一個假想的題目當作例子: “公司推出一個產品給家裡有養狗的主人們,該產品是一個攝影機裝設在可以投飼料的機器上,請設計出可以偵測狗的位置並引導投擲飼料方向的演算法”。
一開始可以用以下問題來釐清系統需求:
  • 需要多精準的方向判別? 例: 只需要左右方向的角度,還是同時需要距離?
  • 需要多短的反應時間?
  • 這個產品會被放置在什麼樣的高度?
  • 需要考慮多隻狗的情況嗎?
  • 我們有現有的訓練資料嗎?有預算可以請人標記資料嗎?有多少?
  • 有需要分辨不同的狗種嗎? 有需要分辨不同隻狗嗎?
根據以上問題的答案,可以大致了解面試官要你解決的問題範圍,如果沒有明確的答案,你也可以主動做出假設來簡化問題:
  • 假設只處理一條狗的情況。
  • 假設只需要顧慮左右的方向,不用判定遠近。
  • 假設不需要分辨不同的狗或狗種。
根據上述假設,可以把問題簡化成一個標準的物件偵測(object detection)問題:
  • 討論要訓練一個object detection model需要的資料如何準備,要標記多少,如何搜集訓練資料,如何搜集評估的資料。
  • 討論市面上有哪些不同的object detection models,他們的優缺點,你覺得哪個比較適合,為什麼?
  • 要用什麼指標(offline/online)來評估系統好壞?
對Staff-level而言,可能還需要考慮以下:
  • 產品有沒有插電,需不需要考慮系統耗電量?
  • 產品本身有沒有運算能力,有的話多強?
  • 模型要直接在產品上面跑還是要把影像傳回伺服器跑?
  • 如果套用既有的物件偵測模型會不會有data mismatch的問題? 有的話如何解決?
  • 多隻狗的情況可能怎麼做? 需要應付關燈或黑暗的情況嗎?
  • 產品有計劃推出什麼其他的功能嗎?例如: 偵測狗的行為,偵測危險狀況。。。
準備這類型的面試,除了工作平常會遇到的問題之外,在日常生活中當遇到一些有趣的產品功能時,可以主動想想如果是你的話要怎麼設計,有可能會遇到什麼困難等等。專業知識部分推薦閱讀Deep Learning這本書的前兩部分(有時間看完整本更好)。雖然通常考的時候可以要求考某個子領域,但最好各個子領域的有名的方法都能大概知道是怎麼做的。針對不同公司,事前先思考一下該公司可能會遇到的問題並多去了解,例如要面自動駕駛的公司前,多去了解一下怎麼處理point cloud。最重要的是,能夠找到好朋友幫你練習並給你一些回饋。個人覺得實際上走過整個流程一遍,比埋頭苦讀十個小時都有用。其他一些小技巧:
  • 面試前先查好面試官的背景,去閱讀面試官或該組最近發表的一些文章/論文/演講。系統設計的題目很多都來自於真正解決過的問題。
  • 事前先整理好設計固定的流程,確認哪些是一定會要問的問題,並寫在小紙條上隨時提醒自己。
  • 在一些分享考古題的網站多看一下別人遇到的問題,ML設計這類型題目的題庫比coding小很多,所以更容易撞題,但網路上也通常不會有詳細的答案所以要自己先思考並查好資料。
  • 有自信地為自己的選擇辯護。這類型的問題通常沒有正確答案,即使面試官心目中有個答案,只要你能夠為你的選擇提出足夠的理由一樣不會有問題,因此不要畏懼地以試探的方式去猜面試官心中的答案。

結語

找工作就是一個標準的盡人事、聽天命的事。以上所分享的只是希望大家能夠更好的準備並提高通過這些面試的機率,但最終結果如何很大程度上還是有運氣的成分,因此如何控制好自己的得失心,不被可能遭遇的一次又一次的壞消息所擊倒,並持續進步個人覺得才是最重要的。請記得不論短期內能不能找到自己夢想的工作,這些準備的過程都不會浪費並轉化成持續成長的養分。另外最後再分享一些面試的想法:
  • 要自信但不自大: 展現出自信其實非常重要。你的自信會感染到面試官們,讓他們更相信你的能力,和你陳述的經驗。但請記得不要過頭了,不管你的能力多強,他們想找的是討人喜歡並在未來合作愉快的人,過度自大很有可能會讓人覺得你難以合作導致否定掉你優秀的能力。
  • 面試官不是你的敵人: 有些人會以為面試官的目的在於把你考倒,但這其實完全是錯誤的。面試官只是想要透過和你的互動衡量的你能力和未來的工作表現。他們也希望有個互動舒服跟結果良好的面試。因此請把他們放在幫助和引導解題的角色上,如果卡住了,適度地尋求提示和協助不見得是件壞事。
  • 面試是雙向的: 面試同樣也是你可以了解對方公司的機會,面試官有時候甚至可能是你未來的同事。他們的態度展現了部分公司的文化,他們本身的知識水平和能力也可以透露出這是不是一個可以持續成長學習的環境。因此請不要浪費這些機會,並準備好一些問題來獲得更多資訊。
以上為筆者近幾年來累積的面試經驗技巧分享,如果有什麼問題歡迎大家一起提出討論,並祝各位找工作順利:)
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.