前往
大廳
主題

2021 新鮮人軟體工程師面試心得

小王 | 2021-09-02 01:08:07 | 巴幣 28438 | 人氣 12048

0.前言
本來是計畫要在onboard前寫這篇面試心得。不過俗話說,計畫永遠趕不上變化:各家公司的面試結果都很會拖,加上五月時令人猝不及防的疫情導致無法如期去當12天補充兵,決定提早報到去上班後就差點忘記自己本有打算要寫這篇,直到最近被人敲碗才姍姍開始動筆。


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。

前兩關是台灣的工程師,沒限制要使用英文,但我遇到其中一個是在台灣的越南人所以是用英文。後兩關則是英文限定,但也都是台灣人所以溝通起來不會太有障礙。四關用的算法分別的是
1. BST
2. sliding window
3. Trie
4. 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. 不一定要寫出最佳解才能通過面試
想不出最佳解時不要慌張,很多時候面試官本來就沒有預期你要寫出最佳解,例如經典的字串匹配,我相信不會有面試官期望你在1小時內寫出KMP。真的沒想法時可以先給出暴搜解,再思考有沒有辦法降低複雜度,例如最佳解是O(N),你把O(N^2)的暴搜壓到O(NlogN),給出一個次佳的解通常就能通過面試了。

2. Coding syntax不一定要完全正確
面試只是要考你解題的思路而已,有時候遇到不好處裡的寫法可以口頭敘述就好,不用實作。例如python的string是immutable,面試時你可以假設他是muttable,口頭告知面試官這個假設。當然遇到會實際run code的面試就不能這樣做,但大多數的面試都不會要求run code,onsite的白板題甚至連電腦都不一定會有。

3. 溝通、coding style的對結果的影響不一定比演算法小
有些公司對溝通跟coding style的評分比重不亞於演算法,尤其是有制度的大型軟體公司。所以在面試時一定要跟面試官溝通,把腦海中的思路完整的講出來,coding style也一定要注意,尤其是每個變數命名都要有可讀性,不要用什麼a,b,c,s,l,tmp1,tmp2這種意義不明的變數名稱。

4. 適時地向面試官尋求提示
這點算是要看面試官個人,有些面試官確實會死不給提示,但向大多數的面試官尋求提示都會給,只要不是從頭到尾都瘋狂要提示,通常都不會對結果有太大的扣分。


6.薪水
這邊提一個跟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

細節不能透漏太多也很難透漏太多,因為每家公司的會浮動的股票/獎金都不一樣。例如蝦皮跟微軟的年薪主要是多在股票比例很高。


-1.後記
今年面試的四家公司都有順利拿到offer,尤其Shopee、Microsoft、Google這三家開出來的各種條件都十分吸引我,猶豫了很久才做出決定。最後我決定去Google Chrome OS的部門,現在已經在101辦公室上班一個多月了,工作都還蠻愉快的,之後有空再來寫個在Google的工作心得吧!

創作回應

秋山
拜大佬
2022-02-20 00:28:14
❖十代目霸王❖
卡工作心得
2022-02-20 16:59:56
三級貧戶
幹 你也太猛 == 那些薪水根本都underpaid了吧
2022-04-16 14:29:36
小王
以台灣的物價跟所得稅算起來還行啦,哪天真的想出去闖敝公司也有不少relocate的機會
2022-04-16 17:29:13
❖十代目霸王❖
https://truth.bahamut.com.tw/s01/202205/253ae72c9710643ed1794b4107806d2a.JPG
2022-05-14 14:48:29
你的肚子搖得我真開心
讚耶uwu
2022-12-21 23:12:09

相關創作

更多創作