de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

文件危機

每個工程團隊都深知這種痛苦。你花費數週時間設計優雅的微服務架構,精心編繪能令利害關係人讚嘆的 Visio 圖表。六個月後,系統已經演進——新增了新服務、遷移了資料庫、棄用了 API 端點,但圖表卻凝固在過去。它已成遺物,甚至是一種謊言。

這就是「文件腐蝕」,它是工程生產力的無聲殺手。當圖表失真,開發者便會忽視它們;當開發者忽視文件,部落知識便會取而代之;當唯一了解系統的人離職,你便只剩下一套複雜的程式碼庫,卻毫無地圖指引。

圖形即程式碼(DaC)是解決方案。而其核心正是Mermaid,這是一款基於 JavaScript 的圖形工具,能將純文字轉化為精美的視覺圖表。

圖表即程式碼(DaC):解決文件危機


核心理念:將圖形視為軟體

圖形即程式碼的根本轉變在於,以與應用程式程式碼相同的嚴謹度來處理圖形。這意味著:

1. 版本控制成為標準

當你的圖形是.mermaid檔案,它便與你的原始碼一同存放在你的 Git 儲存庫中。每一次變更都會被追蹤。你可以git blame來查看是誰新增了該服務,git diff來在合併前審查變更,並可回滾至任何先前狀態。

gitGraph
    commit id: "初始架構"
    commit id: "新增使用者服務"
    branch feature/order-service
    commit id: "訂單服務 v1"
    commit id: "新增支付閘道"
    checkout main
    merge feature/order-service
    commit id: "更新 API 閘道"

範例:使用 Mermaid 的 Git Graph 語法視覺化圖形本身的 Git 歷史

2. 圖形的程式碼審查

拉取請求(Pull Requests)不再僅限於程式碼。當開發者提出新服務或修改資料流程時,該變更會以可讀的差異(diff)形式出現在拉取請求中。審查者可以直接對圖形本身進行評論,確保架構決策在合併前經過討論與核准。

3. CI/CD 整合

你的圖形可在你的 CI/CD 流程中自動生成與驗證。想像一個 GitHub Action 能夠:

  • 將所有 Mermaid 圖形渲染為 PNG/SVG 格式

  • 將它們上傳至你的文件網站

  • 若偵測到無效的 Mermaid 語法,則使建置失敗

 

flowchart LR
    A[開發者推送程式碼] --> B[CI 流程執行]
    B --> C[執行測試]
    B --> D[渲染美人魚圖表]
    D --> E{語法有效?}
    E -->|是 | F[上傳至文件]
    E -->|否 | G[建置失敗並通知團隊]
    F --> H[部署應用程式]
    G --> I[開發者修正語法]
    I --> A

範例:用於圖表驗證與部署的 CI/CD 工作流程


美人魚實作:真實世界範例

讓我們透過實用且真實世界的範例,來探索美人魚支援的圖表類型。

範例 1:微服務架構(流程圖)

這是最常見的使用情境——視覺化您的服務如何進行溝通。

flowchart TB
    subgraph "客戶層"
        MobileApp[行動應用程式]
        WebApp[網頁應用程式]
    end

    subgraph "API 閘道"
        Gateway[API 閘道]
    end

    subgraph "微服務"
        UserSvc[使用者服務]
        OrderSvc[訂單服務]
        ProductSvc[產品服務]
        PaymentSvc[金流服務]
    end

    subgraph "資料層"
        UserDB[(使用者資料庫)]
        OrderDB[(訂單資料庫)]
        ProductDB[(產品資料庫)]
        Redis[(Redis 快取)]
    end

    subgraph "外部服務"
        Stripe[Stripe 金流]
        EmailAPI[電子郵件 API]
    end

    MobileApp --> Gateway
    WebApp --> Gateway
    Gateway --> UserSvc
    Gateway --> OrderSvc
    Gateway --> ProductSvc
    Gateway --> PaymentSvc

    UserSvc --> UserDB
    UserSvc --> Redis
    OrderSvc --> OrderDB
    OrderSvc --> Redis
    ProductSvc --> ProductDB
    ProductSvc --> Redis

    PaymentSvc --> Stripe
    OrderSvc --> EmailAPI
    PaymentSvc --> EmailAPI

