C4模型完整指南:以清晰且有目的的方式呈現軟體架構

「一張圖勝過千言萬語——但只有是正確的圖才有效。」
— 源自C4模型的精神

C4模型(情境、容器、組件、程式碼)是一種強大、輕量且層級化的軟體架構文件記錄方法。由西蒙·布朗所創建,旨在讓跨團隊與利害關係人——從執行長到資深開發者——都能理解複雜系統。

本指南將帶你走過模型的每一層,說明最佳實務,展示實際案例,並提供工具,讓你能在自己的專案中應用C4。


🔍 為什麼要使用C4模型?

在深入之前,讓我們先回答這個重要問題:

❓ 既然如此,為什麼不直接使用UML或隨意繪製圖表呢?

傳統圖表的問題:

  • 細節過多(例如,包含每個方法與介面的UML類別圖)。

  • 缺乏標準化——每個人繪製方式都不同。

  • 難以維護——圖表很快就會過時。

  • 並非適合所有觀眾——工程師能理解;但高階主管卻無法理解。

✅ C4的解決方案:

  • 層級化 → 就像Google地圖一樣可放大或縮小檢視。

  • 以觀眾為導向 → 只呈現對每一群體而言重要的內容。

  • 簡單且一致 → 使用標準的圖形與標籤。

  • 可維護的 → 易於更新和版本控制。

🎯 目標: 傳達 系統做什麼,系統做什麼,如何建構,以及如何建構,以及為何如此結構化——而不被技術噪音淹沒。為何如此結構化——而不被技術噪音淹沒。


📊 C4模型的四個層級

讓我們詳細探討每一層,包括其目的、何時使用、如何繪製,以及應避免的事項。

Diagrams | C4 model


🟦 第一層:系統上下文

「系統在世界中處於什麼位置?」

🎯 目的

  • 呈現整體概況整體概況.

  • 識別誰使用該系統以及它與哪些其他系統互動.

  • 答案:「我們要解決什麼問題,涉及哪些人?」

🧩 包含什麼內容

  • 您的 系統 (以標籤如「銀行系統」框起來)。

  • 外部參與者:使用者、客戶、其他系統(例如:「客戶」、「付款網關」、「電子郵件服務」)。

  • 互動:顯示資料流的箭頭(例如:「客戶 → 登入 → 銀行系統」)。

✏️ 如何繪製

  • 使用 簡單的方框與箭頭.

  • 不包含內部細節 — 這並非關於不是您應用程式程式碼的內容。

  • 使用 描述性名稱 (例如:使用「客戶入口」而非「前端應用程式」)。

📌 範例:電子商務平台

 

* 由 Visual Paradigm AI 聊天機器人生成

 

[客戶] →(透過網頁/行動裝置下單)→ [電子商務系統]
                              ↓
                      [付款網關(Stripe)]
                              ↓
                      [庫存管理系統]
                              ↓
                      [電子郵件服務(SendGrid)]

✅ 適用於:產品經理、高階主管、利害關係人,以及協助新成員融入團隊。

⚠️ 避免

  • 包含內部組件。

  • 使用模糊的標籤,例如「使用者」——應明確指定為「線上客戶」或「管理員使用者」。


🟨 第二層:容器

「系統的高階技術構建模塊是什麼?」

🎯 目的

  • 將系統分解為主要的邏輯組件.

  • 顯示容器之間如何通訊以及它們使用哪些技術.

  • 答案:「系統是如何構建的,每個部分由哪些技術驅動?」

🧩 應包含的內容

  • 容器:應用程式、資料庫、API、微服務、檔案儲存等。

  • 技術:(可選但有幫助)例如「React Web 應用程式」、「Node.js API」、「PostgreSQL 資料庫」。

  • 通訊:以箭頭顯示資料流(例如 HTTP、REST、gRPC、訊息佇列)。

✏️ 繪製方法

  • 使用圓角矩形(或簡單的方框)。

  • 清楚地標示每個容器。

  • 使用 帶標籤的箭頭 來顯示互動(例如:「HTTP POST /login」)。

  • 以顏色編碼 如有需要(例如:網頁應用程式用藍色,資料庫用綠色)。

📌 範例:銀行系統(L2)

 

* 由 Visual Paradigm AI Chatbot 生成

