過去幾個月雖然不是什麼秘密但有偷偷的面試了三間公司的Staff Engineer 機會,很感謝他們願意給我這個機會用 Staff 的標準來面試我,其中兩間有走完全部的流程包括整個 onsite 面試,雖然最後沒有拿到 offer 但至少給了我一個可以進步的方向,今天就來聊聊 Staff 面試和 Junior 、Senior 有什麼不一樣。
這邊快速了解一下通常工程師等級有分 new grad、Junior、Intermediate、Senior、Staff、Principal,越往上走你可能會越專精一個領域、你在某個domain會很有影響力、你在組織裡會是一個領導者的角色,尤其像是 Staff Principal 這樣的等級,他們的影響力不只是一個單一的 team 也會是 cross team 的,這樣的 leadership skill 也會反覆的在面試中一直被詢問和挑戰的。
那 Staff 以上還需要寫程式嗎?這看公司和工作內容了,有些還是會寫程式但大部分會有比較多的 meeting 比如架構問題需要和別的組討論或是需要寫更多的文件來紀錄工作和當作 guidelines,但不管如何,Staff 工作會變得多領導類型的工作,不管是 mentor 其他人或是寫文件做紀錄。
我有走完全部流程的兩間公司
一間是小公司,規模感覺像是剛走出新創的規模但開始需要開始重新現有架構,等等會說為什麼我知道
另一間是已經上市的大公司,名字講出來應該很多人都知道
先講小公司好了
這間是對方 recruiter 來找我,人很親民跟我講了很多關於這間公司的狀況和為何要找一個 Staff 因為聽說原本有一個資深前端剛離開然後想找一個可以替補他的人所以特別開了一個 Staff 前端位置
公司還有一個 Staff 是後端的和一位 Principal
之後他們給了我一個回家作業要我在兩天內寫完
內容其實不難就是一個 React app 叫 API 拿資料和用一個 form submit 資料
比較含糊的點是 instructions 只有說假裝這是一個之後會上線的產品
光這一句話可能就有很多可以考慮的點了
反正到最後我弄了一些我會用的 library
確定我的 code 是 reusable 確定有拆分好 components
雖然明明只有一頁但我加了 react router
因為有個 form 所以我加了 react hook form 和 zod 來確保我 submit 的資料的 type 是正確的
我還有把 unit test 撞起來然後寫了幾個簡單的 test cases
其實平常工作熟悉的話這些都不難 只是那一句話就涵蓋了很多東西
這樣前後我在下班後弄花了兩天左右交出去了
這部分挺順利的因為隔天就說要安排下一輪了
這一輪有 director 和 staff engineer 主要是講講 resume 和我寫的那個 coding challenge
他們只問了一個問題說我通常會在眾多library中怎麼選擇要用哪一個用
我記得當時我是說先問問大家有沒有喜歡的想要用的,然後比較每個library的資源,看看每個library有缺點是什麼,好不好用,好不好測試,module 大小等等,有沒有確切的解決現有的問題以及在可見的未來能不能scale up
之後有個 45 分鐘的 session 硬要算應該是系統設計
他們說之前他們要從一個原本的 Angular 加 REST API 轉到 React 加 GraphQL
後端主要有兩個 REST server 要 migrate 到一個 GraphQL
然後前端有兩個 app 一個升級成 v2 時候舊的還需要支援一段時間但這個目前只跟 rest 溝通
另一個轉成 v2 後就不用管了
這邊要做的當然就是如何做 migration 這個動作
當然這樣的 migration 不可能一天做完所以要有一個 migration plan
總不能在 migrate 時候整個 business 都不能動
這邊可以看出 leadership skill、critical thinking、和 planning
比如可以評估能不能把舊的專案也移到新的 GraphQL server 這樣之後少一個 component 需要維護或 sunset
我個人覺得這問題很有趣而且某種意義來說也貼近真實工作狀況
有時候就是會出現需要做 migration 的時候尤其當這個 migration 預期會比較久的時候要怎麼去執行這件事情就是個難題了
但另一方面我覺得這問題有點不好是因為據說這是他們真的遇到的狀況而且還沒完成
不像其他系統設計題目有個比較明確的方向指標以這個為基礎可以大概評估一個人的程度
而且這類問題也不好準備,真的就是工作經驗但也不是每個人都會遇到這樣的機會
這輪之後就是比較偏 cultural fit 比如和某個director聊天和其他manager聊天講我遇到什麼事情會怎麼做什麼的
第二間公司面試過程就比較 standard 一點
一開始和 recruiter 聊完後就約了 hiring manager 聊天
要說一下的是這間公司沒有 Staff 是直接 Principal 職位
所以跟 hiring manager 聊聊這個 team 在做什麼 這個 role 需要做什麼
有趣的是 job description 其實寫的是很後端的只有一點點的前端
manager 說她想要一個前端很強的因為目前這個組甚至整個大組沒有一個前端的 leader 所以想要有一個這樣的角色來帶領前端
之後面了下一輪是 coding session 有一位 principal 加一位 senior
題目是類似當給了信用卡號碼,我的 function 要 return 這個號碼屬於哪一種卡
比如這張可能是 visa mastercard amex 等等
那他們會給規則所以照著規則寫就好
之後他們會照著我寫的 function 問我問題比如這邊我複製了一組 array 會不會有什麼問題
那可以說在記憶體很不足情況下這樣做可能不太好等等
這邊也被問說為何要用 const 不用 var 和 arrow function 有什麼特性
所以大家還是得把基礎學好 永遠不知道什麼時候會被考這些基礎
之後過了很久等到了 virtual onsite 的通知
第一個是系統設計,我事前查了資料有查到一些可能被問的題目
其中一個是蠻有名也很多人遇到的是 url shortener 題目
大概意思就是給一個網址然後這個服務或網站需要回傳一個比較短的網址
這對那種有字數限制的 social network 比如 Twitter 就很有幫助而不會放個網址就塞滿了
那我拿到的問題是我之前沒看過的是 report generation 不過也有一點像製作 PDF 的感覺
大概是意思是這個系統會有一些templates然後使用者可以選擇一個template把資料打上去
之後系統就會根據輸入的data或是要從後端抓的data按照template把它生出來
那因為這個系統可能會需要比如五分鐘時間才能把report弄好所以還需要有個方法通知user弄好了
面試官考量到我比較在前端所以就往前端的方向走
但一開始還是會需要我先大概想要的 api endpoints 長什麼樣子
比如有什麼 get 然後 add new report 需要什麼 post request
然後也被問到如果很多 traffic 時候 server 應該怎麼辦
他其實只是想聽到那個關鍵字 horizontal scaling
所以利用 load balancer 和 auto scaling 來開多個 server instance 處理進來的 request
後面什麼可以用 queue 但一來處理 report 或是用 notification service 來通知 user 這類的就沒有提了但如果你的是後端系統設計這些肯定都要提一下
然後前端聊可以怎麼 build 需不需要 SSR 或是 CSR 就好
像這種不是面向 public 的不需要 SEO 我大概就不會想要用 SSR
多一個 server 需要處理 若處理不好挺麻煩的
接著講到頁面有什麼 什麼時候叫剛才定義好的 endpoint
不同頁面之間data可以怎麼傳送等等
這些都是前端系統設計可以被問的範圍
下一輪是 code review
面試官開了一個 sample PR 裡面有三個 function 然後要我來做 code review
這地方可以看出一個工程師對 code quality的定義在哪邊也可以聽聽理由為何要這麼建議
也可以看這工程師溝通的方式好不好
有些人講話很嗆的 code review comments 那個態度就不好
對整個 team 氣氛會有負面影響
另一點是 senior 以上會開始 lead 或是 mentor 其他人而做 code review 也是 mentoring 一環
code review 很多東西可以講
比如讀了這個 function 但和這個 function 名字不相干可以要求換名字
有些名字用 kebab case 有些 snake case 就可以要求統一除非是 constant
有些東西重複了是不是可以 reuse 尤其是 heavy calculation
像面試中有個 array filter map 做了兩次 這看起來就很不 efficient
有些是繼然寫了 comment 應該可以順便寫 JSDOC 把 input type 放上去這樣因為這code不是 typescript寫的
後面兩輪是和principal engineer 和 director 聊我過去的經驗尤其是 technical leadershp 的經驗
帶領團隊的經驗 mentor 其他人的經驗等等
這兩間公司規模來看差很多 業務也不同
但 staff 以上的面試最重要的點都在於有沒有辦法 high-level thinking 比如組織架構上或是把複雜的問題弄成小問題一個一個解決
和有沒有 leadership skills 因為 Staff 等級以上的常常會是別人問問題的對象或是 someone people look up to
順便講一下 第二間公司其實我感覺是拿後端的標準在面試我因為每一輪開始時候都問這個職位是前端的嗎加上每個人都是後端的 principal 和 senior
雖然老實說我覺得不公平但後端確實跟其他 full time 後端相比我的經驗和知識量比別人少
我會跟我熟是兩回事
也因為這樣我開始看 DDIA 的書 雖然讀的有點慢哈哈
也計劃看看 kubernetes 和 postgresql 等等希望有系統性的把這些東西補起來
突然想到我的 javascript design pattern 還沒讀完 可能也得繼續哈哈
然後我也和我們team上面的 staff 做了一次 1 on 1 聊聊什麼叫做 technical leadership
最簡單開始方式是 build credit
有什麼 discussion 就去參加提供自己的意見
或是寫文件把自己學到的東西記錄下來分享給別人也可以是做的 project 中做了哪些決定可以記錄下來這樣
有時候工作忙就忽略了這些事情但做這些剛好又是讓大家認識你的時候
so 雖然沒有拿到 offer 但至少知道可以外面的人想要什麼 自己缺什麼這樣
也是我鼓勵別人去面試的原因 測試一下市場要什麼和自己的價值
manager 說我大部分 staff 該有的都有但可能得在多做些努力讓別人認識我
也算是一個努力的方向
oh 對了我知道為何 technical leadership 可能是我沒過的原因因為他們 feedback 有寫
今天先這樣啦
話說你們聽著一集的時候我應該雷射打完在睡覺
大概至少會有四五天沒辦法回覆留言就先說抱歉啦
然後有想要試試 mentoring coaching 計畫因為有人私訊說希望有那種 regular check in 給建議哪變可以怎麼做或是以 senior 為目標而我們現在可以做什麼這樣
如果大家有什麼建議或是覺得自己哪邊需要幫忙的都可以私訊我跟我說 然後合作方式可以是什麼這樣
我也會查一下怎麼做才能給大家最大的 value