無論是參與面試或釐清需求,系統設計常常令人感到困惑,不知如何進行。
我想,原因大概有兩種。
首先,不同領域的系統通常都有不同的設計要素,如何找出這些要素進行提問?
其次,即便提出疑問找出重點,接下來要如何針對這些要素進行高層設計或規劃?
《系統設計面試指南》對於系統設計的初步規劃或高層結構提供合適的解決步驟。
這些步驟包含如何尋找系統設計的要素以及如何對這些要素進行設計規畫,對於經驗不足或想加強系統設計高層結構的相關經驗者會有很大的幫助。
作者提出的解決步驟分為以下四個流程,
1.了解問題並確定設計範圍
2.提出高階設計並取得認可
3.深入設計
4.彙整總結
書中分別提到各個流程概要內容為
1.了解問題並確定設計範圍
請認真思考系統本身且提出問題,這些問題是用來釐清需求的條件和假設。千萬不要立即提出解決方案,這只會讓你迷失方向,重要的是務必了解需求的具體內容並釐清這些內容中不明確的地方。
有幾個幫助提出問題的清單:
a.系統需要那些特定功能
b.使用者數量
c.擴展速度(3個月 / 6個月 / 1年)和擴展規模
d.可以使用那些現有技術來簡化設計
2.提出高階設計並取得共識
這個流程的目標為設計出系統的高層規畫並和需求者(可能是面試官)達成協議。
a.提出設計藍圖並要求需求者提供回饋
b.在紙或白板上用方框圖畫出關鍵元素,這些關鍵元素可能是客戶端,API,Web伺服器,資料庫,快取,CDN,訊息佇列等等
c.用粗略估算評估設計藍圖是否符合需求中的條件
3.深入設計
大多數的情況下會根據步驟 2.的高層設計藍圖,進行各個要素的擴展。 因為系統在不同情境下關注點也可能不同,有時候可能關注於高層設計,有時候可能關注於效率瓶頸,此時就必須和需求者(可能是面試官)對設計中的各個元素達成共識並確認優先順序。
另外要注意的是請小心時間管理,不要陷入瑣碎細節。
4.彙整總結
最後的步驟需求者會對後續情況提問或自由討論關於系統的其他主題,可以關注的方向如下:
a.系統瓶頸和改進作法
b.重新檢視設計
c.討論系統異常情況(伺服器故障/網路斷線等等)
d.規模擴增該如何處理
e.其他改進方案
談到這裡,如果對本書有興趣的話,還需注意以下兩點:
1.本書談論高層設計,所以只會有非常少量的程式碼。
2.討論的系統種類還不夠全面,有點可惜。