[客戶行動應用程式] → (HTTPS) → [銀行網路 API(Node.js)]
                              ↓
                      [客戶資料庫(PostgreSQL)]
                              ↓
                      [詐欺偵測微服務(Python)]
                              ↓
                      [電子郵件服務(SendGrid)]

✅ 適用於:架構師、後端工程師、DevOps 團隊、技術負責人。

⚠️ 避免

  • 不要將容器拆分過細(例如:將「網頁應用程式」拆分成 10 個部分)。

  • 過度堆疊技術細節(這些內容留給 L3/L4 層)。


🟥 第 3 層:組件

「容器內有什麼?」

🎯 目的

  • 深入探討 一個容器 (例如:網頁應用程式),並展示其 內部邏輯結構.

  • 答案: 「這個應用程式內部實際是如何運作的?」

🧩 應包含的內容

  • 組件: 邏輯模組(例如「驗證服務」、「訂單處理」、「電子郵件發送器」)。

  • 依賴關係: 用箭頭顯示組件之間如何互動。

  • 技術提示: (可選)例如「使用 JWT」、「呼叫 Redis」。

💡 注意: 組件是邏輯上的,而非實體的。它們不必對應到檔案或類別。

✏️ 如何繪製

  • 使用簡單的方框(無需複雜的 UML)。

  • 清楚標示:「使用者驗證組件」。

  • 使用箭頭來顯示依賴關係(例如「使用者服務 → 資料庫」)。

  • 避免顯示類別、方法或資料結構(那是 L4)。

📌 範例:Web 應用組件

 

 

[使用者驗證組件]
         ↓
[使用者個人檔案服務]
         ↓
[訂單處理組件]
         ↓
[電子郵件通知組件]
         ↓
[支付網關整合]

✅ 最適合: 開發人員、後端工程師、團隊負責人、程式碼審查。

⚠️ 避免

  • 繪製每個類別或函數。

  • 除非必要,否則使用 UML 符號(例如,用於複雜的狀態機)。

  • 過於詳細——這其實是並非一個類別圖。


🟩 等級 4:程式碼(可選)

「實際的程式碼是什麼樣子?」

🎯 目的

  • 展示實際的程式碼結構——通常用於複雜或關鍵的元件。

  • 答案:「這個元件是如何實作的?」

🧩 應包含的內容

  • 類別、介面、函數.

  • 關係:繼承、組合、相依性注入。

  • 套件/模組.

✏️ 如何繪製

  • 使用UML 類別圖套件圖,或 序列圖.

  • 保持簡潔 聚焦 — 僅顯示一個組件。

  • 使用 像 PlantUML、Draw.io 或 Visual Studio Code 插件之類的工具.

📌 範例:使用者服務(L4)

@startuml
class UserService {
  + createUser()
  + getUserById()
  + validateUser()
}

class UserRepository {
  + save(user)
  + findById(id)
}

UserService "1" -- "1" UserRepository : 使用
@enduml

✅ 最適合:資深開發人員、程式碼審查者,協助新成員熟悉複雜邏輯。

⚠️ 避免

  • 繪製專案中的每一個檔案。

  • 使其過於龐大或複雜。

  • 為每個組件都使用 L4 — 僅在必要時使用.

🔑 經驗法則:僅在以下情況使用 L4 複雜、關鍵或難以理解 組件。


🔄 實際應用 C4 的方法

逐步工作流程:

  1. 從 L1:系統環境開始

    • 定義你的系統及其環境。

    • 識別關鍵使用者和外部系統。

  2. 進入 L2:容器

    • 將系統拆分成高階元件。

    • 使用技術標籤以釐清內容。

  3. 選擇一個容器並深入探討 L3:元件

    • 專注於一個關鍵領域(例如:驗證、付款)。

    • 呈現邏輯結構——而非程式碼。

  4. 僅在必要時才進入 L4

    • 用於複雜邏輯,或在解釋設計決策時。

  5. 文件化並進行版本控制

    • 將圖示儲存在 Markdown、PlantUML 或 Draw.io.

    • 使用 版本控制(Git) 以追蹤變更。

  6. 與利害關係人共同審查

    • 向主管展示 L1,向開發人員展示 L3,向架構師展示 L2。


🛠️ 用於建立 C4 圖表的工具

