Learning path
AI 時代的 Clean Code:30 天讓 AI 產出的程式碼可讀、可驗證、可維護
2026 iThome 鐵人賽 Software Development 系列:把 Clean Code 帶進 AI Coding,從命名、函式、測試到架構邊界逐步實測,整理出 CLEAN 五原則與可重用的 AI Agent Skill。
這是我參加 2026 iThome 鐵人賽 Software Development 組的系列文章。
AI 能很快交出一份「看起來很整潔」的程式碼,但名稱有沒有說對意圖、拆分有沒有讓下一次修改更容易、測試全綠能不能當成完成證據,還是得由工程師判斷。這個系列用同一個 API 範例反覆實驗,把 Clean Code 的原則改寫成 AI Coding 可以遵守、也可以被檢查的規則。
這個系列會走過什麼?
- Day 1–3:說明為什麼要寫這個題目,以及 CLEAN 五原則如何掌握情境、範圍、意圖、證據與行為。
- Day 4–9:檢查函式、命名、註解與格式,比較不同拆分方式與 Commit 策略對後續修改的影響。
- Day 10–14:從物件與資料結構、類別內聚,一路比較直接完成、TDD、TCR 與受控 Mutation。
- Day 15–22:用 SRP、OCP、可替換性與元件邊界,處理背景 Worker、競態條件、Outbox 與重試規則。
- Day 23–27:以六角形架構與 Dependency Rule 隔離外部細節,並留下可重跑、可查證的完成證據。
- Day 28–30:回到團隊生產力與誠實估算,整理 Clean Code 如何推導出 CLEAN 五原則。
- Day 31–33:把 24 份 Clean Code Policy 整理成可下載的 AI Agent Skill,並收斂成五個 AI Coding 結論。
適合已經用 AI 寫程式,開始在意可讀性、測試可信度與長期維護成本的開發者與技術主管。
Start here
從這篇開始
先讀這篇建立共同語言,再往下看完整閱讀順序。
Full archive
完整閱讀順序
- 01 Day 1|第三個參賽系列:我為什麼還想寫 AI 時代的 Clean Code? 2026 iThome 鐵人賽 AI CleanCode Day 1:安安~我是ChiYu~ 前兩個 iThome 鐵人賽系列,我從七月就開始準備;進入九月前,稿件也都如期完成。 照理說,這時候應該可以先喘口氣。可是在整理那兩個系列的過程中,我一直惦記著另一個題目,甚至覺得它可能會比原本的規劃更有意思。 但…
- 02 Day 2|叫 AI 清理程式碼,為什麼常只清到表面? 2026 iThome 鐵人賽 AI CleanCode Day 2:安安~我是ChiYu~ 昨天,我真的把這句話交給了 Codex: 改善逾期處理,讓它符合 Clean Code。 Agent 最後交出一份看起來很成功的候選:能 Build、測試全綠,名稱更清楚,主要流程更短,Diff 也集中在逾期處理。…
- 03 Day 3|CLEAN 五原則:如何掌握 AI Coding 的情境、範圍、意圖、證據與行為? 2026 iThome 鐵人賽 AI CleanCode Day 3:安安~我是ChiYu~ 昨天的 Agent 很有把握地寫下: 已完成逾期處理的 Clean Code 重構。 它確實改善了命名與閱讀順序,既有行為驗證也沒有發現漂移。可是看完這份完成報告,我沒有先問 Code 還能不能更漂亮,而是卡在一個…
- 04 Day 4|AI 把函式拆小就算 Clean Code 嗎?從小、命名、組織與順序檢查重構結果 2026 iThome 鐵人賽 AI CleanCode Day 4:安安~我是ChiYu~ 同一段四十多行的 Controller Action,我交給同一個 AI Agent,用兩種整理範圍各跑一次。 兩份結果都通過測試:一份把 Action 壓到十七行,另一份保留三十八行,只抽出單筆逾期處理。若只看行…
- 05 Day 5|AI 取的名稱格式正確,為什麼還是可能誤解程式意圖? 2026 iThome 鐵人賽 AI CleanCode Day 5:安安~我是ChiYu~ 昨天,我把逾期處理中的單筆流程抽成一個私有方法: ProcessOverdueItemAsync 看起來很像一個好名稱:有動詞、有處理對象,也保留非同步方法常見的 Async 結尾。 但只看呼叫端,我仍然得猜:它只…
- 06 Day 6|註解與格式都漂亮,程式碼為什麼還是難讀? 2026 iThome 鐵人賽 AI CleanCode Day 6:安安~我是ChiYu~ 昨天,我們把 Work Item 逾期流程的命名規則寫進 Repository,讓 Agent 可以在安全範圍內自主命名。 名稱說清楚之後,我接著測另一個很常見的要求:補註解、整理格式,真的會讓程式碼更好讀嗎? 這…
- 07 Day 7|AI 把函式拆得越小,就越符合 Clean Code 嗎?三種拆分方式實測 2026 iThome 鐵人賽 AI CleanCode Day 7:安安~我是ChiYu~ 昨天,我們替 Work Item 逾期流程保留兩則有測試依據的警告註解,也確認 Formatter 只能整理已設定的格式規則。 註解沒有逐行翻譯 Code,排版也整理好了。可是打開 ProcessOverdue,查…
- 08 Day 8|同一項需求交給下一個 AI Agent,三種函式結構會走出哪條修改路徑? 2026 iThome 鐵人賽 AI CleanCode Day 8:安安~我是ChiYu~ 昨天,我從三份函式拆分結果中選了 Stepdown 版本。 ProcessOverdue 現在可以由上而下讀成四個步驟:找出逾期候選、逐筆處理、儲存狀態、回傳結果。入口變清楚了,但一份結構是否真的好用,不能只看今天…
- 09 Day 9|AI Agent 一次重寫或分段 Commit:哪個容易還原,哪個完成後更好讀? 2026 iThome 鐵人賽 AI CleanCode Day 9:安安~我是ChiYu~ 昨天,我把同一項需求交給三種函式結構,觀察全新 Agent 會如何理解資料、又會把修改放在哪裡。我最後採用 CQS,但那只回答了資料目前該放哪裡,還沒回答修改走偏時要怎麼退回。 今天接著比較同一段清理工作:讓 Ag…
- 10 Day 10|WorkItem 要公開資料還是封裝行為?用新增業務種類與新增操作比較三種模型 2026 iThome 鐵人賽 AI CleanCode Day 10:安安~我是ChiYu~ 昨天我比較了一次重寫與分段 Commit,最後保留可以逐步驗證、失敗時局部還原的清理節奏。函式內部整理完後,我接著往物件邊界看,WorkItemsController 裡還留著幾行很直接的 Code: 這些 Se…
- 11 Day 11|類別低於 100 行就只有一個責任嗎?用高優先逾期通知比較行數上限與內聚拆分 2026 iThome 鐵人賽 AI CleanCode Day 11:安安~我是ChiYu~ 昨天我先釐清 WorkItem、DTO 與 EF Entity 各自負責什麼。最後沒有建立第二套 Domain Model,只把指派、完成與逾期狀態轉換收回 WorkItem。 物件角色清楚之後,新的問題也浮了出…
- 12 Day 12|AI 寫完再測,和先測再改有什麼差別?比較直接完成、TDD 與 TCR 2026 iThome 鐵人賽 AI CleanCode Day 12:安安~我是ChiYu~ 昨天比較類別拆分時,控制組、行數上限與內聚拆分都能把升級通知做對,也都通過最後的行為驗證。 若只看終點,三種結構都像是成功的候選。可是最後一片綠燈,只能證明它們抵達了終點,沒有說明途中累積了多少尚未驗證的修改,也…
- 13 Day 13|測試全綠,為什麼仍漏掉「剛好 24 小時」?用整潔測試、驗收測試與受控 Mutation 檢查答案 2026 iThome 鐵人賽 AI CleanCode Day 13:安安~我是ChiYu~ 昨天談測試紀律時,我比較了直接完成、TDD 與 TCR。那些實驗回答的是:測試何時介入,會怎麼改變 Agent 的前進節奏與還原範圍。 今天遇到的問題更麻煩:測試介入得很早,不代表測試問對了問題。 在產品範例驅動…
- 14 Day 14|測試全綠後,怎麼判斷設計已經足夠簡單? 2026 iThome 鐵人賽 AI CleanCode Day 14:安安~我是ChiYu~ 前天談測試紀律,昨天接著確認整潔的測試與驗收測試能不能真的守住需求。今天,這個系列正式跨過 Part I〈程式碼〉,進入 Part II〈設計〉。 一進入設計,測試全綠就不再是最後答案。 同一個 Agent 交出…
- 15 Day 15|第三條規則由不同負責人維護,SRP/OCP 要求 AI 把責任拆到哪裡? 2026 iThome 鐵人賽 AI CleanCode Day 15:安安~我是ChiYu~ 昨天只有兩條通知升級規則,而且都由同一位服務等級政策負責人維護。我因此把判斷集中在 RequiresEscalationNotification,沒有再建立 Interface 或規則集合。對當時的需求來說,一個…
- 16 Day 16|兩個通知 Provider 都能編譯,為什麼還不能證明可以互相替換? 2026 iThome 鐵人賽 AI CleanCode Day 16:安安~我是ChiYu~ 昨天把服務等級與派工政策分開後,今天我在共同通知介面後方,再放入一個 Queued Provider。Provider 就是負責實際送出通知的替代實作。 Demo 與 Queued 都能實作同一個 Interfa…
- 17 Day 17|AI 把 API 拆成多個 Project,怎麼判斷哪些元件邊界值得留下? 2026 iThome 鐵人賽 AI CleanCode Day 17:安安~我是ChiYu~ 昨天整理完通知的行為契約、Consumer 需要的能力與原始碼依賴方向後,系列接續版本仍只有一個 Production Project。IWorkItemNotificationSender 由高階 Use Ca…
- 18 Day 18|AI 一次完成三項需求,和逐步設計相比,加入背景 Worker 時有什麼差別? 2026 iThome 鐵人賽 AI CleanCode Day 18:安安~我是ChiYu~ 昨天談完元件原則後,Work Item API 已經形成三個清楚的責任區域:API 處理 HTTP、資料與通知流程,WorkItems.ServiceLevel 保存共用的 SLA 規則,Reporter 則是只…
- 19 Day 19|兩個執行流程同時處理同一筆 Work Item,為什麼會重複通知?從競態條件到 Outbox 與冪等設計 2026 iThome 鐵人賽 AI CleanCode Day 19:安安~我是ChiYu~ 昨天加入背景 Worker 後,逾期流程多了第二個入口:使用者可以透過 HTTP 主動觸發,Worker 也會依排程執行,最後兩邊都呼叫同一個 IOverdueWorkItemProcessor.ProcessA…
- 20 Day 20|兩份程式碼都通過測試,加入重試規則後哪一種結構比較容易修改? 2026 iThome 鐵人賽 AI CleanCode Day 20:安安~我是ChiYu~ 昨天,我們處理了 HTTP 與背景 Worker 同時選中同一筆 Work Item、進而重複送出通知的問題。資料更新、通知傳送、失敗重試與取消路徑,也都有對應測試。 從行為價值來看,昨天的需求已經完成。不過,測…
- 21 Day 21|拆成多個 Project,業務流程、執行方式、團隊與部署就真的獨立了嗎? 2026 iThome 鐵人賽 AI CleanCode Day 21:安安~我是ChiYu~ 昨天,我把會獨立改變的重試規則從 Dispatcher 分離出來。但打開目前的 Solution,裡面早已有三個正式 Project,Build 後也會產生多個 DLL。這是不是代表架構早就取得獨立性了? 還不一…
- 22 Day 22|通知 Provider 已有介面,AI 何時才需要加上 Namespace 防線或拆成 Assembly? 2026 iThome 鐵人賽 AI CleanCode Day 22:安安~我是ChiYu~ 昨天,我把工作項目的生命週期與通知傳送拆成兩條 Use Case,但它們仍在同一個 API Host 裡執行。通知流程只認得 IWorkItemNotificationSender,實際使用 Demo 還是 Qu…
- 23 Day 23|Controller、EF Core 與第三方 SDK 為什麼不該決定 Use Case?用六角形架構隔離外部細節 2026 iThome 鐵人賽 AI CleanCode Day 23:安安~我是ChiYu~ 昨天整理元件邊界時,我保留了既有通知 Port,卻也發現一個不能忽略的問題:它接收的參數仍是 EF Core 使用的 WorkItem Entity。表面上隔離了通知 Provider,核心實際上還在說 Pers…
- 24 Day 24|Use Case 直接依賴 DbContext,架構測試為什麼還是綠燈?用 Dependency Rule 找出掃描盲點 2026 iThome 鐵人賽 AI CleanCode Day 24:安安~我是ChiYu~ 昨天剛把 EF Core 與通知 SDK 留在 Use Case 外圍,今天我就故意把 WorkItemsDbContext 加回 OverdueWorkItemProcessor 的建構式。Release Bu…
- 25 Day 25|AI 寫完功能、測試全綠,為什麼還會重複通知? 2026 iThome 鐵人賽 AI CleanCode Day 25:安安~我是ChiYu~ 昨天我補強了 Dependency Rule 與 Architecture Test,確保 Use Case 不會直接依賴資料庫或外部 SDK。不過,那組測試只守住 Use Case;Controller 仍能另…
- 26 Day 26|AI 說測試全綠還不夠:如何固定版本、重跑驗證,留下可查的完成證據? 2026 iThome 鐵人賽 AI CleanCode Day 26:安安~我是ChiYu~ 「Build 成功、測試全綠、需求完成。」 這三句,我在 AI Agent 的完成回報裡看過很多次。看起來很完整,卻沒有交代驗證的是哪一份 Code、實際跑了哪些檢查,也沒有說綠燈在哪裡停止。 昨天修正人工重送功…
- 27 Day 27|AI 一次改完再驗證,還是拆成三個小週期?比較紅燈時機、回退範圍與測試品質 2026 iThome 鐵人賽 AI CleanCode Day 27:安安~我是ChiYu~ 昨天,我把 AI Agent 的完成宣告整理成可重跑的 Evidence Packet:固定產品版本後,連同 Prompt、Diff、Build、Tests、Smoke、限制與失敗紀錄一起保存。下一位工程師因此能…
- 28 Day 28|AI 提高產碼速度後,團隊生產力真的提高了嗎? 2026 iThome 鐵人賽 AI CleanCode Day 28:安安~我是ChiYu~ 昨天,我把一項通知重試需求拆成三個小週期,讓 Agent 每完成一段就取得測試回饋與回退座標,避免單一開發流程一次累積太多風險。 今天,我把開發線從一條增加到兩條:兩位 Agent 從相同 Commit 同時開工…
- 29 Day 29|AI 給出 48、84、156 小時:工程師如何把單點工期改成誠實估算? 2026 iThome 鐵人賽 AI CleanCode Day 29:安安~我是ChiYu~ 昨天,我比較了多個 Agent 平行開發時的實作、整合、Review 與接手成本。兩條開發線都能完成任務,但整個團隊有沒有變快,還得把後面的整合與接手算進去。 只要有人問:「這個需求多久可以完成?」我們卻很容易再…
- 30 Day 30|Clean Code 如何經過 AI Coding 實作,推導出 CLEAN 五原則? 2026 iThome 鐵人賽 AI CleanCode Day 30:安安~我是ChiYu~ 昨天,我拒絕把 AI 給出的 48、84、156 小時直接當成承諾,因為那些數字缺少足以支撐它們的來源、假設與失效條件。 寫到 Day 30,我想先把這個系列最核心的問題正式回答一次:CLEAN 五原則,到底是怎…
- 31 Day 31|什麼是 AI Agent Skill?我如何把 24 份 Clean Code Policy 整理成可重用工具 2026 iThome 鐵人賽 AI CleanCode Day 31:安安~我是ChiYu~ 昨天,我重新走了一遍這三十天從 Clean Code 延伸到 CLEAN 五原則的過程,才發現前面的文章已經累積了 24 份 Policy。 單篇看都不長,全部塞進 AGENTS.md 卻會產生新的問題:Agen…
- 32 Day 32|我把 Clean Code 做成可下載的 AI Coding Skill:保留、捨棄與重新設計了什麼? 2026 iThome 鐵人賽 AI CleanCode Day 32:安安~我是ChiYu~ 昨天,我把前面累積的 24 份 Policy 分別放回適合的位置:跨 Repository 可重用的判斷進入 Skill,專案自己的領域語言、架構與測試規則留在 Repository,風險接受與最後決策仍由工程師…
- 33 Day 33|三十三天後,我從 Clean Code 與 CLEAN 得到的五個 AI Coding 結論 2026 iThome 鐵人賽 AI CleanCode Day 33:安安~我是ChiYu~ 三十三天前,我手上其實只有三份材料:一本 753 頁、厚度大約五、六公分的《無瑕的程式碼 第二版》,兩則 Uncle Bob 談 Coding Agent 的 X 貼文,以及這段時間大量使用 AI Coding …