最近結束了幾個海外的面試,想留下一些個人心得。
如果剛好有機會幫助到人的話就更好了。
簡短自我介紹
台大電機系畢,畢業後先後待過中央研究院資訊所 / Gogolook /
KKBOX / KKStream。由於從大學畢業後就一直有朝國外發展的計畫,
但想去國外讀書卻一直申請失敗,今年便興起了直接找工作的念頭。
公司 & 地點選擇
根據一些大大的分享,近幾年沒有 OPT,要直接找到美國的工作不是
一件容易的事情;H1B 抽到的機率也一年比一年低,所以本次面試的
目標,全部都鎖定歐洲的公司或在歐洲有分部的公司。
而考量到 VISA 的問題,找的公司都是比較大型的公司,處理 VISA
比較有經驗。
以下是本次有面試的幾間公司 (依面試順序):
Booking : Backend engineer (Amsterdam)
Facebook : Production engineer (London)
Google : Site reliability engineer (Zurich)
準備 & 面試過程
跟大部份人的過程十分類似,因此不會寫太多細節,例如 phone
interview 的進行方式之類的。會比較著重在個人心得的雜記。
準備履歷
自己覺得履歷沒有寫得很好,但原則就是多看多改。可以讓人
Google 到的東西盡量要更新,例如 GitHub,LinkedIn。
投履歷
盡量找該公司內部人推薦,沒有的話再從網站上面投。
以個人的經驗是,內推有 phone interview 的機率是 100 % (3/3);
反之則是 0 % (0/1)。
不過我沒有投很多家,也許誤差很大。
Online coding test
跟 Leetcode 很像,就是在線上解 Leetcode 類型的題目。
不是每間公司都有這關。
HR phone screen
大部份是一般 screen 的問題,只要可以用英文與 HR 溝通,
不會有什麼大問題。
有些公司會有簡單的技術問題,例如前一陣子有人在 Hacker News
分享面試 Google 的第一關問題,參考價值很高 (笑)
HR 也會在這個階段解釋接下來的面試流程,有不清楚的可以把握機會問清楚。
有特殊需求的也可以趁這個時候說明,例如需要公司幫忙申請 VISA,
可以趕快尋求共識。以免面試結束後發現你要的公司給不起...
Technical phone interview
由於我投的職位有些跟系統有關,所以分 coding & system 分享。
Coding
在過程中盡量跟 interviewer 溝通,了解是否在正確的道路上。
就我的稀少經驗中,有幾個 interviewer 給的建議都非常的好,
讓我在開始踏上錯誤的方法前及時的回頭。
Always think loud,把想到的事情盡量講出來
例如「I am thinking if I can replace this part with blahblah,
the complexity can be reduced to O(n)」之類的。
最後通常會有機會可以問 interviewer 問題,這裡指的是跟面試
本身較無關的問題。有些大大覺得問 interviewer 問題會影響結果,
就我個人的想法而言,我其實覺得不要問很離題的問題應該都還好。
因此我大部份問的問題就是跟工作 & 生活有關的問題。也得到了很多有趣的資訊。
System
非常非常非常廣,可以說是一台現代 Linux server 上面有的都有可能出現。
舉些例子:
process memory layout, inode, shell, IPC,
file system, DNS, TCP/IP, HTTP, signal, log
Interview 的方式也很特別,例如其中一個面試開始前,interviewer
就要求我離開鍵盤,不要使用 terminal & browser。
接著開始情境模擬,例如碰到一個怎樣的狀況,會從什麼線索開始查,
可能的 workaround 是什麼;如果想要解決 root cause 要怎麼解決。
(印象中我最後就拿紙筆做些筆記而已)
(但不是所有的 system interview 都是這樣子的)
個人感覺是 system interview 的準備難度比 coding 難上不少。
主因是 system 的問題可以不斷的越問越深;但因為寫程式的過程中其實
有不少的 abstraction,不一定有機會了解更深一層的運作方式。
另外就是 coding interview 的準備資源非常的多;但 system interview
就沒有這麼多可以抱佛腳的東西。
後續會推薦兩本書籍,有興趣的大大們可以參考。
Onsite interview
分三部份: coding & system & system design
Coding
Onsite 後基本上就是白板題,進行的方式跟 phone interview 沒有太大
不同,只是要習慣在完全沒有 IDE / editor 的幫助下,寫人看的懂的 code。
由於是在白板上作答,有一些優點可以運用。
例如可以先用一些圖像化的方式解釋想做的事情。如果需要 binary search
就可以先畫個圖,說待會寫的 code 是這樣那樣。
另一個優點是看的到人了,可以多觀察 interviewer,例如覺得怪怪的時候
就盡快問是不是走錯路了。
偶爾也可以喘口氣思考一下,或者利用一兩句話放鬆一下,整理思緒。
System
要有在白板上解釋任何被問到東西的能力。
例如被問到 directory, regular file, inode 之類的關係的時候,
要可以在白板上利用一堆表和線解釋出來。
或者可能會需要解釋 OSI model 中,主要幾層做了什麼事情
從最底層到最上層的東西都可能會考。非常硬的一關。
System Design
在每一間公司都有遇到,題目基本上就是「Design XX」XX 可以是任何現代
網路的服務,例如 Facebook,Gmail,dropbox。
但實際上不可能要求在這麼短的時間內設計這麼大的東西,因此過程反而像是
跟 interviewer 討論,是不是只做這些部份,剩下的就先不要。
在實際開始規劃前,問的問題非常重要,會直接的影響怎麼設計系統。
例如「How many users will use the system?」就是一個最根本,一定要
問的問題。
Imagine Dropbox with 10 users v.s. 10 million users.
問完以後就會在白板上畫出需要的 components,
例如 HTTP server,DB,Cache,storage。
最簡單的版本完成以後,就會根據這個版本慢慢的越變越好。
在改善的過程中一定會有一些很兩難的問題,可以試說著說明各種方案的好壞,
tradeoff 是什麼,也許在什麼樣的情況下我會選 A,而另一個會選 B。
一些參考方向:
* 基本的協定 (TCP/IP,HTTP,TLS,DNS) 要有一定的認識;
* 不要有 SPOF;
* 水平的 scalability;
* 常見的 modern web components 有哪些;
進階的:
* 所有的 components 要怎麼做 HA (這是一個非常難的問題.....)
結果
Offer:
* Facebook
Reject after onsite interview:
* Google
* Booking
Reject after sending resume:
* GoCardless (有點沒準備就亂丟了...)
心得
在準備面試的過程中,壓力非常的大;有時候會想說,我寫程式也不一定
用的到這些。
Steve Jobs 在 史丹福大學的畢業生演講中分享過:
「我沒預期這些東西會對實際生活帶來什麼具體的作用。但是 10 年後,
當我們設計第一部麥金塔電腦時,它 (書法) 又浮現在我心中。」
我自己的想法是,把整個過程變成另一種提升自我的方法:
例如
* 準備 coding interview 的過程中,其實就是不斷的提昇自己寫程式的
一些技巧。也許自己有一些思考的盲點,在練習的過程中很容易就可以發現。
* 準備 system interview 的過程中,收穫更是豐富,幾乎是把在網路產業
會需要用的東西都再讀過一遍。
* 面試的過程中除了盡力展現以外,也是在學習別人面試的技巧,也許很快
就有機會在自己的公司內應用。
* 失敗的面試就當成是一個免費的面試練習,只要有學到一點東西就很賺了。
* 全部都失敗的話,至少這幾個月的收穫要讓自己不虛此行。
在抱持著這樣的信念下,不論成功與否,都會有很多收穫。
另外,整個準備 + 面試的過程我並沒有刻意拉得很長。
一方面是自己身體在壓力大下並不是很健康;另外就是不想長時間的影響
工作上的表現。
在收到第一個 rejection 的時候,心裡有短短的失望了一下。
但很慶幸自己有堅持下去,最近有一個還不錯的結果。
另外在整個過程中,保持跟 HR 良好的溝通也非常重要。
跟我合作的 HR 裡,在每次通知結果時,我都會問可否給我一些 interviewer
的 feedback。而他們也不吝於分享,因為對 HR 來說,recruiting 到好的人
是他們最重要的工作。這些 feedback 也在接下來的一些面試中有許多無形的幫助。
書籍推薦
* Advanced Programming in Unix Environment:
經典書,許多 system programming 的東西都有講。
* TCP/IP Illustrated Vol. 1:
經典書,從 IP 開始,講到 DNS / UDP / TCP,非常完整的一本書。
這兩本書也許不是很適合拿來抱佛腳的書,因為兩本書都超級厚,內容豐富
的程度非常適合拿來打底。
其實兩本我也都還沒有完全看完,也還一直持續在看,希望有朝一日可以看完他們 XD
致謝
Last but not the least。
在這些過程中受到非常多人的幫助,因此特地開一個 section 致上最深的謝意與敬意。
KKStream
簡單介紹,我們是 KKBOX Group 的一間子公司,是 Multimedia Streaming
Service 的 total solution provider。
公司目前有穩定的商業模式,也一直在探索不同的方式。跟大部份公司一樣,
一樣會有各式各樣的問題,但較為可貴的是我們願意改變而變得更好。
對公司的感謝不是三言兩語可以說完,想以簡單的兩行說明
* 如果沒有出國的夢想,是願意一起打拼的公司。
* 不是最好的公司,是一直在變好的公司。
而 KKStream、KKTV 和 KKBOX 的幾位強者同事 & 主管們,讓我一直有學習的
目標,打從心裡感謝我的同事和主管們。
另外,我們也還一直持續的在尋找優秀的人,有興趣的大大們可以參考以下網址
https://goo.gl/1QjHGE
或者想要找我聊,也都非常歡迎 (站內信)
(快點投履歷的話,也有機會在公司聊聊天 XDD)
中央研究院 陳昇瑋博士
昇瑋老師是我在畢業後進入中研院的實驗室老師
是非常非常強的實務派老師,好幾次我抱著電腦看著他把我的 code 從數十行
改到不到十行(眼淚都快流下來了)
沒有昇瑋老師的指導 & 鞭策,我絕對不可能有機會完成出國工作的夢想
如果有計畫到中研院資訊所,也非常推薦昇瑋老師的實驗室 :D
Others
另外也很感謝在過程中幫忙內推的同學與同事們,沒有你們我應該連面試的
機會都沒有 QQ
最後感謝在過程中一直為我打氣在我身邊幫我加油的人。