工具 最適合 備註
PlantUML 基於程式碼的圖表(非常適合自動化) 使用 @startuml 搭配 C4 語法
Draw.io (diagrams.net) 手動、視覺化編輯 免費,支援 C4 形狀
Lucidchart 團隊協作 適合非技術使用者
Excalidraw 手繪風格,有趣且快速 非常適合白板繪製
C4-Model 插件 (VS Code) 開發者工作流程 自動從程式碼生成圖表

💡 專業提示: 使用 PlantUML 搭配 Markdown (例如在 GitHub README 中) 以保持圖表版本控制且可搜尋。


🎨 C4 圖表規範 (最佳實務)

規則 為何重要
✅ 使用 方框 用於系統、容器、組件 簡單、易讀、可擴展
✅ 使用 箭頭 用於通訊 顯示資料流,而不僅僅是連接
✅ 標籤所有內容清楚地 無歧義
✅ 使用一致的顏色(可選) 例如:藍色 = 網頁,綠色 = 資料庫,紅色 = 外部
✅ 保持圖示小巧且專注 避免雜亂
✅ 使用描述性名稱 「客戶服務」>「服務1」
✅ 除非在 L4,否則避免使用 UML 保持 L1–L3 簡單

📌 黃金法則C4 圖示應能在 30 秒內被不熟悉該系統的人理解。


🔄 C4 與 UML:清晰的對比

功能 C4 模型 UML
目的 溝通與清晰性 全面的建模
細節層級 層級式(縮放) 可以非常詳細
目標受眾 所有利害關係人 主要針對開發人員與架構師
複雜度 簡單、輕量 高(可能令人感到壓抑)
維護 容易 經常被忽略
使用案例 架構文件 設計、文件編寫與分析

✅ 使用 C4 進行架構溝通
✅ 使用 UML 進行深入設計(例如:狀態機、序列流程) — 但僅限於 L4 的 C4 圖表中


🌟 實際應用案例

🏦 銀行應用程式

  • L1: 客戶 → 銀行系統 → 支付網關

  • L2: 網頁應用程式、行動應用程式、資料庫、詐欺偵測微服務

  • L3: 認證元件、交易處理器、警示服務

  • L4TransactionService.java 與  validate()  和  process()  方法

🛒 電子商務平台

  • L1: 客戶 → 電子商務系統 → 支付網關 → 庫存系統

  • L2: 前端、API 網關、訂單服務、庫存資料庫

  • L3: 購物車服務、結帳元件、電子郵件服務

  • L4結帳服務 與  applyPromo()  和  sendReceipt() 

🧠 AI 聊天機器人平台

  • L1: 使用者 → 聊天機器人 → 自然語言處理引擎 → 資料庫

  • L2: 網頁前端、機器人 API、自然語言處理微服務、Redis 快取

  • L3: 消息處理器、意圖分類器、回應生成器

  • L4意圖分類器 類別包含 predict() 方法


📚 進一步學習資源


✅ 最終檢查清單:你是否正確使用C4?

  • 圖表應階層式的(L1 → L4)。

  • 每一層僅顯示對觀眾而言必要的內容給觀眾。

  • L1–L3不使用UML(除非為釐清內容)。

  • 圖表應30秒內即可輕鬆理解.

  • 你應使用一致的命名與圖形.

  • 圖表應版本控管(例如在Git中)。

  • 審查與利益相關者討論他們。


🎯 摘要:C4 的力量

層級 重點 受眾
L1:系統背景 整體圖像 高階主管、產品經理
L2:容器 技術模組 架構師、DevOps
L3:組件 內部邏輯 開發人員
L4:程式碼 實際實作 資深開發人員、審查者

✅ C4 不僅僅是繪圖工具——它是一種溝通策略。

它將抽象的系統轉化為共通的理解,減少誤解,並協助團隊更快地打造更好的軟體。


📣 準備好視覺化你的專案了嗎?

👉 告訴我你的專案,我會為你產生:

  • 一個系統背景(L1)圖表

  • 容器 (L2) 圖示

  • 組件 (L3) 圖示(針對一個主要容器)

  • 可選: 程式碼 (L4) 程式碼片段

只要說:

「幫我為我的 [專案名稱] 建立一個 C4 模型!」

讓我們一步步建立清晰的視覺 — 一次一個圖示。 🎨✨