Logo
Published on

AI Coding 下的 TDD 實踐

引言:當 AI 會寫測試,TDD 還是 TDD 嗎

在 AI Coding 快速發展的今天,我們面臨一個前所未有的挑戰:當 AI 可以同時產生測試和實作程式碼時,傳統的 TDD(Test-Driven Development,測試驅動開發)實踐還有意義嗎?這不僅是一個技術問題,更是關於開發者角色定位的根本性思考

讓我們從一個真實場景開始探討這個問題

AI Coding 帶來的挑戰

真實場景:失控的 500 行程式碼

想像這樣的情境:你打開 AI 助手,輸入「幫我寫一個 XX 功能」,AI 熱情地回應「好的,這是完整的實作...」,然後螢幕上出現了 500 行程式碼

此時你心中浮現兩個問題:

  • 這程式碼對嗎?
  • 我該從哪裡開始理解?

AI 確實能快速產生程式碼,但我們真的掌控了嗎?

三大核心問題

在實際使用 AI Coding 的過程中,我們會遇到三個主要問題

1. 過度實作與過度設計

你只是想要一個簡單的功能,AI 卻常常過度設計。就像你只想煎個蛋,結果 AI 幫你設計了一整套米其林三星的廚房設備

2. 程式碼脆弱性

當你想加新功能或改需求時,可能會遇到「改 A 壞 B」的情況。因為你不理解整個系統的結構,不知道哪些地方有耦合、哪些地方有依賴。就像疊積木,你不知道哪一塊是關鍵,隨便抽一塊,整個都垮了

3. 理解斷層

最可怕的是這個:程式碼能跑,測試也過了,看起來一切正常。但你完全不知道為什麼要用這個 Pattern,為什麼要這樣設計。結果就是——你不敢改

核心感受:失控感

這三個問題累積起來,產生了一種強烈的感受——失控感

我們開始懷疑:還在「開發」軟體嗎?還是只是在「搬運」AI 產生的程式碼?如果我們失去了對程式碼的掌控,我們就不再是工程師,而變成了 AI 的操作員

AI Coding 的演進歷程

要理解當前的困境,我們需要了解 AI Coding 是如何演進到今天這個階段的

Copilot 模式:人類主導

在這個階段,開發者在寫程式碼,AI 在旁邊幫忙補完。人類還是主導者,AI 只是加速器。這個階段,人類完全掌控開發流程

Composer/Edit 模式:部分授權

這時候人類開始給 AI 簡單任務,比如「幫我重構這個 function」、「幫我寫這個 API endpoint」。AI 可以跨檔案完成任務。人類開始部分授權,但仍保有決策權

AI Agent 模式:全自動完成

這就是現在的狀態。人類只要給需求,AI 可以全自動完成。從設計、實作到測試,一條龍服務。在這個階段,AI 幾乎可以完全自主

聚焦 AI Agent:掌控權的問題

本文主要探討 AI Agent 這個階段,因為在這個階段,「掌控權」的問題最為嚴重。當 AI 可以一次產生完整的系統時,傳統的 TDD 實踐還適用嗎?

TDD 的本質探討

要回答這個問題,我們必須先搞清楚:TDD 的本質到底是什麼?

多數人眼中的 TDD

當提到 TDD,大部分人第一個想到的是:「先寫測試,後寫程式碼」。或者用更專業的術語:紅燈(Red)、綠燈(Green)、重構(Refactor)

這個認知沒有錯,但這只是 TDD 的表象

Kent Beck 的核心理念

TDD 的發明者 Kent Beck 提出的核心理念是

測試不是為了驗證程式碼正確性,而是為了驅動設計決策

這句話值得仔細咀嚼。TDD 的重點不是「寫測試」,而是「透過測試來發現設計」。注意這裡用的詞是「發現」設計,而非「規劃」設計

這就像在黑暗中探索一個洞穴,你用手電筒(測試)照亮前方,一步一步發現路徑(設計),而不是在入口就畫好整個洞穴的地圖

從驗證工具到設計工具的轉變

TDD 本質上是一個轉變

  • 從「驗證工具」→「設計工具」
  • 從「事後檢查」→「事前思考」

這個轉變和敏捷宣言的精神很像:不是左邊的沒有價值,而是更在意右邊的

為何 AI Agent 更需要 TDD

理解了 TDD 的本質後,我們需要思考一個關鍵問題:為什麼 AI Agent 時代更需要 TDD?

