在 30 天內用 Claude Code 打造生產級 AI 平台:最真實的故事
某個週二凌晨兩點,我意識到計費系統正在向用戶收取雙倍費用。這個 bug 已經在生產環境運行了六個小時。Claude Code 在那天下午生成了付款對帳邏輯,我也審查、測試並發布了它。程式碼看起來很完美,通過了每一項測試,但本質上卻是錯誤的。
這是關於如何利用 AI 程式碼助手構建 LemonData 的故事——包含 274 個 API 路由、46 個資料庫模型、超過 10 萬行程式碼。這不是那種美化過的「看 AI 讓你效率多高」的故事,而是真實的版本,充滿了失敗、凌晨三點的除錯環節,以及那些讓我質疑 AI 輔助開發是否真的是個好主意的時刻。
理想 vs. AI 輔助開發的現實
AI 程式碼助手的宣傳非常誘人:你描述需求,AI 編寫程式碼,你審查並發布。理論上,一名開發者現在就能完成整個團隊的工作。
實際上呢?前兩週的體驗非常驚人。Claude Code 理解我的程式碼庫、生成完整的功能、跨檔案進行重構。我的發布速度達到了職業生涯的巔峰,快速關閉 issue 帶來的多巴胺讓人陶醉。
接著,裂痕開始出現。
同一個函式以略微不同的實作方式出現在三個不同的檔案中。配置值被硬編碼在隨機的地方。型別定義在不同 package 之間互相矛盾。程式碼庫增長迅速,但也變成了一個「能跑但不知道為什麼」的迷宮。
至於那個計費 bug?Claude 生成了一個看起來非常合理的對帳函式,但它沒有考慮到我們非同步付款確認流程中的競態條件(race condition)。AI 無法得知那個邊緣案例(edge case),因為我沒有明確告訴它,而部分由 AI 生成的測試套件也沒有覆蓋到這一點。
不斷導致崩潰的七種模式
在使用 Claude Code 構建一個月後,我開始記錄一份清單。嚴格來說不是 bug 清單,而是模式清單。同樣類型的失敗不斷發生,這不完全是 Claude 的錯,或者至少不完全是。這是 AI 傾向於優化「現在能跑的程式碼」而非「未來好維護的程式碼」的必然結果。
1. 一致性問題
Claude 會根據它正在處理的檔案、最近看到的範例,或純粹是隨機變異,來以不同的方式實作相同的邏輯。一個 API endpoint 會回傳 { data: users },另一個則回傳 { users }。兩者都能運作,但互不匹配。除錯變成了考古。
2. 複製貼上問題
當複製程式碼更快且不會冒著破壞現有功能的風險時,AI 為什麼要建立共享工具?每當我要求一個與現有功能類似的新功能時,我得到的是全新的實作,而不是重構後的共享解決方案。三週後,我的程式碼庫中散布著五個不同的「格式化貨幣」函式。
3. 型別偏移(Type Drift)問題
新的狀態值被添加到某個檔案,但沒有添加到 enum 定義中。某個欄位在 API 回應中是選填的,但在前端型別中卻是必填的。TypeScript 捕捉到了其中一些,但沒能捕捉到語義上的不匹配——即型別技術上正確但邏輯上不一致的情況。
4. 配置分散問題
資料庫 URL、API key、功能開關(feature flags)、速率限制——Claude 會把它們放在對當前任務方便的任何地方。有時在環境變數中,有時在配置檔案中,有時直接硬編碼。尋找某個值定義的所有位置變成了一場尋寶遊戲。
5. 測試覆蓋率幻象
AI 生成的測試往往會徹底測試正常路徑(happy path),卻完全遺漏邊緣案例。計費 bug 就是一個完美的例子:測試套件完美地覆蓋了正常的付款流程,但從未測試過當兩個付款確認在同一毫秒內到達時會發生什麼。
6. 靜默失敗問題
Claude 會添加 catch (error) { console.log(error) } 區塊來吞掉異常。在開發環境中這看起來沒問題——錯誤會出現在控制台。但在生產環境中,關鍵故障被靜默記錄後就被遺忘了。
7. 文件斷層
Claude 能寫出優秀的程式碼註釋,但它寫出的架構文件卻很糟糕。它可以解釋一個函式的作用,但無法解釋系統為什麼要這樣構建,或者是什麼約束導致了特定的設計決策。
CLAUDE.md 解決方案
轉折點出現在第三週,我建立了 CLAUDE.md——一個位於專案根目錄的檔案,包含 Claude 需要知道的所有慣例、約束和架構決策。
這不是給人類看的文件,而是給 AI 看的文件。
## API Response Format
Always use: { success: true, data: T } or { success: false, error: string }
Never return raw data without the wrapper.
## Currency
Internal storage: USD. Display: formatCurrency(amount, currency, rate).
Never hardcode exchange rates. Never store CNY directly.
## Error Handling
Never use catch(e) { console.log(e) }.
Always use the logger: logger.error('context', { error }).
效果立竿見影。Claude 開始一致地遵循慣例。當它生成的程式碼違反規則時,我可以指向 CLAUDE.md 中的特定行,它就會自我修正。
但單靠 CLAUDE.md 是不夠的。我需要自動化執行。
構建安全網:為 AI 生成的程式碼設置 CI 門檻
我們構建了一個 CI 流水線,其門檻在傳統程式碼庫中可能顯得過於偏執——因為它們的存在是為了在用戶發現之前捕捉 AI 生成的 bug:
- 全域型別檢查:覆蓋整個 monorepo(捕捉型別偏移)
- SSOT 審計:驗證不存在重複的實作
- Enum 同步檢查:確保資料庫 enum 與 TypeScript enum 匹配
- API 回應格式驗證(解決一致性問題)
- 安全門檻:針對計費、權限和身份驗證程式碼
核心洞察:Claude 是一個放大器,而不是替代品。它放大你的生產力,但也放大你的錯誤。如果你沒有強大的慣例,Claude 就會發明自己的慣例——而且它們不會是一致的。如果你沒有自動化檢查,Claude 的 bug 會比人類產生的 bug 更快到達生產環境。
計費 bug 不再可能發生。這不是因為 Claude 變得更聰明了,而是因為流水線現在要求明確處理非同步競態條件,並由一個檢查付款流程中適當鎖定機制的門檻進行驗證。
什麼是「AI 原生開發」的真諦
當我說 LemonData 是「AI 原生基礎設施」時,我並不是指我們在現有產品中添加了 AI 功能。我的意思是整個開發過程都是由與 AI 程式碼夥伴協作的現實所塑造的。
我們的文件比通常情況下更詳細——因為 Claude 需要人類同事可能憑直覺推斷出的明確上下文。我們的型別系統比必要的更嚴格——因為 Claude 會利用任何模糊之處。我們的 CI 流水線設有在傳統程式碼庫中顯得過於偏執的門檻——因為它們的存在是為了在用戶發現之前捕捉 AI 生成的 bug。
結果是,這個程式碼庫實際上比我經手過的大多數專案都更容易維護。這不是因為 AI 寫的程式碼比人類好,而是因為為了 AI 輔助開發,我被迫將那些通常只存在於資深開發者腦中的慣例和檢查全部明確化。
關於 AI 原生作為一種哲學的更多內容,請參閱 什麼是 AI 原生?
給使用 AI 程式碼助手的開發者的建議
如果你正準備使用 Claude Code、Cursor 或任何 AI 程式碼助手開始專案:
- 在第一天就建立你的 CLAUDE.md —— 不要像我一樣等到第三週
- 自動化慣例執行 —— 不要依賴 AI 去記住規則
- 像審查初級開發者一樣審查 AI 程式碼 —— 它速度快且能力強,但缺乏上下文
- 手動測試邊緣案例 —— AI 生成的測試覆蓋正常路徑,而非競態條件
- 從一開始就集中管理配置 —— 配置分散問題會迅速惡化
- 使用嚴格的 TypeScript —— 這是你對抗型別偏移的最佳防禦
- 儘早構建 CI 門檻 —— 它們在第一週內就能回本
我會再做一次嗎?
絕對會。但我會在第一天就建立 CLAUDE.md。我會記住,10 倍的生產力乘數也意味著錯誤後果的 10 倍乘數。
我們構建的平台——300 多個 AI 模型、統一的 API、多幣種計費、13 種語言的國際化——如果由傳統團隊來做,可能需要數月時間。我們在 30 天內就發布了。Bug 是真實存在的,但開發速度也是真實的。
AI 輔助開發並非魔法,而是一種新型的工程學科。就像所有學科一樣,它會回報那些尊重其約束的人。
FAQ
一名開發者真的能用 Claude Code 打造生產級平台嗎?
可以,但有前提。AI 能以驚人的速度處理程式碼生成和重構,但你仍然需要強大的架構判斷力、自動化質量門檻,以及仔細審查一切的紀律。如果你不小心,10 倍的速度也意味著 10 倍快的 bug。
什麼是 CLAUDE.md?
CLAUDE.md 是一個專案級別的指令檔案,AI 程式碼助手會讀取它以獲取上下文。它包含 AI 應該遵循的編碼慣例、架構決策和約束。把它想像成你的 AI 隊友的入職培訓文件。
如何防止生產環境中出現 AI 生成的 bug?
自動化 CI 門檻至關重要:型別檢查、SSOT 審計、enum 同步驗證以及特定領域的安全門檻。核心洞察是 AI 放大生產力的同時也放大了錯誤——你需要自動化檢查來捕捉這些被放大的錯誤。
AI 輔助開發適用於計費和支付系統嗎?
適用,但要格外小心。支付程式碼需要明確的競態條件處理、適當的鎖定機制以及徹底的邊緣案例測試。AI 生成的測試傾向於覆蓋正常路徑——你必須手動測試失敗情境和並行操作。
LemonData 讓你透過單一 API 存取 300 多個 AI 模型。我們用 AI 打造它,為 AI 服務。免費開始使用 —— 新用戶可獲得 $1 額度。