可驗證性設計三支柱

Vibe Coding 法則四「建立可驗證檢查點」的具體落地方式:設計階段就要問自己——

Reviewer 不讀實作能判斷正確嗎?

如果答案是「不能」,這段 code 不該由 AI 大量生成(要嘛是 Core Code 該由人寫,要嘛是該重新設計到能 verify)。

三支柱

1. 介面優先 (Interface-First)

  • 函式 / API 必須有明確的輸入輸出型別與文件
  • 副作用(DB 寫入、外部 call)需在介面層說明,不能藏在實作裡
  • 介面層說明 = reviewer 讀 type signature + docstring 就能 99% 知道這個東西做什麼

2. 測試覆蓋(依程式類型分層)

程式類型必備測試
Pure function / utilityUnit test(含邊界條件)
Endpoint / APIIntegration test(happy path + 錯誤路徑)
非同步 / 排程 / 長時運行Stress test 或長時間 soak test
UI 元件Snapshot / interaction test

關鍵:reviewer 不讀實作,光看 test cases 列舉的場景就能判斷「需求 vs 行為」對齊。

3. 可觀測性 (Observability)

  • 重要流程須有 log、metric、trace
  • 失敗能被監控察覺,而非只丟出 stack trace

光丟 stack trace 對 production 沒用——使用者會體感異常但你不知道原因。設計時就要思考「這段 code 出問題時,從監控面板看得出來嗎?」。

一個對照例子

功能:批次處理使用者匯出請求

✅ 良好設計(reviewer 不讀實作可信任)

維度設計
輸入JSON list of user_ids(schema 明確)
輸出每筆寫入 S3,結果回傳 manifest.json 含每筆狀態
驗證跑 10,000 筆 stress test,比對 manifest 數量 vs S3 物件數量
結論Reviewer 不需讀實作即可信任結果

❌ 不良設計

維度設計
輸入散落在多個全域變數
輸出直接改寫 production DB,無紀錄
驗證只能祈禱

第二個設計不只是「壞的 code」,是從根本上違反可驗證性——三支柱全倒:

  • ❌ 介面:輸入散落、輸出無界面
  • ❌ 測試:無法測(global state 難 mock)
  • ❌ 可觀測性:寫入無紀錄

不該由 AI 生成,連人寫都不該這樣寫。

在 Vibe Coding 流程中的位置

Plan-then-Execute SOP
  ↓
Step 3 計畫產出 ← 三支柱在這時就要 spec 清楚
  ↓
Step 4 AI 執行
  ↓
Step 5 自我驗證 ← 三支柱讓 reviewer 不讀實作也能驗

跟其他工具的對應

支柱工具 / 規範
介面優先TypeScript / Pydantic / Protocol Buffer
測試覆蓋Vibe Coding TDD 三條 e2e 測試 / pytest / Vitest
可觀測性OpenTelemetry / Sentry / 結構化 log

相關