Vibe Coding:
用 AI 寫網站的真功夫
AI 寫 code 不是叫 ChatGPT 「幫我做一個網站」就完事。真正的 Vibe Coding 是 規格驅動 + 多 Agent 協作 + 文檔系統。這章直接示範我們在 SnowRealm 做產品時的實戰流程:Claude 規劃 + Codex 執行的雙 Agent 工作流, 一個國中生用這套也能交出公司等級的產品。
- 會寫 CLAUDE.md / README.md / design.md 三大文檔
- 懂得「規格驅動開發」(Spec-Driven Development)
- 會分工:規劃 Agent + 執行 Agent + 審查 Agent
- 學會把大專案拆成 AI 寫得動的小任務
- 知道怎麼跟 AI 協作 debug、refactor、寫測試
- 掌握 SnowRealm 實戰的雙 Agent 流程
什麼是 Vibe Coding?
Vibe Coding 一詞 2025 年初由 Andrej Karpathy 提出,意思是:
「你只要照感覺寫,剩下的 AI 處理。」
但這詞被誤解很大。新手以為 = 對 ChatGPT 喊「做個 app」。真正的 Vibe Coding 是:
- 你負責架構決策、產品方向、程式碼審查
- AI 負責實作、樣板碼、查文件
- 你跟 AI 之間用文檔當合約,不是用聊天
Vibe Coding 像當建築師:你畫設計圖、決定結構、選材料,工人(AI)按圖蓋。沒有設計圖的工人會蓋出怪東西。
「叫 AI 直接做完整 app」99% 失敗。AI 會編造 API、混用版本、寫出無法跑的 code。要拆任務、要文檔、要驗證。
三大文檔:你跟 AI 的合約
每個專案 root 必備這三個檔:
| 檔案 | 給誰看 | 內容 |
|---|---|---|
README.md | 人類(包括未來的你) | 專案是什麼、怎麼跑 |
CLAUDE.md | AI | 架構規範、命名規則、不能踩的地雷 |
design.md | 當前任務 | 正在做什麼功能、預期行為、邊界條件 |
README.md(給人)
# SnowRealm Insight
AI 驅動的問卷 / 內容 / 社群平台。
## 跑起來
```bash
pnpm install
cp .env.example .env # 填上 Supabase / OpenAI key
pnpm dev
```
## 技術棧
- Next.js 15 App Router
- Supabase (Postgres + Auth)
- shadcn/ui + Tailwind
- 部署在 Zeabur Tokyo
## 目錄
- `app/` — 路由
- `components/` — UI 元件
- `lib/` — 商業邏輯
CLAUDE.md:給 AI 的工程規範
這是 Vibe Coding 最關鍵的檔。寫好 CLAUDE.md,AI 寫出的 code 會跟你的專案 100% 一致風格。
# CLAUDE.md — Engineering Guidelines
## 你是誰
你是 SnowRealm 的工程助手,負責 Insight 專案。
## 鐵律(不能違反)
- 永遠用 TypeScript,禁止 `any`
- 所有 API route 用 Zod 驗證輸入
- 禁止把 secret 寫進 code
- 禁止用 useEffect 做資料 fetch(用 Server Component / SWR)
- 樣式用 Tailwind,禁止 inline style
## 命名
- 元件:PascalCase(`UserCard.tsx`)
- 工具函式:camelCase(`formatDate`)
- 常數:UPPER_SNAKE(`MAX_UPLOAD_SIZE`)
## 資料夾
- `app/[lang]/...` — 路由
- `components/ui/` — shadcn 元件,不要改
- `components/feature/` — 我們自己的元件
- `lib/supabase/` — DB query
- `lib/llm/` — LLM 相關
## Commit
用 conventional commits:`feat:`, `fix:`, `refactor:`, `docs:`
全英文。
## 改 code 前
1. 先讀 `design.md` 確認任務
2. 先讀相關檔案理解現狀
3. 再動手
## 改完後
1. 跑 `pnpm typecheck`
2. 跑 `pnpm lint`
3. 自己寫測試(Vitest)
CLAUDE.md 不要一次寫完,用迭代的:每次 AI 做了讓你不爽的事,就把規則加進去。三個月後會變成超精準的工程規範。
design.md:規格驅動開發
每次要做新功能,先寫 design.md 給 AI 讀。範例:要做一個「訂閱電子報」功能。
# 訂閱電子報功能設計
## 目標
讓未登入訪客留 email,加進電子報名單。
## 使用者流程
1. 訪客點 footer 的「訂閱」按鈕
2. 跳出 modal,填 email
3. 送出 → 顯示「請查收驗證信」
4. 點驗證信內連結 → 啟用訂閱
## 技術方案
- 資料表:`newsletter_subscribers`
- `id`, `email` (unique), `verified` (bool), `verified_at`, `created_at`
- API:
- `POST /api/newsletter/subscribe` — 收 email,寄驗證信
- `GET /api/newsletter/verify?token=...` — 驗證
- 信件用 Resend,模板用 React Email
## 邊界條件
- 同一 email 重複訂閱 → 重寄驗證信,不報錯
- 驗證 token 24 小時失效
- 驗證後不能再用同一 token
## 不做
- 取消訂閱(v2 再做)
- 寄電子報內容(這只是收名單)
把這個 design.md 丟給 AI,跟它說「按這個設計實作」,產出品質會差到天上去。
多 Agent 工作流:分工才會強
單一 AI agent 寫整個專案會崩。實戰上要分工:
| 角色 | 工具 | 職責 |
|---|---|---|
| 規劃 Agent | Claude | 讀需求、寫 design.md、拆任務 |
| 執行 Agent | Codex / Claude Code | 按任務寫 code、跑測試 |
| 審查 Agent | Claude | code review、找 bug、安全檢查 |
| 你(人類) | 大腦 | 最終決策、產品方向、品質把關 |
典型一輪
- 你給規劃 Agent 一句話需求:「做訂閱電子報功能」
- 規劃 Agent 寫
design.md+ 任務清單 - 你檢查 design.md,調整
- 執行 Agent 按任務清單一個個做
- 每個任務做完,審查 Agent 看一遍
- 你做最後 PR review,merge
規劃 Agent 跟執行 Agent 用不同模型。Claude 規劃比較強(架構思考),Codex / Claude Code 執行快又便宜。模型市場每天變,重點是分工結構。
實戰示範:SnowRealm 的雙 Agent 流程
以下是我們在 SnowRealm 真實用的流程,2025 年起跑了一年多,蓋出 Insight、YukiBoard、毛行天下、GLACÉRA 等多個產品。
環境
- Claude Code CLI(規劃 + 執行主力)
- Codex CLI(執行副手,跑長任務)
- 每個專案 root 有:
CLAUDE.md、README.md、docs/目錄 - 每個 feature 開新 branch,新
docs/features/xxx-design.md
典型開發一個新功能
# 1. 開分支
git checkout -b feat/newsletter
# 2. 跟 Claude(規劃)對話
claude
> 我要做電子報訂閱功能。先讀 CLAUDE.md 跟 README.md,
> 然後幫我寫 docs/features/newsletter-design.md,
> 包含 schema、API、流程、邊界條件。
# Claude 寫好 design.md,你看過、修
# 3. Claude 拆任務
> 根據 design.md 列出實作 task list,
> 每個 task 一個檔案、一個 commit。
# 4. Codex(執行)開另一個視窗
codex
> 讀 docs/features/newsletter-design.md 跟 task list,
> 從 task 1 開始做。每個 task 做完跑 typecheck,
> 確認沒錯再做下一個。
# 5. 你定期回來看,調方向,merge
為什麼分兩個 Agent?
- 分工專注:規劃時不要寫 code,寫 code 時不要改架構
- 避免 context 爆掉:兩邊各自的 context window 短而精準
- 降低錯誤:執行 Agent 不會「自作主張改 schema」
- 方便審查:你可以隨時叫第三個 Agent 檢查另兩邊產出
把任務拆到 AI 寫得動
AI 一次能處理的範圍有限。學會拆任務是 Vibe Coding 的核心技能。
反例(會失敗)
「做一個訂閱電子報功能」— 這太大,AI 會寫一堆殘缺不全的東西。
正例(會成功)
## Task List
- [ ] T1. 建 newsletter_subscribers 資料表(migration)
- [ ] T2. 寫 lib/email/resend.ts(Resend client)
- [ ] T3. 寫 lib/email/templates/verify.tsx(React Email 模板)
- [ ] T4. 寫 POST /api/newsletter/subscribe(含 Zod 驗證)
- [ ] T5. 寫 GET /api/newsletter/verify
- [ ] T6. 寫 components/feature/newsletter/SubscribeModal.tsx
- [ ] T7. 在 footer 加按鈕觸發 modal
- [ ] T8. 寫測試(Vitest,每個 API 至少 3 個 case)
- [ ] T9. 更新 README.md 加 Resend env var 說明
每個 task 一個檔案、一件事、20–80 行 code。AI 做這種大小最穩。
客戶報需求 → 你先用 AI 拆出 design.md + task list → 估時報價 → 接案。整個流程比手動拆快 5 倍,估時還準(每 task 平均 20 分鐘)。
跟 AI 一起 Debug
Bug 出現時的對話模板:
我遇到一個 bug。
【現象】
使用者 submit form 後,顯示「成功」但資料庫沒紀錄。
【已知資訊】
- API 是 /api/newsletter/subscribe
- console 沒 error
- 資料庫 query 直接跑會成功
【我試過】
- 加 console.log,看到 req.body 是對的
- 看 supabase log,沒有任何 query 進來
【我猜】
是不是 supabase client 沒拿到正確 env var?
【請你做】
1. 讀 lib/supabase/client.ts
2. 讀 app/api/newsletter/subscribe/route.ts
3. 找出問題,給修正方案
4. 不要直接動 code,先告訴我原因
關鍵:給結構化資訊、要求結構化回答、先要求診斷再要求修。
不要直接「幫我修這個 bug」。AI 會猜,猜錯就改了不該改的地方。永遠先問為什麼。
Refactor 時的協作
程式碼變亂了想重構?AI 是最好的搭擋,但要分階段:
- Phase 1:診斷「讀 components/UserCard.tsx,告訴我它有什麼壞 smell」
- Phase 2:規劃「擬定一個重構計畫,不要動 public API,分 5 個 commit」
- Phase 3:執行「執行第 1 個 commit,做完跑 test 確認沒壞」
- Phase 4:驗證「對比重構前後,列出行為差異」
絕對不要
- 沒測試就重構(你會永遠不知道是不是壞了)
- 一次重構一大塊(diff 太大看不出問題)
- 讓 AI 改名字(變數、檔案)但沒看 reference
Context 管理:AI 的記憶有限
每個 LLM 有 context window 上限。聊太久 AI 會忘前面講過什麼,產出品質直線下降。
三招維持 context 品質
- 定期重啟:聊到 50 輪以上就開新對話,把關鍵結論摘要進 design.md
- 用文檔當 memory:重要決策寫成檔案,新對話開頭叫 AI 讀
- 分 session 任務:一個 session 做一件事,做完關掉
SnowRealm 實作
我們專案有 docs/decisions/ 目錄,每個重大決策一個 ADR(Architecture Decision Record):
# ADR-007 SnowRealmClaw 三層權限
## Status
Accepted (2025-04)
## Context
SnowRealmClaw 要同時服務 Luffysky 個人、自家產品、B2C 客戶。
## Decision
A+B+C 三層:
- A:個人(Max OAuth,僅 Luffysky)
- B:產品(API key,自家產品 backend)
- C:B2C(Z-coin + API)
## Consequences
- 每個 Skill 必須宣告 allowed_modes
- Day 1 就要有 auth-routing 層
- Max token 嚴禁服務外人
每次新對話讓 AI 讀 docs/decisions/,它就有所有歷史脈絡。
實戰:用這套做出第一個產品
步驟模板(複製來用):
- Day 1:寫 README.md(產品是什麼、誰用)
- Day 1:寫 CLAUDE.md(技術規範)
- Day 2:跟 Claude 一起寫 docs/architecture.md(整體架構)
- Day 3:列 MVP feature list,每個 feature 一個 design.md
- Day 4–N:每天做 1–2 個 feature,嚴格走 design.md → task list → 執行 → review
- 每週:回顧、更新 CLAUDE.md(把這週踩到的雷加進去)
這套不快,但穩。新手 1 個月能做出一個能上線的產品。
把所有專案的 CLAUDE.md 都共用 80% 規則,建一個 ~/dotfiles/CLAUDE-base.md,每個專案 symlink。一次調,所有專案都生效。
🔨 動手練習:用雙 Agent 做一個小產品
做一個「個人短網址服務」,網域用你 ch13 買的。
- 建 repo,寫 README.md + CLAUDE.md(規範你 Next.js + Supabase + Tailwind 的規矩)
- 跟 Claude 寫 docs/architecture.md(schema、API、頁面)
- 列 MVP task list(建議 8–12 個任務)
- 用另一個 AI session(或 Codex)執行 task list
- 每個 task 完成跑 type check + lint
- 部署到 Zeabur,綁網域
- 把整個過程寫成部落格,發在 ch15 學的 SEO 平台上
常見卡關 FAQ
Q1. 我用免費 ChatGPT 也能 Vibe Coding 嗎?
能起步但很卡。Claude Pro / Max 或 Cursor / Claude Code 有檔案讀寫能力才順。建議至少訂一個 $20/月的工具,省下的時間絕對划算。
Q2. CLAUDE.md 一定要叫這個名字嗎?
對 Claude Code 來說,是。它會自動讀 root 的 CLAUDE.md。其他工具(Cursor)有 .cursorrules。可以多份共存,內容大致一樣。
Q3. AI 寫的 code 我看不懂怎麼辦?
停下來,問 AI「逐行解釋這段,假設我是初學者」。不懂就絕對不能 merge。你的工作是審查者,看不懂的東西就是地雷。
Q4. 一個 feature 該分幾個 task?
原則:每個 task 5–30 分鐘做完、可獨立測試、一個 commit。一個中型 feature 通常 5–15 個 task。太少表示拆不夠細,太多表示沒把握重點。
Q5. 多 Agent 不會講話打架?
會。所以要用文檔當溝通介面,不是兩邊直接對話。規劃 Agent 寫 design.md → 你檢查 → 執行 Agent 讀 design.md。中間有人類 review,就不會偏太多。