AI 擅長 How,不擅長 What/Why

AI 很擅長解決「How」(如何實作)的問題。給它一個明確的規格,它可以寫得又快又好

但是,AI 不擅長「What」和「Why」

  • What(範圍):你到底要做到什麼程度?
  • Why(設計意圖):為什麼要這樣設計?

這些需要領域知識、設計思維和對業務的理解。而這些,正是 AI 目前還不擅長的

對比範例:直接要求 vs TDD 約束

讓我們看一個具體的對比

❌ 直接要求

AI:幫我寫一個網球計分系統
結果:可能會得到一個完整的系統,包含選手管理、比賽記錄、歷史數據、統計分析...

✅ TDD 約束

TDD:讓這個測試通過:當比分是 0-0 時,應該回傳 'love all'
結果:AI 只會寫需要的程式碼

看到差別了嗎?TDD 透過測試,幫你定義了「範圍」

TDD 在 AI 時代的新定位

在傳統開發中,TDD 的主要價值是

  • 設計流程和程式碼
  • 提供重構信心
  • 作為文件

但在 AI Agent 時代,TDD 有了新的價值

1. 控制 AI 的實作範圍

透過測試,你定義了「只要做到這樣就好」。不要過度設計,不要做多餘的功能

2. 引導 AI 的方向

注意,是「引導」,不是「限制」。我們不是在限制 AI 的能力,而是在給它一個明確的方向

就像建築藍圖。藍圖不是告訴工人怎麼搬磚,而是定義要蓋什麼樣的房子。工人(AI)可以自由發揮技術,但不會蓋錯方向

TDD 的三個層次

要真正理解 TDD,我們需要知道它有三個層次。很多人只停在第一層,但要發揮 TDD 的威力,需要理解全部三層

第一層:技術執行(What)

這是大家最熟悉的層次:知道要先寫測試,知道紅燈、綠燈、重構

例如你寫

test('0-0 should return "love all"')

這是 What——你知道要寫什麼樣的測試。這一層很多人都會,但這只是 TDD 的表面

第二層:設計驅動(How)

在這一層,測試開始影響你的設計決策

  • 強迫你思考 API 介面該長什麼樣
  • 引導你做出小而專注的設計決策
  • 幫助你發現領域概念和抽象

當你寫測試的時候,你會發現:「喔,我需要一個 score() 方法。那這個方法應該接收什麼參數?應該回傳什麼?」

這是 How——測試驅動了你的 API 設計

很多人寫測試只是為了驗證,但其實測試應該在你寫 production code 之前,就幫你「設計」好 API 的形狀

第三層:思維模式(Why)

這是最深的一層。TDD 是一種「對話式設計」的思維方式

你在透過測試

  • 與需求對話:「這個需求真正要的是什麼?」
  • 與設計對話:「這個設計合理嗎?」
  • 與未來對話:「這個設計好維護嗎?」

這是一種從已知到未知的探索過程

例如你在寫網球計分系統的測試時,你會問自己:「需不需要有 Player 的概念?」

如果你的測試可以不需要 Player 也能跑通,那可能現階段就不需要這個抽象

這就是 Why——你在思考設計的「原因」和「必要性」

測試驅動設計的浮現

完整的 TDD 流程是這樣的

測試 → 驅動設計 → 設計浮現

這個概念叫做「Emergent Design」——設計浮現。意思是設計不是一開始就規劃好的,而是透過測試一步步「發現」出來的,從簡單到複雜的自然演進

你是透過測試「發現」設計,而不是「預先」設計好再寫測試

AI 時代的 TDD 辯證

現在我們面臨一個全場最關鍵的問題

核心問題

如果 AI 能同時產生測試和實作,而且都是正確的,那「先寫測試」這個順序,還有意義嗎?

這個問題在 AI 時代變得很重要。讓我們看看不同的觀點

兩派觀點

傳統派認為:「當然有意義,這是 TDD 的核心!」

他們認為,先寫測試這個順序不能改,改了就不是 TDD 了

實用派認為:「測試和實作的產出方式變了,但 TDD 的精神沒變」

他們認為,重點不是順序,而是精神

AI 先寫測試的問題

如果讓 AI 先寫測試,算不算 TDD?答案是:不完全算

為什麼?因為缺少了「開發者主導」的設計探索

還記得我們說的嗎?TDD 的核心價值是透過測試驅動設計的演進

