擅長
嘴砲溝通的人在這個環節有較多優勢。
其實前面 10 幾篇文章的內容都是系統設計的一環,只是問題的方向是從你過往的履歷、技術或是面試公司的需求出發,透過詢問細節來評核你技術的硬實力。
再確認求職者的硬實力過關後,有些面試官會給你一個情境來做系統設計
;然後依據你在這道題目上的應對進退,決定要給你 Junior 還是 Senior 的職稱
。
如果你面試的職缺是 Tech Lead,這題回答得不好有高機率直接出局。
初探系統設計
如何設計一個像 Facebook 的社交平台
衍伸問題
筆者在第一次遇到系統設計的問題時表現得很差,因為我把它當成一個技術性的問題,所以不停的在輸出自己的想法及觀點
,面試完的當下還覺得自己表現的超棒,肯定會拿到 Offer。
果然在兩天後收到 Offer Get 的信件,但核薪結果沒有到達自己的期待;當時我並不了解自己在哪個環節犯了錯,於是向人資詢問主管對我的評價,我收到的評價是:「技術完全沒問題、經驗豐富、自我學習能力高;但在系統架構的設計上能力稍顯不足,主觀思維太多
。」
在這之後我才知道面試有「系統設計」這個類型的題目,也明白當時的回答並不是面試官期待的答案。
Junior 工程師在看到問題後會想直接提出解決方案
;而 Senior 工程師則會先釐清問題,從整體架構去思考
。
會有這樣的差異是很正常的,因為 Junior 工程師在入職後,往往是接受任務分配
的一方,所以他們已經習慣「收到問題 → 解決問題
」的作業模式;很少人會去思考為什麼要這樣做、能不能這樣做
,以至於可以完成交辦的任務,卻缺乏對整體架構的思維。
而 Senior 工程師除了要寫程式外,有時還要跟 PM 討論需求、規劃系統架構、分配工作給 Junior 工程師、幫 Junior 工程師 Debug
;有些工程師討厭做這些事情,因為會耽誤到自己寫程式的時間,但正因為這些事情讓他有更完整的架構思維與溝通能力
。
雖然系統設計的範圍很廣,但面試官愛考的就大概就是以下幾種:
先熟悉題庫
;透過反覆練習題庫,除了掌握基本盤外;在面對沒有接觸過的系統也能做到基本的應對進退。求職者對面試公司的系統了解有多深
。網頁爬蟲
的經歷,面試官就會以此詢問筆者:「如何設計一個網頁爬蟲的系統?」備註:
每個面試官在意的細節都不一樣;有些題目除了要系統設計外,他還要你提供不同方案的人力資源配置、功能時程預估、所需硬體資源...
,要你設計一套可以讓組織運轉的流程。
如果沒有一定的實務基礎,面對這些延伸的問題基本沒有招架之力。
問題走向完全看面試官的喜好,因為沒有固定的解答,所以回答是否被接受也是看你跟面試官頻率是否契合
。
今天面試官要找的是同事
,在確認技術過關後;他想透過這個關卡更進一步了解求職者:
與其說是考試,更像是同事間在討論一個議題
;有時也會遇到你認為自己的方案沒問題,但面試官就是覺得不可行的狀況;此時你可以先了解面試官顧慮的點,可能真的有自己忽略的細節。
有時面試官的技術能力未必高於求職者,也許你提出的方案更好,但因為已經超過面試官知識範圍所以不被採納;此時並不建議堅持己見
,你可以說:「也許有我忽略的細節,您的考慮應該是對的。」然後轉移到下一個話題
。
如果你遇到一個自己完全不熟悉的領域,連回答的頭緒都沒有,請跟面試官討論你想解決的問題,並說明為什麼會卡住,千萬不要不懂裝懂瞎掰答案
;多跟面試官互相分享彼此的想法,面試官自己也很清楚求職者是不可能在短時間內給出完美的答案,面對自己不熟悉的議題,就算有不會知識也是很正常的。
會錄取的求職者未必技術能力最好,但絕對是在面試過程中溝通流暢的
。
大部分主管在交代事情時,只會給一個方向,並不會把細節說清楚;所以面試官也是想透過這個問題來了解在未來交辦工作時,你會如何面對。
提供的服務實在是太多了
,所以要先確認問題回答的方向,比如說:「Facebook 有提供蠻多種服務的,像是發文動態、Messager、廣告系統;我們要先從哪一塊來做討論?」回答的內容完全偏離了面試官想要了解的方向
。
使用什麼技術可以等需求確定後再討論,如果一開始在分析問題時就走偏了,那後面再多的努力也沒有用。
假設面試官把問題縮小到打造一個 Messager 的系統
,那核心功能就非常明確;此時你只要簡單敘述設計概念
就好;不要急著說出使用 Node.js + Socket.io + MongoDB 這些工具來打造系統。
聊天伺服器
來處理訊息間的溝通,當用戶發送訊息時,訊息會先傳送到伺服器並儲存
;如果接收方在線上就直接傳送訊息
給他,如果不在線就透過推播通知
。時間戳記
;當接收方點開訊息時也會有已讀的標記
。通常考題都會涵蓋「前端、後端、資料庫」的設計;這樣面試官才能依照自己在意的點深入詢問。
資源永遠是有限的,更高的硬體規格代表更多的預算,此時就需要 trade-off(權衡)
。
接著讓我們從資源消耗的角度來探討 Messager 這個系統中,好友上線顯示綠燈的功能
要如何設計。
最簡單的做法是當用戶一上線,就向所有好友發送上線通知;但這個設計在系統成長到百萬用戶
,且特定時段上線的活躍用戶數量高達 30 萬
時,這種發送通知的方法對資源的消耗極大
。
顯示活躍用戶
,可能要在線 5 分鐘以上再發送通知;透過減少請求的次數來降低對系統資源的消耗
。在提出基礎的解決方案後,題目就會往細節發展,此時你可以主動向面試官確認一些系統需求
,假設你擅長大流量高併發的議題,你就故意問面試官:「這個系統在設計上要考量到大流量以及高併發的問題嗎?
」
主動引導面試官將話題轉向自己擅長的領域是很重要的;但如果面試官對這個議題沒有興趣,千萬不要自顧自的一直講
。
如果你對某個領域不擅長就
不要挖坑給自己跳
,假如你主動提及資料庫相關問題,面試官可能就因為你履歷上有 MySQL 跟 PostgreSQL 的經驗,而詢問你兩者的優缺點及使用時機,如果你答不出來反而會被扣分。
Messager 系統除了傳送訊息這個基礎功能外,還有建立聊天群組、回覆特定訊息、移除訊息、對訊息傳送表情符號...
等眾多功能。
如果你打算在這些功能上開闢戰場,請先詢問面試官是否需要這些功能
;而不是沒有經過溝通,自己覺得理所當然就直接開始設計。
經驗分享
在系統開發上,如果你要做的功能在需求規格以外,一定要先跟 PM 溝通;你認為必要的功能對客戶來說可能根本不需要,甚至系統有可能因為多出來的功能而產生無法預期的 Bug;千萬不要自作聰明
。
如果面試官把話題帶到 DB Sharding
上面,比如:「隨著用戶成長,儲存用戶的 Table 資料量太大,效率越來越低,有什麼解決方案嗎?」
筆者會用下面的角度來回答:
考慮到用戶數量會持續成長,為了減輕資料庫的負擔,我會將這個 Table 切分到多個資料庫來分散壓力,這邊提供兩種切分策略:
欄位作為切分條件
,像是以用戶的「年齡」做為切分條件;不過使用這種方式可能會造成不均勻的 Server load
,因為每個年齡段的用戶數量不同。Hash Function
計算出一個值,用這個值來決定資料要放到哪個資料庫。
可以採用
Consistent Hashing
讓資料均勻分布在不同 DB;這個方案在 DB 數量有增減時,也能盡量避免原有的 Key 被重新分配。
系統設計沒有標準答案,如果你有能力提出多種解決方案,並能說出各自的利弊是非常加分的。
考點:設計系統架構時的輔助工具
孤兒網頁:系統沒有連結可以抵達的網頁。
即使經驗豐富,面對一個從未思考過的問題,也很難提出合適的設計;這邊建議讀者可以透過以下方式,有意識地培養自己系統設計的能力:
感謝大家的閱讀,如果喜歡我的文章可以訂閱
接收通知;如果有幫助到你,按Like
可以讓我更有寫文的動力,我們明天見~
我在 Medium 平台 也分享了許多技術文章
❝ 主題涵蓋「MIS & DEVOPS、資料庫、前端、後端、MICROSFT 365、GOOGLE 雲端應用、自我修煉」希望可以幫助遇到相同問題、想自我成長的人。❞
在許多人的幫助下,本系列文章已成功出版,除了添加新的篇章,更完善了每個案例的應對進退;如果對現在的職涯感到迷茫,也許這本書能帶給你不一樣的觀點~