荷蘭菜雞軟體工程師跳槽心得
前言:
這篇文章拖稿了很久,其實新工作已上工兩個月了但遲遲一直沒把心得整理好。
背景:
小弟目前在荷蘭一間 IT Consultancy(嗯,其實就是接案公司)擔任軟體工程師,管理階層基本上都是法國人,人數大概 100 多人,規模不大不小。工作內容主要是幫 Audi 及福斯搭建自駕車影像辨識的 QA 系統。涉及的技術棧蠻廣,包含 Scala,Akka,ScalaJS (有點像是 Scala 用 Scala 寫 React),Elasticsearch,Azure,K8s… 族繁不及備載。
尤於是 project 導向,而非 product,所以技能樹點的很寬很雜,大概就是客戶請你做什麼你就做什麼的概念,這是好處也是壞處,在動機那邊會有更多補充。簡而言之就是,從前端後段到 DevOps 都有碰過一點點,可以對整個軟體開發的流程以及概念有粗略的了解。
動機:
公司的開發氣氛還算不錯,有不少內部 workshop ,對於 Scala 生態系也有相當程度的投入,且存在不少高手。在公司的生態中,我們的商業模式是以敏捷開發的 story point 來向客戶計價,所以蠻多工程面的事缺乏良好的整合,因為客戶的需求時時改變,工程師就是盡可能地在短時間內完成更多 stroy point,所以對於難以評估的 task 大家就會盡可能把 story point 拉高,至於最後的 feature 有沒有產生價值,性能有沒有優化相對來說就比較不重要。
以個人層面來說,會常常接觸不少技術,但可能用沒多久就會因為客戶需求,而跳去做別的東西。例如可能光 CI CD pipeline 你就碰過好幾種,卻無法特別專精。
這樣對菜雞工程師來說,的確可以很快地探索各種不同的技術棧,但無法深入所造成的問題就是,單一技能無法累積,面試時候雖然 CV 可以列出很多技能看起來很漂亮,但當問到一些 project deep dive 很容易就翻車了。
其實中間也有跟主管討論過 context switch 過多的問題,但始終得不到具體的回應與解決方案,也漸漸發現這樣的公司基本上就是大量 hire 員工,但員工不是因為不想久待而跳槽就是因為客戶專案預算縮減而導致工程師不被續約。
加上目前合約也只有一年,對於續約並不是十分有把握,被換太多次項目導致對單一業務有較深刻的理解,產出自己也不是很滿意。加上發現後疫情時代,歐洲的軟體工程師職缺相當多,每幾天在 Linkedin 上面就有 recruiter 私訊一些職缺消息,於是求職模式就此展開。
準備過程:
這次的投遞履歷因時間有限,面試也是利用在家工作時間偷偷進行,所以沒法像學生時期用亂槍打鳥的方式。稍微了解一下荷蘭的軟體工程師生態,並從 The Trimodal Nature of Software Engineering Salaries in the Netherlands and Europe 發現同等級的薪資其實能有數倍差距後,便果斷放棄所有非科技公司的軟工缺(例如銀行,FMCG,傳統工程,顧問公司…),也主要以美商或是知名的歐洲軟體公司為主(ex: Spotify),接案或是沒有自身產品的公司我也不考慮。
原因其一是,純軟體公司有明確的產品方向,比較能夠在單一產品領域累積技術,比較有明確的 roadmap,產出跟回饋也比較容易衡量,成就感較高。
其二,美商的薪資普遍較高,甚至有股票等額外福利,對於遠距工作也較為寬容。
其三,此類公司一般技術迭代較快,發展跟日後跳槽的籌碼更多。
當確定目標公司之後,就是優化履歷,投遞 or 請人內推的過程了。在準備面試方面主要分為三個部分:
- 演算法數據結構 coding interview
- 系統設計(其實後來沒有遇到)
- Behavioral Interview (行為面試)
因為不是第一次準備面試,加上之前Leetcode有已有累積一定題數,基本的coding interview大致上算是能應付,但保險起見還是希望能把重要的演算法及數據結構概念有一次快速複習。我的策略是一天寫個一兩題維持手感,除了以Leetcode的熱門題庫為主外,我也參考了一些別人整理的高頻題目(以下稱為熱題75)。第二次刷題,會以快速回顧為主,基本上一個題目十分鐘內沒想法30分鐘內無法實現,就是直接參考討論區的答案,但務必要自己再實現一次,印象會比較深刻。寫完題目也可以自己講解給自己聽或是把思路過程以英文記下來。甚至可以邊寫邊自言自語,因為面試的時候重點是溝通,以及和面試官討論解法及優化的過程,邊寫邊講解是需要練習的,畢竟一心二用不是大腦的強項。
系統設計方面,因為相關經驗很少,之前也沒特別準備,時間緊迫也沒空啃聖經Designing Data-Intensive Applications(DDIA),仿間有不少比較速成的教材如:
以上的教材我個人不是非常喜歡,對於經驗不足的我並不是十分容易理解。因為是以快速準備面試為主,所以在累積相關知識的同時最重要是能快速將其模板化,於是發現了 Alex Xu 所寫的 System Design Interview — An insider’s guide 這本書。最近他也出了第二冊。作者對於系統設計的呈現相當簡單易懂,也很容易簡化成面試能夠說出來的形式,他的個人網站以及 LinkedIn 也有相當多系統設計文章,最近似乎也有 youtube 頻道。此外 LinkedIn 上面也有另一個值得追蹤的作者 Hua Li,也有很多圖文並茂的系統設計相關文章。系統設計部分因為我經驗跟瞭解並不是很多,日後再來分享。
行為問題方面,很多人以為如 What’s the most difficult challenge you had? 之類的問題就是在聊天而輕忽不用準備,這其實大錯特錯。我不否認有人英文口語流利且邏輯清晰,可以馬上把過去的經驗講出來並加以包裝,但個人認為面試不是只有一次,建立標準化的脈絡是長期比較輕鬆且高效的做法。
這方面我個人是以亞馬遜的 Leadership Principle 當作基準來準備,遇到個別公司有不同的教條再加以修正。因為其實面試多了就發現亞馬遜的軍規 14 條其實涵蓋了大部份公司都適用的核心價值,相關的面試準備文章也很多,以此出發是相對容易的方式。
有了大致的脈絡後,就開始準備一些過往的小故事,大概可以準備 5–10 個然後把對應的 Leadership principle 寫上去。或是加上一些關鍵字提示,最後做成一張 cheatsheet。在面試時候可以一聽到問題馬上就映射到對應的故事來舉例,並運用 STAR法 來闡述。這部分可以參考工程師泰瑞的總結:
面試:
後來拿到面試的公司有:
- Booking.com
- Uber
- Datadog
- Flexport
- JW player
Booking.com
Booking.com 我投的是 Junior Developer 基本上 OA 跟 New Grad 完全一樣,看起來是萬年題目,但可惜太慢投,面完 HR 時候已經找到人選了。HR 有意把我轉往 New Grad 繼續面試,但我的簽證等不到那時便作罷。
Uber
Uber 給我的面試體驗不太好,大概面了三關,每一次面試都是寄信請我回答可以的時間,但都 3–4 天後才回覆。由於我選的時間都是以越近越好為主,所以面試的日期又常常重新調整,導致時間拖很長,後來某次面試後就無聲了。
面試內容第一輪是 HR 行為問題面試,後兩輪都是 coding 基本上 Leetcode easy medium 程度,互動不是很多,面試官不太愛說話就是靜靜看你寫,你想互動想問問題,他就說你再想想看,試看看,有時候也感覺他沒有認真在聽你講話。
Datadog
Datadog 只有面到 HR,其實我投了好幾個部門,但最後給我的是跟數據庫優化有關的,算是我一竅不通的部分。得知我相關經驗不夠後就發感謝函了。
Flexport
Flexport 也是面了一輪 HR 兩輪 Coding,第一輪遇到類似設計棋盤走法的問題,一開始以為是 N-Queens但其實條件跟問題敘述更長更複雜。不過不太需要用到一些常見的演算法以及數據結構,不太像一般Leetcode 題目,我在釐清問題花了不少時間,互動並不是太好,部分原因可能是我無法用比較好的方式拆解問題然後去跟面試官要提示。最後拼拼湊湊給了一個不太好的解法。
第二次面試也是 Coding,也不是傳統 Leetcode 題目,需要一點 OOD 以及數據結構設計,面試官的互動比以前多,但這次沒有做出他想要的東西。不久之後也是收到感謝函了。
JW Player
JW Player 是 HR 直接從 LinkedIn 找到我,約面試約的很快,基本上已一週面兩到三輪的速度進行,最後面了五輪包含兩輪 coding,兩輪行為問題,其中一輪是 PM 來面。
Coding 部分互動相當好,題目不是很難是跟 Set 還有 HashMap 有關,但是後續的 Follow-up 優化不是很好做,考了用二進位來把空間複雜度降到常數等級。但面試官很願意給提示,這時候懂得怎麼縮小問題,跟提適當的問題就相當重要,平常自己講給自己聽的練習起了很大作用。
另外的問題包括 Top-K 的問題,但這題目設計有問題,給的 input 在某些情況會出問題,面試官自己都沒有發現,後來花了大部分時間在討論這件事,也提出該怎樣重改題目,最後在時間有限情況下提出一個複雜度不是很好的做法。
事後 Hiring Manager 也寫信抱歉說他們選題目時候不夠謹慎,對於不好的面試體驗感到抱歉。整個流程算是體驗相當好,也有那種一個 team 一起解決問題的感覺。最後 offer get。
談薪水:
這方面其實,我很猶豫要不要分享,大家可以當成 Anti-pattern 來學習?,因為在第一輪 HR 面試被問期待薪資時候不小心說溜嘴,講了一個很不怎樣的數字,這完全是個大忌,也導致最後發現自己被稍微 low-ball 了。
其他不利因素是不小心透漏出自己簽證狀態快過期,還有有點急著想離職的想法,以及手上沒有 compete offer,種種不利因素都讓自己一再讓出談判籌碼。詳細地談薪資技巧可以參考這篇
Ten Rules for Negotiating a Job Offer
後續:
其實 JW player 整個面試過程,遇到的未來主管都讓我很喜歡,很樂意給予你有效的指導,從面試過程就有種大家在合作解決問題的感覺。雖然最後薪資不是百分之百滿意,但從 LinkedIn 上發現公司的 Promotion 也算是快,產品也算是自己有興趣的串流領域。最後還是選擇加入了。
目前入職兩個多月,除了工作量比以前大很多之外,自由度跟技術學習方面都令我相當滿意。
結論:
其實這次有個很重要的心得就是面試的體驗就是以後在公司日常工作的縮影,所以對於待遇很好但面試體驗極差的公司,真的要特別小心。畢竟面試官在面試你,你也在找未來共事的同事及主管,當然像接案公司面進來再任意分派 project 的情況,就比較難得知未來合作的人合不合適。
另外一個觀察的指標就是可以從面試時的情景,想想看如果在公司發展下去你變成面試官現在的樣子,你喜歡嗎? 是不是自己想要的? 畢竟同事跟老闆常常是自己最開始學習模仿的 role model 吧…
瀏覽 4,050 次