C4模型:像「程式碼的Google地圖」一樣,直觀呈現軟體架構

「C4模型幫助團隊以清晰、一致且恰當細節層級的方式溝通軟體架構。」
— Simon Brown

這個 C4模型 (情境、容器、組件、程式碼)是一種階層式、可縮放的框架,用於記錄軟體架構。它設計為 開發者友善符合敏捷開發,以及 易於閱讀 —— 超越雜亂、靜態的「方框與線條」圖示。

它讓團隊能夠:

  • 在技術與非技術利益相關者之間有效溝通架構。

  • 維持一致且版本控制的文件。

  • 專注於 重要的事在每個抽象層級上。


🔍 C4模型的核心抽象

The Ultimate Guide to C4 Model Visualization with Visual Paradigm's AI Tools - ArchiMetric

層級 概念 目的
第一層:情境 系統與人員 誰使用這個系統?它如何與環境互動?
第二層:容器 可部署單元 高階技術元件(應用程式、資料庫、API)是什麼?
第三層:組件 邏輯分組 容器內部的功能是如何組織的?
第4層:程式碼(可選) 類別、介面、方法 實作細節——通常由IDE產生。

✅ 關鍵原則僅在需要時才放大檢視。先從廣泛開始,再逐步深入。


🧩 關鍵元素與關係

元素 描述 範例
人員 人類參與者或使用者 客戶管理員第三方API
軟體系統 提供價值的系統 網際網路銀行系統
容器 可部署單元(執行時或可部署) Web應用程式、微服務、資料庫、無伺服器函式
組件 相關功能的邏輯群組 驗證模組支付處理器大型主機外觀
關係 元素之間的白話語言連接 「使用」「呼叫」「讀取/寫入」「依賴於」

💬 使用自然語言用於關係。避免使用「連接到」等模糊用語。


📊 C4 模型層級與 PlantUML 範例

📌 所有範例均使用C4-PlantUML 函式庫以確保一致性與自動化。


1. 系統上下文圖(第 1 層)

誰使用這個系統?它與哪些外部系統互動?

🎯 受眾:非技術利益相關者、產品負責人、高階主管。

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml
LAYOUT_WITH_LEGEND()
title 網路銀行系統上下文圖

Person(customer, "客戶", "一位個人銀行客戶")
System(banking_system, "網路銀行系統", "讓客戶可檢視帳戶並進行付款")
System_Ext(mainframe, "大型主機銀行系統", "儲存所有核心銀行資料")

Rel(customer, banking_system, "使用")
Rel_R(banking_system, mainframe, "從此取得帳戶資訊")
@enduml

✅ 重點:範圍與邊界系統的範圍與邊界。


2. 容器圖 (第2級)

主要的技術組件及其技術是什麼?

🎯 目標受眾: 架構師、開發人員、DevOps工程師。

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person(customer, "客戶", "一位個人銀行客戶")
System_Boundary(c1, "網上銀行系統") {
    Container(web_app, "Web應用程式", "Java, Spring MVC", "向使用者提供內容")
    Container(api_app, "API應用程式", "Java, Spring Boot", "透過JSON/HTTPS提供功能")
    ContainerDb(db, "資料庫", "關聯式資料庫", "儲存使用者資料")
}

System_Ext(mainframe, "主機銀行系統", "儲存所有核心銀行資料")

Rel(customer, web_app, "使用", "HTTPS")
Rel(web_app, api_app, "呼叫", "JSON/HTTPS")
Rel(api_app, db, "讀取/寫入", "JDBC")
Rel(api_app, mainframe, "使用", "XML/HTTPS")
@enduml

✅ 重點:技術選擇部署邊界資料流.


3. 組件圖 (第3級)

API應用程式內部結構是什麼樣的?

🎯 目標受眾: 開發人員、技術主管、團隊主管。

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
LAYOUT_WITH_LEGEND()
title 網上銀行系統中API應用程式的組件圖

Container(api_app, "API應用程式", "Java, Spring Boot")
ContainerDb(db, "資料庫", "關聯式資料庫")
System_Ext(mainframe, "主機銀行系統")

Container_Boundary(api_boundary, "API應用程式") {
    Component(sign_in, "登入控制器", "MVC控制器", "允許使用者登入")
    Component(security, "安全組件", "Spring Security", "處理驗證")
    Component(mainframe_facade, "主機外殼", "DAO", "與主機通訊")

    Rel(sign_in, security, "使用")
    Rel(security, db, "讀取/寫入")
    Rel(sign_in, mainframe_facade, "使用")
    Rel(mainframe_facade, mainframe, "使用")
}
@enduml

✅ 重點:內部結構職責依賴關係.


4. 程式圖 (等級 4 – 可選)

實作細節:類別、介面、方法。

🎯 目標對象: 開發人員、程式碼審查者。

⚠️ 不建議手動繪製 — 最佳方式是透過 IDE(例如 IntelliJ、VS Code)使用自動繪圖工具生成。

範例(簡化版):

@startuml
class SignInController {
  +signIn()
  +validateCredentials()
}

class SecurityComponent {
  +authenticate()
  +generateToken()
}

class MainframeFacade {
  +fetchAccountData()
  +sendTransaction()
}

SignInController --> SecurityComponent : 使用
SecurityComponent --> Database : 讀取/寫入
MainframeFacade --> MainframeAPI : 使用
@enduml

✅ 最佳實務:自動化 使用工具如 PlantUML + IDE 插件.


✅ 最佳實務與核心原則

原則 為何重要
迭代式優化 從背景開始 → 僅在需要時才增加細節。避免過度文檔化。
圖表即程式碼 儲存 .puml 檔案至 Git。支援版本控制、CI/CD、協作與差異比對。
包含圖例 始終解釋符號、顏色與慣例(例如 紅色 = 外部藍色 = 內部).
專注於溝通 圖示應傳達資訊,而非令人印象深刻。簡潔性 > 完整性。
使用「系統概覽」圖 展示多個系統如何在組織內互動。
使用「動態」圖 加入序列圖以顯示執行時行為(例如:登入流程)。
合理界定範圍 元件圖必須界定範圍於單一容器內。不要混合容器!

🛠 工具與生態系統

  • PlantUML + C4-PlantUML 庫 – 免費、基於文字、可版本控制。

  • Visual ParadigmLucidchartDraw.io – 透過範本支援 C4。

  • IDE 插件 – 從程式碼自動產生 C4 圖(例如:IntelliJ + PlantUML 插件)。

  • CI/CD 整合 – 將圖示作為建置流程的一部分產生。


📚 參考資料與進一步閱讀


🎯 最後的想法

C4模型並不是為了創造完美的圖表——而是關於在恰當的細節層級上講述正確的故事.

使用它來:

  • 更快地讓新開發人員上手。

  • 讓團隊在系統邊界上達成共識。

  • 用非專業術語與利益相關者溝通。

  • 隨著代碼的演進,同步更新架構文檔。


✅ 專業提示:從一個 系統上下文圖表開始。然後,隨著團隊需求的演進,逐步擴展模型——就像一街一街地建造地圖一樣。


如果需要,請告訴我:

  • 本指南的可下載PDF版本

  • 包含Git中C4圖表的範本儲存庫

  • 從代碼生成C4圖表的自動化腳本

  • 與其他模型(例如,4+1視圖、Zachman)的對比

愉快地繪製圖表吧! 🖥️📘