AI 當工程師,我當主管
一個非工程師,如何把 Vibe Coding 變成可管理、可驗收的開發流程。
這場分享要講什麼
- 第一部 我的 AI Coding 三階段:每一階段都是被前一階段的失敗推出來的
- 第二部 我現在的開發流程
一個非工程師,如何把 Vibe Coding 變成可管理、可驗收的開發流程。
我看不懂大部分程式碼。這套流程不是讓我變強,是讓我像個主管:在看不懂細節的情況下,仍然能判斷「這件事做完了沒有」。
我的 AI Coding 三階段
Vibe Coding 的問題
Fitness Expedition 運動 RPG · Codex · Python × Streamlit × Google Sheet
點圖可放大
- 只提供幾個規則說明的 md 檔,前端、後端、資料庫全由 AI 決定,資料庫接 Google Sheet
- 全程用自然語言提需求,沒有任何開發架構與流程
- 結果:畫面粗糙、沒有響應式、功能不齊、錯誤修不完
五個失敗原因
排序有意義——最不重要的那個,正好是當時我以為最重要的那個
01沒有規格
02沒有明確驗收條件
03技術選型交給 AI
04AI 還不夠聰明
05門外漢
接觸 SDD:openspec
規格驅動開發 Spec-Driven Development
- 什麼是 SDD:先把「要做什麼」寫清楚再動手——蓋房子先畫藍圖,不是拿起鐵鎚就開始敲
- AI 為什麼特別需要:上下文長度有限、分段作業,規格就是路線圖
- openspec:給 AI 用的 SDD 標準作業程序,
npm install -g+openspec init
指令只有三個:
proposal 開案、apply 施工、archive 收帳;中間三步是 proposal 產出的文件/openspec:proposaldesign.mdspecs/tasks.md/openspec:apply/openspec:archive案例:JJoy 家庭娛樂記帳 APP
JJoy 家庭娛樂記帳 · openspec · Vue 3 × Supabase × Netlify
自家的娛樂費規則(月預算 + 有運動加 300 元)· 規則明確、規模小 · 不到一天做出來
文件兩份人機共管文件
execution-plan.md 計劃書 → 進度追蹤清單(誰負責、打勾)
ToDoList.md 途中的想法先寫下來,一段落再討論
協作先說明自己是新手
寫進 CLAUDE.md:技術決定要說明優缺點與取捨理由
dev_exp.md 記三種:學到的概念、可遷移的決定、踩過的坑
資料庫表格設計不符合使用需求、費用結餘的計算方式有誤。後來寫成紅線第二條:寫成測試腳本後,一定要由人驗算一次。
但還有一個問題沒解決:規格寫得再細,仍有一整類問題是文字描述不出來的。
學習 Agentic Engineering
Google 5-Day AI Agents 課程 課程連結(免費,有興趣可以自己上)
DAY 1關鍵不在模型,在 Context Engineering
Context 六類:指令、知識、記憶、範例、工具、護欄。
靜態(CLAUDE.md,每次互動都載入,消耗 token)與動態(Skill、RAG,需要時才載入)要分開管理。
DAY 2MCP 是 agent 的通用接口
選工具的原則是「夠用就好」——MCP 與 Skill 都不是安裝越多越好。
DAY 3Agent Skills:把經驗變成資產
context rot(上下文腐化):靜態背景放太多,會稀釋掉真正重要的訊號。
Skill 的命名與 description 欄位決定它會不會在對的時機被觸發。
DAY 4安全性與評估
沙盒、紅藍綠隊、Vibe Coding 特有的風險。核心提問:AI 做完了,但它做對了嗎?
DAY 5規格驅動的正式環境開發
程式碼變便宜之後,什麼變貴了?同一個 AI 要戴不同的帽子。以及先寫一個會失敗的測試。
三段光譜:差別不在有沒有用 AI
| 驗證方式 | 驗什麼 | 誰來驗 |
|---|---|---|
| 測試 Tests | 確定性的部分:給定輸入就有對應輸出 | 程式碼 |
| 評估 Evals | 不確定性的部分:步驟軌跡、工具選擇、回應品質 | 標記資料集、評分量表、LM 裁判 |
管理 context window + Matt Pocock 的 Skill
- 對話變長之後,模型在後段的判斷品質會下降 → 工作單位要切到「一個全新對話裝得下」
- 命名會影響流程:決策卡與任務卡混用,整套流程會跟著偏掉
我現在的 dev skill,骨架來自這幾個 skill(點開看說明)。順序不能顛倒:grill → to-spec → to-tickets
SKILLgrill
Matt Pocock 最有名的一支。不是我寫需求給 AI,是讓 AI 當審稿人,在寫任何程式碼之前把我問到說清楚。
它解決的是門外漢最大的問題:我不知道自己漏了什麼。產出是需求決策清單,答案會沉澱成這個專案的共同術語。
SKILLto-spec
把已經談清楚的對話整合成正式的產品需求文件(PRD)。它不負責重新訪談,所以順序很重要:先 grill,再 to-spec。
PRD 要有:背景與目標、使用者角色與核心流程、功能與非功能需求、不做什麼(Out of Scope)、驗收標準。我的 dev-spec 就是從這個 skill 改出來的。
SKILLto-tickets
把龐大的功能需求或規格,拆成範圍明確、具備依賴關係的小單元。避免一次丟給 AI 過大的任務,導致脈絡混亂或改壞既有程式,讓 AI 沿著確認過的規格逐步執行。
核心原則是垂直切片,不是水平切片:每張卡從資料表 → 後端邏輯 → 畫面 → 測試切穿一條窄路,做完就能親手操作看到結果,而不是先把整個資料層做完再往上疊。我的 dev-tickets 沿用這個原則。
SKILLwayfinder
它防的是一件事:在你還沒決定的事情上先動手。大需求一次丟給 AI,它會照自己的假設做下去,錯了就是大返工。
做法是先命名終點(終點決定每張卡長什麼樣),再把「已經預感到、但還講不清楚的決策」畫成迷霧,把現在就能處理的卡放上前線。原則是 Plan, don't do:先解決決策,不急著產出東西。
卡分四種:研究(查外部事實,AI 自己跑)、原型(做粗的換回饋)、拷問(跟我對話釐清)、雜務(現實的前置作業)。地圖只是索引,決定留在各自的卡裡。
SKILLprototype
用在設計還不確定的時候。撰寫程式碼的成本已大幅下降,「該長什麼樣、操作順不順」用文字討論半天,不如直接做出來。
做一個可拋棄的版本,驗證完就淘汰——它的產出是判斷,不是程式碼。
我現在的開發流程
Dev Skill 全景
把踩過的坑固化成標準作業程序
dev-kickoff功能起點:方向定了嗎?
dev-wayfindergrilldev-speccodex-peer-reviewdev-ticketsdev-verify-carddev-verify-specdev-closeoutgit-commit(版控)/dev-test-plan(寫測試)/dev-debug(診斷錯誤)/dev-ci-setup(自動檢查)- 每個階段都有核准關卡——AI 不能自己往下一關走
- 工作單位是「一個全新對話裝得下」——避免中途遺失前面的決定
- 做成 Skill 而不是寫在提示詞裡:屬於動態 context,需要時才載入
為什麼從 openspec 換成自己這套
- openspec 的文件層數太多,小案子光是文件作業就佔掉半天
- 現在收成兩層:
SPEC.md一本總帳 +changes/{功能}/delta.md差異規格 - 入口也簡化:小軟體直接 grill 後開工;大軟體先用 wayfinder 釐清架構
wayfinder 與 grill
動工之前,先把方向定下來,再把需求問清楚
wayfinder:想法太大、方向未定的時候
方向已經清楚、只差寫規格,就直接走 dev-spec。開一張沒必要的地圖只是增加流程成本
已定案
每條只記一行摘要與連結前線 FRONTIER
沒被擋住的卡,現在可以認領迷霧區 FOG
還講不清楚的,先不要切成卡一個對話只結一張卡。這張卡缺的是什麼?
RESEARCH
缺事實 → 派 subagent 去查PROTOTYPE
缺高保真回饋 → 做一個預計丟棄的版本GRILL
缺人的取捨(預設型別)→ 跟我談TASK
缺一個不做就無法決定的動作dev-spec。只決策,不施工 | 一個對話只結一張卡 | AI 不得代替我回答它自己提的問題
霧散了、方向定了,接下來才是把細節問到可以驗收的精確度。
grill:拷問模式
不是我寫需求給 AI,是 AI 反過來把我問到說清楚——因為我不知道自己漏了什麼
| 六條訪談紀律 | 為什麼 |
|---|---|
| 一次只問一題 | 一次給五題,我只會挑最容易回答的那題 |
| 附上建議答案 | 開放式問題我答不出來,選項我判斷得了 |
| 查得到的事實自己查 | 只問需要我決定的事 |
| 順著依賴走 | 先問會影響後續答案的上游決策 |
| 挑戰模糊語言 | 「使用者」指誰?「完成」的判準是什麼? |
| 用具體情境施壓 | 「月底 31 號跨月呢?」在例子上做決定,不在抽象原則上表態 |
結束方式:輸出共識清單(問題 → 決定 → 理由一句),我確認後才動工。小軟體到這裡就能開工。
dev-kickoff
開案時一次把制度裝好
dev-kickoff:八個步驟
新專案走完整流程;既有專案補掛制度也走同一個 skill,只補缺的部分
docs/specs/changes/ 與 done/。SPEC.md 本體不在這裡建,由第一次 dev-spec 從討論中生成.env 有金鑰、node_modules/ 與 dist/ 可以重建專案計劃.md 與 專案進度追蹤.mdgit-commit skill,不直接下 git 指令先盤點再動手:列出「已有什麼、缺什麼」給我看過,同意後只補缺的。不覆蓋既有檔案:已有 CLAUDE.md 或 .gitignore 就改用差異合併,逐條加入。不動既有程式碼:這個 skill 只裝制度,不重構也不改功能。
專案 CLAUDE.md 的六條紅線
違反任一條就停下來,先取得我的同意
01先討論再動手
02業務邏輯要使用者驗算
03危險操作用白話確認
04資料庫預設 RLS
05git 一律走 git-commit skill
06套件安裝先查證
dev-spec 與交叉審查
規格只寫行為,而且要先被另一個 AI 審過一輪
首次SPEC.md v1
DELTAchanges/{功能}/delta.md
輕量小改動直接做
規格紀律:只寫行為,不寫實作。實作決策記在 delta 的 Implementation Decisions,那一節永遠不會併進 SPEC.md。
codex-peer-review:為什麼要找第二個 AI
- 規格自審,審不出源自自己假設的缺口
- 規格的缺口會一字不漏變成程式碼的錯誤;在文字這層修正只花幾行字
- Stop hook 硬性把關:規格檔沒蓋審查 marker 就不准收工——靠制度,不靠自律
sed 確認它指的行號屬實、用 grep 數出 81 處樣式混用。驗完才接受這 10 條,其中 2 條採用不同解法。| Codex 抓到的關鍵問題 | 為什麼嚴重 | 怎麼改 |
|---|---|---|
| 健康檢查不會重啟 | 卡住的容器只會被標成 unhealthy 然後繼續掛著,User Story 4 完全落空 | 改成容器內監督程序 |
| 首次設定是一條無密碼登入捷徑 | 任何人都能替沒密碼的人設定密碼,並立刻用他的身分進入 | 加上「開放設定密碼」30 分鐘窗口 |
| 鎖定機制可被用來癱瘓全站 | 登入頁公開全部人名,連續輸錯就能把同事鎖在門外 | 鎖定改綁「人員 + 來源電腦」 |
| 漏了 SPEC 四行沒處理 | 合併後總帳會同時存在兩套相反的行為 | 逐條補進修改段 |
dev-tickets:拆成垂直切片
- 垂直切片:每張卡切穿資料 → 邏輯 → 介面 → 測試的一條窄路,不是先做完整個資料層
- 一個功能通常 2~8 張卡;超過 8 張表示規格太大,該回頭分期
- 拆完就停,不在同一個對話開始實作
它用我的操作語言寫,不是用程式語言寫,而且連「這張卡還不會做到什麼」都寫明——此時系統還沒上鎖,那是 02 卡的範圍。
dev-verify-card:人工驗收
每做完一張卡就當場驗,不累積到最後
- 驗收清單不寫成 md,產成 HTML:
docs/verify/index.html+data.js+results/ - 雙擊就能開、不用起伺服器、填寫自動存在瀏覽器、可分次完成、最後匯出 JSON
- 整個資料夾進版本控制,這是專案的驗收歷史帳
四個篩選鈕:全部/只看未測/只看高風險、人工必測/只看不通過。逐卡驗收階段,結案鈕是鎖住的,跑完 dev-verify-spec 才解鎖。
使用者的時間是整套流程裡最貴的資源。別項的前提不要再獨立列一項;一張卡超過 5~6 條,通常是拆太細了。
| 欄位 | 規則 |
|---|---|
| coverage.auto | 確實有自動化測試涵蓋,附上測試檔路徑與測試名稱 |
| coverage.agent | AI 實際執行過,附上跑了什麼指令、看到什麼輸出 |
| risk | 高/中/低,加一句具體理由 |
| manualOnly | 畫面觀感、金額驗算、外部系統串接、需要真實時間流逝 → 永遠排最前面 |
| crossEnv | 只給行為確實會因環境而異的項目開啟 |
找不到證據就填 false,不推測「應該有測過」——這一欄的用途是決定我把時間花在哪。
人工必測|風險高|自動化測試 ✗|AI 驗過 ✗|跨環境
純看版面(這一項 AI 完全驗不了)。 ① 登入頁與「請設定你的密碼」頁: 欄位寬度、按鈕位置、字級看起來合不合理?把視窗拉窄會不會爆版? ② 人員主檔的操作欄現在一列有四顆按鈕+一行狀態文字, 會不會太擠、擠到看不懂哪顆是哪顆? 覺得哪裡不對就寫在備註裡,這種事只有你看得出來。
不通過:三選一
- 當場修:改動小、在這張卡的範圍內
- 開新卡:牽涉範圍超出這張卡
- 延後:對應的規格條文不得合併進 SPEC.md
某次驗收時抓到——一個按鈕要把頁面上下捲動才能重複點選。這種操作上的問題,AI 自己測不出來。
全部卡做完 → dev-verify-spec
- 三問檢查:漏做/多做(範圍擴張)/做錯
- 跨卡整合驗收:單卡都通過,不代表串起來會正確——這是逐卡驗收唯一的結構性缺口
- delta 合併回 SPEC.md(由我看 diff 核准)→ change 資料夾搬到
done/封存
git-commit
git 是唯一的還原機制,但指令沒人教
顯示目前變更 → 安全掃描 → 規劃 commit 計畫(判斷要不要拆)→ 逐筆 commit → 確認後才 push
掃描逐項說明判定依據
.env.example只新增說明與佔位字串,沒有真實金鑰- docker-compose 用的是變數引用,不含實際值
- 新檔案掃過,沒有寫死的密碼或 token
- 真正的
.env沒有進變更清單,已被.gitignore擋住
攔截什麼情況會被強制擋下
檔名:.env*、*.pem、*.key、id_rsa
內容:password=、api_key=、secret=、token=
被攔下時會說明「這會造成什麼、建議怎麼處理」。
37 個修改檔 + 8 個新增檔,建議分成 3 筆。拆分邏輯是按性質分,不是按時間分。
commit 訊息照 Conventional Commits 寫:這是業界通用的規範,格式是 type: 說明文字。好處是讀歷史紀錄時,光看前綴就知道這筆在做什麼,工具也能據此自動產生版本紀錄。
| type | 用途 | 範例 |
|---|---|---|
| feat | 新功能 | feat: 新增使用者登入頁面 |
| fix | 修正錯誤 | fix: 修正送出表單後畫面空白的問題 |
| docs | 文件變更 | docs: 更新 README 安裝說明 |
| refactor | 重構 | refactor: 拆分登入邏輯為獨立模組 |
| chore | 雜項設定、依賴 | chore: 新增 .gitignore |
| test | 測試 | test: 補充登入流程的單元測試 |
繁體中文、動詞加受詞、30 字以內,說「做了什麼」而不是「為什麼」。
dev-closeout
上線前的六項收尾檢查
| 檢查項 | 做什麼 |
|---|---|
| 一、程式碼清理 | 框架模板殘留檔(列清單,經同意才刪)、<title> 不是「Vite App」、package.json 的 name、favicon |
| 二、文件 | README 至少要有「專案是什麼、怎麼安裝執行、環境變數清單(只列名稱不列值)」;進度追蹤的「延後/技術債」逐項確認是接受還是要處理 |
| 三、規格收帳 | changes/ 應該是空的;抽 2~3 條核心行為規則對照程式碼;SPEC.md 版本紀錄每個 change 都有一行 |
| 四、安全檢查 | RLS 是否啟用、前端不得有 service key、git ls-files 確認 .env 不在追蹤中、npm audit 結果用白話回報 |
| 五、git 收尾 | git status 乾淨、push 後確認部署平台自動重新部署成功 |
| 六、交還使用者 | 用正式網址親手跑一次完整流程:登入、操作核心功能、確認資料正確 |
還有 change 沒收完怎麼辦:卡做完了就引導跑 dev-verify-spec 驗收合併;卡沒做完,就問我要完成還是放棄。放棄的 change 搬到 done/ 並註明「未實作即關閉」,它的條文不得出現在 SPEC.md。
結尾
那我什麼時候該用 vibe coding?
不是二選一,是同一條光譜上的刻度。決定落在哪一端的,是「產出需要被驗證到什麼程度」。
兩個問題就能決定
- 這東西出錯,誰會受影響?
- 這東西會存在多久?
| Vibe Coding 那端 | Agentic Engineering 那端 | |
|---|---|---|
| 例子 | 一次性腳本、資料清洗、個人小工具、探索性原型 | 同事或客戶每天在用的系統,牽涉金額、日期、權限 |
| 出錯代價 | 丟掉重做,成本接近零 | 要有人收拾,而且常常是上線之後才發現 |
| 需求哪裡來 | 做了才知道自己要什麼 | 動手前先問到可驗收的精確度:方向未定走 wayfinder,方向清楚走 grill |
| 給 AI 的東西 | 幾句話 | 一整套 harness(見下) |
| 工作單位 | 一個對話從頭做到尾 | 一張任務卡一個對話,每張卡切穿資料表 → 邏輯 → 畫面 → 測試 |
| 誰說做完了 | 我自己看一眼,覺得可以就可以 | 規格說要做什麼,測試與人工驗收說做到了沒有;AI 不得自行宣告 |
| 出錯之後 | 重講一次,再生一版 | git 還原 → 先寫會失敗的回歸測試 → 修 → 規格補一條 |
| 換人接手 | 只有我知道當初為什麼這樣做 | 規格是團隊的共同語言:任務卡可以分給不同人平行做,驗收紀錄與 commit 留下誰在什麼時候確認了什麼 |
右邊那欄的「harness」是什麼
不是提示詞寫得更長,是把「這件事怎麼被做完」整個架起來。對照 Day 1 的 context 分類:靜態的每次都載入,動態的需要時才載入
指令與護欄(靜態)
專案 CLAUDE.md 的六條紅線,每次互動都在,違反就停下來等我同意流程(動態)
dev skill 這一整套,該用到才載入,避免 context 被稀釋記憶
SPEC.md 總帳與任務卡,是跨對話的共同記憶,不靠我每次重講證據
驗收 Hub 的打勾紀錄、測試結果、commit 歷史,用來回答「做完了沒有」我是一個人在跑這套,所以每一關的核准人都是我。放到企業團隊裡,這些東西的名字其實你都認得:規格是需求規格書、任務卡是工單分派、紅線是作業規範、驗收紀錄是稽核軌跡。差別只在於,這次接單的是 AI。
人一多,harness 反而更不能省:多個人同時叫 AI 改同一套系統,沒有共同的規格與驗收紀錄,衝突會在上線那天才爆出來。
第一題:出錯了誰會受影響?
第二題:這東西會存在多久?
大部分案子是先 vibe 再收斂。關鍵是事先說好這個版本要被丟掉——原型直接沿用成正式版,是最常見的失敗方式。
- 小工具走完整流程 → 流程本身的成本超過它防的風險(所以要有輕量通道,所以方向清楚就不開地圖)
- 正式系統直接 vibe 上線 → 就是第一部那個坑。Vibe Coding 不等於 Vibe 上線
三個階段
這套流程真正在管的,不是 AI 夠不夠聰明,而是「做完了」由誰認定。
延伸閱讀
我的文章
- 打造家庭娛樂記帳 APP — Vibe Coding 從零到上線的實踐心得
- Day 1 為什麼你的 AI 比較聰明?關鍵不在模型
- Day 2 幫你的 AI Agent 裝上萬用插頭
- Day 3 Prompt 的下一步:把經驗變成 Skill
- Day 4 Vibe Coding 的陰影:當 AI 開始自己寫程式
- Day 5 Vibe Coding 不等於 Vibe 上線:AI 寫程式,要先寫規格
- Fable 5!來完善我的開發流程吧!
其他來源
- Wayfinder 真正管理的是「現在還不能決定的事」(阿星導讀)
- 別再把時間耗在規格書上,先做一個能丟掉的版本(阿星導讀)
- OpenSpec 讓 SDD 變簡單的三個指令(高見龍)