如果 AI 一次把所有測試都寫完了,那個「探索」和「發現」的過程就不見了。你沒有參與設計的思考,只是被動接受 AI 給你的設計

核心結論:人類主導 vs 被動接受

我的觀點是:在 AI 時代,我們可能不需要完全遵循傳統的 TDD

重點不是先後順序,而是開發者有沒有參與設計思考

讓我再強調一次這個核心觀點

AI 先寫還是後寫,不是關鍵。人類主導還是被動接受,才是關鍵

  • ❌ 被動接受 AI 產生的一切 = 失去掌控
  • ✅ 人類主導設計思考過程 = 保有 TDD 精神

從需求到測試案例的思考

在討論實踐方法之前,我們還有一個關鍵步驟要理解

TDD 的起點是「思考要測什麼」

很多人以為 TDD 的起點是「寫測試」。錯了

TDD 的起點是「思考要測什麼」

從需求探討出測試案例

怎麼從一個需求,探討出 TDD 的測試案例?

這是思考和設計的一部份,也是實踐 TDD 的關鍵環節

比如你拿到一個需求:「實作網球計分系統」

你不是直接開始寫測試,而是要先思考

  • 最簡單的測試案例是什麼?(0-0 → "love all")
  • 下一個測試案例是什麼?(1-0 → "fifteen love")
  • 什麼時候需要考慮 deuce?
  • 什麼時候需要考慮 advantage?

這個思考過程,就是在「拆解需求」和「規劃測試路徑」

這個思考過程不能省略

雖然 Kent Beck 在書中,是一邊做一邊推論出來的,看起來很自然

但這個「思考過程」不能省略

其實就跟一般的開發一樣,難道開發前不用討論相關的設計?TDD 也一樣,你需要在開始前,思考測試的策略

這個步驟決定了 TDD 能否真正驅動設計。如果你的測試案例選得不好,TDD 就變成形式主義。如果你的測試案例選得好,TDD 就能發揮威力

實踐方法與建議

在 AI Agent 下如何實踐 TDD?這要分兩種模式來看

Copilot/Composer 模式:傳統 TDD 流程

如果你用的是 Copilot 或 Composer/Edit 模式,那比較簡單

在這些模式下,開發者還是主導,AI 只是輔助。所以你可以比較自然地使用傳統的 TDD 流程

  • 你寫測試
  • AI 幫你補完實作
  • 你 Review
  • 重構

這個流程和傳統 TDD 差不多

AI Agent 模式:新的實踐流程

但如果你用的是 AI Agent,就不太一樣了

我建議的流程是這樣

  • 你先思考測試案例(這是人類做的)
  • 讓 AI 先完成測試
  • 你 Review 測試設計(這很關鍵!)
  • 確認後才讓 AI 實作
  • 你 Review 實作品質

看到重點了嗎?每個階段都要有人的判斷

你不是讓 AI 一路跑到底,而是在關鍵點都要參與、要 Review、要判斷

核心原則:保持掌控

核心原則就是

人工介入 = 保持理解 = 保持掌控

TDD 的精神不變,只是執行方式更彈性

AI 讓我們快,TDD 讓我們穩。兩者結合,才是 AI 時代的正確姿勢

總結與新定義

該做的事情還是要做

該做的事情還是要做,它沒有不見

沒有 TDD 的幫助,你還是要想辦法解決那些問題

  • 過度設計的問題
  • 程式碼脆弱的問題
  • 理解斷層的問題
  • 失控感的問題

只是現在,工具變了

AI 改變了實踐方式,沒有改變本質

AI 演進的過程,改變了 TDD 的實踐方式,但沒有改變 TDD 的本質

TDD 在 AI 時代的新定義

所以,TDD 在 AI 時代的新定義是什麼?

TDD 不是「先寫測試」的機械流程,而是「用測試保持思考」的習慣

TDD 不是為了驅動 AI 的實作,而是為了驅動我們的理解

速度是 AI 給的,掌控是 TDD 給的

最後這句話,我希望你能記住:速度是 AI 給的,掌控是 TDD 給的

AI 讓我們快,TDD 讓我們穩。兩者結合,才是 AI 時代下軟體開發的正確姿勢


支持創作

如果這篇文章對您有幫助,歡迎透過 贊助連結 支持我持續創作優質內容。您的支持是我前進的動力!


圖片來源:AI 產生