搞定系統(tǒng)設計 03:系統(tǒng)設計面試的答題框架
終于要講到答題框架了!
我們說系統(tǒng)設計面試題沒有統(tǒng)一的答案,但答題過程還是有一定的規(guī)律可尋,這就是第 3 章要講到的答題框架。
系統(tǒng)設計面試中,經(jīng)常會被問到如何設計微信、如何設計微博、如何設計百度……我們怎么能在如此短的時間內(nèi)設計出來一個由成千上萬的碼農(nóng)、PM,經(jīng)年累月地迭代出來的如此優(yōu)秀的產(chǎn)品?如果面試者這么優(yōu)秀,那還面試啥?百度、谷歌也不可能只是一個搜索框而已,底下的東西復雜去了。
所以,這種問題的答案一定不可能是全面的,面試官也不會期望我們給出一個滿分答案,這點是要首先明確的。
所謂的系統(tǒng)設計面試實際上是在模擬一個場景:兩名同事在一起就一個模糊的問題,討論一番,得出一個還不錯的解決方案。
問題是開放性的,沒有標準答案。并且最終的設計是怎么樣并沒有求職者在整個過程中表現(xiàn)出來的能力、思維方式重要。過程中,我們需要“一驚一乍”,需要回答面試官的問題、回應他的質(zhì)疑、證明我們的選擇。
面試官的目標是充分挖掘求職者的能力,并在面試結(jié)束時給出過或不過的結(jié)論。
那么面試官到底想在一場系統(tǒng)設計的面試中得到關(guān)于求職者的什么信息呢?
很多人認為系統(tǒng)設計面試就是考察求職者的技術(shù)設計能力。但真實情況要考慮得更多:合作能力、抗壓能力、問出高水平問題的能力……甚至有一些面試官非常看重問問題的能力。
另一方面,面試官也在尋找一些“不好的品質(zhì)”,例如過度設計。求職者傾向于設計出一些完美、不做取舍,不控制成本的方案。這樣的人招進來后,最終需要公司買單。其他“不好的品質(zhì)”還包括:思路狹窄、固執(zhí)、溝通能力差……這些都是要盡量避免表現(xiàn)出來的。
四步法
雖然系統(tǒng)設計面試是開放性的,且沒有“一招吃遍天下”的招式,但一次成功的面試還是會遵循一些步驟:4 步法。
第一步:理解問題,設定邊界
當面試官給出問題時,不要馬上給出答案。系統(tǒng)設計面試沒有標準答案,脫口而出說明求職者并沒有考慮清楚。當沒有徹底理解面試官意圖的情況下就給一個答案通常會給面試官釋放一個不好的信號:我很浮躁。
要想厘清問題,弄清面試官真實的意圖是什么,就必須要和面試官你來我往地問問題。第一步就是要確定要求和假設。
對于求職者,在弄清問題后,不要馬上就給出一個最終的設計版本,因為這通常會是一個錯誤的版本。始終要記住:最終的設計是什么樣并沒有那么重要,重要的信息已經(jīng)整個面試過程中傳遞給了面試官。
所以正確的做法是:在做設計的同時,問面試官的要求是什么,做出合理的假設、取舍,讓面試官看出你的思考過程,最終綜合所有的信息完成一個還不錯的設計。
不要害怕問問題。那并不會說明我們不懂,而是讓面試官理解我們的思考過程。
當我們問出問題后,面試官要么給出明確的回答;要么讓我們自己做出假設。當需要做出假設時,我們需要把假設寫下來備用。
那我們應該問出什么樣的問題呢?這有一些典型的例子:
這個系統(tǒng)的核心功能是什么? 有多少用戶使用我們的產(chǎn)品? 公司的業(yè)務發(fā)展速度怎么樣,3 個月、半年、一年后,規(guī)模會變成多大? 公司的技術(shù)棧是什么?有什么現(xiàn)存的服務可以簡化我們的設計。
第二步:提出整體設計,達成一致
這一步,目標是畫出一個高層次的整體設計,過程中和面試官合作,并和面試官達成一致。
想出一個最初版本的設計。詢問面試官是否可行。要把面試官當成一起工作的同事,這就是一個平常的討論。 在紙上用線框圖畫出關(guān)鍵的組件。包括:客戶端、API、服務端、數(shù)據(jù)庫、緩存、CDN、消息隊列…… 做一個估算,看第一版的設計是否滿足當前的用戶規(guī)模。當然,是否要做估算可以先和面試官交流。
如果可能的話,設想幾個具體的例子,對著圖演練一遍。這讓我們能更堅定當前的設計,有時候還能發(fā)現(xiàn)一些未考慮到的邊界 case。
有個問題是:我們需要設計 API 和數(shù)據(jù)庫的 schema 嗎?這個取關(guān)于面試題是什么,如果面試官讓我們設計一個谷歌搜索引擎,那顯然是不需要的,這個問題層次太低了。但如果問題是設計一個多人撲克游戲的后端,可能這就是考點了。當然,這些都可以向面試官求證,由他決定。
第三步:深入設計
到達這一步時,我們和面試官應該已經(jīng)達成了如下的一致:
總體目標和要完成的功能 一個整體設計圖 從面試官那里獲得了關(guān)于這個設計的反饋 通過反饋,知道了接下來要對哪些方面做深入細致的設計
我們要和面試官確定接下來應該聚焦到哪些組件,這在不同面試場景中不會相同。即使是相同的題目,不同的面試官想考察的點也可能不一樣。有些面試官就喜歡討論頂層設計,畫 PPT 好看??;有時在一個高級職位的面試中,面試官更想討論系統(tǒng)的性能,討論瓶頸和資源預估。大部分時候,面試官還是會想就某個或一些組件進行深入地探討。例如,對于一個短網(wǎng)址應用,重點討論哈希轉(zhuǎn)換算法;對于一個聊天系統(tǒng),面試官更關(guān)注如何減少系統(tǒng)延遲以及如何支持在線、離線狀態(tài)。
面試中的時間管理也是有學問的。不要在沒有用、不能有效證明你能力的細節(jié)上浪費太多時間。例如在設計一個可伸縮的系統(tǒng)時,大談 PageRank 算法,這對面試結(jié)果沒有什么幫助。
第四步:殺青
這是最后一步,面試官會問一些后續(xù)的問題、討論一些其他的點,這有幾點建議的方向:
面試官想要我們識別出當前設計的瓶頸并且給出改進。所以,永遠不要說我們的設計是完美的且沒有改進的余地。每個系統(tǒng)都能做出優(yōu)化。這里實際上可以展現(xiàn)我們的批判性思維,指出現(xiàn)有設計的問題、如何改進,給面試官最后留下一個完美的印象。 幫助面試官回顧一下我們在整個過程中所做的各種設計。如果我們在面試過程中提出了多種方案的話,這可以避免面試官遺忘。 故障處理。例如服務器掛了、網(wǎng)絡中斷了等等故障,都是很好的話題。 運維。如何監(jiān)控各種指標、錯誤日志,如何回滾。 如何應對更大的規(guī)模。例如我們當前的設計能夠支撐 100w 用戶,那么當用戶數(shù)達到 1000w 時,需要如何應對。 提出一些其他組件的精細設計。
關(guān)于要做的和不要做的列表
要做的:
如果要做出假設,向面試官確認是否可行。 理解問題的要求是什么。 沒有最好的答案,也沒有正確的答案。不同方案適合不同的場景:對于創(chuàng)業(yè)公司來說,怎么方便、快速怎么來;而對于有著百萬用戶的公司來說,可用性、穩(wěn)定性才是更重要的。所以,要事先確認面試官到底想要哪種。 讓面試官知道你在想什么。不要悶頭不說話,因為很可能我們在一個錯誤的路徑上思考半天,浪費了時間。 如果可能的話,提出多種方案。 一旦和面試官在整體框圖上達成一致,接下來就要細化設計單個組件,記得先從最重要的組件開始。 從面試官那里獲得一些點子。好的面試官在此刻就是一位同事。 永不言棄。
不要做的:
不提前準備典型面試題。 不要直接提出一個解決方案而不弄清要求和假設。 不要一開始就給單一的組件做非常詳細的設計。先給總體設計再往下深入。 如果卡住了,不要悶著,大膽向面試官尋求提示。 再次強調(diào):不要悶頭思考。 不要想著當我們給出了設計方案的時候,面試就結(jié)束了。只有當面試官說結(jié)束的時候才是結(jié)束的時候,面試過程中,要經(jīng)常問面試官:這樣設計怎么樣,有問題嗎?
每一步的時間如何分配
總體而言,系統(tǒng)設計面試可以問的問題是非常寬泛和靈活的,45 分鐘到 1 個小時不可能覆蓋整個設計,所以時間分配是很重要的。
那我們應該在每一步各花多少時間呢?其實并沒有一個標準的答案,還是那句話:取決于面試官和面試題目。歸根結(jié)底,要看面試官如何安排,看他想考察求職者哪方面的能力。
這里給出一個大概的參考:
| 步驟 | 時長 |
|---|---|
| 第一步:理解問題,設定邊界 | 3-10' |
| 第二步:提出整體設計,達成一致 | 10-15' |
| 第三步:深入設計 | 10-25' |
| 第四步:殺青 | 3-5' |