範例:包含快取、資料庫與外部相依性的完整微服務架構

範例 2:使用者驗證流程(序列圖)

序列圖非常適合記錄服務之間複雜的互動。

sequenceDiagram
    autonumber
    participant 使用者
    participant 前端
    participant AuthSvc 驗證服務
    participant UserDB 使用者資料庫
    participant Cache Redis 快取
    participant EmailSvc 電子郵件服務

    使用者->>前端:輸入憑證
    前端->>驗證服務:POST /login (電子郵件,密碼)
    驗證服務->>使用者資料庫:依電子郵件查詢使用者
    使用者資料庫-->>驗證服務:回傳加密後的密碼與使用者資料
    驗證服務->>驗證服務:使用 bcrypt 驗證密碼
    
    alt 有效憑證
        驗證服務->>驗證服務:產生 JWT 權杖
        驗證服務->>快取:儲存工作階段 (金鑰:user_id, 過期時間:1 小時)
        驗證服務-->>前端:200 OK + JWT 權杖
        前端-->>使用者:重新導向至主控台
    else 無效憑證
        驗證服務->>電子郵件服務:觸發登入失敗警示
        驗證服務-->>前端:401 未授權
        前端-->>使用者:顯示錯誤訊息
    end
    
    Note over 驗證服務,電子郵件服務:5 次失敗嘗試後,鎖定帳號 15 分鐘

範例:詳細的驗證流程,顯示成功與失敗路徑,包含快取與警示等副作用

範例 3:AWS 雲端基礎設施(類別圖)

類別圖不僅用於程式碼,也能建模雲端資源及其關係。

classDiagram
    class VPC {
        +string cidr_block
        +string region
        +createSubnet()
        +deleteSubnet()
    }

    class Subnet {
        +string availability_zone
        +string cidr_block
        +boolean is_public
        +attachRouteTable()
    }

    class EC2Instance {
        +string instance_type
        +string ami_id
        +int storage_gb
        +start()
        +stop()
        +reboot()
    }

    class RDSDatabase {
        +string engine
        +string version
        +int storage_gb
        +boolean multi_az
        +takeSnapshot()
        +restoreFromSnapshot()
    }

    class S3Bucket {
        +string bucket_name
        +string region
        +boolean versioning_enabled
        +uploadFile()
        +downloadFile()
    }

    class IAMRole {
        +string role_name
        +string policy_document
        +attachPolicy()
        +detachPolicy()
    }

    VPC "1" --> "*" Subnet
    Subnet "1" --> "*" EC2Instance
    Subnet "1" --> "0..1" RDSDatabase
    VPC "1" --> "0..*" S3Bucket
    EC2Instance --> IAMRole
    RDSDatabase --> IAMRole

範例:將 AWS 基礎設施建模為具有屬性與方法的類別,適用於文件撰寫與基礎設施即程式碼規劃

範例 4:電子商務訂單處理(狀態圖)

狀態圖擅長展示實體如何在不同狀態之間轉換。

stateDiagram-v2
    [*] --> Cart: 使用者新增商品
    Cart --> Checkout: 使用者進入結帳
    
    Checkout --> PaymentPending: 使用者提交訂單
    PaymentPending --> PaymentProcessing: 啟動支付閘道
    
    PaymentProcessing --> Paid: 支付成功
    PaymentProcessing --> PaymentFailed: 支付遭拒
    
    PaymentFailed --> Checkout: 使用者重試支付
    PaymentFailed --> [*]: 使用者放棄購物車
    
    Paid --> OrderConfirmed: 發送確認郵件
    OrderConfirmed --> Preparing: 分配至倉庫
    
    Preparing --> Shipped: 移交給運送商
    Shipped --> InTransit: 運送商取件
    
    InTransit --> Delivered: 送達確認
    Delivered --> ReviewPrompted: 請求使用者評價
    
    ReviewPrompted --> [*]: 使用者提交評價
    Delivered --> RefundRequested: 使用者申請退費
    
    RefundRequested --> RefundApproved: 客服審核通過
    RefundApproved --> RefundProcessed: 款項退回
    RefundProcessed --> [*]: 訂單結案
    
    state "高風險詐欺檢查" as FraudCheck {
        [*] --> CheckScore
        CheckScore --> LowRisk: 分數 < 50
        CheckScore --> HighRisk: 分數 >= 50
        HighRisk --> ManualReview: 標記供團隊審查
        ManualReview --> LowRisk: 核准
        ManualReview --> PaymentFailed: 駁回
    }
    
    PaymentPending --> FraudCheck: 觸發風險評估
    FraudCheck --> PaymentProcessing: 低風險

