2022 新鮮人 軟體工程師面試分享- 研替(Synology, Nvidia, Trend Micro)
圖文/PL
背景
119 學碩,大學資管會計雙主修,大學有延畢一年。資科雖然沒拿學位,但必修都有修完,連帶上了幾堂選修。碩班直升資管所,碩論做虛擬化相關。大學有跟著做資管專題,工作經驗了話大學有找了一個寫 app 的研究助理兼差,大四大五有在外商做一年半前端實習。大部分技能點在 web 上面,大學和碩班雖然修過不少 ML 相關的課,不過後來覺得沒什麼興趣,就沒有找相關工作。
原本預計當完兵再開始找工作,但是年前朋友貼研發替代役的資訊給我,認真研究了一下目前研發替代役的制度,還有爬了下之前當替代役的文,覺得似乎是一條可以試試的管道。目前台灣研發替代役需要當一年半,可以用高中大學軍訓課折底。期間薪水都是看公司決定,大部分都是比照正職辦理。部分外商的研發替代役福利會少。
稍微確定制度之後就開始找公司,找公司對我來說大概有三個要求,一個是職位要是做純軟體。第二個是預期的 pay 至少要能達到一定的期望,不然去當兵之後在找工作就好。最後一個是要在台北,不然在外面租屋很浪費錢。其實這三個條件篩選之後剩下的公司也不多,分別是 Nvidia、Trend Micro、Synology 和 QNAP。投的職位基本上跟前後端的都有丟,不過有進面試的都是偏前端。可能跟中間有面試官說,履歷寫的經驗太偏重前端有關係(?
面試前準備
我大約是在 1 月底二月初開始準備,主要有分刷題跟專業知識複習。刷題的部分用 Leetcode,我是點選 Leetcode 裡面有個 study plan(底下藍色框框處點選),可以選 data structure 跟 algorithm 分別下去寫,裡面會幫你分門別類,然後規定好每天要刷的主題,基本上照著做所有的重要內容都會複習到。因為當時還在寒假,一邊寫碩論一邊刷題,刷題的速度大概是一天 7~10 題,在收到第一個面試之前大概刷了 140 題,中間陸陸續續到最後關面試題數大約 170 題。
專業知識複習了話,我覺得大概包括 OS 跟網路,但我沒有花很多時間複習,因為我研究的關係,我對於 OS 裡面 process 跟 memory 的章節十分熟習,synchronization 之前有實作過,有大概複習了一下 mutex 跟 semaphore 的差異這樣而已。網路了話因為上學期才當網路課的助教,對於課本內容都還記得,花了一點時間複習一下 TCP 而已。程式語言跟 Web 開發相關的知識,平常在寫專案的時候遇到問題都還蠻認真去研究,所以沒有特別花多餘時間去複習。可能因為職位偏前端的關係,這次幾乎沒有被問到很難的問題。
面試流程
最後有收到面試的有三個公司,分別為 Nvidia, Trend Micro, and Synology。以下大概講一下面試心得。
1. Nvidia — System Software Engineer — Geforce Now (RDSS Intern)
面試流程:三關技術面試,各約一小時。
第一關應該是台灣的工程師。整關全英文考兩題白板題,一題是 Leetcode medium,另一題因為我投的是Web相關的職缺,所以就是考官提出一個要求,然後實作一個class出來,比較像是在考 design pattern。不過全程用英文,而且考官說不用一些有 auto-complete 的 IDE,我選用 vim(雖然 vim 可以設定 auto-complete 就是)。
第一題是一題 graph 的題目,大概 5~10 分鐘寫出一個次佳解,後續就是跟考官來回討論如何 optimize,跟算時間空間複雜度,約莫 20~30 分鐘的來回修改之後,但考官表示可以了不過還有地方可以 optimize。接下來就直接進入第二題,第二題是實作題,難度了話如果平常大部分都用框架或是 library 了話有可能會寫不出來,但如果有用原生 api 操作過 DOM 而且了解 event loop 了話,還算挺容易。
我用 TypeScript 花了一點時間,一邊講實作的思路一邊跟考官討論實作細節,還有可能的 use case 跟 memory 相關的問題,略為修改之後就過了。最後考官表示這題對你太簡單了,然後就進入中文閒聊環節。面完晚上就收到二面通知,因為下一面的考官在美國,所以喬時間花了一點時間。
第二關的面試官是美國的主管(台灣人),好像前兩年轉調去美國。先英文自介然後用英文閒聊了一下。我完全沒準備英文的情況下要講什麼,這邊其實小尷尬,因為他一直問我還有沒有問題或是要補充,我都說沒有。後面考了一題 DP,不過是 easy 程度。面試官口頭要求要時間空間最佳解,我用 bottom up 的方式寫了一個最佳解,然後解釋一下時間空間複雜度。主管請我設計一些 test case,之後就進入閒聊環節。面試官好像是 7 8 年前的研發替代役出身,後面就一直留在公司。之後大概也是當天晚上就收到三面通知。
第三關面試官是台灣的工程師,除了剛開始用英文自我介紹之外都用中文。先針對履歷部份問一些問題,之後就開始有關專業知識的問答。先問了 OS 問題,例如 stack heap 差別、parallel concurrency 差別、有沒有用過 mutex、semaphore 等等。然後問了一些 JS 的問題,例如解釋 asynchronous 跟 synchronous 差異、event loop 是什麼等等。
這邊有個部分蠻有趣的是,在解釋 synchronous 跟 asynchronous 之後,被問能不能不要從軟體的角度改用生活的例子舉例,突然有點卡住想了很久只想出一個很爛的例子。然後問了一些履歷的問題之後就進入 coding 環節。是一題 medium 的題目,內容是 binary search 的變形,雖然我有刷過這題但我已經忘記內容了,他先請我解釋 binary search,接下來實作一個 binary search,然後丟一些 test case 測試。接下來寫題目的時候其實有一點卡住,不過在面試官的提示下,大概 15~20 分鐘就寫出最佳解。之後就是針對履歷繼續問問題,因為我有個 side project 做跟加解密有關,請我解釋一 下 symmetric 跟 asymmetric 加密的區別,還有 public key encryption 的 use case。後面就是閒聊,順便問了一下碩論。
當天晚上 HR 打電話來,詢問一下期望薪資,然後說主管還想要跟我面談一次,不是正式的面試。後面約了一次面談,基本上就是主管想提醒我一些研發替代役要注意的事項,好像他們以前福利不太好,這幾年才慢慢改過來,還有研發替代役在 Nvidia 其實算是 intern 的一種,不是正職,雖然過程的薪資跟福利比照正職,但不是真的員工。主管就表示應該不會有面試了,之後就照著人資跑流程。
之後按照 HR 發的信跑流程,體檢完之後一週收到電子 offer,距離口頭 offer相隔大約兩週。
面試心得
感覺得出來 Nvidia 的 HR 很積極,每一次面試後,幾乎當天晚上或是下午就會約下一次面試時間。在我投遞履歷當天晚上 8 9 點就打電話來要約第一次面試。技術面試的部分也蠻扎實,第一關完全不問履歷直接全英文寫兩題真的是有點驚訝,後續的面試就有慢慢適應過來。題目大部分都是 Leetcode medium 程度,平常有在刷題應該不會太難回答。專業知識大概問 OS 跟 Web 相關的問題,平常開發的同時,如果有認真研究當下遇到的問題,應該都還算簡單。看得出來每一次面試時間還蠻精準的壓在剛好一小時。
面試結果
Offer Get.
2. Trend Micro — Cloud Engineer
面試流程:線上測驗,一關線上面試(後續應該還有,但我被刷)。
投完履歷之後隔一個工作日收到線上測驗。線上測驗平台用 codelity,有三題。個人覺得難度大概是一題easy,一題easy — medium,然後一題 medium 程度。我前兩題大概 15 分鐘寫完,後面那一題寫了 40 50 分鐘。感覺應該是全對吧(?雖然後來沒機會看到成績。做完測驗大概隔一天人資就打來約時間,約了之後好像因為面試主管喬不攏,延後了一週。
線上面試有兩個主管,其實面試過程偏閒聊,會從你履歷裡面寫的作品跟實習經驗問問題。專業問題了話,前面被問了有沒有使用 AWS、GCP 之類的問題,我雖然有用過但都停留在最基礎的例如開個 VM 在裡面跑個 server 之類的,這邊問到蠻多問題都不太會。後續就是詢問關於 Web 開發相關的一些問題,這邊比較有印象就是有問 client-side rendering, server-side rendering 跟 static rendering 差異跟優缺點,還有問了 PWA 是什麼。
其他就是例如在團隊扮演什麼角色之類的問題。把履歷上面所有經歷都問完之後,就是主管開始介紹分別介紹他們負責的產品,印象中一個是偏向消費者,一個是偏向公司內部產品這樣。然後就結束面試,整體時間大約一小時。大部分技術問題都有回答出來,也不會太刁難,如果沒聽過的他也會跟你解釋一下。
隔天 HR 打來 follow up,順便詢問了一下替代役的名額的事情,因為我有注意到趨勢名額偏少,所以想確認一下名額,HR 說名額會優先給之前曾經在趨勢實習的人,所以名額還要確定。
面試心得
測驗題難度適中,不會太難。應該是 Codelity 的題庫隨機撈,我事後有偷偷查題目,貌似查不到。線上面試過程也還不錯,面試官都很友善,也沒有遇到特別難回答的問題,大部分都是針對履歷的問題做延伸。面試官對於自己的產品跟開發流程介紹的非常清楚,也會針對如果未來要進來做個工作做蠻詳盡的解釋,蠻可惜最後收到感謝信,希望是因為替代役名額的關係吧。
面試結果
一個月後感謝信。
3. Synology — Product Developer (雲端前端軟體開發)
面試流程:總共4關,3關技術,1關人資。
ptt傳說中的白板大魔王,覺得必須來試看看。
第一關是兩個工程師,先問了履歷上面的經歷跟專案,因為投的職缺跟前端相關,就是問一些 JS 的基礎問題,有熟悉什麼框架和有沒有寫過 unit test?用過什麼 unit test 框架、有沒有用過 redux、redux 的核心概念是什麼,還有詢問 TypeScript 熟悉度,考一兩題 TypeScript 語法,有一題比較有印象沒回答出來是,如果 TypeScript 無法確認某個型態然後要消除 linter error 要怎麼解,我第一個想到的是直接 as any 大法,考官表示可以用 instanceof 或是 typeof 的去消除。最後考一題我覺得是 easy — medium 的題目,我用遞迴寫出最佳解,解釋了一下思路之後,考官表示沒什麼能改進的,就請我休息一下,他們要討論一下。大約 20 分鐘之後,第二位考官進來。
第二關基本上也是先聊天,然後面試官表示有看了一下我履歷上寫的 side project,他們表示他們也有在做類似的產品,有詢問我一些實作細節,還有討論當初實作上有遇到什麼困難點。然後花了蠻長一段時間解釋我的實作細節,主管也提了一些問題,問了一下如果要重新設計可能會如何設計,因為這個 side project 跟加密有點關係,最後請我解釋一下 SHA、AES 跟 CBC mode 是什麼就結束了。接下來就是一題 medium 的題目,一開始從時間複雜度 O(nlogn) 的解寫到 O(n) 的解,然後又要求空間要 O(1),寫完一個解面試官就會要求分析時間空間複雜度。
我中間有一段時間其實有點緊張導致整個放空,不過後來在面試官提示之下有寫出最佳解。後續追問為何在某些情況的case為什麼不用考慮的時候卡住,面試官好像為了節省時間就直接解釋了一下。後續閒聊了一下就結束了。原本以為涼涼了,隔兩天之後收到HR要約現場面試。
現場面試有兩關,第一關是 HR,基本上就是聊聊天,問一些 HR 會問的問題。大部分跟履歷有關係。
第二關主管面試,先針對上一次的解題做一些 follow up 問題,大該花了 20 30 分鐘用反證法證明那個演算法是對的,不過中間還是有一個地方主管不太滿意,覺得假設不夠嚴謹,應該能用更嚴謹的方式表達,後續因為時間問題就直接進入白板題。白板題也是 medium 的題目,快速寫出一個版本之後,被指出有兩個 edge case 沒處理到,之後稍作修改之後就完成。
因為時間還有剩,主管開了一個線上編輯器,把白板的 code 輸入之後,丟一些測資進去跑。一兩個小 bug 修了之後就跑過測資了。不過這一題寫的不是很漂亮,丟了一堆邏輯炸彈在裡面,最後修改的時候自己都有點不好意思,因為真的是蠻醜的。最後就是針對履歷問一些問題,大部分就是想知道之前的團隊開發的流程,還有有沒有接手過大型專案的經驗,也問了一些碩論的事情,因為主管看不太懂這題目在幹嘛,請我解釋了一下。後面就是一些關於公司的閒聊,諸如這個部門在做什麼,負責維護的產品有哪些等等。結束之後,主管表示因為還有人要面試,所以不會馬上知道結果。
面試心得
白板題我後來有回去查,都是 medium 題目。我覺得算蠻硬的面試,無論在履歷、專業知識和程式各個方面都有被檢視到,蠻感謝每個面試官花這麼多時間跟我討論問題,還有了解我以前的經驗,就算最後沒有上也學到蠻多東西,知道自己還有蠻多不足的地方。不過還是覺得好不容易面到最後一關,但沒有收到 offer 還是覺得小可惜。
面試結果
目前無聲卡。
總結
刷題部分,幾乎每一間公司都有考白板題,如果不是神人而且距離資料結構跟演算法有一段時間了話,建議還是要刷一下題目練習手感,考的題目大部分都是 Leetcode medium 程度。追求效率了話剛開始可以用 easy 練練手,之後都以 medium 為主。題目數應該是盡量將每個題型都刷一次會比較好,即使遇到的白板題沒寫過,也至少有個概念可以跟面試官討論。
程式語言感覺沒什麼限制,我這幾次面試的時候,因為職位需求主要都是 TypeScript,所以面試官都給我 TypeScript 的 interface,但我其實超久沒寫了,我都直接問能不能用 Python 實作,沒遇到什麼太大的問題。
經歷相關的問題蠻注重專題跟實習經驗,幾乎都會問說在專題裡面扮演的角色,所以專題還是得認真做一下。實習經驗基本上會照著你寫的東西去問,所以建議在履歷上把實習經驗或是專題有用到的工具全部列出來,還有把自己真的負責且參與的東西都條列式寫出來,這樣比較有機會讓面試官可以從這邊去延伸問題。
我面試前有特別整理一下我的 github ,把我做的比較完整的兩個專案寫在履歷裡面。兩個專案都有被問,其中一個因為當時要交接的緣故,有非常詳細的交接文件,有被其中一個面試官稱讚寫得不錯。所以平常自己開發的時候,可以盡量寫一些文件幫助其他人了解你的專案。
面試一直都是一個很不錯可以用來檢視自己的程度的方式,這次也多少是想看一下自己目前的程度才去丟履歷。遇到的所有面試官都很友善,每一關都像是朋友一樣在討論問題,雖然面試前都會很緊張,但真的開啟鏡頭開始講話之後,緊張感就會慢慢消除。現在就是祈禱能順利畢業,8 9 月準備上工囉。
瀏覽 20,683 次