【學長姊帶路】Google/Microsoft/Shopee/ASUS/Verizon 軟體工程師 面試經驗分享
原標《2021 新鮮人軟體工程師面試心得》
文/小王
本文作者親揭五家知名公司軟體工程師面試流程全攻略,想去 Google、Microsoft 面試必看! 本文提供 Google(SWE)、Microsoft(SWE)、Shopee(ML)、ASUS(AICS)、Verizon(SWE) 詳細的面試心得,看這篇就能一次準備所有科技大廠 !
1.背景
– 台大資工學+碩,實驗室主要在做NLP/Deep Leaning
– 有三篇不同領域的top conference paper(ICASSP一作、EMNLP一作、CVPR共作),還有一篇跟RL相關workshop paper
– 大四/碩一時分別做過兩個ML相關的實習,碩一的實習除了ML外同時也參與了web frontend/backend的開發
– 除了ML,程式競賽、CTF、軟體工程、資料庫、web開發等等,各式奇怪的領域幾乎都有碰過,不過除了ML外都只是略懂皮毛
– 跟同儕相較之下英文偏爛,沒有長期補過英文,當年學測壓線14級,英聽B,畢業門檻的英檢中高級聽力買題本練了一個月才壓線通過
– 碩一就幾乎寫完碩論,今年1月就口試完了,專心準備面試
2.目標
從背景應該不難看出我是個興趣廣泛的人,甚至在NLP的實驗室不務正業做著不相關的研究。所以在找工作時並沒有特別鎖定非ML相關的職缺不可。最後有投的公司有 Google(SWE)、Microsoft(SWE)、Shopee(ML)、ASUS(AICS)、Verizon(SWE)
除了Verizon是網站上自己投的,沒有收到面試,剩下四家都是內推並得到面試機會
3.面試準備
3.1 履歷
直接上懶人包:履歷範例
– 當年在2019實習面試這篇就有提過了,有能力的話請用Latex+英文撰寫履歷,對大部分科技業/軟體業都是加分項目
– 履歷請精簡,每個項目在1~2句話敘述你做了什麼、有什麼實際的影響力,不要放自傳浪費版面,能決定雇用你的人通常不會看。真的沒東西放的話學校修課的project都比自傳好。
– 公司沒要求的話請不要放個人照片!有些公司放照片是扣分項目,甚至我聽過有公司會直接篩掉有照片的履歷。
– 善用你的人脈去內推,尤其熱門的職缺內推非常重要,像 Verizon 我沒內推連面試都不給,微軟我也自己投過一個 ML 的缺沒下文,後來找人內推SWE才拿到面試。
3.2 解題
使用語言
除了 Microsoft 的職缺有指定要考 C++,我刷題面試幾乎都是用 python。python 的好處是 code 會比較短,可以節省面試時的 coding 複雜度,C++ 的好處則是 STL 功能很完整,某些特定的題目反而比 python 更方便。但我個人是建議選自己熟悉的語言就好,沒有必要特別去為了面試去練一個自己不熟的語言
Leetcode:
扣掉前面偶爾沒事隨便寫的幾十題,我主要是在1月底口試完了才開始認真刷題,二月過年還放了一個禮拜。再加上我4月初時跟同學借了premium帳號大概兩週刷了65題(6/29/30),我大概是不到3個月刷了400題左右。
刷題的重點不在於數量,而在於面試當下對各種題型的熟練度。舉例來說,有些人可能一兩年間陸陸續續刷了500題以上,但面試當下出了一題很久沒寫過的題目就爆炸了。所以我個人推薦的練習解題要分為三個階段:
1. 認識各種演算法/資料結構
有時候遇到題目想不出來並不是題目很難或自己太笨,而是題目要考的演算法你根本沒有聽過。最好的解法就是先去 Leetcode 旁邊的各個 topic 找出所有自己沒看過、不熟悉的類型,想不到時不要抗拒看提示或解答,確認你的腦袋裡有安裝完該有的 dependency 才能有效率的刷題。
2. 熟練各種題型
認識完各式算法之後就要開始懂得舉一反三,看到題目時要能快速列出可能有用的算法。這時可以先試著隨機抽題目寫,寫一陣子後應該會發現自己有不熟的topic->回去練習不熟的topic->熟了再去隨機抽題找不熟的topic->loop。練到隨機抽題抽不到不熟的題型就差不多了,除了某些真的很依賴臨場反應的hard題應該都要會寫。
3. 維持手感
其實練到上一步就夠用了,但開始準備直到全部面試結束往往是一段慢長的時光,所以每天還是要持續練習維持手感。
以我個人的經驗來說,自己感覺是大概刷個200題左右後就練不太到新東西了,後面只是每天隨機抽題練手感,有時候一個下午甚至可以解個10幾題。不過因為本身有碰過競程所以算法底子比一般人好一點,所以我前兩步驟上手的很快,底子不夠好的話剛開始熟練算法應該會比較慢,但練熟了後面試解題考驗的只是當下的手感而不是你總共刷過幾題。
模擬面試
除了線上刷題外,找人模擬面試也非常重要,畢竟面試當下的情境跟自己刷題是完全不一樣的,尤其是英文面試,邊解題邊用英文描述思路一定要找人練才有效。我自己是有跟一同要找工作的同學固定約時間互相出題模擬,沒有適合練習的對象的話網路上也有付費 mock interview 的服務,我沒有研究過但也許可以試試看。
3.3 英文
前面提過我英文偏爛,對我而言開始練英文的轉捩點是大四時第一次出國參加 conference,外國人提問時幾乎聽不懂只能跟他雞同鴨講,講到他自己放棄跟我溝通XD
之後我開始關注一些有興趣的英文 youtuber,像我本身有在玩音樂就有追 David504,他的語速非常慢很適合英聽爛的人入門。或是平常有在打 LOL 之類的線上遊戲也可以看國外的實況或比賽。一開始看不懂可以先開字幕或多回放幾次,看久了就慢慢減少看字幕或回放的比例。前陣子在面試時剛好 Hololive EN 很紅,我也常常早上起床在面試前倒杯咖啡邊看 Gawr Gura 的實況等等。
準備英文的方式網路上很多人都有分享過,但我自己認為不管用甚麼方式準備,最重要的都是要有興趣。從大四到碩二,我花了漫長的兩年才從完全聽不懂進步到有辦法用英文跟外國人面試,有興趣的準備方式才能持之以恆。
4.面試流程
Shopee – Machine Learning Engineer
3/24 內推
3/29 online coding test
4/6 coding interview
4/13 ML interview
4/16 offer
蝦皮的ML主要有兩塊:推薦系統 跟 關鍵字搜尋。要找到真的在大型產品上應用的ML技術其實很難,所以想往ML發展的話蝦皮做的專案算是非常有競爭力。
Online coding test就是丟一個測驗網址請你一小時內解兩題(字串匹配, prefix sum),全程螢幕錄影。字串匹配那題遇到網頁前端有bug測資過不了,花了快20分鐘幫他們debug,螢幕錄影大概就錄到有個來亂的人在那邊開 F12 debug。不過還好兩題都是秒解沒什麼障礙,寫完後 user experience直接 1 星開噴高歌離席,結果還是過了。
Coding interview 是用 zoom,面試官是中國人講中文,考了一題很簡單的水題+一題 BST。
ML interview事前有先問面過蝦皮的朋友,原本以為只會問基本的ML,結果面試官看了我的履歷後問了一堆NLP相關的開放式問題,包括中文斷詞、語言模型等等。這關因為沒有特別準備所以我自認沒有答得很好,不過應該還算有講出基本的答案,過幾天 HR 就通知我 offer 了。
ASUS AICS
3/16 內推
3/23 phone interview
4/12 onsite interview
4/14 口頭offer
4/21 HR offer
AICS的主力產品是用 NLP 的技術做一些醫療相關的產品,目前已經有不少醫院跟 AICS 有合作了,聽說最近也要開始跟電商合作做廣告投放。
Phone interview 是用 Teams,考了一題 two pointers。解完後面試官給了兩個 follow up,但感覺像是臨時想的他也不確定正解,兩題我都給了 DP 解,最後大概解太快了想不到要問啥了不到半小時就提早結束進入閒聊環節。
Onsite interview 是到關渡的 ASUS 立功大樓,不得不說真的是靠北遠又偏僻,附近除了 costco 連超商都不好找。
總共排了四關面試,前兩關都是問一些基本的 ML 問題,問完都有考簡單的解題(DP, linked list)。不過這兩個面試官都是偏研究路線的,感覺不太熟leetcode,解題時就是看著我把 code 寫完,test case 跟複雜度都沒有仔細問。第三關的面試官就是一般的 SWE,問了一題 DP,過程中有提出比較正常的問題跟 follow up。
最後一關是跟主管閒聊,過程中就是聽他嘴砲描繪 AICS 的美好藍圖,誘拐涉世未深的學生說服你進入 AICS 的溫馨大家庭。另外主管還有提到他們會開最頂級的 offer,可以等我所有面試都結束後再跟他們談,即使拿到外商 offer 也會有 competing offer 。不過很遺憾的是 ASUS 的 HR 似乎跟AICS 不同調,我面完後沒多久就通知我 offer 的數字了。
這裡要特別開噴ASUS的HR真的很機掰,約時間通話瘋狂放鳥就算了,問他 competing offer 的事也只說已經不能更高了,一副不接拉倒隨便你,三天兩頭就奪命連環 call 催我趕快接 offer。過一陣子我跟蝦皮談到一個還算滿意的 package 後就直接跟 HR 說 88 有緣再相見。
不過真正的好戲還在後頭,我拒掉隔天主管就打電話問原因,敘述了 HR 的事蹟後主管表示 HR 根本沒有問過他,不然 AICS 那邊是願意等的。除了我以外也有聽說其他人在 AICS 遇到類似的事,也有被主管關照。跟主管意見回饋完後沒多久就陸續聽到其他面 AICS 的朋友有順利談到 competing offer,希望那個HR現在還在ㄏㄏ
Microsoft – Software Engineer
2/23 內推
3/12 phone interview
3/26 online tech interview
3/30 online tech interview
4/13 hiring committee
6/6 offer
我投的部門是 PowerBI,沒聽過的話可以自己查一下這個產品。
PowerBI 主要的開發部門是在美國,台灣只有大約 10 人的團隊,主要是在負責處理 PowerBI API 的後端資料。由於這個部門主要是在美國,所以台灣的工程師是完全的自由工時不需要進辦公室,想要白天睡覺直接配合美國時間也行,不然聽說微軟有些部門是要打卡的。但同時壞處就是有時候需要在早上六七點跟美國開會。
微軟的面試都是用自家的 Teams。Phone interview 是一個台灣的工程師,用中文面試,考了一題 binary search。
Online tech interview分兩次,一次兩關種共四關。
第一關是一個在美國的中國人工程師,用中文面試,考了一題 two pointer,解完後有問順便一些經典的OS題,像是 parallelization、threading。
第二關是台灣的主管,開場自介是中文,但解題時有要求使用英文,考了一題 sliding window。
第三關是印度人,考了一題可以用 linked list 解的題目,但他只有要求我實作暴搜解,雖然跟印度人溝通有點障礙,但其實只要慢慢講,有事沒事就喊一句 pardon me,最後還是有順利解完。
最後一關是美國主管,也是印度人,考的是 system design ,這裡算是我自己的失算,完全沒料到會遇到 system design 也完全沒有準備,不過還好平常system的基本功不算太差,自認回答的還算可以,除了中間有一段因為溝通障礙鬼打牆了很久,後來聽HR說這關因為鬼打牆被給了很低分= =
面完過了兩週沒消息本來以為大概是涼了,寄信問了 HR 才跟我說面試有合格,因為有表現的更好的面試者卡在前面所以要我等。後來到處打聽了一下發現卡在前面的那個是認識的同學,而且他同時也在面 Google 等結果,最後等到 6 月他確定要去 Google 了才通知我 offer。
Google – Software Engineer (Campus Hire)
2/5 內推
3/25 phone interview
4/9 online tech interview
4/15 online tech interview
5/18 hiring committee (沒過)
6/7 team match
6/29 offer
新鮮人投 Google 都是經過 campus hire,先面試通過後才 team match 決定要去哪個部門。另外 Google 的招募流程是出了名的冗,我從投履歷到錄取花了將近五個月,如果有興趣面Google的朋友請一定要盡早丟履歷,不要想說最想去的留到最後才面,不然拖太久其他公司不等,Google 又不幸沒上的話會出大事。
Phone interview 是一個中國人講中文,不過 Google 的 phone interview 是世界共通的,所以有機會遇到外國人,要面 Google 的話第一關就要有講英文的心理準備。考題是 BFS+DP。
Online tech interview 跟微軟一樣分兩次 4 關,最後還有附帶一個簡短的 behavior interview。
前兩關是台灣的工程師,沒限制要使用英文,但我遇到其中一個是在台灣的越南人所以是用英文。後兩關則是英文限定,但也都是台灣人所以溝通起來不會太有障礙。四關用的算法分別的是
- BST
- sliding window
- Trie
- DP+一個沒解出來,但事後發現可以binary search的follow up。
題目這邊特別說明一下,只要被流出到網路上的題目就會被Google禁用,所以面 Google 時如果你遇到太簡單或 Leetcode 寫過的題目,不用懷疑100%還有 follow up,請盡快寫完解下一題。
Behavior interview 沒什麼好講的,不要亂答都會過。
面試結束後才是整個流程中最漫長難熬的時光。4/15 面試結束當天 HR 就跟我要資料要送 hiring committee,送完後等了一個多月,等到 HR 都離職了換了另一個 HR 接手,5/18 才真的排到我的結果被 review。又很不幸的我的面試結果不夠好所以沒過。
但同時很幸運的是我的結果也許是在合格邊緣,又或剛好是台灣板橋新辦公室真的很缺人,HR 決定先幫我 team match,有 match 到的話再送一次committee 通過的機率就會變高。
team match 的流程是這樣:所有面試者的履歷跟面試結果會被集中到一個 pool,各部門的主管可以在 pool 中挑選想要的人選進行面試,再決定要不要錄用。想當然爾,面試結果不太好的人要 match 的難度會比較高,甚至有可能沒有 match。
過了兩週後都沒消息,當時微軟要我做決定,我只好厚著臉皮寄信請 HR 幫忙,又很幸運的我遇到的 HR 很積極,主動把我的履歷轉給給其中一個team 的主管,主管也說覺得很奇怪 HR 怎麼突然丟一個履歷請他盡快面試,叒很幸運的主管跟我聊完覺得面試表現無所謂想要收我,就這樣順利的再送一次 committee 並拿到 offer 了。
5.面試技巧
分享幾個我自己在面試中學到,以及從一些面試經驗豐富的人口中聽到的小技巧
- 不一定要寫出最佳解才能通過面試
想不出最佳解時不要慌張,很多時候面試官本來就沒有預期你要寫出最佳解,例如經典的字串匹配,我相信不會有面試官期望你在 1 小時內寫出KMP。真的沒想法時可以先給出暴搜解,再思考有沒有辦法降低複雜度,例如最佳解是O(N),你把O(N^2)的暴搜壓到O(NlogN),給出一個次佳的解通常就能通過面試了。
- Coding syntax不一定要完全正確
面試只是要考你解題的思路而已,有時候遇到不好處裡的寫法可以口頭敘述就好,不用實作。例如 python 的 string 是 immutable,面試時你可以假設他是 muttable,口頭告知面試官這個假設。當然遇到會實際 run code 的面試就不能這樣做,但大多數的面試都不會要求 run code,onsite 的白板題甚至連電腦都不一定會有。
- 溝通、coding style的對結果的影響不一定比演算法小
有些公司對溝通跟 coding style 的評分比重不亞於演算法,尤其是有制度的大型軟體公司。所以在面試時一定要跟面試官溝通,把腦海中的思路完整的講出來,coding style 也一定要注意,尤其是每個變數命名都要有可讀性,不要用什麼 a,b,c,s,l,tmp1,tmp2 這種意義不明的變數名稱。
- 適時地向面試官尋求提示
這點算是要看面試官個人,有些面試官確實會死不給提示,但向大多數的面試官尋求提示都會給,只要不是從頭到尾都瘋狂要提示,通常都不會對結果有太大的扣分。
- 薪水
這邊提一個跟HR談判時很重要的技巧:事先打聽好各家公司的薪水範圍,知道各家公司開的上下限才能開出一個合理的價碼。
例如跟蝦皮談offer時HR告訴我新鮮人月薪大約是 6000sgd,如果你乖乖開了差不多的價碼,恭喜你被 lowball 了。因為我曾聽到有人拿過 7000 所以就直接開 7000,HR 最後也真的有去幫我爭取到一個很接近 7000 的數字。
另一個例子是微軟一開始開的 offer 其實只跟 ASUS 差不多,而且跟我說 compete 要拿其他家的合約給他們看。但當時微軟給我決定的死線等不到Google 給我正式 offer,就口頭跟微軟說我打聽到 Google 會給的數字,讓 HR 知道我會放棄他們的 offer 後沒看合約也幫我 match 了。
如果你只是進來直接下拉想看重點的,恭喜你我很貼心的把重點整理在最後一段
月薪: Shopee > Google > Microsoft > ASUS > 90k/m
年薪: Shopee >>> Google >= Microsoft >>> ASUS > 1.5m/y
細節不能透漏太多也很難透漏太多,因為每家公司的會浮動的股票/獎金都不一樣。例如蝦皮跟微軟的年薪主要是多在股票比例很高。
本文由 小王 授權轉載, 原文: 《2021 新鮮人軟體工程師面試心得》
___________
你也有經驗想分享嗎?快來投稿賺稿費吧!
瀏覽 1,011 次