當了幾年 junior 工程師了,如何才能晉升資深工程師呢?
想加入跨國新創,我該具備什麼能力?
國際企業想要什麼樣的軟體人才?我們讓雇主直接告訴你!ALPHA Camp 特別邀請到新加坡新創 honestbee 工程副總 Sam,與 ALPHA Camp 畢業校友威辰,在直播上進行資深後端工程師的模擬面試。
一般而言,應徵 honestbee 的資深工程師除了履歷審查,還須經過 4-5 關:
- coding test(take home test)
- 2-3 關技術面試
- 以上都過關斬將後,會跟技術副總面談
看起來似乎挑戰不小,ALPHA Camp 校長 Bernard 也指出:「通常徵才過程嚴謹、難進的公司,往往也能提供很好的成長潛力。我們希望不只是幫學生轉職,也要幫助他們進到好公司、好職涯!」
在這場精彩直播中,實戰演練了技術面試、文化面試的部份流程,Sam 也不藏私分享資深工程師的徵才評估標準。因為時間關係,這次的模擬不會深入技術細節,目的是讓大家瞭解在面試過程中如何見招拆招,展現思考、解決問題和表達能力。
以下原汁原味還原這場模擬面試的過程,看看技術主管教你如何面試、前進跨國新創!
(也來看看:非本科系也沒關係 他們讓國際企業雇主青睞!)
資深後端工程師 面試問答
Q1:我看你的履歷有提到你有蠻多系統建置經驗,請分享你會從哪些方面去評估系統是否符合效能需求、performance 是否夠穩定、夠好?
威辰:performance 方面,我會裝監控軟體,例如 New Relic,觀察每個頁面的 response time。response time 又分為前端、後端兩個部分,前端會看網路傳輸時間跟 render 的時間,後端看伺服器運作所需時間。
我們會去分析前端、後端,看到底是哪邊出了問題。通常會先 tune 前端,因為理論上講,前端比較能夠去 tune 好。
後端改程式碼,通常只能快幾百毫秒,但前端若 tune 好會是『秒』等級的改善,所以我會先從前端下手。
效能評估是個很廣泛的問題,威辰的切入點是先舉出效能量測方法,並把 response time 的解決方式拆解為前端、後端兩部分。
通常面試官會針對一個主題不斷追問,往下挖應徵者對於處理同類問題的經驗和想法。接下來面試官深入追問「如何定義效能?」
Sam:你們如何制定你們的服務級別協定 SLI(Service Level Indicator)、SLO(Service Level Object)、SLA(Service Level Agreement)?
比如今天要把系統交給客戶,客戶會問你有辦法確定系統服務品質嗎?這時候就需要制定 SLA 去評估,通常可能維持在 99.8%,但一旦掉到小於 99%,那天就不跟客戶收錢。
威辰:我們有監控我們倒站的次數…是這個意思嗎?
Sam:可能是倒站,或是 latency 太長。比如原本一個 API 只要 500 ms,可是現在變成要 5000 ms。假設我是一個股票商,跟你買系統,結果每一筆資料更新都要花 5 秒,那我怎麼受得了?
威辰:我們跟客戶之間,以前沒有遇過這樣的問題…
Sam:沒有經驗沒有關係,但你覺得如果是你來制定 SLA,你會如何去制定 SLA 的級距?
通常會分為三個級距,例如 99%、95%、或更低。比如原本的標準是 500ms,第二級距可以取 3 倍(1.5 秒),再下一個等級是最爛的,4-5 秒之類的。我想知道的是,你會怎麼去設定各級距的標準?
威辰:嗯…一般最好情況下,我們會設定交給客戶的反應時間要在 0.5 秒內。如果超過一定時間,這些 job 它可能很耗效能,我們會把它放到 background,用非同步的方式去處理。
Sam 問如何制定 SLA 級距,威辰比較沒有把握,因此他退而求其次,先定義合格效能為 0.5 秒內回傳頁面給使用者,然後分享若效能不符合標準,要如何處理。
在這裡,Sam 很好心地主動解釋技術名詞以及實務上使用的場景,但不是每個面試官都會這麼做。應徵者遇到不會的題目,千萬不要兩手一攤說「沒遇過」,請主動向面試官請教,再提出自己的認為可能的解方,與面試官一起討論。面試官想看到的是你「如何去思考沒遇過的問題」。
Sam:那你們現在偵測到的 response time 0.5 秒,它的 daily traffic 大概是多少?比如說我有一個 service 跑了一個月,average response time 是 400 ms,但 daily traffic 只有 10 個…
威辰:我會用 httperf 做壓力測試,去看服務能夠承受多少流量。
(同場加映:不想被面試官考倒 後端開發必學資料庫、網路概論!)
Q2:如果今天要做一個評價跟留言功能,你會怎麼做?
威辰:首先我會詢問客戶,有哪些角色會參與評價跟留言。如果是使用者要對產品做評價跟留言,我會去跟客戶確定:這個功能的目的是什麼、他們需要使用者的哪些資訊?
如果使用者要對產品留言,那也要跟客戶釐清,留言功能是否要再去區分成不一樣的留言。比如使用者可能有不同角色,每一種角色的留言是否有不同的處理方式?
另外,也需要釐清是否要定義留言的狀態。例如某些情況下,留言是公開的;但在什麼,留言必須為非公開。
評價的話,會跟客戶確定評價的方式,是按讚就好還是要用星等?比如一顆星到五顆星來評價,才能確定設計的架構。
威辰在這題展現他與客戶的合作經驗:從定義產品需求出發。接下來面試官開始討論產品背後的技術。
Sam:假設剛剛問的評價跟留言得前提是資料來源是從同一個來源來的。假設今天你是 honestbee 工程師,我們的資料來源是從 20 個不同的 Microservices 來的,這時候你會怎麼設計?
威辰:我會做一個中介層,整理來自不同地方的資料,把資料整理成我們可以讀的、確保傳進來的資料格式是一樣的。
Sam:那你資料的存儲會選用什麼樣的形式?假設資料流量是一小時兩千萬筆。
威辰:我以前的案子比較沒做過…處理這種大流量的機會比較少。
Sam:你可以設想看看,很基本的答案可能會說用 database,可是如果今天流量大,那 database 的 I/O 可能會造成流量的消耗,這時候你要怎麼做。
那你說我可不可以做在 Redis,除非你用 Redis 的 persistent storage 功能,否則 Redis 會當掉,資料群會不見。這時候你要怎麼去做一個 Balance,我比較想聽到這方面的答案。
面試很容易被問到沒碰過的情境,遇到這樣的狀況,別馬上說「我不知道、沒遇過」。你可以把球回丟給面試官,請他多給一點提示,然後試著用自己現有的知識去設想、解決。
接下來,Sam 問起 code review 經驗與測試流程。在業界,code review 除了是防止產品出錯,也是資深工程師建立團隊開發文化、培訓新進工程師的重要方法。
(技術進修必看:有系統的培訓 打通前端、後端、產品開發!)
Q3:你有 code review 的經驗嗎?如果我今天發一個 PR 給你,你會如何下手?
威辰:第一個是不要搞壞產品,這是很重要的。我們還會看 coding style,一個團隊的 coding style 對我們 code 的 maintainability 是非常重要的。另外,還會看可讀性,到底讀起來是不是對的。
Sam:為什麼 coding style 需要用人為的方式去檢測?
威辰:可以用工具可以去做檢測。還有一些 junior 工程師比較不會想到的 edge case、corner case,如果你對整個架構比較了解,其實可以去看。最後是看他整體的 code structure 跟現在的 codebase 是不是符合的。
Sam:你如何去確保不會把產品或系統搞壞?
威辰:我們有引入 CI/CD 的流程,跑自動化流程去測試,主要是 feature testing。
Sam:所以你們是有一個專門的 automation 的 QA team 嗎?還是你們是 dev 自己去寫?
威辰:我們是 dev 自己去寫。基本上自己寫什麼方法,就寫哪一個 unit testing。feature testing 另外會寫專門的 feature testing。
Sam:你剛剛有講到 structure,我覺得這件事情有點模糊,應該說你怎麼去評估現在這個 PR 有沒有做出一些 over-engineering 的行為?另外,你覺得 over-engineering 的標準在哪裡?
威辰:這題我比較沒有想法耶…
Sam:這題也跟我們剛剛一直在討論的流量有關。比如說你今天要上一個 PR,那你瞭不瞭解,將來上線後你預期的東西是什麼。假設你今天預期流量只有 100 個,可是你今天設計出來的架構是符合 10000 個的(過早最佳化),那何必呢?
威辰可能過去經驗較少考慮到 over-engineering 的狀況所以卡住了,他可以請面試官舉例後,再來分享自己的經驗和想法。
Q4: 你為什麼會想來 honestbee 面試?為何選擇離開現在的工作?
這題的目的有二:展現對於面試公司的興趣,同時說明自己你在現任公司學到了什麼。切記不要貶低現任公司來突顯面試公司的好!
Q5: 你之前有做過什麼自發性的專案?
威辰:我們之前公司有個專案的搜尋功能原本沒那麼好,那時候我有自己去搜尋一些,那時 Elasticsearch 剛好換新版,它可以加入一個功能(IK),可以用中文去搜尋、用中文去分詞,就用這樣的功能去導入我們的產品。
Sam:那這個搜尋功能幫助了你什麼?
威辰:我學到非常多底層的 Elasticsearch,因為這個東西它在 Rails 裡面其實是包裝得非常好的。因為它我要去學如何在 Terminal call Elasticsearch。
Sam:所以你基本上是用 Rails 還是用 searchkick?只是你願意去測 console?
李同學:對,想要了解它的底層。
談到自己研究過的 Elasticsearch 技術,威辰整個人亮了起來!透過分享自己解決專案問題的經驗,展現出開發熱忱,是面試的加分關鍵!
面試講評
模擬面試結束後,ALPHA Camp 的 Bernard 校長以及 Sam 為這次的模擬面試進行深度講評。
Sam 指出:「整體說來,威辰的溝通能力是不錯的,技術程度也算扎實,去追問他一些細節,他也都能回答出來。
但有一件事我比較擔心,我覺得你可以承認自己沒做過、沒經驗。但如果我今天要交辦給你一項你沒做過的工作,我想要聽你講述你會怎麼做、你會怎麼想,而不是就說我沒有做過。即便你今天是用你的想像去編出來,這至少表示你有認真去想,而不是直接說沒有答案。
技術部分,我覺得威辰有講到一個讓我很驚豔的點:我剛剛問他說假設 ratings & comments 的資料是從數十個不同 service 過來,他知道怎麼去 align data flow!這點我很少在沒有大型架構經驗的應徵者口中聽到。
其實 align data flow 在大型架構跟系統下,是最重要的切入點,因為當你的 data flow align 從不同系統過來,它們可能原始資料都不一樣。可是你可以 create 一個 data template 去 standardize 這個 format,就可以讓後續處理上很快速,而且不會造成太多 redundant 的問題。」
(同場加映:非本科系畢業 如何培養讓企業驚艷的程式力?)
經過在眾目睽睽之下面試的初體驗,威辰在 Medium 部落格分享心得:「雖然知道自己離資深工程師還有一段距離,但藉由瞭解資深工程師的面試問題,能夠幫我釐清還需要哪些能力才能夠勝任。」
資深工程師的價值除了技術層面外,還必須有與其他部門溝通、團隊合作、帶著剛入行工程師成長的能力。
面試技巧 1:向面試官呈現思考過程
ALPHA Camp 校長 Bernard 指出:「如同 Sam 所說,如果你想在新創、或成長曲線很快的公司工作,你會有 8 成時間在做你沒做過的事、沒解決過的問題。面試被問到沒做過的事是很正常的,因此重點是當下你怎麼去面對、回答。
面試是一個問答過程,但很多時候我們會太重視答案。其實,一個好公司、好老闆,他最在意的不是你是否有正確答案,而是你的思考過程。
因此,你的目的不是告訴面試官一個正確的答案,而是要呈現你如何思考。例如:『我雖然沒有做過,但我認為有 A、B、C 三種可能…』提出來和面試官一起討論。面試官其實很在乎這個過程,他也從中評估是否能跟你合作。」
(同場加映:蹲馬步練功夫 成為搶手全端開發人才)
面試技巧 2:把面試話題導引到自己研究過的專案,展現熱情
Bernard 校長也指出:「很多人想試試看自己能否轉職工程師,但除了薪水、職涯發展,你更應該考慮的是『你是否享受這個過程?』
面試時,盡可能把話題拉回來你研究過的主題、專案。當你分享自己很有熱忱的開發經驗,散發出來的能量真的會不一樣!面試官也會感受到你的熱情。
例如剛剛威辰提到他自主研究過的 Elasticsearch 技術時,他整個人散發出來的能量是很吸引人的。」
結語:以謙虛學習的心態面對每場面試
模擬面試與講評告一段落,Sam 建議面試者,以謙虛學習的心態面試,「去面試時,請抱持著你都不會上的心態,得失心太重反而會影響到後面的面試。抱持著謙遜去學習,竭盡可能去發掘、吸收對方(面試官)的經驗。」
「科系已經不是重點了,」Sam 工程團隊許多強棒都不是理工科系畢業的,「重要的是思考能力、學習能力以及願意嘗試的心態!」