AI 3 min read 原始貼文

我用 Claude Code 在最不熟的前端做了一個 Roguelike:一份 400 行長到 900 行的 CLAUDE.md

故意挑最不熟的前端領域(Canvas、game loop、React 狀態),不走 TDD,只用 CLAUDE.md + 人工驗證,看能不能撐到收斂。一個週末完成「重構地城」,學到的不是 React,是一份從規格書變防護網的 CLAUDE.md,以及四種 AI 時代真正考驗工程師的能力。

重點:不熟的領域、不走 TDD、只靠 CLAUDE.md 撐到收斂,學到的不是 React,是 AI 時代真正考驗工程師的四種能力。

我故意在自己最不熟的前端開發技術,用 Claude Code 做了一個完整的 Roguelike 遊戲。

週五晚上開工,週一早上完成。

除了做這個遊戲覺得好玩以外,也是為了驗證一件事:

當 AI 寫出來的東西,你沒辦法靠肌肉記憶發現問題的時候,你還守不守得住品質?

我最近在整理一個想法:AI 時代工程師要補的四塊能力

  • 系統理解
  • 需求拆解
  • Context 管理
  • 驗證與判斷

但整理歸整理,我過去的實戰經驗都是 C# 後端,是我打滾二十年的舒適圈。

所以我刻意挑了相對最不熟的領域:前端、Canvas、game loop、React 狀態管理。

而且條件再刻意不專業一點——這個專案不走 TDD(但也許這比較符合業界實際狀況?)。

我想測的是:在沒有足夠的測試保護的情況下,靠 CLAUDE.md 加上人工驗證,能不能把一個完整專案撐到收斂?還是會在某個點整個炸開、收不回來?

先講遊戲本身

BSP 地城生成、回合制戰鬥、15 種怪物各有獨立 AI、4 層 Boss 戰含多階段變身、Web Audio 合成 9 首 BGM。純 TypeScript,零圖片檔,零音效檔,零後端。

腦細胞死了不知多少,在筆電前坐到凌晨兩點,發現女友的眼神已經帶著殺氣,才趕快回房間睡覺。

不過撐過來了。而且撐過來之後,最重要的產物不是遊戲本身——是那份從 400 行長到 900 行的 CLAUDE.md

從 400 行到 900 行的 CLAUDE.md

開發前我寫了一份架構規格書放 repo 根目錄,讓 Claude Code 讀。遊戲設計、技術架構、sprite 規格都在裡面。為了提高 AI 的判讀準確度,整份文件刻意用英文寫——當然,英文文法也是請 Claude 幫我修的。

  • 一開始檔案約 400 行
  • 開發結束,900 多行

多出來的 500 行有個標題:CRITICAL ARCHITECTURE NOTES

18 條。每一條都是一個親手踩過的坑。

卡最多次的問題:戰鬥凍結

戰鬥系統是 event-driven + animation queue。Claude Code 新增了一個 CombatEvent 類型,忘了在 animation mapper 補對應的 case。動畫佇列永遠是空的,finished flag 永遠不會觸發。

戰鬥凍結。畫面就卡在那裡。

我修好了一個。

然後同樣的 bug 在不同的 event 上又出現三次。

另一個經典:React 狀態的 race condition

60fps game loop 用 useRef 存戰鬥狀態,React 用 useReducer 存持久狀態。兩套系統各管各的,開發時一切正常。

直到戰鬥結束的那個瞬間。

Game loop 拿了一個 stale snapshot 寫回 React state,直接把 APPLY_COMBAT_RESULT 已經更新好的數值蓋掉。打完怪回到地圖,HP 跟經驗值像什麼都沒發生過 😂

雖然對 React 的狀態管理不熟,但當下就覺得可能是 race condition,花了一點時間確認後,總算順利修正,也把規則加到 CLAUDE.md 內。

這就是我想驗證的事。

回到「不走 TDD」這個決定

整個過程沒有發生無法收斂的狀況。該修的都修得回來。

但代價是什麼?就是同樣的 bug 會重覆出現。 像 animation mapper 那個,同一種錯犯了三次。如果有測試攔著,第一次修完寫個 test case,後面兩次根本不會發生。

這也是 CLAUDE.md 的侷限——它能讓 AI 下次避開,但它不像測試那樣能自動攔截。它靠的是 AI 讀到、記住、遵守。大多數時候有效,但不是百分之百。

兩者不是替代關係,是不同層級的防護網。

18 條 Note,全來自「你不知道你不知道的」

18 條 Note,沒有一條是語法錯誤或邏輯錯誤。全部都跟架構規範有關——但不是「被違反」,是一開始根本不知道那裡需要一條規範。

我很多年前在一場技術演講裡聊過架構思維的三層金字塔——廣度 vs 深度:

  • 你知道的
  • 你知道你不知道的
  • 你不知道你不知道的

這 18 條 Note 全部來自最底層——「你不知道你不知道的」。

在自己熟的 C# 後端,多年經驗會幫助我把很多「不知道你不知道的」往上搬——你踩過夠多次,直覺就會告訴你哪裡該設防線。但換到不熟的技術棧,那層又變厚了。而 AI 跑得比你快,它會比你更早碰到那些你還沒意識到的邊界。

所以 CLAUDE.md 會從 400 行長到 900 行。不是因為一開始偷懶,是因為有些約束你真的要踩過才知道它該存在。

CLAUDE.md 在開發過程中角色完全變了

開始時是規格書,結束時是防護網。

每次出 bug,我不只修 code,而是回去加一條 Note。附 ✅ 正確寫法、❌ 錯誤寫法、當初怎麼炸的。下次碰到類似情境,Claude Code 讀到這條 Note 就不會再犯。

18 條 Note,18 次把「不知道你不知道的」變成「你知道的」。

總結

在我最不熟的前端技術,一個週末,那四塊能力裡被考驗最兇的果然是驗證與判斷

但考驗的不是你對語言熟不熟——是你有沒有把踩過的坑系統化記錄下來的紀律。

CLAUDE.md 就是那個紀律的載體。

不熟的地方 AI 會幫你走得快,但架構規範你不寫,沒有人會幫你補。

遊戲本身:「重構地城」🎮

你是一個工程師,走進 Legacy Codebase 地城,用重構技能打 Code Smell 怪物,最終面對 God Class Boss。

每隻怪物的 sprite 就是一段 TypeScript 2D 陣列。

← 回到所有文章