AI Agent 時代的程式碼整潔之道:拆解與實測 Uncle Bob 的 Clean Code Sub-mode

Cover


SOURCE | 資訊源評估

NAPKIN | 餐巾紙

餐巾紙公式

$$\text{CRAP} = \text{CC}^2 \times (1 - \text{coverage})^3 + \text{CC} \quad (\text{Constraint: } \text{CRAP} < 10)$$

公式白話解析:CRAP 評分以圈複雜度(CC)為底線,覆蓋率為阻尼器。當圈複雜度 $\text{CC} \ge 10$ 時,即便覆蓋率 100%,得分仍為 10,單靠補測試絕無法達標,強制 Agent 必須拆分函數。

一句話

Vibe Coding 降低了生成程式碼門檻,卻未降低維護複雜度;將工程紀律轉化為 Agent 量化門禁,才是大模型時代交付可靠系統的支點。

餐巾紙草圖

┌──
│ Uncle Bob 的 ub-mode 三層治理架構
│ ├── 第一階段:先讓功能可用 (First Make it Work)
│ │   ├── 最小改動約束 (Laziness) ──▶ 單一決策點、最小編輯量
│ │   ├── 前置型別設計 (Data Shape) ──▶ 型別鎖死非法狀態、入口解析一次
│ │   └── 邊界防禦與 TDD ──▶ 核心邏輯純函數、紅綠循環、單一寫入者 (One Writer)
│ ├── 第二階段:再把程式碼寫好 (Then Make it Right)
│ │   ├── crapper ──▶ 圈複雜度 + 覆蓋率計算,強制 CRAP < 10 (限制分支膨脹)
│ │   ├── dryer ──▶ AST 結構指紋 Jaccard 相似度,消除相似度 >= 0.8 重複
│ │   └── mutator ──▶ 注入變異體壓力測試,阻斷存活變異體 (Kill survivors)
│ └── 第三階段:工程實踐 (Follow Practice)
│     └── 操作日誌、守衛上下文視窗、Worktree 清理、小步規範提交
└──

ROUND 1: SKELETON | 骨架掃描

“這本書在說什麼”

章節骨架

  1. 背景:Uncle Bob 與從 Clean Code 到 AI Agent 的典範轉移
  2. 第一階段:先讓功能可用(最小改動、型別防禦與 TDD)
  3. 第二階段:再把程式碼寫好(crapper、dryer、mutator 與 uml-viewer)
  4. 第三階段與實戰:工程規範守則與 oh-my-x 開源專案重構閉環

ROUND 2: DISSECTION | 血肉解剖

“憑什麼這麼說”

論證鏈

┌──
│ [無約束 Vibe Coding] ──▶ [分支無限疊加、虛高行覆蓋率] ──▶ [維護成本飆升、迴歸缺陷爆發]
│         ▼
│ [引入 ub-mode 前置約束] ──▶ [型別鎖死非法狀態 + TDD 最小實現] ──▶ [邊界清晰]
│         ▼
│ [執行量化門禁檢測] ──▶ [crapper 抓高複雜度、dryer 抓結構重複、mutator 殺假測試]
│         ▼
│ [Agent 驅動約束重構] ──▶ [拆分單體純函數 + 補齊邊界斷言] ──▶ [CRAP < 10 且變異體全滅]
│         ▼
│ [工作區紀律管理] ──▶ [守衛上下文視窗 + 規範 Git 提交] ──▶ [生產級可靠交付]
└──

關鍵證據與量化數據

  1. CRAP 臨界值幾何限制:公式 $\text{CRAP} = \text{CC}^2(1 - \text{cov})^3 + \text{CC}$ 中,當 $\text{CC}=10$ 且覆蓋率 100% 時得分仍為 10。「CRAP < 10」是硬性要求單一函數分支必須小於 10 的純數學約束。
  2. 變異測試戳破覆蓋率假象:在免運費門檻(amount >= 100)案例中,若僅測 50 與 150,行覆蓋率 100%,但 mutator 將 >= 變異為 > 後變異體存活,唯有補齊 100 邊界斷言才能阻斷。
  3. 真實專案實測成效:在瀏覽器套件 oh-my-x 中,依工具報告將圈複雜度超標單體函數抽離為純函數,補齊邊界斷言,使變異測試通過率達 100%,行程退出碼為 0。

隱形假設與邊界條件

ROUND 3: SOUL | 靈魂提取

“還能怎麼用”

留白提問 (Guided Reflection)

跨域映射

DEEP READ | 精讀指引

  1. 第一階段:前置設計原則
    • 「Put domain in structure making illegal states impossible… Parse outside data once.」
    • 推薦理由:從源頭阻斷狀態爆炸,型別系統是約束大模型隨意發揮的最強韁繩。
  2. 第二階段:Mutator 變異測試
    • 「If the test still passes when every function returned nothing, throw it out… Kill survivors.」
    • 推薦理由:揭開虛高測試覆蓋率謊言,直擊自動化測試的核心本質。

STRUCTURE MAP | 全書結構圖

