生產代碼已死,測試代碼萬歲
十二年前,DHH寫了一篇"TDD is dead. Long live testing."(TDD已死,測試萬歲),整個互聯網炸了鍋。他說對了——但說早了。2026年,不只是TDD死了。死的是整個"生產代碼是你寫的最有價值的東西"這個概念。
我每天都在用Claude Code、Codex和Gemini構建和發佈產品。幾十個項目,幾千條AI輔助prompt。所有這些經歷中最清晰的一個洞察是:最重要的代碼不再是用戶看到的那些代碼,而是確保用戶看到的代碼真的能用的那些代碼。
測試代碼,就是新的生產代碼。
從零到一,從未如此簡單
說句實話。生成邏輯正在變成一種commodity(大眾商品)。
去年,我一個人發佈了一整套屏幕錄製引擎、UI框架和導出管線。以前需要五個人一個sprint(迭代週期)的功能,現在我一個下午就搞定。Claude Code寫實現,Gemini審架構,Codex抓邊界情況。我負責調度。代碼就這麼出來了。
這不是在炫耀。這就是普通的週二。越來越多的開發者只要花200美元/月買AI訂閱、並且能清晰定義問題,就能做到類似的事。一個十幾歲的小孩在臥室裡就能週末搭出一個SaaS的骨架。一個非技術創始人在種子輪關閉之前就能prompt出一個能用的原型。
從零到一的成本從未如此之低。從一到一百也在加速。
瓶頸正在轉移。以前是"你能不能做出來",現在越來越變成"它到底能不能用——以及當你改了什麼之後,它還能不能繼續用?"
生產代碼不再是你的護城河
這是讓人焦慮的部分,而且應該焦慮。
如果任何人都能以接近零的邊際成本生成生產代碼,那生產代碼就不再是競爭優勢。它只是入場券。就像2005年有個網站一樣——你需要一個,但有一個並不讓你特別。
那護城河是什麼?
我認為答案是穩定性。可靠性。當你發佈時,你確信它能用。當你重構時,沒有東西在暗處壞掉。當你的AI在30秒內生成500行代碼時,你知道——不是希望,是知道——它做了它應該做的事。
這種信心主要來自一個地方:測試代碼。
沒錯,有一整個更廣泛的驗證棧——類型系統、linter、靜態分析、staging環境、可觀測性、feature flags。這些都重要。但測試是可執行的規格說明。它們用機器可驗證的格式編碼了意圖。其他工具檢查的是形式。測試檢查的是行為。
有一個類比我覺得很有啟發性。想想AI自身是怎麼改進的。在強化學習中,循環是:生成輸出,根據標準評估,反饋結果。RLHF中的獎勵模型並不完全等同於測試套件——但它扮演了類似的角色。它是驅動收斂的評估信號。沒有它,模型只會生成看起來像樣的垃圾。
軟件中的槓桿在以同樣的方式轉移——從創建行為的代碼轉向驗證行為的代碼。從輸出到驗證器。從生產到證明。
把50%的token花在測試上。我是認真的。
這是我真實的、有立場的觀點:如果你在用AI構建軟件,你應該至少花一半的時間和token寫測試。不是生產邏輯。是測試。
我知道這聽起來極端。讓我解釋為什麼我這樣想。
當AI寫你的生產代碼時,只有兩種可能的結果。要麼代碼能用,要麼不能用。如果不能用而你沒有測試,你和用戶同時發現問題。那是災難。
如果不能用但你有測試,你在幾秒內就發現了。這就是五分鐘修復和五級火警的區別。
但不止於此。測試就是規格說明。當你先寫測試——或者和prompt同時寫——你是在把你的意圖編碼成機器可驗證的格式。你不是在告訴AI"給我做個登錄系統",而是"給我做個登錄系統,要拒絕8位以下的密碼,5次嘗試後限流,並處理Unicode用戶名"。測試就是規格說明,規格說明就是測試。
在AI加速的世界裡,代碼生成的速度遠超任何人類能夠閱讀的速度,測試是你的產品和混亂之間唯一的屏障。
我親眼見過這件事出錯。上個季度,我用Claude Code重構了ScreenKite的導出定價邏輯。AI把模塊重寫得很乾淨——所有舊的行為都保留了,至少看起來是這樣。一切編譯通過。App運行正常。但四捨五入策略從round half up變成了round half even。差別:可能每次一兩分錢。六週後才有用戶發現發票和收據對不上。一個斷言export_price(9.995) == 9.99的測試就能在幾秒內捕獲這個問題。
這不是假設。這是我的代碼庫。我也聽到其他團隊發佈無測試AI生成代碼時遇到了類似的故事。
測試代碼是隱形的。用戶永遠看不到。投資人從不問。它不會讓demo更好看。這正是它被低估的原因。也正是認真對待它的團隊會贏的原因。
測試作為反饋循環
前面的強化學習類比不只是哲學思考——它對你如何使用AI編程工具有實際的影響。
你的AI agent生成代碼,你的測試套件評估它。反饋循環——紅色測試、修復、綠色測試——其功能類似於強化學習中的獎勵信號。不是完全相同的機制,但在結構上是類似的:都是針對評估標準的迭代優化。
如果你的測試套件太薄,你的AI agent就是在盲飛。它生成了看起來對的東西。你沒有信號告訴你它是否真的對。所以你發佈然後祈禱。
如果你的測試套件足夠全面,AI就有了清晰的目標函數。它可以迭代、自我修正、收斂。測試不只是在抓bug——它們在引導生成過程。
這就是為什麼我說測試代碼是你寫的最重要的代碼。它不只是安全網。它是制導系統。
你可能會反駁:"但大語言模型永遠學不會我的具體項目。它們沒有本地記憶。"我以前也這麼想。現在我認為這是錯的。
你的代碼庫不只是代碼。它是記憶。你寫的每一個測試都在教AI什麼是你的項目中正確的行為。每一個文檔文件、每一個AGENTS.md、每一個架構決策記錄——這些都是跨會話存活的持久化本地記憶。當你更新項目的文檔和測試套件時,你不只是在維護軟件。你是在訓練一個本地的獎勵模型。你是在把你的策略、你的邊界情況、你用血淚換來的教訓,編碼成AI能夠真正使用的格式。
搞明白這件事的團隊,他們的AI agent將真正理解他們的代碼庫——不是因為模型變聰明了,而是因為本地上下文變豐富了。測試、文檔和記憶文件,是這個三腳架的三條腿。
呼籲重新平衡
我不是說我有所有的答案。這是我個人的觀點,來自每天用AI構建真實產品的經驗。歡迎批評指正——我是認真的。
但這是我的信念:
我們正在進入一個生成代碼幾乎零成本的時代。維護代碼才是一切代價所在。而在大規模維護代碼最可靠的方式——尤其是那些你沒有手寫的代碼、不斷變化的代碼、三個不同AI模型碰過的代碼——就是擁有一個測試套件,告訴你什麼仍然是對的,什麼已經不是了。類型系統有用。Linter有用。Staging有用。但測試是核心的可執行契約。
未來會脫穎而出的開發者不是prompt最快的人。他們是代碼在六個月後還能用的人。而秘密簡單得令人尷尬:把你的token花在測試上。無聊的、看不見的、關鍵的測試。
生產代碼已死。測試代碼萬歲。
我是Mike,在Edmonton和老婆一起經營micro-company(微型公司),每天用AI編程、公開構建。關注我 @RealMikeChong。