前幾天講了本質複雜度跟意外複雜度的區別,但這種區分方式有一個實務上的問題:它終究要靠「感覺」跟「經驗」去判斷,不是每個 reviewer 都有一樣的敏感度,也很難寫進一份客觀的 code review checklist 裡要求每個人一致執行。
今天想提供一個更具體、更容易操作的替代方案:與其問「這段程式碼複不複雜」,不如問「改一個小需求,要動幾個檔案」。 這個問題的答案是一個可以數出來的數字,不是主觀感受。
ai-news-test 實際跑過的「新增分類欄位」案例看這個指標怎麼運作這個指標的核心想法很直接:如果一個需求本身很小(例如新增一個欄位),改動的檔案數量也應該很小;如果改動的檔案數量遠遠超過需求本身的複雜度,那多出來的部分很可能是意外複雜度在作祟,而不是需求真的需要這麼多改動。
這跟前幾天講的「本質複雜度 vs 意外複雜度」是同一個概念,只是換了一個更容易數出具體數字的角度——不用先判斷「這段邏輯複不複雜」,只需要數「改了幾個檔案」。
在 ai-news-test 這個示範專案裡,我實際估算了一個具體的小需求:替文章加上「分類」欄位。這是一個很典型的「小需求」——不涉及新的業務規則,只是多一個屬性。
| 版本 | 需要碰的檔案 | 檔案數 |
|---|---|---|
| 乾淨版本 | Article.php(建構子+getter)、ArticleRepository.php(SQL 與資料對應)、PublishArticleService.php(方法簽名) |
3 個 |
| 過度設計版本(僅計「有被呼叫」的 62 個檔案內) | Aggregate、TableGateway、SQL Builder、Mapper、CreateArticleCommand/Handler/Validator、EditArticleCommand/Handler/Validator、Service 本體 |
約 10-11 個 |
需求本身沒有變複雜——就是多一個欄位。乾淨版本改動範圍跟需求範圍大致成比例(一個欄位,動到儲存與傳遞這個欄位的三個環節);過度設計版本因為多了一層又一層的轉換鏈(Aggregate 到 TableGateway 到 SQL Builder 到 Mapper,還有 Command 到 Handler 到 Validator 兩組),同一個欄位要在每一層都補上對應的改動,改動範圍因此放大了 3-4 倍。
這個數字比「行數多寡」更能具體回答一個問題:AI 寫出來的東西,有沒有讓後續維護變貴? 21,727 行本身不是問題(如果這些行數服務著相對應的業務複雜度,行數多也合理),問題是「多一個欄位要動 10 個檔案」這件事,直接反映了維護成本被不成比例地推高。
❌ 只看行數或檔案數的絕對值,沒有跟需求範圍對照:
「這個 PR 改了 800 行,有點多,要不要拆小一點?」
(沒有問:這 800 行對應的需求本身有多大?)
✅ 把改動範圍放進需求範圍的脈絡裡去問:
「這個需求只是新增一個欄位,正常情況大概會動到
『儲存層 + 傳遞層 + 讀取層』三個環節。
這個 PR 動了 10 個檔案,多出來的 7 個檔案在解決什麼問題?」
後者的問法把「複雜度高不高」轉換成「這個改動範圍有沒有合理的理由」,這是一個 reviewer 可以具體回答、也可以要求對方具體回答的問題,不需要依賴模糊的架構品味。
這個方法不是萬能的,有幾個要注意的地方:
「感覺太複雜」是主觀的,不同人、不同心情、不同熟悉程度,判斷結果都會不一樣;「改一個欄位要動幾個檔案」是客觀的,任何人數出來的答案都一樣。 這個差異在 AI 產出速度下特別關鍵——如果 review 的標準只能靠資深工程師的直覺去把關,這個把關能力沒辦法規模化,也沒辦法被寫進自動化流程裡。而一個可以量化的指標,理論上可以變成一條可以被工具驗證的規則,這正是本系列的主題句:AI 沒有發明過度設計,它只是讓過度設計的速度追上了你按下 Enter 的速度;Review 要跟得上,審的就不能再是程式碼本身,而是產生程式碼的規則。 而規則要能執行,前提是它要能被量化。
想一個你最近處理過的小需求(新增一個欄位、加一個簡單的檢查規則),回想一下當時實際動了幾個檔案。如果現在請你的團隊成員憑直覺猜這個數字,猜出來的答案跟實際數字會差多少?
ai-news-test 實測案例:新增分類欄位,乾淨版本動 3 個檔案,過度設計版本要動 10-11 個檔案,需求本身完全沒變複雜Day 7 要把前面幾天的觀察收斂成第一部的結論:Code Review 這套「人眼逐行看程式碼」的舊模型,為什麼從結構上就追不上 AI 現在的產出速度。
我自己在推動 code review 文化的過程中,長期以來最頭痛的一件事,就是很難把「這樣寫感覺怪怪的」這種直覺講清楚,讓不同資歷的人有一致的判斷標準。這幾年我開始試著把這種直覺轉換成可以量化的問題——不是每次都成功,但「改動範圍跟需求範圍成不成比例」這個問法,是少數幾個真的讓不同資歷的人都能給出接近答案的問題之一。能被量化的判準,才有機會變成團隊共同的語言,而不是只掛在資深工程師腦子裡的默契。