<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>規格 on Justmaker's KB</title><link>https://justmaker.github.io/tags/%E8%A6%8F%E6%A0%BC/</link><description>Recent content in 規格 on Justmaker's KB</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Mon, 31 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://justmaker.github.io/tags/%E8%A6%8F%E6%A0%BC/index.xml" rel="self" type="application/rss+xml"/><item><title>與 AI 協作的開發工作流：Coding、Debug、Code Review、規格維護與前端整合</title><link>https://justmaker.github.io/post/ai-tools/ai-collab-workflow/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://justmaker.github.io/post/ai-tools/ai-collab-workflow/</guid><description>&lt;h1 id="與-ai-協作的開發工作流">與 AI 協作的開發工作流
&lt;/h1>&lt;p>前一篇&lt;a class="link" href="https://justmaker.github.io/post/ai-tools/ai-tips-and-pitfalls/" >《AI 使用技巧、經驗與避坑指南》&lt;/a>談的是 prompt 層級的技巧。但真正決定產出品質的，其實是&lt;strong>工作流層級&lt;/strong>的設計 — 你怎麼餵脈絡、怎麼切任務、怎麼驗證、怎麼讓文件不腐爛。&lt;/p>
&lt;p>這篇就是把那一整套寫下來。&lt;/p>
&lt;hr>
&lt;h2 id="0-核心心智模型">0. 核心心智模型
&lt;/h2>&lt;p>AI 不是「會寫程式的人」，是&lt;strong>高速但沒有記憶、沒有責任感的實習生&lt;/strong>。&lt;/p>
&lt;p>整套工作流的設計原則只有三條：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>上下文要用檔案供給，不要用對話供給&lt;/strong> — 對話會消失，檔案不會&lt;/li>
&lt;li>&lt;strong>每一步都要有可驗證的產出&lt;/strong> — 測試、build、screenshot、diff&lt;/li>
&lt;li>&lt;strong>人類守住決策點，AI 負責產出量&lt;/strong>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="1-專案骨架讓-ai-每次都醒來就懂">1. 專案骨架：讓 AI 每次都「醒來就懂」
&lt;/h2>&lt;p>在 repo root 放這幾個檔案，任何 AI 工具（Claude Code / Copilot / Cursor / OpenClaw）都吃得到：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">repo/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── AGENTS.md # 給 AI 的專案守則（架構、慣例、禁區、指令）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── docs/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── spec/ # 規格書（單一事實來源）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── adr/ # 架構決策紀錄 ADR-0001.md ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── runbook.md # 怎麼跑起來、怎麼測、怎麼部署
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── .ai/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── prompts/ # 可重用的 prompt 樣板
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── context.md # 當前迭代的暫存脈絡（每個 sprint 更新）
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>AGENTS.md 至少要寫：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>技術棧與版本（含 lint / formatter 規則）&lt;/li>
&lt;li>目錄職責（哪層可以改、哪層碰了要先問）&lt;/li>
&lt;li>驗證指令（&lt;code>npm test&lt;/code> / &lt;code>make lint&lt;/code> / &lt;code>pnpm build&lt;/code>）&lt;/li>
&lt;li>紅線（不要動 migration、不要改 public API、不要自己裝套件）&lt;/li>
&lt;li>Commit / PR 慣例&lt;/li>
&lt;/ul>
&lt;p>這一步做完，AI 的產出品質大概會跳一個級距。&lt;strong>比任何 prompt 技巧都有效。&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="2-寫程式spec--plan--diff--verify">2. 寫程式：Spec → Plan → Diff → Verify
&lt;/h2>&lt;p>不要直接說「幫我做 X 功能」。改成四段式：&lt;/p>
&lt;h3 id="-spec人主導">① Spec（人主導）
&lt;/h3>&lt;p>先讓 AI 幫你把需求寫成規格，你來審。&lt;/p>
&lt;blockquote>
&lt;p>「把這段需求整理成規格：使用者故事、驗收條件（Given/When/Then）、邊界條件、不做的事。有歧義的地方列成問題清單，&lt;strong>不要自己假設&lt;/strong>。」&lt;/p>&lt;/blockquote>
&lt;p>那份「問題清單」是精華 — 通常會抓到你自己沒想到的洞。&lt;/p>
&lt;h3 id="-planai-提案人核可">② Plan（AI 提案、人核可）
&lt;/h3>&lt;blockquote>
&lt;p>「讀 &lt;code>src/&lt;/code> 相關檔案，提出實作計畫：要改哪些檔、每個檔改什麼、風險在哪、測試怎麼寫。&lt;strong>先不要寫 code。&lt;/strong>」&lt;/p>&lt;/blockquote>
&lt;p>看到計畫不對就在這裡擋掉。&lt;strong>在 plan 階段修正的成本是 code 階段的 1/10。&lt;/strong>&lt;/p>
&lt;h3 id="-diffai-執行小步">③ Diff（AI 執行、小步）
&lt;/h3>&lt;p>一次一個關注點。經驗值：單次改動 &lt;strong>&amp;lt; 300 行、&amp;lt; 5 個檔&lt;/strong>。&lt;/p>
&lt;p>超過就拆。太大的 diff 你不會認真看，AI 也會開始亂編。&lt;/p>
&lt;h3 id="-verify機器判定">④ Verify（機器判定）
&lt;/h3>&lt;p>每個 diff 後強制跑：&lt;code>lint → typecheck → test → build&lt;/code>。&lt;/p>
&lt;p>把這串包成一個指令（&lt;code>make check&lt;/code>），讓 AI 自己跑、自己修到綠。&lt;/p>
&lt;p>&lt;strong>沒有綠燈的產出等於沒有產出。&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="3-debug把-ai-當假設產生器不是答案產生器">3. Debug：把 AI 當「假設產生器」，不是「答案產生器」
&lt;/h2>&lt;p>AI 猜 bug 原因很快，但很愛自信地猜錯。流程要這樣走：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>給證據，不給敘述&lt;/strong> — 貼完整 stack trace、實際 input、失敗的測試輸出。不要寫「它壞掉了」。&lt;/li>
&lt;li>&lt;strong>要求列假設而非答案&lt;/strong>
&lt;blockquote>
&lt;p>「列出 5 個可能原因，依可能性排序，每個附上『我該怎麼驗證它』的具體指令。」&lt;/p>&lt;/blockquote>
&lt;/li>
&lt;li>&lt;strong>先寫重現測試&lt;/strong> — 在修之前，讓 AI 寫一個會 fail 的測試。修好 = 測試變綠。這樣就不會有「好像好了」。&lt;/li>
&lt;li>&lt;strong>二分法搜尋&lt;/strong> — 讓 AI 提出插 log 的位置或 &lt;code>git bisect&lt;/code> 範圍，你跑，把結果餵回去。&lt;/li>
&lt;li>&lt;strong>修完問一句&lt;/strong> — 「這個 root cause 還可能出現在其他地方嗎？」常常會撈到同類 bug。&lt;/li>
&lt;/ol>
&lt;h3 id="避坑">避坑
&lt;/h3>&lt;ul>
&lt;li>❌ 讓 AI 在沒看到實際錯誤輸出的情況下改 code（它會開始改無關的東西）&lt;/li>
&lt;li>❌ 連續三次修不好還繼續讓它試 — 這時它已經在亂猜，&lt;strong>回到第 1 步重新給脈絡&lt;/strong>&lt;/li>
&lt;li>❌ 接受「加個 try/catch 包起來」這種修法&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-code-review雙軌制">4. Code Review：雙軌制
&lt;/h2>&lt;h3 id="軌道-a--ai-review-人類的-code">軌道 A — AI review 人類的 code
&lt;/h3>&lt;p>用固定的 review checklist prompt（存在 &lt;code>.ai/prompts/review.md&lt;/code>）：&lt;/p>
&lt;blockquote>
&lt;p>角色：資深 reviewer。針對這份 diff 檢查：正確性 / 邊界條件 / 錯誤處理 / 併發與競態 / 效能熱點 / 安全（injection、authz、secret）/ 測試覆蓋 / 是否違反 AGENTS.md。&lt;/p>
&lt;p>每則意見標 &lt;strong>blocker / should / nit&lt;/strong>，並附建議改法。&lt;strong>找不到問題就說沒有，不要湊數。&lt;/strong>&lt;/p>&lt;/blockquote>
&lt;p>最後那句很重要，不然它會為了顯得有用而製造假問題。&lt;/p>
&lt;h3 id="軌道-b--人類-review-ai-的-code">軌道 B — 人類 review AI 的 code
&lt;/h3>&lt;p>AI 產的 code 要用&lt;strong>更嚴格&lt;/strong>的標準看，重點看它最會犯錯的地方：&lt;/p>
&lt;ul>
&lt;li>幻覺 API / 不存在的套件方法&lt;/li>
&lt;li>錯誤處理被吞掉&lt;/li>
&lt;li>「看起來對」但邊界條件錯（off-by-one、空陣列、null）&lt;/li>
&lt;li>測試是照著實作寫的（同義反覆，測不出東西）&lt;/li>
&lt;li>悄悄改了不該改的地方&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>每次都看完整 diff，不要只看它的摘要。&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="5-規格維護讓文件不會腐爛">5. 規格維護：讓文件不會腐爛
&lt;/h2>&lt;p>規格會爛，是因為改 code 時沒人改文件。做法：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Spec 進 repo&lt;/strong> — 跟 code 同一個 PR 一起改。文件不在 repo 就一定會爛。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>PR 模板加一欄&lt;/strong> — 「本次是否影響 &lt;code>docs/spec/&lt;/code>？是 → 附上 diff；否 → 說明理由」&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>定期漂移檢查&lt;/strong>（每個 sprint 或 CI 週跑一次）&lt;/p>
&lt;blockquote>
&lt;p>「比對 &lt;code>docs/spec/payment.md&lt;/code> 與 &lt;code>src/payment/&lt;/code>，列出：規格有但沒實作、實作有但規格沒寫、兩邊描述矛盾的地方。」&lt;/p>&lt;/blockquote>
&lt;p>這招意外好用，通常一跑就一堆。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>決策寫 ADR&lt;/strong> — 為什麼選 A 不選 B、當時的限制是什麼。半年後你和 AI 都會需要。三段就好：Context / Decision / Consequences。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>規格用 Given/When/Then 寫&lt;/strong> — 因為它可以直接對應到測試，AI 也能直接轉成 test case。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="6-前端整合ai-最容易看起來對的區域">6. 前端整合：AI 最容易「看起來對」的區域
&lt;/h2>&lt;p>前端的坑在於&lt;strong>編譯過 ≠ 畫面對&lt;/strong>。要補上視覺驗證迴路：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>契約先行&lt;/strong> — 先定 OpenAPI / TypeScript type，前後端都從它生成。讓 AI 改 API 時同步改契約檔，型別錯誤自然會炸出來。&lt;/li>
&lt;li>&lt;strong>給設計稿截圖&lt;/strong>，不要用文字描述 UI。多模態模型看圖的效果遠勝於「一個置中的卡片，圓角 8px…」&lt;/li>
&lt;li>&lt;strong>Playwright 當 AI 的眼睛&lt;/strong> — 讓 AI 自己跑 headless browser 截圖 → 自己看 → 自己修。&lt;strong>這是前端 AI 協作品質的分水嶺。&lt;/strong>&lt;/li>
&lt;li>&lt;strong>元件層開發&lt;/strong> — Storybook 或獨立 route，讓 AI 在隔離環境迭代單一元件，不要一次動整頁。&lt;/li>
&lt;li>&lt;strong>狀態管理明確化&lt;/strong> — 告訴它資料流方向與狀態放哪。不然它會在每個元件塞 &lt;code>useState&lt;/code>，然後你就有一堆同步 bug。&lt;/li>
&lt;li>&lt;strong>必檢清單&lt;/strong> — loading / empty / error 三態、RWD 斷點、a11y（label、對比、鍵盤）、i18n 字串沒 hardcode。&lt;strong>AI 預設全都會漏。&lt;/strong>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="7-一個可以照抄的日常循環">7. 一個可以照抄的日常循環
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">早上 → 更新 .ai/context.md（今天要做什麼、卡在哪）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">任務 → Spec → 問題清單 → 人拍板
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> → Plan → 人核可
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> → 分成 3~5 個小 diff
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">每 diff → AI 實作 → make check 綠 → 人看完整 diff → commit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">完成 → AI 自審（review prompt）→ 人開 PR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> → 同步更新 spec / ADR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">週末 → 規格漂移檢查 + 清理 .ai/context.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="8-心法濃縮">8. 心法濃縮
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>上下文 &amp;gt; 模型 &amp;gt; prompt 技巧&lt;/strong> — 花時間整理 AGENTS.md 的回報率最高&lt;/li>
&lt;li>&lt;strong>小步快跑&lt;/strong> — 大 diff 是所有 AI 協作災難的共同起點&lt;/li>
&lt;li>&lt;strong>驗證要交給機器&lt;/strong> — 人類的注意力留給「方向對不對」，不是「語法對不對」&lt;/li>
&lt;li>&lt;strong>AI 沒有記憶，檔案有&lt;/strong> — 任何你希望它下次還記得的事，寫進檔案&lt;/li>
&lt;li>&lt;strong>連續失敗 = 脈絡不足&lt;/strong>，不是模型太笨。停下來補脈絡，別硬催&lt;/li>
&lt;li>&lt;strong>保留你的判斷力&lt;/strong> — 可以讓 AI 寫，但你要看得懂。&lt;strong>看不懂的 code 不要 merge&lt;/strong>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="延伸閱讀">延伸閱讀
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://justmaker.github.io/post/ai-tools/ai-tips-and-pitfalls/" >AI 使用技巧、經驗與避坑指南&lt;/a> — Prompt 層級的技巧&lt;/li>
&lt;li>&lt;a class="link" href="https://justmaker.github.io/post/ai-tools/claude-code-vs-github-copilot/" >Claude Code vs GitHub Copilot：工程師實測比較&lt;/a> — 工具選擇&lt;/li>
&lt;li>&lt;a class="link" href="https://justmaker.github.io/post/ai-tools/knowledge-map/" >AI 工具 KB 總索引&lt;/a> — 整區導覽&lt;/li>
&lt;/ul></description></item></channel></rss>