┌──
│ ub-mode 治理體系全景
│ ├── 階段一:前置防禦 ──▶ Laziness (單一決策) + Data Shape (型別鎖死非法狀態) + TDD
│ ├── 階段二:工具門禁
│ │   ├── crapper ──▶ 計算 CRAP 指標,強制單函數 CRAP < 10 (限制分支膨脹)
│ │   ├── dryer ──▶ 計算 AST Jaccard 相似度,消除 >= 0.8 結構重複
│ │   ├── mutator ──▶ 注入變異運算子,要求阻斷存活變異體 (Kill survivors)
│ │   └── uml-viewer ──▶ 視覺化模組健康度熱力圖與紅線架構反向依賴
│ ├── 階段三:工程紀律 ──▶ 日誌留痕、保護上下文視窗、Worktree 清理、小步提交
│ └── 落地實戰 ──▶ oh-my-x 四步閉環 (安裝 ──▶ 門禁 ──▶ 體檢 ──▶ 約束重構)
└──

AI Agent 時代的程式碼整潔之道:拆解與實測 Uncle Bob 的 Clean Code Sub-mode (Architectural Deep Dive)

前言/背景

二十多年前,Robert C. Martin (Uncle Bob) 起草《敏捷宣言》並出版《代碼整潔之道》。2026 年 10 月,針對 Vibe Coding 帶來的混亂,Uncle Bob 發布了開源專案 ub-mode。

Uncle Bob Release

這是一套面向 AI Agent 的約束規範,核心堅定:先讓功能可用(First Make it Work),再把程式碼寫好(Then Make it Right)。

Paradigm Shift

章節詳細總結

1. 第一階段:先讓功能可用(前置防禦與 TDD 紀律)

Agent 生成程式碼極易隨意追加分支導致狀態發散。ub-mode 建立防禦規範:

架構權衡 (Trade-offs)

2. 第二階段:量化門禁一 —— Crapper 複雜度治理

crapper 是跨六種語言的複雜度與覆蓋率計算工具,採用 CRAP 指標:

$$\text{CRAP} = \text{CC}^2 \times (1 - \text{coverage})^3 + \text{CC}$$

公式中 CC 為圈複雜度。ub-mode 強制單函數評分必須低於 CRAP 10。

Crapper Terminal Report

若函數分支 $\text{CC} \ge 10$,縱使覆蓋率達 100%,得分仍為 10,單靠補測試絕無法達標,高複雜度單體函數必須強制拆分。

架構權衡 (Trade-offs)

3. 第二階段:量化門禁二 —— Dryer 結構性重複查殺

大模型常複製邏輯並微調變數名應付需求。dryer 專門掃描 AST 結構重複。它剝離變數與字面量,保留語法結構計算 Jaccard 相似度:

$$\text{Score} = \frac{|\text{AST}(A) \cap \text{AST}(B)|}{|\text{AST}(A) \cup \text{AST}(B)|}$$

ub-mode 要求消除結構相似度 $\ge 0.8$ 的重複程式碼。

Dryer Terminal Report

架構權衡 (Trade-offs)

4. 第二階段:量化門禁三 —— Mutator 變異測試與架構視覺化

覆蓋率 100% 常伴隨無有效斷言的假測試。mutator 在原始碼中替換運算子(如 >= 換成 >、&& 換成 ||)生成變異體(Mutant),在隔離目錄中並行跑測。

Mutator Terminal Report

若變異體注入後單測仍全部通過,判定為存活(Survived),行程返回退出碼 3。Agent 必須補齊邊界斷言殺死存活體。搭配的 uml-viewer 則進一步將 CRAP 評分與變異消除率疊加在架構全景圖上,以紅線標記反向依賴。

UML-Viewer Dashboard

架構權衡 (Trade-offs)

5. 第三階段與實戰:工程實踐守則與開源專案真實落地

第三階段規範了 Agent 操作紀律:記錄詳細日誌、守衛上下文視窗避免終端刷屏、清理 Worktree 並保護未提交程式碼、落實小步規範提交。

在真實瀏覽器外掛專案 oh-my-x (TypeScript + WXT) 中,依序完成四步閉環:

  1. 安裝 Skill:載入 ub-mode 規範。
  2. 部署門禁工具鏈:克隆 crapper、dryer、mutator 與 uml-viewer。

Install Tools

  1. 驅動 Agent 全面體檢:依序執行體檢路線與掃描,發現潛在圈複雜度與變異漏洞。

Audit Plan Audit Scan

  1. 帶約束重構與修復驗證:Agent 針對存活變異體補齊邊界斷言,並拆解高圈複雜度函數,最終所有函數 CRAP < 10,變異體 100% 阻斷,退出碼為 0。

Refactor Advice Refactor Success

架構權衡 (Trade-offs)

總結與結論

  1. 工程紀律是約束 AI 的韁繩:大模型降低編寫成本,但未降低維護複雜度;Vibe Coding 必須讓位於量化工程規則。
  2. 型別系統構築第一防線:在系統邊界解析外部輸入,透過型別設計鎖死非法狀態,是防範程式碼腐化的關鍵。
  3. 客觀度量取代主觀審查:CRAP < 10 鎖死函數複雜度,AST 相似度阻斷結構拷貝,變異測試逼出真實有效斷言。
  4. 人機協同的質量閉環:工程師職責升級為「為 Agent 定義度量門禁」,真正實現「人人都能寫出好程式碼」。

Source URL: https://x.com/longhaiqwe123/status/2115286893663498696