範例:包含詐欺偵測巢狀狀態的完整電子商務訂單狀態機

範例 5:使用 GitHub 問題進行衝程規劃(Git 圖形)

Git 圖形可以表示超越 Git 本身的工作流程。

gitGraph
    commit id: "衝程規劃" type: HIGHLIGHT
    
    branch sprint-1
    commit id: "使用者故事 #101: 登入頁面"
    commit id: "使用者故事 #102: 使用者註冊"
    
    branch bugfix/hotfix
    commit id: "熱修復:驗證權杖過期"
    checkout sprint-1
    merge bugfix/hotfix
    
    commit id: "使用者故事 #103: 密碼重設"
    
    checkout main
    merge sprint-1 tag: "v1.0.0"
    
    branch sprint-2
    commit id: "功能 #201: 購物車"
    commit id: "功能 #202: 結帳流程"
    
    branch experiment/ai-recommendations
    commit id: "概念驗證:機器學習推薦引擎"
    
    checkout sprint-2
    commit id: "功能 #203: 訂單歷史"
    
    checkout main
    merge sprint-2 tag: "v2.0.0"
    
    commit id: "發行說明:衝程 1 與 2 完成"

範例:將專案管理、衝程與功能分支視覺化為 Git 圖形


圖形繪製的 AI 革命

儘管 Mermaid 優雅,但其語法可能成為障礙。當您試圖記錄系統時,誰還想除錯箭頭未對齊或括號遺漏的問題呢?

這就是 AI 驅動工具改變一切的地方。

AI 自動修復

像「VPasCode(Visual Paradigm 的圖形即程式碼平台)與「Mermaid Chart」已整合 AI 模型(如 Google Gemini 與 OpenAI),能夠:「

  • 自動偵測語法錯誤

  • 修復損毀的圖形,只需單擊一次

  • 建議圖形結構的改進

讓我們看看實際運作:

損毀的 Mermaid 程式碼:

 

 

