Code Smell 品質閘門檢測方法論
Ticket 設計完成後才發現職責不清、範圍過大——這時程式碼都已經寫了,修正成本才是真正的問題所在。
我們在專案中建立了一套設計階段品質閘門:在 Ticket 進入 Phase 2 之前強制執行 C1/C2/C3 三項檢測。 問題在文字階段就抓出來,修正只需幾分鐘;等到程式碼都寫好了,才是幾個小時起跳的代價。
三層檢測標準
C1 God Ticket:超過 10 個檔案、跨越超過 2 個架構層、或預估超過 16 小時,判定過大,必須拆分。
C2 Incomplete Ticket:驗收條件少於 3 個可量化項目、缺少測試規劃、未定義工作日誌名稱、無參考文件連結——任一缺失,Ticket 不完整。
C3 Ambiguous Responsibility:標題缺少層級標示(如 [Layer 5])、目標含複合職責(出現「和」或「或」)、步驟用「相關檔案」而非具體路徑、驗收條件跨層——任一模糊,需重新定義。
檢測順序的設計邏輯
固定執行順序:C1 → C3 → C2。
C1 最先,因為一旦判定 God Ticket,拆分後產生多個新 Ticket,C2/C3 的分析全部作廢要重來。C3 排第二,職責不清的 Ticket,補充驗收條件也會是模糊的。C2 最後,在範圍合理、職責明確的基礎上,確認必要元素齊全。
執行流程
Step 1:C1 God Ticket 檢測
從 Ticket 的步驟章節提取所有檔案路徑,計算檔案數量。接著使用檔案路徑分析法判斷每個檔案所屬的架構層:
lib/presentation/widgets/、lib/presentation/pages/屬於 Layer 1(UI 層)lib/presentation/controllers/、lib/presentation/view_models/屬於 Layer 2(行為層)lib/application/use_cases/、lib/application/services/屬於 Layer 3(UseCase 層)lib/domain/repositories/(介面)、lib/domain/events/屬於 Layer 4(Domain 介面層)lib/domain/entities/、lib/domain/value_objects/、lib/infrastructure/屬於 Layer 5(Domain 實作層)
層級跨度 = 最高層 - 最低層。如果有檔案分佈在 Layer 1 到 Layer 5,層級跨度就是 4,遠超過 2 的上限。
預估工時根據步驟數量與複雜度係數評估:步驟數 × 平均每步時間 × 複雜度係數(1.0 到 2.0)。
檢測失敗時,依序嘗試三種拆分策略:
- 按層級拆分(優先):將跨層的 Ticket 按架構層拆成多個
- 按職責拆分(次要):將工時過長的 Ticket 按職責邊界拆分
- 按功能模組拆分(最終):將職責過多的 Ticket 按功能模組拆分
拆分後的每個子 Ticket 都需要重新執行 C1 檢測。
Step 2:C3 Ambiguous Responsibility 檢測
確認四個要素:
- 層級標示:標題包含
[Layer X]標籤 - 職責描述:目標章節無「和」或「或」的複合描述
- 檔案範圍:步驟列出具體路徑,而非「相關檔案」
- 驗收限定:驗收條件不出現跨層項目
任一不符,依序修正:明確層級 → 重寫職責 → 列出具體檔案 → 限定驗收範圍。
Step 3:C2 Incomplete Ticket 檢測
確認四個必要元素都存在:
- 驗收條件:3 個以上可量化、可驗證的項目(「程式碼品質提升」這種描述不算)
- 測試規劃:明確的測試檔案路徑和對應的測試項目
- 工作日誌:定義好工作日誌的檔案名稱(而非「待填寫」)
- 參考文件:至少 1 個有效的文件連結
缺少哪個就補哪個,沒有例外。
Step 4:提交審查
所有 Ticket 通過 C1/C2/C3 之後,生成品質閘門檢測報告,提交 PM 審查。PM 批准後才能進入 Phase 2。
阻斷機制與執行時機
任何 Ticket 未通過 C1/C2/C3,禁止進入 Phase 2。不是建議,是硬性規定。問題立即修正,所有過程寫入工作日誌。
執行時機有三個:設計完成後立即檢測、PM 分派前確認報告、PM 審查時以報告作依據。三個時機缺一不可——缺了任何一個,閘門就會有漏網之魚。
實際效益
最直接的改變是:開發者接到 Ticket 時就已經有明確範圍、清楚職責、具體驗收標準,不需要反覆確認。
更重要的是,因為修正成本真的很低,團隊才會認真對待每一次品質閘門,而不是當作走形式。一旦修正成本高,就會開始討價還價、局部修正、累積技術債——品質閘門也就形同虛設。