系統架構圖是記錄複雜系統的重要工具。然而,這些圖表中常見的錯誤可能導致觀看者產生困惑、誤解和沮喪。以下是七個(更多!)常見的錯誤,應當避免。

這是對「架構圖的七個常見錯誤」一文的續篇。

標籤不清的資源(線條之間的實體)是系統圖表中一個常見的問題。請考慮此 AWS 圖表中圖示下的標籤:

圖中的每個資源都有一個標示其類型的圖示,但沒有標示其名稱。雖然資源類型非常有價值,但一種不能替代另一種:

類型描述了資源的種類。類型可以包含具體的項目,如資料庫表格或虛擬機器實例,或抽象的項目,如服務。類型可以寫出來,也可以用圖示表示。

名稱可以區分同一類型的不同資源。描述性的名稱還可以揭示資源的角色或用途。

當空間允許時,觀看者最好同時知道資源的名稱和類型。這可以很簡單地在資源名稱後加上類型後綴(例如,Orders Table、Results Bucket)。圖示/形狀通常表示類型(如上圖所示),因此當存在圖示時,按名稱標記資源尤其可取。

這是一個簡單的原則:圖中的資源應始終以某種方式與其他資源連接。包含與所有其他資源斷開連接的資源是一個錯誤。

在上圖(來自本文)中,Amazon Route 53(右側)與其他資源斷開連接。其在系統中的作用完全不清楚。這樣的圖表旨在顯示資源之間的關係,因此省略這些關係從根本上就違背了圖表的目的。

當圖表作者知道某個資源是系統的一部分,但找不到清晰的表達方式時,就會出現這個問題。這通常是試圖在單一圖表中包含過多資訊的結果(通常是「總覽圖」,見下一點)。

「總覽圖」試圖一次性展示整個系統。它們源於一種誤導性的願望,即希望在單一圖表中「看到一切」。它們幾乎總是個錯誤。

上圖是 Ilograph 後端系統架構的「總覽圖」。它將運行時依賴關係、DNS 配置、CDN 配置、原始碼和部署時依賴關係全部包含在單一圖表中。正如它所希望的那樣,在單一圖表中包含如此多的資訊會讓觀看者不知所措。

解決方案是將這樣的圖表分解為多個視角(觀點):

大多數系統都足夠複雜,需要像這樣分解其圖表。每個視角都能講述一個連貫的故事,而不會相互干擾。

如果使用基於模型的圖表繪製,視角可以顯式地共享資源,以保持它們之間的連接。有關更多詳細資訊,請參閱「分解總覽圖」。

到目前為止,本文中的範例圖表都是關係圖,顯示資源之間的關係。還有一類系統圖稱為行為圖,旨在顯示資源之間的特定互動,而不是關係。

由於行為圖顯示特定的互動,它們通常比關係圖更詳細。圖表作者有時會因為空間或時間原因簡化這些圖表;我稱之為「傳送帶症候群」,當他們通過省略實際系統中往返和編排的現實情況來過度簡化它們時,就會發生這種情況。結果是圖表嚴重誤導了觀看者對系統性質的理解。

上圖(來自此解決方案)將系統描繪成一條裝配線:數據順暢地從一個資源流向另一個資源。就好像每個資源都接收前一個資源的輸入,對其進行增強,然後傳遞給下一個資源。

現在,確實有時系統中發生的就是這樣。但通常情況並非如此準確;這些資源(以及未顯示的其他資源)之間有大量的來回互動。經驗豐富的開發人員可能會憑直覺理解圖表顯示的內容不止於此,但缺乏經驗的人將會受到嚴重誤導。

解決方案是完全使用另一種類型的圖表:序列圖。序列圖(最初在 UML 中指定)是專門用於顯示資源之間詳細的來回互動的,如下面的修改圖所示:

像這樣重新格式化圖表可以同時獲得更大的細節和對其所描繪系統的更大保真度。有關更多資訊,請參閱本文。

這是一個幾乎肯定比它被犯下的情況更常被見到的問題。多年來,帶有無意義、分散注意力,有時甚至令人討厭的動畫的圖表在 LinkedIn 等社交網絡上氾濫成災。這是一個典型的例子:

這樣的圖表幾乎可以肯定僅用於市場營銷目的。它們很擅長吸引注意力,但作為技術資源幾乎沒有價值。除了分散注意力之外,上圖中的動畫箭頭完全是多餘的。它們除了指示箭頭已經指明的方向之外,沒有指示任何其他內容。幾乎可以肯定(再次),除非你主要為了市場營銷而創建圖表,否則請避免使用這些不必要的動畫。

系統圖表中的「風扇陷阱」發生在當資源之間的關係資訊在中間資源中丟失時。例如,在基於事件的系統圖中,如果邊緣資源被折疊到共享消息代理中,它們之間的特定通信就會丟失:

可以通過在中間資源中添加更具體的資源(在此示例中為主題)並通過這些新資源重新路由關係來修復「風扇陷阱」。這恢復了邊緣節點之間的通信路徑:

當無法添加中間資源時,還有其他方法可以解決「風扇陷阱」;有關示例,請參閱本文。

人工智能在繪製圖表時可能很有用。在「白板繪製」(即交互式指定系統)時,人工智能可以協助人類進行迭代改進和嘗試想法。如果人工智能可以直接從原始碼自動繪製系統圖,那將會更好。不幸的是,雖然人工智能當然可以嘗試這樣做,但它們生成的圖表通常很模糊,包含幻覺,並表現出上述許多問題。

這些問題源於人工智能在從原始碼創建真實世界系統圖表時面臨的挑戰。這些挑戰包括訓練數據幾乎完全缺失、分析密集原始碼的困難,以及在策略性地選擇包含和省略什麼方面的普遍無能。隨著人工智能的進步,未來情況可能會發生變化;但目前,詳細的系統圖表繪製仍然主要是人類的任務。

有問題或意見嗎?請透過 LinkedIn 或電子郵件 [email protected] 與我聯繫。