flowchart LR
    A[前端] --> B(API 閘道
    B --> C[使用者服務]
    C --> D[(資料庫
    D --> E[快取]

AI 修復的程式碼:

 

flowchart LR
    A[前端] --> B(API 閘道)
    B --> C[使用者服務]
    C --> D[(資料庫)]
    D --> E[快取]

AI 能識別缺失的閉合括號與方括號,並立即修復。

自然語言轉為圖表

或許最強大的功能是從自然語言描述生成圖表。透過像「OpenDocs」(VP 的文件平台),您只需描述您的需求:

「建立一個流程圖,顯示使用者登入。若憑證有效,則重新導向至主控台。若無效,則顯示錯誤並允許 3 次嘗試。失敗 3 次後,鎖定帳號。」

AI 生成的 Mermaid:

 

 

flowchart TD
    Start([使用者嘗試登入]) --> EnterCreds[輸入電子郵件與密碼]
    EnterCreds --> Validate{驗證憑證}
    Validate -->|有效| Dashboard[重新導向至主控台]
    Validate -->|無效| CheckAttempts{嘗試次數 < 3}
    CheckAttempts -->|是| Increment[增加嘗試計數器]
    Increment --> ShowError[顯示錯誤訊息]
    ShowError --> EnterCreds
    CheckAttempts -->|否| LockAccount[鎖定帳號 15 分鐘]
    LockAccount --> SendAlert[發送安全警示電子郵件]
    SendAlert --> End([處理結束])
    Dashboard --> End

圖表類型間的轉換

AI 也能在不同圖表格式間進行轉換。需要將 PlantUML 圖表轉換為 Mermaid 嗎?AI 工具可以處理:

PlantUML 輸入:

 

 

@startuml
actor User
participant "前端" as FE
participant "後端" as BE
database "DB" as DB

User -> FE: 點擊登入
FE -> BE: POST /login
BE -> DB: SELECT user
DB --> BE: 使用者資料
BE --> FE: JWT token
FE --> User: 顯示主控台
@enduml

AI 轉換的 Mermaid:

 

 

sequenceDiagram
    actor User
    participant Frontend
    participant Backend
    participant Database
    
    User->>Frontend: 點擊登入
    Frontend->>Backend: POST /login
    Backend->>Database: SELECT user
    Database-->>Backend: 使用者資料
    Backend-->>Frontend: JWT token
    Frontend-->>User: 顯示主控台

互動式聊天機器人整合

部分平台現已提供用於建立圖表的聊天機器人介面。您可以進行對話:

使用者:「在我的架構圖中新增一個名為『庫存服務』的新服務。」

AI:「我將新增一個庫存服務,連接到您現有的產品與訂單服務。」

圖表會自動更新

使用者:「實際上,請讓它也連接到一個名為『InventoryDB』的新資料庫。」

AI:「完成。庫存服務現在已連接到產品服務、訂單服務以及新的 InventoryDB。」


將程式碼圖表整合到您的工作流程中

步驟 1:從小處著手

不要試圖一次將整個系統圖表化。從單一元件開始——例如您的驗證流程,或是您正在建構的新功能。

步驟 2:嵌入文件

將您的.mermaid檔案與您的文件並列存放(例如,放在/docs資料夾中)。使用如mermaid-cli等工具,在建置過程中將其渲染。

步驟 3:善用 VPasCode 的統一引擎

如果您在一個偏好各異的團隊中工作,VPasCode至關重要。它能在同一位置支援多種程式碼圖表語言:

# 在 VPasCode 中,您可以混合搭配:
diagrams/
  ├── architecture.mermaid
  ├── deployment.puml      # PlantUML
  ├── database-erd.mermaid
  └── workflow.d2          # D2 語言

步驟 4:透過 CI/CD 實現自動化

將步驟加入您的 GitHub Actions 或 GitLab CI:

- name: 渲染 Mermaid 圖表
  run: |
    for file in $(find docs -name "*.mermaid"); do
      npx @mermaid-js/mermaid-cli -i $file -o ${file%.mermaid}.png
    done

- name: 上傳至文件網站
  run: |
    aws s3 sync docs/ s3://your-docs-bucket/

步驟 5:在拉取請求中進行審查

制定政策,規定所有架構變更都必須更新圖表。使用拉取請求評論來討論視覺變更:

審查者:「快取不應該位於訂單服務與資料庫之間嗎?目前它僅附加在用戶服務上。」

作者:「抓得真好。我會更新圖表。」


實際影響:案例研究

考慮一家採用 Mermaid 和 VPasCode 實施「圖表即程式碼」的金融科技初創公司:

  • 之前:47 個靜態 Visio 檔案,大多數超過 6 個月未更新。新進員工花了 3 週才理解架構。

  • 之後:12 個 Mermaid 圖表,全部儲存於 Git 中,隨每個功能更新。新進員工在第一週即能產出成果。

團隊的技術長指出:「我們已將圖表從合規檢查項目轉變為開發流程中活生生的部分。當我們辯論新架構時,我們會開啟 Mermaid 編輯器,直接用程式碼繪製草圖。這是一項革命性的改變。」


未來:持續性文件

最終目標是「持續性文件」,即圖表可從您的基礎設施或程式碼自動生成。相關工具已開始出現,能夠:

  • 掃描您的 Kubernetes 清單並生成服務拓撲圖

  • 解析 OpenAPI/Swagger 檔案並建立 API 流程圖

  • 監控您的雲端資源並自動更新架構圖

Mermaid 處於這場運動的核心,提供一種簡單、基於文字的格式,機器可生成,人類也能理解。


今日開始

準備超越靜態圖片嗎?這是您的行動計畫:

  1. 安裝 Mermaid 擴充功能 在您喜愛的 IDE 中(VS Code、IntelliJ)

  2. 建立您的第一張圖表 在一個 .md 檔案中,使用 Mermaid 語法

  3. 探索 VPasCode 的免費方案 體驗 AI 驅動的圖表繪製功能

  4. 建立一份活生生的文件儲存庫與您的程式碼庫並行

  5. 與您的團隊分享這篇文章並開啟對話

您的架構值得擁有比被遺忘資料夾中塵封圖表更好的待遇。是時候將您的圖表視為其應有的關鍵資產來對待了。