標籤: AI 輔助開發

  • Agent Team 穩定的關鍵:spawn 之前先建好兩份文件

    重點摘要

    • Agent Team 不穩定的根本原因:agent 靠對話記憶工作,不靠文件
    • 解法:spawn agents 之前,必須先建好 CLAUDE.md 和 AGENTS.md
    • CLAUDE.md 寫專案現況,AGENTS.md 寫團隊規則,缺一不可
    • Agent 之間的工作交接必須透過實體檔案,不能靠口頭傳遞

    同樣是用 Claude Code 跑 Agent Team,有人的 team 順暢完成、互動極少,有人的 team 一直卡住、不斷要人介入。

    差距不在任務複雜度,不在模型,在一件事:有沒有在 spawn agents 之前先建好文件。

    為什麼 Agent Team 會卡住

    要理解這個問題,先理解 agent 的本質。

    當你 spawn 一個 agent,它只知道你在那一刻的 prompt 裡說了什麼。你的對話歷史、你之前說的規則、其他 agent 做了什麼——它全都不知道。

    這代表什麼?

    如果你沒有把規則寫進文件,你(orchestrator)就是整個 team 唯一的記憶體。你要記住所有規則,要在每個 spawn prompt 裡正確地說一遍,要把 agent A 的結果正確地轉述給 agent B。

    這就是卡住的來源:

    • Prompt 寫漏一條規則 → agent 做出不符合期望的結果
    • Agent A 的結果透過我轉述給 Agent B → 轉述過程中遺漏細節
    • 對話太長,舊的 context 被壓縮 → 規則消失
    • 某個 agent 失敗重啟 → 什麼都不記得,要重頭說
    • 多個 agent 平行跑 → 每個人收到的規則說法略有不同

    每一個都是可能的失敗點。越複雜的 team,失敗的機率越高。

    讓 Team 穩定的解法:兩份文件

    穩定的 Agent Team 做一件事:把所有 agent 需要知道的東西,從對話記憶移到磁碟上的文件。

    文件是客觀存在的。所有 agent 讀同一份,規則永遠一致。Agent 失敗重啟,讀一遍文件就恢復。多個 agent 平行跑,各自讀文件,不需要我轉述。

    需要兩份文件,職責不同:

    文件 寫什麼 類比
    CLAUDE.md專案現況:ID、路徑、已完成的項目、已知問題、版本新人入職的專案交接文件
    AGENTS.md團隊規則:誰做什麼、如何交接、鐵律、失敗怎麼處理公司的工作手冊

    CLAUDE.md 要寫什麼

    寫所有「agent 每次都要重新查,但其實不需要查」的東西:

    # 專案名稱
    
    ## 關鍵 ID 和路徑
    - WordPress 分類 ID:失智照顧=76、家屬心聲=78
    - 已發布文章:[Post ID 清單]
    - 輸出目錄:./content/drafts/
    
    ## 技術環境
    - 使用版本:XXX
    - API endpoint:[測試] / [正式]
    
    ## 已知的坑
    - 台灣失智症協會網站用 http:// 不支援 https
    - 這個 API 的日期格式是 YYYYMMDD 不是 ISO 8601
    
    ## 已完成 / 待處理
    - ✅ 已完成:XXX
    - ⚠️ 待處理:YYY

    沒有 CLAUDE.md,agent 每次都要重新查分類 ID、確認文章有沒有發過、試連結通不通。每一步都是潛在的失敗點。

    AGENTS.md 要寫什麼

    AGENTS.md 有四個必要部分:

    1. 鐵律(所有 agent 不可違反)

    ## 鐵律
    - 所有醫療資訊必須附上可驗證的來源 URL
    - 不能修改 iDempiere core 代碼,只能在 plugin 層擴充
    - 沒有測試的代碼不算完成

    2. 每個 agent 的定義

    ### researcher(研究員)
    職責:搜尋資料,每筆資訊必須記錄來源 URL
    工具:WebSearch, WebFetch, Read
    輸出格式:[明確定義]

    3. 交接協議(最關鍵、最常被忽略)

    ## 交接協議
    researcher 完成 → 存到 ./drafts/research-[topic]-[YYYYMMDD].md
    writer 開始前  → 必須讀取上面那個檔案
    writer 完成   → 存到 ./drafts/article-[topic]-[YYYYMMDD].md
    publisher 開始前 → 讀取 article 檔案,驗證 References 後才發布

    4. 失敗處理規則

    ## 失敗處理
    - 找不到可信來源:停止,回報「無法找到符合鐵律的來源」,等待指示
    - 需求不清楚:列出疑問,等確認後再開始,不要自行假設
    - 任何 agent:遇到不確定的事,停下來問,不要猜

    具體案例:iDempiere 台灣統一發票 Plugin

    用一個真實場景說明這套做法。假設要用 Agent Team 開發一個 iDempiere 的台灣統一發票 plugin,team 成員是 PM、RD、架構師。

    CLAUDE.md(專案現況)

    # iDempiere 統一發票 Plugin
    
    ## 技術環境
    - iDempiere 版本:11.0,Java 17
    - Plugin 目錄:/path/to/plugin
    - 財政部電子發票規格書版本:5.0(2025年)
    
    ## 已知 iDempiere 約束
    - Callout 用 @Callout annotation(見 idempiere-callout-generator skill)
    - 不能用 Spring,只能用 OSGi service
    - DB 操作只能透過 PO 或 DB class,不能直接 JDBC
    
    ## 已完成的模組
    - ✅ 發票開立
    - ⚠️ 作廢(待測試)
    - ❌ 查詢(未開始)

    AGENTS.md 的交接協議

    ## 新功能開發流程
    
    pm 寫需求 → 存到 ./specs/req-[feature].md
        ↓
    architect 設計 → 讀 req 檔案 → 存到 ./specs/arch-[feature].md
        ↓
    rd 實作 → 讀 req + arch 檔案 → 代碼 + ./specs/impl-[feature].md
        ↓
    architect review → 讀 impl 摘要 → 存到 ./reviews/review-[feature].md

    每個 agent 知道自己要讀什麼、存到哪裡。PM 和 RD 不需要「對話」,他們透過檔案交接。Architect 不需要等 PM 說完才知道需求,直接讀需求檔案。

    每次 spawn agent 的啟動句

    請先閱讀 CLAUDE.md 和 AGENTS.md,
    確認你的角色、鐵律和交接路徑後再開始工作。

    這一句話讓 agent 在開始工作前自己去讀規則,不需要我每次重複說一遍。

    不穩定 vs 穩定:對照表

    沒有文件(常見做法) 有文件(穩定做法)
    規則從哪來我的 prompt(每次可能不同)AGENTS.md(永遠一致)
    專案狀態我的記憶(可能過時或漏掉)CLAUDE.md(客觀存在)
    Agent 間交接我轉述(容易漏細節)實體檔案(完整保留)
    Agent 失敗重啟什麼都不記得讀文件即恢復
    平行跑多個 agent規則可能不一致讀同一份文件,完全一致
    需要人工介入頻繁只在真正需要決策時

    標準流程:每次建立 Agent Team 前

    1. 建立 CLAUDE.md:寫入專案現況(ID、路徑、已知問題、版本、已完成項目)
    2. 建立 AGENTS.md:寫入鐵律、每個 agent 的定義、交接協議、失敗處理規則
    3. Spawn agent 時第一句:「請先閱讀 CLAUDE.md 和 AGENTS.md,確認規則後再開始」
    4. 交接一律用實體檔案:agent 完成後存到指定路徑,下一個 agent 從那裡讀

    沒有做完這四步就開始 spawn,你就是在用對話記憶撐整個 team。任務越複雜,遲早會卡住。

    常見問題

    Q:簡單的任務也需要這兩份文件嗎?

    一個 agent 做一件事,不需要。兩個以上的 agent 有交接,就需要。判斷標準很簡單:如果你需要「把 A 做完的東西交給 B」,就要用文件定義這個交接。

    Q:CLAUDE.md 和 AGENTS.md 要多詳細?

    CLAUDE.md:詳細到「新加入的 agent 不需要問任何問題就能知道專案現況」。AGENTS.md:詳細到「每個 agent 知道自己的輸出要存到哪個路徑」。最常被忽略的就是交接路徑,這是 team 失敗最常見的原因。

    Q:文件要每次重寫嗎?

    AGENTS.md 的團隊結構通常固定,一次寫好後很少改。CLAUDE.md 的專案狀態會變,每次任務完成後更新「已完成項目」。把更新 CLAUDE.md 當作任務完成的一部分,下次 team 啟動時文件就是最新的。

  • 舊系統整合場景下,會用 vs 不會用 Claude Code 的差距

    重點摘要

    • 舊系統整合最大的陷阱:Claude 看不到舊系統,但舊系統的約束決定了新功能能不能用
    • 不會用的人:讓 Claude 在沒有舊系統上下文的情況下做新功能,結果接不上去
    • 會用的人:先讓 Claude 讀關鍵接口,CLAUDE.md 記錄現有約束,設計文件定義接合點
    • 三個場景示範:醫療 HIS 接 LINE 掛號、舊報表接新數據、舊 ERP 接電商平台

    上一篇文章講的是新功能開發。但現實是,大多數人面對的不是一張白紙,而是一個已經在跑的舊系統。

    舊系統整合比全新開發難十倍,不是因為技術更難,而是因為有一大堆隱性約束 Claude 不知道。格式、命名、邊界、不能動的地方,這些都在舊代碼裡,Claude 看不到就無從遵守。

    這篇用三個場景直接模擬:有舊系統在的情況下,會用和不會用 Claude Code 的差距。

    根本差距:Claude 的上下文只有你給它的部分

    Claude Code 非常聰明,但它只知道你告訴它的東西。在全新專案,你說什麼格式就用什麼格式,問題不大。在整合舊系統時,如果你沒有把舊系統的關鍵結構告訴它,它會做出一個邏輯正確但無法接上的東西。

    這不是 Claude 的問題,是你的輸入不完整。

    舊系統整合的核心挑戰是:讓 Claude 在動手之前,先理解它不能動的邊界在哪裡。

    場景一:醫院 HIS 系統加掛 LINE 預約掛號

    情境

    一家地區醫院用了十年的 HIS 系統(Windows Server + MSSQL),所有掛號邏輯都在 stored procedures 裡。現在要加 LINE Chatbot 讓患者能線上預約,但 HIS 系統不能動,只能從外部透過 API 呼叫它。

    不會用的人怎麼做

    幫我寫一個 LINE Chatbot 預約掛號系統,要能讓患者選科別、選醫師、選時段。

    Claude 做出一個完整的 LINE bot,資料庫設計清楚,對話流程順暢。

    開始對接 HIS 系統時,問題一個接一個:

    • HIS 的患者 ID 是 8 位數字,Claude 設計的是 UUID — 整個 primary key 要換
    • HIS 的診次代碼格式是 YYYYMMDD-科別碼-序號(例如 20260325-INT-001),Claude 自己設計了完全不同的格式
    • HIS 只接受 stored procedure 呼叫,不開放直接讀表,Claude 設計的是直接 SELECT
    • 科別代碼是 HIS 裡的維護資料(內科=INT、外科=SUR),Claude 用了自己的命名

    每一個問題單獨看都能修,但修完之後發現下一個格式又不對。最後花了兩天在做格式轉換,而不是做功能。

    結果:開發 3 天,對接 2 天,還有格式轉換層要長期維護。

    會用的人怎麼做

    第一步:先讓 Claude 讀懂舊系統的接口

    把 HIS 系統對外開放的 SP 簽名整理成文件,餵給 Claude:

    請先閱讀以下 HIS 系統的接口文件,
    告訴我你對這個系統的理解,特別是資料格式和呼叫限制,
    再討論 LINE bot 的架構設計。
    
    --- HIS 接口文件 ---
    sp_GetAvailableSessions
      @DeptCode NCHAR(3)      -- 科別碼,參照 tb_Dept.DeptCode
      @DateFrom NCHAR(8)      -- YYYYMMDD 格式
      @DateTo   NCHAR(8)
      回傳: SessionId NCHAR(16), DoctorName, SessionDate, RemainSlots
    
    sp_CreateBooking
      @PatientId NCHAR(8)     -- 8位數字,不足補0
      @SessionId NCHAR(16)    -- 從 sp_GetAvailableSessions 取得
      @Phone     NVARCHAR(20)
      回傳: BookingNo NCHAR(12), Status (SUCCESS/FULL/DUPLICATE)
    
    sp_CancelBooking
      @BookingNo NCHAR(12)
      @Reason    NVARCHAR(100)
    ---

    第二步:CLAUDE.md 記錄現有系統的約束

    ## 整合約束(HIS 系統,不可更動)
    - PatientId:8 位數字字串,不足補 0(例如 "00012345")
    - SessionId:格式為 YYYYMMDD-DeptCode-NNN(例如 "20260325-INT-001")
    - 所有 HIS 呼叫只能透過 stored procedure,不允許直接查表
    - 科別代碼參照 tb_Dept,常用:INT=內科、SUR=外科、PED=小兒科
    
    ## 新系統原則
    - LINE bot 層只做對話邏輯
    - HIS 接口層做格式轉換(HisAdapter class)
    - 不在 LINE bot 層直接呼叫 HIS

    第三步:設計文件定義接合點,不是重新設計格式

    # 功能:LINE 掛號 → HIS 預約對接
    
    ## 接合點(Integration Points)
    LINE 用戶選擇診次 → HisAdapter.getAvailableSessions(deptCode, dateRange)
      → 呼叫 sp_GetAvailableSessions
      → 回傳格式轉為 LINE flex message 可用的結構
    
    用戶確認掛號 → HisAdapter.createBooking(lineUserId, sessionId, phone)
      → 查詢或建立患者檔(PatientId)
      → 呼叫 sp_CreateBooking
      → 處理 FULL / DUPLICATE 回傳狀態
    
    ## 不碰的東西
    - HIS 資料庫 schema 完全不動
    - 所有 PatientId 維持 8 位補零格式
    - SessionId 格式完全繼承 HIS
    
    ## Done When
    - HisAdapter 有完整的 unit test(mock SP 回傳)
    - LINE bot 不包含任何 HIS 格式邏輯(全在 Adapter)

    結果:1.5 天完成,無格式轉換層,後續維護只在 HisAdapter 這一層。

    場景二:舊版股市報表腳本接新即時數據

    情境

    一個量化分析師用了三年的 Python 腳本,每天手動下載 CSV,跑一堆計算,輸出報表。現在要改成自動化:自動爬取數據、自動計算、推播到 Line Notify。但舊腳本的計算邏輯非常複雜(含自訂指標、過去三年調整過的參數),不能改,只能把數據來源換掉。

    不會用的人怎麼做

    幫我把這個股市分析腳本改成自動化,自動抓數據然後推 LINE 通知。

    Claude 看了舊腳本,做了一個新的自動化版本。看起來很整齊,比舊腳本乾淨很多。

    跑了一週,發現結果跟舊版不一樣:

    • 舊腳本的 RSI 計算用的是 Wilder 平滑法,Claude 預設用了 SMA 版本,數值不同
    • 舊腳本對成交量有一個「過去 20 日剔除最高最低各兩天後的平均」的自訂邏輯,新版沒有
    • 舊腳本在除權息日前後有特別處理,新版沒有
    • 欄位名稱被 Claude 重新命名了(舊版 vol_adj 在新版變成 adjusted_volume),下游所有 Excel 公式全壞

    分析師說:「它幫我重寫了,但重寫出來的東西跟我的不一樣,我現在不知道以哪個為準。」

    結果:新舊結果不一致,花了一週在驗算差異,反而比手動下載多花時間。

    會用的人怎麼做

    關鍵原則:計算邏輯一行都不能動,只換數據來源。

    第一步:讓 Claude 讀懂舊腳本,先提取它的業務邏輯

    請閱讀這個舊腳本,告訴我:
    1. 它依賴哪些輸入欄位(欄位名稱和格式)
    2. 有哪些自訂計算邏輯(非標準指標)
    3. 最後輸出哪些欄位
    
    不要修改任何東西,只告訴我你的理解。

    這一步讓 Claude 自己找出所有隱性依賴,避免後面遺漏。

    第二步:CLAUDE.md 把舊腳本的約束凍結

    ## 舊系統相容性約束(不可更動)
    - 所有輸出欄位名稱必須與 legacy_report.py 完全一致
      (vol_adj、rsi_wilder、price_adj 等,不得重新命名)
    - RSI 計算必須使用 Wilder 平滑法(非 SMA),與舊版等價
    - 成交量平均:去掉最高最低各 2 天後的 16 日均量
    - 除權息調整邏輯:參見 legacy_report.py 第 87-134 行,禁止修改
    
    ## 本次修改範圍
    - 只修改數據來源層(DataFetcher class)
    - 所有計算邏輯保持不變
    - 輸出格式和欄位名稱保持不變

    第三步:設計文件只描述「換什麼」,明確說「不換什麼」

    # 功能:數據來源自動化
    
    ## 要換的
    舊:手動下載 CSV 放在 ./data/ 目錄
    新:DataFetcher 自動從 TWSE API 抓取,存成相同格式的 DataFrame
    
    ## 不換的
    - 所有 calculate_*() 函數:一行都不動
    - 所有欄位名稱
    - 輸出的 Excel 格式和公式
    
    ## 驗證方式
    用同一天的歷史數據,新舊兩版並排執行,
    所有欄位數值差異必須在浮點誤差範圍內(< 0.0001)

    「驗證方式」這一段給了 Claude 一個清楚的完成定義:不是「看起來跑得動」,而是「跟舊版數字一樣」。

    結果:1 天完成,新舊並排驗算通過,分析師信心十足上線。

    場景三:舊訂單系統接新電商平台(Shopee / momo)

    情境

    一家中型品牌商有自己的後台訂單系統(自建,PHP + MySQL,跑了七年),現在要同時開 Shopee 和 momo 的店,訂單要自動回拋到自建系統,庫存要即時同步。自建系統的代碼文件不齊全,但不能大改,只能在外面包一層。

    不會用的人怎麼做

    幫我串接 Shopee 和 momo 的訂單,自動同步到我們自己的系統。

    Claude 寫了一個整合服務,讀 Shopee/momo 的 webhook,轉換格式,打進自建系統的 API。

    測試時發現:

    • 自建系統的商品 SKU 格式是 PRD-XXXXXXXX,但 Shopee 上的 SKU 是當初手動輸入的,有些根本對不上
    • 自建系統的訂單狀態只有 5 種,Shopee 有 12 種,Claude 的對照表做了一半,有幾個狀態沒處理
    • momo 的訂單金額包含平台折扣,自建系統的商品價格是定價,兩邊金額對不上帳
    • 自建系統在創建訂單時會觸發一個庫存扣減的觸發器,Claude 不知道這件事,導致庫存被扣兩次

    最後一個問題最嚴重:庫存被扣兩次,一直到實際出貨才發現。

    結果:開發 4 天,測試又 3 天,上線後還是出現庫存問題。

    會用的人怎麼做

    舊系統不熟,先讓 Claude 幫你挖清楚它的邊界。

    第一步:讓 Claude 讀舊系統,主動找隱性行為

    請閱讀這個訂單系統的代碼,特別注意:
    1. 創建訂單時會觸發哪些副作用(觸發器、事件、其他表的更新)
    2. 庫存扣減在哪裡發生(是 API 層還是資料庫層)
    3. 訂單狀態的完整清單和流轉規則
    
    告訴我所有你發現的隱性行為,不要開始寫任何代碼。

    「隱性行為」這個說法很重要。Claude 在讀舊代碼時會主動找資料庫 trigger、事件監聽器、side effect,這些是最容易被遺漏的整合風險。

    第二步:用 Plan Mode 規劃整合架構,重點在「邊界」

    【背景】
    自建訂單系統(PHP + MySQL),創建訂單時資料庫層會自動扣減庫存(trigger)。
    Shopee 和 momo 各有自己的訂單狀態體系。
    
    【目標】
    Shopee/momo 新訂單自動進到自建系統,庫存只扣一次,狀態對照完整。
    
    【約束條件】
    - 自建系統的 trigger 不能改(沒有完整文件,風險太高)
    - SKU 對照表需要人工確認後再上線(不能用 Claude 猜測)
    - momo 的折扣金額要分開記錄,不能直接入自建系統的商品價
    
    請制定整合架構計劃,
    特別說明如何避免庫存被扣兩次,
    等我確認計劃後再開始實作。

    Plan Mode 裡,Claude 提出了三個方案,推薦的是:新建一個 OrderBridge 服務,只負責格式轉換和狀態對照,在呼叫自建系統 API 之前先把庫存檢查做在 Bridge 層(避免 API 呼叫失敗後 trigger 已執行的問題)。

    第三步:設計文件把 SKU 對照、狀態對照、金額拆分全部定義清楚

    ## SKU 對照策略
    - 對照表存在 sku_mapping 資料表,人工審核後才生效
    - 找不到對照的 SKU:訂單進 pending_review 佇列,不自動處理
    - 禁止猜測或模糊匹配
    
    ## 訂單狀態對照(Shopee → 自建)
    UNPAID        → 不同步(等付款)
    READY_TO_SHIP → processing
    SHIPPED       → shipped
    COMPLETED     → completed
    CANCELLED     → cancelled
    其他狀態      → 記錄 log,不同步,發警報
    
    ## momo 金額處理
    momo_original_price → 自建系統 unit_price
    momo_discount       → 另存 discount_record 資料表
    momo_final_price    → 自建系統 actual_amount
    (三個欄位分開記錄,不做合併計算)

    結果:2 天完成 OrderBridge,庫存零重複扣減,SKU 對照人工審核後上線,穩定運行。

    舊系統整合的核心技巧整理

    技巧 怎麼做 目的
    先讓 Claude 讀現有接口提供 API 簽名、schema、關鍵函數,要求 Claude 說出理解後再動手讓 Claude 在正確的上下文下設計,不做無效假設
    要求 Claude 找隱性行為明確說「找出所有 trigger、side effect、副作用,不要開始寫代碼」在整合前把地雷挖出來,不是做完才踩到
    CLAUDE.md 凍結不能動的邊界在 CLAUDE.md 明確寫「不得修改 X 格式 / Y 欄位名稱 / Z 計算邏輯」Claude 不會因為「更整齊」而擅自重新命名或重構
    設計文件定義接合點,不定義格式設計文件描述「新舊系統在哪裡接觸」,格式繼承舊系統,不重新設計避免做一個格式轉換層長期維護
    驗證方式要對比舊系統Done When 裡明確說「與舊系統同樣輸入,輸出結果必須一致」讓 Claude 自己驗算新舊等價性,不是跑起來就算完成

    一個可以直接用的提示模板

    每次要在舊系統上加新功能,用這個模板啟動:

    【現有系統】
    [描述現有系統的技術棧和關鍵接口,附上接口文件或關鍵代碼片段]
    
    【要加的功能】
    [一句話描述]
    
    【不能動的邊界】
    - [現有系統的格式、欄位名稱、計算邏輯等不能更動的項目]
    - [如果有 DB trigger 或其他隱性行為,也列在這裡]
    
    【請先做這兩件事,再開始設計】
    1. 告訴我你對現有接口的理解(特別是你覺得可能影響整合的部分)
    2. 指出你看到的整合風險(格式衝突、重複操作、狀態對照缺口)
    
    確認理解正確後,我們再討論設計。

    這個模板做了三件事:把舊系統的上下文給 Claude、凍結不能動的邊界、要求 Claude 在動手前先說出它的理解和風險判斷。

    常見問題

    Q:舊系統的代碼很亂,文件也沒有,怎麼辦?

    先讓 Claude 讀代碼,問它「這個系統對外暴露了哪些接口?資料庫有哪些關鍵的 table 和 trigger?」讓 Claude 幫你反向整理出一份接口文件,確認沒有遺漏後再進行整合設計。不要跳過這一步,這是整合成功的前提。

    Q:整合的範圍不確定,不知道要動到哪裡?

    先用 Plan Mode,給 Claude 目標和約束,讓它畫出影響範圍。Plan Mode 的價值在複雜整合場景特別高,因為它會列出所有相關的文件和狀態流,讓你確認範圍是否正確,再決定怎麼切入。

    Q:新功能做完,但舊系統有些邏輯說不清楚,怕 Claude 做錯?

    這種情況用「新舊並排驗算」:先在測試環境讓舊版和新版用同樣輸入各跑一次,比較輸出。在設計文件裡明確寫出這個驗證條件,Claude 就會把「新舊等價」列為完成定義的一部分。

    從不會用到會用:舊系統整合的具體升級路徑

    舊系統整合的升級路徑跟全新開發不太一樣:問題不是「我沒說邊界條件」,而是「Claude 根本不知道舊系統長什麼樣」。所以升級的重點是:在動手前把舊系統的關鍵資訊餵給 Claude

    第一步:今天就能做到(一個句子)

    在你的提示前面加上這段:

    我有一個現有系統,新功能必須跟它相容。
    
    現有系統的關鍵格式:
    [把你知道的接口格式、欄位名稱、資料格式貼在這裡]
    
    新功能不能更動上面這些格式。先告訴我你的理解,再開始設計。

    就算你只知道一部分格式,先寫一部分。有比沒有好。

    醫療 HIS 整合:Level 0 → Level 1

    不會用(Level 0) 初步會用(Level 1)
    幫我串接 HIS 系統做 LINE 掛號(見下方)
    我有一個舊的 HIS 系統(不能修改),需要在外面接一個 LINE 掛號 bot。
    
    HIS 現有接口(Stored Procedure):
    sp_GetAvailableSessions(@DeptCode NCHAR(3), @DateFrom NCHAR(8), @DateTo NCHAR(8))
    sp_CreateBooking(@PatientId NCHAR(8), @SessionId NCHAR(16), @Phone NVARCHAR(20))
      回傳 Status: SUCCESS / FULL / DUPLICATE
    
    格式約束(不能改):
    - PatientId 是 8 位數字字串,不足補 0
    - 所有呼叫只能透過 stored procedure,不能直接查表
    
    請先告訴我:
    1. 你對這個 HIS 接口的理解
    2. 你覺得 LINE bot 和 HIS 之間需要什麼樣的轉換層
    
    確認後再討論架構設計。

    舊報表腳本接新數據:Level 0 → Level 1

    我有一個舊的 Python 分析腳本,計算邏輯不能動,只要換掉數據來源(從手動 CSV 改成自動抓取)。
    
    舊腳本的輸入依賴(這些欄位名稱不能改):
    - date (YYYY-MM-DD)
    - open, high, low, close, volume
    - vol_adj(自訂欄位:去掉最高最低各2天的16日均量)
    
    計算邏輯不能動的原因:
    - RSI 用的是 Wilder 平滑法(非標準 SMA),三年來的報告都是這個版本
    - 改了數值會跟歷史記錄不一致
    
    請先告訴我:
    1. 你理解哪些東西不能動
    2. 你打算怎麼讓新舊版本在同樣輸入下輸出一致的結果
    
    確認後再開始實作數據來源層。

    舊 ERP 接電商平台:Level 0 → Level 1

    我有一個舊的訂單系統(PHP + MySQL),要串接 Shopee 的訂單進來。
    舊系統不能大改,只能在外面包一層。
    
    已知的舊系統行為:
    - 創建訂單時,資料庫層有 trigger 會自動扣庫存
    - 訂單狀態:pending / processing / shipped / completed / cancelled(只有這五種)
    
    Shopee 訂單狀態有 12 種,需要做對照。
    
    我擔心的問題:
    - 庫存被扣兩次(trigger + 外面的 API 都扣)
    - 狀態對照不完整,有些 Shopee 狀態沒有對應的舊系統狀態
    
    請先幫我分析這兩個風險,告訴我你的處理方案,再開始設計架構。

    注意最後一段:把你擔心的問題說出來。這讓 Claude 優先處理你知道有風險的地方,而不是從它認為重要的地方開始。

    第二步:下週可以做到(CLAUDE.md 記錄舊系統約束)

    舊系統整合的 CLAUDE.md 要特別加一個「整合約束」區塊:

    # 整合約束(現有系統,不可更動)
    
    ## [系統名稱] 的格式規範
    - [欄位名稱] 的格式:[說明]
    - [接口規範]:[說明]
    - 禁止直接操作資料庫,只能透過 [API / SP / 特定方法]
    
    ## 已知的隱性行為
    - [觸發器 / 事件 / side effect 描述]
    - 注意:[操作 X] 會同時觸發 [Y],不要重複執行
    
    ## 新功能的邊界
    - 只修改 [Adapter / Bridge / 特定模組],不動舊系統
    - 欄位名稱繼承舊系統,不重新命名

    每次發現一個新的隱性行為(觸發器、計算邏輯、格式特例),就加進這個區塊。它會越來越完整,讓你以後的整合工作越來越省力。

    第三步:一個月後的進化

    進化 A:在開始任何整合前,先讓 Claude 找隱性行為

    請閱讀 [現有系統代碼/文件],找出所有:
    1. 資料庫 trigger 和它的作用
    2. 創建/更新/刪除記錄時的 side effect
    3. 對外暴露的接口(API / SP / 事件)和它們的格式
    
    告訴我你找到的所有隱性行為,不要開始設計,先讓我確認。

    這個步驟在整合開始前把地雷挖出來,比做完後踩到省 10 倍時間。

    進化 B:複雜整合用 Plan Mode,重點讓 Claude 畫出影響範圍

    【現有系統】[描述]
    【目標】[一句話]
    【不能動的邊界】[列清楚]
    
    請制定整合計劃,特別標出:
    - 會影響到的現有功能
    - 每個整合點的風險
    - 我需要在上線前人工驗證的項目
    
    等我確認計劃後再開始實作。

    進化 C:設計文件加「新舊等價性驗證」

    舊系統整合的完成定義,永遠要加這一條:

    ## 驗證方式
    用同一份歷史輸入,新舊兩版並排執行,
    [關鍵輸出欄位] 的結果差異必須在 [可接受範圍] 內。
    新版上線前,提供新舊對比報告。
    階段 做什麼 關鍵句
    Level 0直接說要串接什麼
    Level 1(今天)把舊系統格式和約束說清楚「這些格式不能改,告訴我你的理解再開始」
    Level 2(下週)CLAUDE.md 記錄舊系統約束和隱性行為每次整合後補一條「已知隱性行為」
    Level 3(一個月後)先讓 Claude 挖地雷,再 Plan Mode 確認影響範圍「找出所有隱性行為,不要開始設計」
  • 會用 vs 不會用 Claude Code:醫療、股市、電商三場景對比

    重點摘要

    • 差距不在「會不會用 AI」,在「有沒有給 AI 做事的結構」
    • 不會用的人:一句話丟需求 → 結果跑偏 → 多輪修正 → 累積沮喪
    • 會用的人:CLAUDE.md + 設計文件 + 分段驗證 → 第一次就對
    • 三個真實場景(醫療 / 股市 / 電商)示範具體差距

    「Claude Code 對我沒用,我試過,它做出來的東西都不對。」

    這句話我聽過很多次。幾乎每次深入問,問題都不在 Claude,在提問的方式。

    這篇文章用三個真實的軟體開發場景,直接模擬「不會用的人」和「會用的人」各自怎麼做,讓你看清楚差距在哪裡。

    核心差距:有沒有給 AI 做事的結構

    不會用 Claude Code 的人,把它當成「很聰明的搜尋引擎」,問一句,期待完美答案。

    會用的人,把它當成「需要完整簡報才能開工的新進工程師」:你給的資訊越清楚,他做出來的東西越準確。

    差距的本質是:你的輸入有沒有結構

    場景一:醫療預約系統(門診掛號)

    痛點

    診所要做線上掛號,需要處理:醫師排班、假日停診、同時段人數上限、患者重複掛號防止。每個規則都有例外,例外裡還有例外。

    不會用的人怎麼做

    直接開口:

    幫我寫一個門診預約系統的 API,要能掛號、取消、查詢。

    Claude 給了一個乾淨的 REST API,CRUD 完整,code 看起來不錯。

    開始整合後發現問題一個接一個:

    • 沒處理同時段上限(診所每診次只收 20 人,API 沒有 capacity 邏輯)
    • 沒有重複掛號檢查(同一個患者可以掛同一診次兩次)
    • 沒有假日判斷(系統不知道什麼是醫院休診日)
    • 時區沒處理(台灣 UTC+8,stored as UTC,前端顯示全錯)

    開始補需求:「喔對,要加上每診次人數上限」→ Claude 修改。「還有重複掛號要擋掉」→ Claude 再改。「假日要停診」→ 再改。每次修改都可能動到之前改好的邏輯,三輪之後代碼開始難以追蹤。

    結果:8 小時,仍有未發現的 bug,信心不足。

    會用的人怎麼做

    第一步:CLAUDE.md 裡早就寫好領域規則

    ## 醫療領域規則
    - 所有時間以 UTC+8 儲存,API 回應包含 timezone 欄位
    - 患者 ID 採用身分證字號格式,需驗證格式(字母+9位數字)
    - 診次 (session) 為最小預約單位,每診次有 capacity 上限
    - 相同患者在同一診次只能有一筆有效預約
    
    ## 錯誤處理標準
    - 業務邏輯錯誤:HTTP 422 + { code, message, field }
    - 驗證錯誤:HTTP 400 + 同上格式

    第二步:先寫設計文件(20 分鐘)

    # 功能:門診掛號 API
    
    ## 輸入
    { patientId: string, sessionId: string }
    
    ## 驗證順序(按此順序,遇錯即停)
    1. patientId 格式是否合法
    2. sessionId 是否存在且為未來時間
    3. 該診次是否已達 capacity
    4. 該患者是否已有此診次的有效預約
    
    ## 邊界條件
    - capacity 滿:422,code: SESSION_FULL
    - 重複掛號:422,code: DUPLICATE_BOOKING
    - 患者格式錯:400,code: INVALID_PATIENT_ID
    - 診次已過去:422,code: SESSION_EXPIRED
    
    ## Done When
    - 所有邊界條件有單元測試
    - integration test 驗證完整掛號流程
    - 0 TypeScript errors

    第三步:分段給任務

    請先閱讀 CLAUDE.md 和這份設計文件。
    閱讀完告訴我你的理解,特別是驗證順序的邏輯,再開始實作。
    先只實作 validateBooking() 函數和對應單元測試,不要動 API 層。

    確認驗證邏輯正確後,再說「現在依照這個驗證函數實作 POST /bookings endpoint」。

    結果:2.5 小時,第一次就通過所有測試,零修改。

    場景二:股市回測系統

    痛點

    想驗證一個交易策略:當 5 日均線上穿 20 日均線時買進,死亡交叉時賣出。聽起來簡單,但台股有漲跌停、只能在交易日交易、最小交易單位是 1000 股、手續費和證交稅要扣掉,每個細節都會影響回測結果。

    不會用的人怎麼做

    幫我寫一個台股回測程式,策略是 5 日均線上穿 20 日均線買進,死叉賣出。

    Claude 給了一個 Python 回測,用 pandas 計算均線,邏輯清楚。跑了一下,報酬率看起來很漂亮。

    仔細看才發現:

    • 買賣都用收盤價,但實際上收盤價買不到(要用隔日開盤)
    • 沒有漲跌停限制,假設任何價格都能成交
    • 沒扣手續費(0.1425%)和證交稅(0.3%)
    • 沒有最小交易單位,0.1 張也買
    • 跑到非交易日(週末)的資料也在交易

    這些問題加起來,讓回測結果虛報了約 30–40%。一個看起來賺錢的策略,修正後可能是虧損的。

    結果:6 小時修修改改,最後不確定結果是否可信。

    會用的人怎麼做

    設計文件把所有台股規則先寫清楚:

    # 功能:台股均線策略回測引擎
    
    ## 市場規則(必須完整實作)
    - 交易日:排除週末 + 台灣國定假日(用 holidays-tw 套件)
    - 成交價:訊號發生在收盤,執行在「隔一個交易日開盤價」
    - 漲跌停:每日最大漲跌幅 ±10%,超過範圍無法成交,標記 LIMIT_HIT
    - 最小交易單位:1000 股,不足整張無法下單
    - 手續費:買賣各 0.1425%(可設定),最低 20 元
    - 證交稅:賣出 0.3%(ETF 為 0.1%)
    
    ## 回測輸出格式
    {
      total_return_pct: float,    # 扣除所有費用後
      trades: [{ date, action, price, shares, cost, tax, net_pnl }],
      unfilled: [{ date, reason }],   # LIMIT_HIT 等無法成交紀錄
      sharpe_ratio: float,
      max_drawdown_pct: float
    }
    
    ## 邊界條件
    - 漲停無法賣出(LIMIT_HIT_SELL)
    - 跌停無法買入(LIMIT_HIT_BUY)
    - 資金不足一張:跳過,記錄 INSUFFICIENT_FUNDS
    - 最後持倉:回測結束日強制以收盤價平倉

    提示方式:

    請先閱讀這份設計文件,告訴我:
    1. 成交時間點的邏輯(訊號日 vs 執行日)你的理解
    2. 漲跌停時的處理流程
    
    確認理解正確後,先只實作 TaiwanMarketRules 類別和測試,
    包含漲跌停判斷、交易日判斷、手續費計算三個方法。
    不要實作策略邏輯或回測引擎。

    結果:3 小時,回測結果可信,且有完整的無法成交紀錄供分析。

    場景三:電商金流串接(綠界 ECPay)

    痛點

    要串接台灣最常用的金流服務商,支援信用卡一次付清 + ATM 虛擬帳號。牽涉到加密簽章驗證、非同步回調(ReturnURL / OrderResultURL)、以及各種付款失敗情境。

    不會用的人怎麼做

    幫我串接綠界金流,支援信用卡和 ATM 付款。

    Claude 寫了一個串接,看起來完整。測試環境跑起來。上線後三天,開始收到客訴:

    • 付款成功但訂單沒更新(沒有正確處理綠界的非同步通知)
    • ATM 超時未付款,訂單卡在「待付款」沒有自動取消
    • CheckMacValue 驗簽偶發失敗(特殊字元的 URL encode 方式不對)
    • 退款流程完全沒實作(以為付款和退款是同一組 API)

    每個問題單獨看都能修,但修一個又會影響另一個。金流 bug 是最難測試的,因為要模擬真實付款行為。

    結果:上線後 bug,緊急修補兩天,損失用戶信任。

    會用的人怎麼做

    先用 Plan Mode 讓 Claude 梳理所有狀態流:

    【背景】
    我要串接綠界 ECPay,使用 Node.js + PostgreSQL,
    CLAUDE.md 中規定所有金流操作要記 audit log。
    
    【目標】
    支援信用卡一次付清和 ATM 虛擬帳號,訂單狀態要與付款狀態完全同步。
    
    【約束條件】
    - 不能有「已付款但訂單未更新」的狀態
    - ATM 超過 3 天未付款自動取消訂單並釋放庫存
    - CheckMacValue 驗簽失敗必須記錄並告警
    
    請制定實作計劃,列出所有需要處理的狀態流轉,
    等我確認計劃後再開始實作。

    Claude 在計劃中列出了 14 個狀態節點,包含「非同步通知重複到達」、「驗簽失敗的處理」這些不明顯的情境。確認計劃後再開始做。

    設計文件特別標明的邊界條件:

    ## 邊界條件(金流特有)
    - ReturnURL(非同步)和 OrderResultURL(同步)可能「都」被呼叫
      → 用 idempotency key 確保同一筆交易只更新一次訂單
    - CheckMacValue 驗簽:URL encode 順序必須按綠界規範(非標準 encodeURIComponent)
      → 測試案例需包含含特殊字元的 MerchantTradeNo
    - ATM 逾期:用 pg-cron 排程,不要依賴前端觸發
    - 退款:獨立 API,與付款 API 完全分離,需要人工審核 flag

    結果:4 小時,上線零 bug,audit log 完整。

    差距總結

    面向 不會用的人 會用的人
    提示方式「幫我做 X」「背景 + 目標 + 約束條件 + 邊界條件」
    領域規則每次用到才補說寫進 CLAUDE.md,一次設定永久生效
    邊界條件做完後才發現沒處理設計文件裡最前面就列清楚
    複雜任務一次丟,結果跑偏再修Plan Mode 確認方向,分段執行
    驗證方式全部做完再整體測試每段完成後先確認,錯誤早期發現
    對話輪數8–15 輪2–4 輪
    結果品質能跑,但邊界不完整完整,測試覆蓋所有邊界

    為什麼大多數人卡在「不會用」

    不是因為懶,是因為直覺錯了。

    我們習慣搜尋引擎:問一句,得到答案。Claude Code 不是搜尋引擎,它是一個需要簡報才能開工的工程師。你給的資訊越完整,它做出來的東西越準確。

    轉換這個直覺需要時間,但一旦轉過來,你就不會想回頭了。

    從下一個任務開始,試著在開口前先回答三個問題:

    1. 這個功能的輸入和輸出各是什麼格式?
    2. 哪些邊界條件會讓它失敗?
    3. 我怎麼確認它做對了?

    把這三個問題的答案寫下來,你的 Claude Code 使用效果會立刻不一樣。

    常見問題

    Q:每次都要先寫設計文件,不會很花時間嗎?

    一份最小版設計文件 20 分鐘。省下的多輪修改至少 2–4 小時。這筆帳很好算。

    小功能(一個函數、修一個 bug)不需要設計文件,直接做。設計文件是為了「有多個邊界條件、或跨越兩層以上架構」的任務。

    Q:CLAUDE.md 不是每個專案都要重寫一遍嗎?

    寫一次,維護成本低。每次發現 Claude 做了一個你不喜歡的決定,把那條規則加進 CLAUDE.md,下次就不會再發生。它是越用越省力的資產。

    Q:我的需求很複雜,文件要寫到多詳細?

    詳細到「可以讓另一個工程師依照這份文件實作,不需要問你問題」。如果你寫完文件還是覺得有地方模糊,那就是還有沒想清楚的需求,先想清楚再開始比較省事。

    從不會用到會用:各情境的具體升級路徑

    看完上面三個場景,你可能知道差距在哪,但還不知道今天要改什麼。這一節給你一條明確的路,從第一步到進階,每步都有可以直接複製的東西。

    第一步:今天就能做到(不需要任何準備)

    在你現在的任何提示最後加上這一句:

    先告訴我你的理解和假設,再開始實作。

    就這一句。它會讓 Claude 在動手前先說出它的假設,你可以在它寫出一堆錯誤代碼前糾正它。成本 0,效果立竿見影。

    三個情境的具體升級示範:

    醫療場景:Level 0 → Level 1

    不會用(Level 0) 初步會用(Level 1)
    幫我寫門診預約系統(見下方)
    幫我寫門診掛號的 API。
    
    輸入:{ patientId: string, sessionId: string, phone: string }
    輸出:{ bookingNo: string, status: "SUCCESS" | "FULL" | "DUPLICATE" }
    
    必須處理:
    - 同一診次超過容量上限 → 回傳 FULL
    - 同一患者重複掛同一診次 → 回傳 DUPLICATE
    - 所有時間以 UTC+8 處理
    
    先告訴我你的理解,特別是這三種情況你打算怎麼處理,再開始實作。

    改變了什麼:加了輸入輸出格式、三個邊界條件、確認步驟。這 5 分鐘的準備,省掉事後發現「沒處理重複掛號」的 2 小時修改。

    股市場景:Level 0 → Level 1

    幫我寫台股均線回測。策略:5日均線上穿20日均線買進,死叉賣出。
    
    台股特有規則(全部都要實作):
    - 訊號發生在收盤,執行在隔交易日開盤價(不是同日收盤)
    - 漲跌停 ±10%,超過無法成交,記錄 LIMIT_HIT
    - 手續費:買賣各 0.1425%,最低 20 元
    - 證交稅:賣出 0.3%
    - 最小交易單位 1000 股,不足不下單
    
    先告訴我這些規則你的理解,特別是成交時間點的邏輯,再開始寫。

    電商金流場景:Level 0 → Level 1

    幫我串接綠界 ECPay,支援信用卡一次付清。
    
    必須處理的情況:
    - ReturnURL(非同步)和 OrderResultURL(同步)可能都會被呼叫,
      同一筆交易只能更新訂單一次(要有 idempotency 機制)
    - CheckMacValue 驗簽失敗:記 log,不更新訂單,回傳 0|Error
    - 付款成功後訂單狀態必須立刻更新
    
    先告訴我你打算怎麼處理「非同步和同步通知都到達」這個情況,再開始實作。

    第二步:下週可以做到(CLAUDE.md)

    把你的領域規則寫成一個檔案,放在專案根目錄,命名 CLAUDE.md。之後每次對話都不用再重複說這些規則。

    先從最小版開始,15 分鐘寫完:

    # 專案規則
    
    ## Tech Stack
    [填你用的技術]
    
    ## 這個領域的特殊規則
    [把你每次都要補充說明的規則寫在這裡]
    例:
    - 台股交易日排除週末 + 台灣國定假日
    - 醫療系統所有時間 UTC+8
    - 金流驗簽失敗一律記 log 不更新訂單
    
    ## 代碼標準
    [你每次都要糾正的習慣寫在這裡]
    例:
    - 禁止 any 類型
    - 每個函數必須有對應測試
    - API 錯誤格式統一:{ code, message, field }
    
    ## 邊界條件規則
    [這個專案特有的邊界處理方式]

    寫好之後,下次開口前說「請先讀 CLAUDE.md」或什麼都不用說(Claude Code 會自動載入)。

    第三步:一個月後的進化(設計文件 + Plan Mode)

    當你習慣 Level 1 之後,下一步是在動手前多寫一份設計文件。這份文件不是給人看的,是給 Claude 看的,20 分鐘寫完,節省的是事後 4–6 小時的修改。

    設計文件的最小格式:

    # 功能:[名稱]
    
    ## 輸入 / 輸出
    輸入:[JSON 範例]
    輸出:[JSON 範例]
    
    ## 邊界條件(必須處理)
    - [條件 A] → [預期行為]
    - [條件 B] → [預期行為]
    
    ## 完成定義
    - [ ] 所有邊界條件有對應單元測試
    - [ ] TypeScript 0 errors

    有了設計文件之後,任務的啟動提示變成:

    請先閱讀 CLAUDE.md 和 [設計文件名]。
    閱讀完告訴我你的理解,特別是邊界條件部分。
    確認後先只實作 [最小單元],不要動其他層。

    當任務更複雜(跨 5 個以上文件、不可逆的架構改動),改用 Plan Mode 啟動:

    請先制定實作計劃,列出方案選項和取捨,等我確認後再開始執行。
    階段 做什麼 時間投資 節省的來回
    Level 0直接說需求00
    Level 1(今天)加輸入/輸出/邊界 + 確認步驟5 分鐘/次2–4 輪
    Level 2(下週)CLAUDE.md 寫入領域規則15 分鐘(一次性)每次省 1–2 輪
    Level 3(一個月後)設計文件 + Plan Mode20 分鐘/功能第一次就對
  • Claude Code 系列文 (5/5):實戰 — 3 天完成 Taiwan Invoice 系統

    ⚡ 重點摘要

    • Day1規劃6小時:需求+CLAUDE.md+設計文檔+Hook
    • Day2實施8小時:Claude一次到位,200+測試通過
    • Day3部署4小時:安全審查+文檔+上線
    • 總計18小時,vs傳統方式40-50小時

    前提:讀過第 1-4 篇,理解整個工作流 目標:看一個真實的「一人公司 3 天完成功能」案例 收穫:知道如何套用到你的項目


    案例背景

    公司:一人 SaaS 公司(會計軟件) 需求:完整的台灣統一發票系統 期限:3 天內完成 MVP 資源:1 個人 + Claude Code 目標:一次到位,最少改動


    🗓️ Day 1:規劃 + 準備(6 小時)

    上午(3 小時):理清需求

    # Taiwan Invoice System - Requirement Doc
    
    ## 為什麼要做
    目前手工開發票,容易出錯,無法追蹤
    
    ## 用戶故事
    "As a freelancer with 50+ monthly invoices,
     I want to generate invoices in Taiwan GUN format,
     so I can legally submit to tax authority"
    
    ## MVP Scope(3 天內)
    ✅ 建立發票 (可編輯草稿)
    ✅ 查看發票列表
    ✅ 匯出 PDF (GUN 格式)
    ✅ 基本驗證 (金額、格式)
    
    ⏳ Phase 2 (1 個月後)
    - 批量操作
    - 進階篩選
    - 政府系統整合

    花時間:30 分鐘(邊想邊寫)

    中午(3 小時):建立項目規則 + 設計

    建立 CLAUDE.md

    # Taiwan Invoice System
    
    ## Tech Stack
    - Frontend: React 18 + TypeScript
    - Backend: Node.js + Express
    - Database: PostgreSQL
    - Styling: Tailwind CSS
    
    ## Code Standards
    - TypeScript strict mode
    - Test coverage > 80%
    - JSDoc for public API
    - Prettier + ESLint
    
    ## Business Rules (Critical!)
    
    ### Invoice Format (GUN)
    必須符合台灣政府格式:
    - 發票號碼:8 位數 (格式:AAA12345)
    - 序列必須連續
    - 日期:民國年 (e.g., 112/03/25)
    - 必填欄位:公司統編、客戶統編、品項、金額
    
    ### Tax Rules
    - 標準稅率:5% (大部分)
    - 零稅率:0% (出口商品)
    - 免稅:0% (政府單位等)
    - 進項稅:同月內計算,超過月份無法扣
    
    ### Immutability
    已提交的發票不可修改,只能作廢重新開
    
    ## Architecture Decision
    使用 Strategy Pattern 處理不同稅率
    → 易於新增新稅種
    
    ## Important
    必須通過以下檢查:
    - 發票序列連續
    - 日期格式正確 (民國年)
    - 金額計算正確
    - 必填欄位都有

    花時間:1 小時

    寫設計文檔

    # Feature: Create Invoice
    
    ## User Flow
    1. 使用者點「新建發票」
    2. 看到表單:日期、客戶、品項清單、稅率
    3. 填完按「儲存為草稿」
    4. 發票編號自動產生 (取自上一張+1)
    5. 顯示「草稿已保存」訊息
    
    ## Data Structure
    ```typescript
    interface Invoice {
      id: UUID;
      invoiceNumber: string;      // e.g., "AAA00001"
      invoiceDate: Date;          // ROC year format
      companyId: string;          // 公司統編
      companyName: string;
      customerId: string;         // 客戶統編
      customerName: string;
      items: InvoiceItem[];       // 品項清單
      taxRate: 5 | 0;            // 稅率
      subtotal: number;
      taxAmount: number;
      total: number;
      status: "DRAFT" | "SUBMITTED" | "VOIDED";
      createdAt: Date;
      updatedAt: Date;
    }
    
    interface InvoiceItem {
      id: UUID;
      name: string;
      quantity: number;
      unitPrice: number;
      amount: number;             // qty * price
    }
    ```
    
    ## API
    ```
    POST /api/invoices
    {
      invoiceDate: "2024-03-25",
      customerId: "12345678",
      customerName: "ABC Company",
      items: [{name, quantity, unitPrice}, ...],
      taxRate: 5
    }
    → 201 Created
    {
      id: "uuid",
      invoiceNumber: "AAA00123",
      ...
    }
    
    GET /api/invoices/:id
    → 返回完整發票資料
    
    PUT /api/invoices/:id
    {...updates}
    → 200 OK (只有 DRAFT 狀態可修改)
    ```
    
    ## Validation
    - [ ] 發票號碼格式:AAA + 5 位數
    - [ ] 客戶統編:8 位數
    - [ ] 日期:不能是未來日期
    - [ ] 品項至少 1 個
    - [ ] 金額都是正數
    - [ ] 稅率只能是 5 或 0
    
    ## Edge Cases
    - 新使用者,沒有上一張發票?→ 自動從 AAA00001 開始
    - 修改數量後,金額要自動計算 ✅
    - 刪除品項要更新小計 ✅
    - 同一天多張發票?→ 號碼自動遞增 ✅
    
    ## Acceptance Criteria
    - [ ] 表單能填入資料
    - [ ] 發票自動編號
    - [ ] 計算正確
    - [ ] 驗證有效
    - [ ] 錯誤訊息清晰(中文)
    - [ ] 所有測試通過

    花時間:1.5 小時

    設置 Hook(複製 settings.json):

    花時間:30 分鐘

    下午成果

    Day 1 完成:
    ✅ 需求清晰(RFC 格式)
    ✅ CLAUDE.md 完成(規則明確)
    ✅ 設計文檔完成(API + UI + 驗證規則)
    ✅ Hook 已設置(自動格式化和測試)
    ✅ Git 提交
    
    Code ready for Claude!

    🗓️ Day 2:實施 + 驗證(8 小時)

    早上(4 小時):Claude 實施後端 + API

    Prompt 給 Claude

    這是我們的 Taiwan Invoice 系統。
    
    CLAUDE.md(規則):[貼上 CLAUDE.md]
    
    設計文檔(需求):[貼上設計文檔]
    
    請按照設計實施:
    1. 建立 Invoice 數據模型
    2. 建立 API endpoints (POST /invoices, GET /invoices/:id, PUT)
    3. 實施驗證邏輯
    4. 寫單元測試(coverage > 80%)
    
    注意:台灣稅法很嚴格,邊界情況要測試完整。

    Claude 做的事

    • 自動讀 CLAUDE.md(知道 TypeScript strict,要測試)
    • 自動讀設計文檔(知道確切的 API 格式和驗證規則)
    • 一次性實施,不猜測
    • 自動加測試(因為 CLAUDE.md 要求)
    • 自動格式化和 lint(Hook 搞定)

    結果(2 小時):

    ✅ models/Invoice.ts (50 行)
    ✅ services/InvoiceService.ts (200 行)
    ✅ routes/invoices.ts (80 行)
    ✅ __tests__/invoiceService.test.ts (150 行,30 個測試)
    
    所有測試通過 ✅
    代碼 lint 通過 ✅
    覆蓋率 > 85% ✅

    中午(2 小時):Claude 實施前端 + 表單

    Prompt

    前端現在需要:
    1. 發票新建表單(日期、客戶、品項清單)
    2. 發票列表頁面
    3. 發票詳情頁面
    
    用設計文檔中的 API,請實施 React 組件。
    
    要點:
    - 表單驗證(錯誤訊息用中文)
    - 品項動態新增/刪除
    - 自動計算小計和稅額
    - 載入中和錯誤狀態要顯示

    結果(2 小時):

    ✅ components/InvoiceForm.tsx (300 行)
    ✅ pages/InvoiceList.tsx (150 行)
    ✅ pages/InvoiceDetail.tsx (200 行)
    ✅ hooks/useInvoice.ts (100 行,API 調用)
    ✅ __tests__/InvoiceForm.test.tsx (200 行)
    
    測試通過 ✅
    外觀符合預期 ✅

    下午(2 小時):整合測試 + Bug 修復

    做法

    1. 連接前後端
    2. 手動測試端到端流程
    3. 發現 2 個小 bug(日期格式,驗證訊息)
    4. Claude 修復
    5. 再測一遍,沒問題

    結果

    ✅ 前後端連接
    ✅ 表單能提交
    ✅ 發票能保存到 DB
    ✅ 列表能顯示
    ✅ 所有驗證工作
    ✅ 錯誤訊息清晰

    Day 2 成果

    ✅ 後端 API 完成
    ✅ 前端 UI 完成
    ✅ 單元測試通過(200+ 測試)
    ✅ 整合測試通過
    ✅ 0 console.log,0 TODO
    ✅ 準備上線

    🗓️ Day 3:優化 + 部署(4 小時)

    早上(1 小時):性能 + 安全檢查

    # 代碼審查
    npm run lint           # 0 錯誤 ✅
    npm test              # 200+ 測試通過 ✅
    npm run type-check    # TypeScript: 0 錯誤 ✅
    
    # 安全檢查
    npm audit             # 0 高風險漏洞 ✅
    grep -r "console.log" src/   # 0 結果 ✅
    grep -r "TODO" src/          # 0 結果 ✅

    中午(1 小時):文檔 + README

    # Taiwan Invoice System
    
    ## Features
    - ✅ Create/Edit/View invoices in GUN format
    - ✅ Automatic invoice numbering
    - ✅ Tax calculation (5% / 0% / exempt)
    - ✅ Form validation (Taiwan rules)
    - ✅ PDF export (coming v1.1)
    
    ## API
    [自動生成 API 文檔]
    
    ## Setup
    ```bash
    npm install
    npm run dev
    ```
    
    ## Testing
    ```bash
    npm test
    npm run test:coverage
    ```
    
    ## Deployment
    [部署指令]

    下午(2 小時):部署 + 監控

    # 部署
    npm run build         # 0 警告
    deployment-script    # 部署到 staging
    
    # 煙霧測試
    curl http://staging/api/invoices
    # 確保 API 正常
    
    # 監控設置
    [設定錯誤告警]
    [設定性能監控]

    Day 3 成果

    ✅ 代碼審查通過
    ✅ 安全檢查通過
    ✅ 文檔完整
    ✅ 部署到 Staging
    ✅ 煙霧測試通過
    ✅ 準備上線

    📊 3 天總結

    時間分配

    Day 1 規劃:6 小時
      ├─ 需求文檔:30 min
      ├─ CLAUDE.md:1 hour
      ├─ 設計文檔:1.5 hours
      ├─ Hook 設置:30 min
      └─ Git 提交:30 min
    
    Day 2 實施:8 小時
      ├─ 後端實施 + 測試:4 hours
      ├─ 前端實施 + 測試:2 hours
      ├─ 整合 + Bug 修復:2 hours
      └─ 無重複改動 ✅
    
    Day 3 優化:4 小時
      ├─ 性能 + 安全:1 hour
      ├─ 文檔:1 hour
      ├─ 部署 + 測試:2 hours
      └─ 準備上線
    
    總計:18 小時 = 2.25 天工作量

    成果

    代碼行數:~1500 行(含測試)
    測試數:200+ 個
    測試覆蓋率:85%+
    Bug 數:0 個(在 staging)
    改動次數:0 次(一次到位)
    
    典型方式的對比:
    傳統(沒規劃):40-50 小時,改 5-6 次
    規劃優先(本案例):18 小時,0 次改動

    關鍵成功因素

    因素為什麼重要這次是否做到
    CLAUDE.mdClaude 知道規則,不猜測
    設計文檔Claude 知道確切需求,一次對
    Hook自動化質量檢查,省手動操作
    TypeScript類型安全,邊界情況早發現
    完整測試回歸測試保證不破壞舊功能
    Git 提交每個功能清楚的 commit

    🎯 如何套用到你的項目

    Step 1:這週做

    • ☐ 為你的項目寫 CLAUDE.md(1 小時)
    • ☐ 選一個新功能,寫設計文檔(30 分鐘)
    • ☐ 給 Claude,看效果

    Step 2:下週做

    • ☐ 設置 Hook(15 分鐘)
    • ☐ 再試 2 個功能用設計文檔
    • ☐ 感受時間節省

    Step 3:成習慣

    • ☐ 所有新功能都先寫設計文檔
    • ☐ Hook 自動化所有品質檢查
    • ☐ CLAUDE.md 定期更新

    💡 一人公司老闆應該學到的

    1. 規劃比實施更值得

    傳統思維:「趕快寫代碼!」
    結果:寫很多,改很多,還是有 bug
    
    正確思維:「花 2 小時規劃,用 8 小時實施」
    結果:代碼一次對,沒有重複

    一人公司必須這樣思考,因為時間最貴。

    2. 文檔不是累贅,是投資

    成本:30-60 分鐘寫設計文檔
    收益:省 6-8 小時改動
    
    ROI = 600-800%

    最好的投資

    3. 自動化不是選項,是必須

    每週 5 小時手動 lint/test
    一年 260 小時
    相當於 1.5 個全職開發者成本
    
    用 15 分鐘設置 Hook,省這麼多

    不設置 Hook 的一人公司,在浪費金錢

    4. 一個人不代表不能有系統

    一人公司有一個優勢:決策快
    
    用 CLAUDE.md + 設計文檔 + Hook
    建立「個人系統」:
    - 代碼風格一致
    - 質量有保證
    - 規律可預測
    - 未來能擴招
    
    這是一個小公司變成可擴展企業的基礎。

    📈 一人公司的進化路徑

    Month 1:學習 (讀這 5 篇文章,試一個功能)
    Month 2:習慣 (所有新功能都用規劃優先)
    Month 3:系統 (CLAUDE.md + Hook 成為日常)
    Month 4-6:收穫 (月開發速度 ×3, bug ÷2)
    Month 6+:擴招 (有文檔,新人能快速上手)
    
    最後變成一個「可擴展的一人公司」
    而不是「永遠只能一人」的公司

    核心觀點回顧

    ┌─────────────────────────────────────┐
    │ 一人公司的黃金工作流                │
    ├─────────────────────────────────────┤
    │ 規劃(30%)                         │
    │  ├─ CLAUDE.md:寫一次,永遠用      │
    │  └─ 設計文檔:每功能寫一份          │
    │     ↓                                │
    │ 實施(50%)                         │
    │  ├─ Claude 一次對                  │
    │  └─ Hook 自動檢查                  │
    │     ↓                                │
    │ 驗收(20%)                         │
    │  ├─ 測試自動通過                   │
    │  └─ 文檔已完整                     │
    │     ↓                                │
    │ 上線                               │
    │                                    │
    │ 結果:                              │
    │ - 時間 -70%                        │
    │ - Bug -80%                         │
    │ - 心理壓力 -90%                    │
    └─────────────────────────────────────┘

    最後的話

    這個系列文教你的不是「怎麼用 Claude Code」

    而是「怎麼用 Claude Code 作為一人公司老闆活得更輕鬆」

    你的時間 ≠ 開發者的時間
    你的時間 = 企業的命脈
    
    所以:
    不要做「重複的手動工作」
    不要「改」代碼(要「規劃」代碼)
    不要「猜測」用戶需求(要「寫下來」)
    
    文檔優先,自動化第二,代碼最後。
    
    這是一人公司的生存法則。

    行動清單(現在就做)

    Week 1

    • ☐ 讀完這 5 篇文章(2 小時)
    • ☐ 為你的項目寫 CLAUDE.md(1 小時)
    • ☐ 設置 Hook(15 分鐘)

    Week 2

    • ☐ 選一個新功能,寫設計文檔
    • ☐ 用新工作流實施,看效果
    • ☐ 記錄時間(和傳統方式比較)

    Week 3-4

    • ☐ 再用 2-3 個功能測試
    • ☐ 調整 CLAUDE.md(發現遺漏的規則)
    • ☐ 分享給朋友(看看他們的反應)

    資源總結

    你現在有:

    📚 5 篇教學文
    📋 3 個可直接用的模板
    ✅ 4 個檢查清單
    🔧 1 個實戰案例 (Taiwan Invoice)
    📖 完整的 Claude Code 指南庫 (~/claude-code-guide/)

    一切你需要的都在了。


    致謝

    感謝你讀完這個系列。

    如果有問題、改進建議或你的實踐心得,歡迎分享。

    下一步:不是讀更多,是實踐

    選一個功能,按照 Day 1-3 的流程試試看。

    你會驚嘆「怎麼忽然快這麼多」。


    THE END – 系列完! 🎉


    系列文快速導航

    #標題你學到時間
    1為什麼規劃優先理解痛點15 min
    2CLAUDE.md – 編碼憲法寫規則文檔30 min
    3設計文檔 – 讓 Claude 一次對寫需求文檔30 min
    4Hook 自動化 – 省手動工作設置自動化15 min
    5實戰 – 3 天完成系統看完整案例20 min

    總時間:1.5 小時讀 + 2 小時實踐 = 3.5 小時 收益:未來每週省 5-10 小時,一年省 260-520 小時!

  • Claude Code 系列文 (4/5):Hook 自動化 — 讓機器做重複工作

    ⚡ 重點摘要

    • Hook讓機器自動做重複的lint和測試工作
    • 3個必備Hook:after-edit、before-commit、scheduled
    • 15分鐘設置,每週節省5-10小時手動操作
    • 永遠不提交有bug的代碼,主分支永遠綠色

    前提:已有 CLAUDE.md + 設計文檔 時間投入:15 分鐘設置 + 自動化 省時:每週 5-10 小時(再也不用手動 lint/test)


    核心觀點

    傳統流程:
    1. 你寫代碼
    2. 你手動 npm run lint
    3. 你修復 lint 錯誤
    4. 你手動 npm test
    5. 你看測試結果... 有 bug
    6. 你修復 bug
    7. 你再手動 lint 一遍
    8. 最後才提交
    
    時間:45 分鐘 / 功能
    
    ===
    
    Hook 自動化:
    1. 你寫代碼
    2. 保存檔案 → Hook 自動 lint + fix ✅
    3. 提交 git → Hook 自動測試 ✅
    4. 測試通過 → 允許提交 ✅
    
    時間:10 分鐘 / 功能

    節省時間:35 分鐘 × 10 功能 / 月 = 6 小時 / 月!


    一人公司最需要的 3 個 Hook

    Hook 1: after-edit(保存檔案時自動格式化)

    作用:自動執行 prettier + eslint –fix

    好處

    • 不用手動 npm run lint
    • 代碼永遠符合格式
    • Code review 不再被卡在「縮排問題」

    設置(5 分鐘):

    # 編輯 ~/.claude/settings.json
    cat >> ~/.claude/settings.json << 'EOF'
    {
      "hooks": {
        "after-edit": {
          "enabled": true,
          "commands": [
            {
              "patterns": ["**/*.ts", "**/*.tsx", "**/*.js"],
              "run": "prettier --write {file_path} && eslint --fix {file_path}",
              "on_failure": "warn",
              "timeout": 5000
            }
          ]
        }
      }
    }
    EOF

    驗證(1 分鐘):

    # 寫一個格式很爛的檔案
    echo "const  x   =   1" > src/test.ts
    
    # 通過 Claude 編輯它(或手動編輯)
    # 檢查:是否自動格式化為 "const x = 1;"
    cat src/test.ts

    Hook 2: before-commit(提交前自動測試)

    作用:提交前必須通過所有測試

    好處

    • 永遠不會提交有 bug 的代碼
    • 主分支永遠綠色(測試都通過)
    • 不用事後才發現 bug

    設置(5 分鐘):

    cat >> ~/.claude/settings.json << 'EOF'
    {
      "hooks": {
        "before-commit": {
          "enabled": true,
          "commands": [
            {
              "name": "test",
              "run": "npm test -- --onlyChanged --passWithNoTests",
              "on_failure": "block",
              "timeout": 60000,
              "message": "Tests failed. Fix before committing."
            },
            {
              "name": "lint",
              "run": "npm run lint -- {staged_files}",
              "on_failure": "warn"
            }
          ]
        }
      }
    }
    EOF

    驗證(1 分鐘):

    # 破壞一個測試
    echo "test('fail', () => expect(1).toBe(2));" > src/__tests__/test.ts
    
    # 嘗試提交
    git add .
    git commit -m "test: add failing test"
    
    # 結果:被 Hook 擋住 ✅
    # 訊息:Tests failed. Fix before committing.

    Hook 3: scheduled(每週自動檢查依賴)

    作用:每週一自動檢查 npm 依賴更新 + 安全漏洞

    好處

    • 不用手動 npm audit
    • 自動 npm audit fix(修復已知漏洞)
    • 依賴永遠最新,安全性更好

    設置(5 分鐘):

    cat >> ~/.claude/settings.json << 'EOF'
    {
      "hooks": {
        "scheduled": {
          "enabled": true,
          "jobs": [
            {
              "name": "weekly_dependency_audit",
              "cron": "0 10 * * MON",
              "run": "npm audit fix --audit-level=moderate",
              "description": "Check and fix dependencies every Monday 10 AM"
            }
          ]
        }
      }
    }
    EOF

    Hook 完整配置(給一人公司)

    把這個存到 ~/.claude/settings.json

    {
      "hooks": {
        "after-edit": {
          "enabled": true,
          "description": "Auto-format and lint after editing files",
          "commands": [
            {
              "patterns": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"],
              "run": "prettier --write {file_path} && eslint --fix {file_path}",
              "on_failure": "warn",
              "timeout": 5000
            },
            {
              "patterns": ["**/*.json"],
              "run": "prettier --write {file_path}",
              "on_failure": "warn",
              "timeout": 3000
            }
          ]
        },
    
        "before-commit": {
          "enabled": true,
          "description": "Run tests and lint before committing",
          "commands": [
            {
              "name": "test",
              "run": "npm test -- --onlyChanged --passWithNoTests",
              "on_failure": "block",
              "timeout": 60000,
              "message": "Tests failed. Fix before committing."
            },
            {
              "name": "lint",
              "run": "npm run lint",
              "on_failure": "warn",
              "timeout": 30000
            }
          ]
        },
    
        "scheduled": {
          "enabled": true,
          "description": "Automated background tasks",
          "jobs": [
            {
              "name": "weekly_dependency_audit",
              "cron": "0 10 * * MON",
              "description": "Check and fix dependencies every Monday 10 AM",
              "run": "npm audit fix --audit-level=moderate || true"
            },
            {
              "name": "daily_test_report",
              "cron": "0 9 * * *",
              "description": "Run full test suite daily at 9 AM",
              "run": "npm test"
            }
          ]
        }
      }
    }

    一週省下的時間

    假設你一週寫 5 個功能

    任務次數時間 / 次舊方式Hook 方式省下
    手動 lint52 min10 min0 min10 min
    手動測試55 min25 min0 min25 min
    修復 lint bug53 min15 min0 min15 min
    手動 npm audit110 min10 min0 min10 min
    總計60 min0 min60 min

    一週省 1 小時,一年省 52 小時!


    一人公司老闆應該知道的 Hook 細節

    細節 1: on_failure 的三種選擇

    "on_failure": "block"   ← Hook 失敗就停止
                (測試失敗時用)
    
    "on_failure": "warn"    ← Hook 失敗但繼續
                (建議性檢查,不強制)
    
    "on_failure": "ignore"  ← Hook 失敗完全忽視
                (做了無關的操作時)

    建議

    • 測試失敗 → block(必須通過)
    • 格式化失敗 → warn(不影響功能)
    • npm audit → warn(有漏洞但不阻止提交)

    細節 2: timeout 設定

    "timeout": 5000   ← 5 秒超時(快速操作)
    "timeout": 30000  ← 30 秒超時(複雜操作)
    "timeout": 60000  ← 60 秒超時(完整測試)

    建議

    • prettier/eslint:5 秒
    • 單個檔案 lint:10 秒
    • 單個 component 測試:30 秒
    • 全部測試:60 秒

    細節 3: patterns(針對特定檔案類型)

    "patterns": ["**/*.ts", "**/*.tsx"]
                ↓ 只對 TypeScript 檔案執行
    
    "patterns": ["**/*.js"]
                ↓ 只對 JavaScript 檔案執行
    
    "patterns": ["src/**"]  (可選)
                ↓ 只對 src/ 資料夾執行

    常見問題

    Q: Hook 會拖慢我的開發速度嗎?

    A: 不會,反而加快。

    Hook 執行時間:< 5 秒
    傳統修復時間:15-30 分鐘
    
    所以快 180-360 倍。

    Q: 如果我想跳過 Hook(緊急情況)?

    A: 可以,但不推薦。

    # 跳過 before-commit hook
    git commit -m "message" --no-verify
    
    # 但這很危險!只在真正緊急時用

    一人公司建議:不要跳過。多花 1 分鐘讓 Hook 通過,比之後修 bug 便宜。

    Q: 我已經有自己的 lint 設定,怎樣整合?

    A: Hook 尊重你的 .eslintrc 和 .prettierrc

    # 如果你已經有這些檔案,Hook 會自動用它
    ls -la .eslintrc .prettierrc
    
    # 如果沒有,建議建立預設的
    touch .eslintrc.json .prettierrc.json

    設置 Hook 的完整步驟

    Step 1: 確認已安裝工具(2 分鐘)

    npm --version          # Node.js
    npm list prettier      # Prettier 已裝
    npm list eslint        # ESLint 已裝
    
    # 如果沒裝,安裝它們
    npm install --save-dev prettier eslint

    Step 2: 複製配置(3 分鐘)

    # 如果你沒有 settings.json
    touch ~/.claude/settings.json
    
    # 貼上上面「完整配置」的內容
    # 或用模板
    cp ~/claude-code-guide/templates/settings.json.template \
       ~/.claude/settings.json

    Step 3: 驗證設置(5 分鐘)

    按照上面「驗證」部分,測試 3 個 Hook 是否工作。

    Step 4: 提交到 Git(1 分鐘)

    # 可選:把配置存在 repo 裡(方便分享給團隊)
    cp ~/.claude/settings.json .claude/settings.json
    git add .claude/settings.json
    git commit -m "chore: add hooks configuration"

    進階:自訂你的 Hook

    假設你想在每次提交前自動檢查台灣稅務規則:

    {
      "before-commit": {
        "commands": [
          {
            "name": "tax_rule_check",
            "run": "grep -r 'TODO.*tax' src/ && echo 'WARNING: Tax rules need attention' || true",
            "on_failure": "warn"
          }
        ]
      }
    }

    一人公司的 Hook 最佳實踐

    ✅ DO

    1. 保持 Hook 快(< 10 秒)
    2. 從必須有的開始(測試、格式化)
    3. 定期檢查 Hook 日誌

    bash tail -50 ~/.claude/logs/hooks.log

    1. 團隊共享 Hook 配置

    bash git commit .claude/settings.json

    ❌ DON’T

    1. 不要太多 Hook(> 5 個會累)
    2. 不要 Hook 做複雜邏輯(只做檢查和格式化)
    3. 不要在 Hook 裡執行部署(太危險)

    下一步

    現在就做

    1. 複製完整配置到 ~/.claude/settings.json
    2. 測試 3 個 Hook(1-2 分鐘)
    3. 編輯一個檔案,檢查是否自動格式化
    4. 提交代碼,檢查是否自動測試
    5. 享受節省下來的時間!

    重點回顧

    CLAUDE.md:規則(永遠不變)
    設計文檔:需求(每功能一份)
    Hook:自動化(一次設置,永遠運行)
    
    一人公司工作流:
    規劃 → 寫代碼(自動格式化)
       → 提交(自動測試)
       → 完成
    
    時間:30% 規劃 + 70% 實施(不是傳統的 20% 規劃 + 80% 改動)

    下一篇預告

    第 5 篇:實戰案例 – Taiwan Invoice 3 天完成

    前四篇教了理論和細節。

    最後一篇會示範完整的一人公司工作流:

    1. Day 1:規劃 + 寫 CLAUDE.md + 設計文檔
    2. Day 2:Claude 實施 + 自動化驗證
    3. Day 3:部署 + 監控

    看完了,你就可以套用到自己的項目。


    現在就設置 Hook,開始自動化! 👋

    還有一篇,堅持到最後!💪

  • Claude Code 系列文 (2/5):CLAUDE.md — 你的編碼憲法

    ⚡ 重點摘要

    • CLAUDE.md是讓Claude永遠記住你規則的配置文件
    • 包含代碼標準、命名約定、業務規則、技術決策
    • 30分鐘投入,每週節省3-5小時重複prompt
    • 具體規則 > 模糊描述,MUST/NEVER > 建議

    前提:讀過第 1 篇,理解「規劃優先」的理念 時間投入:30 分鐘讀 + 30 分鐘寫你自己的 CLAUDE.md 收益:從此每次 prompt 少打 50% 重複內容


    這一篇的核心觀點

    傳統用法:
    prompt #1: "用 TypeScript 寫"
    prompt #2: "按照我們的命名規則..."
    prompt #3: "記得加 unit tests"
    prompt #4: "遵守這些安全規則..."
    
    === vs ===
    
    CLAUDE.md 方法:
    寫一次(CLAUDE.md 裡記錄所有規則)
    之後:Claude 自動遵守,不用每次都提醒

    實際節省:每個 prompt 減少 50-70% 的文字。


    CLAUDE.md 是什麼

    CLAUDE.md 是一份你放在項目根目錄的文檔。

    Claude Code 啟動時會自動讀取它,並把規則記住。

    # 檔案位置
    ~/your-project/CLAUDE.md
    
    # Claude 行為
    claude
     ├─ 讀取 CLAUDE.md
     ├─ 記住所有規則
     ├─ 每次你輸入 prompt 時遵守
     └─ 不再需要你重複告訴它

    類比

    • 傳統方式 = 每次進公司都告訴員工「要穿正式服裝」
    • CLAUDE.md 方式 = 第一天讀 dress code,以後自動遵守

    一人公司應該在 CLAUDE.md 裡寫什麼

    第一層:基本信息(不改的東西)

    # Project: Taiwan Invoice System
    
    **Stack**: React 18 + Node.js 18 + PostgreSQL
    **Language**: TypeScript (strict mode)
    **Main concern**: Taiwan tax law compliance
    
    ---
    
    ## Architecture Decision Log
    
    ### Decision 1: Use Strategy Pattern for tax calculation
    **Why**: Taiwan tax law changes frequently (new government = new rates)
    **Impact**: New tax type can be added in 30 min, not 8 hours
    **Done**: ✅
    
    ### Decision 2: Keep invoice data immutable once submitted
    **Why**: Taiwan tax audit requires unmodifiable records
    **Impact**: No delete/edit after submit, only void new ones
    **Done**: ✅

    好處

    • 6 個月後你自己看,能快速想起設計邏輯
    • 新人(或外包)接手,有據可查
    • Claude 理解你的業務優先級

    第二層:代碼標準(重複最多的東西)

    ## Code Standards
    
    ### File Structure
    ```
    src/
    ├── components/       # React components
    ├── pages/           # Page-level components
    ├── services/        # API calls & business logic
    ├── utils/           # Helpers
    ├── hooks/           # Custom React hooks
    ├── styles/          # CSS modules
    └── __tests__/       # Test files (mirror structure)
    ```
    
    ### Naming Conventions
    - Components: PascalCase (e.g., InvoiceForm.tsx)
    - Utilities: camelCase (e.g., calculateTax.ts)
    - Constants: UPPER_SNAKE_CASE (e.g., MAX_INVOICE_AMOUNT)
    - Database tables: snake_case (e.g., c_invoice)
    
    ### Code Quality Rules
    
    **MUST HAVE**:
    - [ ] TypeScript (no `any` type)
    - [ ] Unit tests for all logic (TDD)
    - [ ] JSDoc for public functions
    - [ ] Error handling (no silent failures)
    
    **NEVER**:
    - ❌ Hardcode config values (use .env)
    - ❌ Leave console.log() in production code
    - ❌ Commit commented-out code
    - ❌ Use var (only let/const)

    為什麼重要

    • Claude 有了標準,自動遵守
    • 省去每個 prompt 都要說「按 TypeScript best practices」
    • 代碼風格一致,review 更快

    第三層:業務邏輯(最容易被遺忘的)

    ## Taiwan-Specific Rules
    
    ### Tax Calculation
    - Standard VAT: 5% (applies to most goods)
    - Zero-rated: 0% (exports, specific items)
    - Tax-exempt: 0% (non-profit, some services)
    - Input tax can be deducted if invoice dated in same month
    
    ### Invoice Rules
    - Invoice number format: GUN (Government Uniform Number)
    - Sequence must be continuous
    - Cannot be modified after submission
    - Must include buyer's company ID + name
    - QR code is mandatory for official submission
    
    ### Compliance
    - Must report to MOPS (Ministry system) by 15th of next month
    - Annual audit by tax bureau
    - Keep records for 10 years

    為什麼重要

    • Claude 有了背景,不會犯「常見的 bug」
    • 減少審查時需要找的問題
    • 新人學習曲線 ÷ 2

    第四層:技術決策(省掉最多討論時間)

    ## When You Ask Claude to Build Something
    
    ### Before Implementation (Planning Phase)
    1. Claude enters Plan Mode automatically
    2. Claude reads this CLAUDE.md + design docs
    3. Claude proposes approach
    4. **YOU APPROVE** (or suggest changes)
    5. Claude implements
    
    ### Testing Strategy
    - Unit tests: Must cover edge cases
    - Integration tests: For API + database interaction
    - Manual testing: Only for UI/UX
    - Coverage target: > 85%
    
    ### Code Review Checklist
    - [ ] Logic is correct (test passes)
    - [ ] Taiwan business rules followed
    - [ ] No security holes
    - [ ] Performance acceptable
    - [ ] Error messages are clear (in Chinese)
    - [ ] Documentation updated

    為什麼重要

    • Claude 知道你的評審標準
    • 自動寫出符合預期的代碼
    • 不用反覆改

    一人公司版本的 CLAUDE.md 精簡版

    如果你覺得上面太複雜,這是最小版本(30 分鐘可寫完):

    # Taiwan Invoice System
    
    ## Stack & Language
    - TypeScript + React 18 + Node.js
    - Database: PostgreSQL
    
    ## Code Rules
    - File structure: components/ pages/ services/ __tests__/
    - Names: Components = PascalCase, functions = camelCase, constants = UPPER_CASE
    - MUST: TypeScript strict, unit tests, JSDoc, error handling
    - NEVER: console.log, hardcoded config, var, no tests
    
    ## Business Rules
    - Tax rates: 5% standard, 0% zero-rated, 0% exempt
    - Invoice format: GUN, continuous sequence, immutable after submit
    - Compliance: Report to MOPS by 15th, keep records 10 years
    
    ## When You Ask Me to Build
    1. I'll enter Plan Mode
    2. Read design doc + this file
    3. Propose approach (you approve)
    4. Implement with tests
    5. You review
    
    ## Important Decisions
    1. Tax calculation uses Strategy Pattern (easy to add new rates)
    2. Invoices immutable after submit (Taiwan law requirement)
    
    ---
    
    Done! Keep this updated as rules change.

    寫這個花了多少時間? 30-45 分鐘。

    省了多少時間? 每週 3-5 小時(因為不用重複解釋)。


    真實案例:有沒有 CLAUDE.md 的差別

    沒有 CLAUDE.md 的一人公司

    Day 1, Prompt:
    "Build invoice form with validation.
    Use React, TypeScript, follow best practices."
    
    Claude builds... but:
    - Uses var instead of const ❌
    - Only 60% test coverage ❌
    - API call has no error handling ❌
    - Component name is lowercase ❌
    
    You: "Oh no, 改了改了改了"
    時間消耗:8 小時 (1 小時寫 + 7 小時改)

    有 CLAUDE.md 的一人公司

    Day 1, CLAUDE.md 寫好,然後 Prompt:
    "Build invoice form with validation"
    
    Claude builds:
    - Automatically uses let/const ✅
    - Automatically writes unit tests ✅
    - Automatically adds error handling ✅
    - Automatically uses PascalCase ✅
    
    You: "一次到位!"
    時間消耗:2.5 小時 (30 分鐘規劃 + 2 小時實施)

    節省時間:5.5 小時 per feature。 一個月(~4 features)= 22 小時 = 3 整天!


    怎樣寫一個好的 CLAUDE.md

    ❌ 常見錯誤

    # Project Rules
    
    要遵守我們的架構。要寫好代碼。不要有 bug。
    
    Done!

    問題:太模糊,Claude 無法遵守。

    ✅ 正確方式

    # Project Rules
    
    ## Code Quality
    - MUST: TypeScript strict mode, no `any` type
    - MUST: Unit tests for all functions (Jest)
    - MUST: Error handling (try-catch or error state)
    - NEVER: console.log in production code
    - NEVER: var keyword (use let/const)
    
    ## File Naming
    - Components: PascalCase (InvoiceForm.tsx)
    - Utilities: camelCase (calculateTax.ts)
    - Tests mirror source: src/foo.ts → src/__tests__/foo.test.ts

    好處:具體、可驗證、Claude 能遵守。

    規則

    1. 具體 > 模糊
    • ❌ 「寫好代碼」
    • ✅ 「TypeScript strict mode, coverage > 85%, no console.log」
    1. 實例 > 敘述
    • ❌ 「按照公司命名慣例」
    • ✅ 「組件 = PascalCase (InvoiceForm.tsx), 函數 = camelCase (calculateTax.ts)」
    1. MUST/NEVER > 建議
    • ❌ 「考慮使用 const」
    • ✅ 「MUST use const (never var)」
    1. 定期更新 > 一次寫完就忘
    • 每月審視 1 次
    • 如果發現 Claude 經常犯某個錯誤,加入 CLAUDE.md

    一人公司老闆的 CLAUDE.md 檢查清單

    寫完了嗎?檢查一下:

    • 基本信息
    • ☐ 項目名稱
    • ☐ 技術棧
    • ☐ 主要業務邏輯
    • 代碼標準
    • ☐ 文件結構
    • ☐ 命名約定
    • ☐ TypeScript/語言設置
    • ☐ 測試要求
    • 業務規則
    • ☐ 稅務/財務規則(如有)
    • ☐ 數據有效性
    • ☐ 合規要求
    • 決策日誌
    • ☐ 架構決策 + 理由
    • ☐ 為什麼選這個技術
    • 評審標準
    • ☐ 什麼樣的代碼才算「完成」
    • ☐ 什麼是「不接受」

    如何開始

    Step 1:複製模板(1 分鐘)

    cp ~/claude-code-guide/templates/CLAUDE.md.template \
       ~/your-project/CLAUDE.md

    Step 2:填入你的內容(30 分鐘)

    打開編輯器,按照上面的框架填入:

    1. 你的技術棧
    2. 你的命名約定
    3. 你的業務規則
    4. 你的決策理由

    Step 3:提交到 Git(2 分鐘)

    git add CLAUDE.md
    git commit -m "chore: add project rules"
    git push

    Step 4:開始用(即時)

    claude
    
    user: "Add a new invoice field called customer_contact_number"
    # 不用再說「用 TypeScript」、「加測試」、「命名要駝峰」
    # Claude 自動知道

    一個月後會發生什麼

    Week 1

    • CLAUDE.md 寫好
    • 第一個功能用新規則
    • “哦,還是得改一些東西…”
    • 把發現的規則加入 CLAUDE.md

    Week 2-3

    • Claude 開始學到你的風格
    • 改動變少了
    • “不錯,大部分對了”

    Week 4

    • 新功能一次到位 90%+ 正確
    • 只需要微調
    • 驚嘆「怎麼忽然快這麼多」

    Month 2+

    • CLAUDE.md 成為寶貴資產
    • 新人/外包根據 CLAUDE.md 快速上手
    • 你的編碼風格一致,代碼可維護性 ↑

    一個常見問題:CLAUDE.md 應該多詳細

    答案:「足夠清楚讓 Claude 不猜測」

    測試方法:

    1. 寫 CLAUDE.md
    2. 給 Claude 一個簡單的 prompt
    3. 看結果
       - 如果 Claude 做對了 90%+ → 夠詳細
       - 如果還要改 → 加更多細節

    一人公司的理想狀態

    • 一份 1000-2000 字的 CLAUDE.md
    • 涵蓋 70% 的日常情況
    • 20% 用 design docs(下一篇講)
    • 10% 需要臨時 prompt

    重點回顧

    CLAUDE.md 是「一次性投資」:
    
    30 分鐘寫 CLAUDE.md
      ↓
    之後每周省 3-5 小時
      ↓
    一年省 150+ 小時
      ↓
    相當於半個全職開發者的成本!

    你如果是一人公司老闆,這是值得的投資。


    下一篇預告

    第 3 篇:設計文檔模板

    CLAUDE.md 處理「永遠不變的規則」

    那「會變的東西」(業務邏輯、UI 流程)怎麼辦?

    設計文檔

    下一篇我會告訴你:

    • 怎樣寫一份 2 小時內完成的設計文檔
    • 讓 Claude 看懂你的想法,一次實施正確
    • 實例:Invoice 功能設計文檔

    現在就做這一件事

    1. 打開編輯器
    2. 複製上面的「精簡版 CLAUDE.md」
    3. 填入你的技術棧和規則
    4. 保存為 ~/your-project/CLAUDE.md
    5. git add + commit

    花時間:30 分鐘 收益:未來每週省 3-5 小時

    下一篇見!👋

  • Claude Code 系列文 (3/5):設計文檔 — 讓 Claude 一次做對

    ⚡ 重點摘要

    • 設計文檔解決「Claude不是心靈讀者」的問題
    • 最小版本20分鐘:What+How+Edge Cases+Done When
    • 投入30分鐘,節省6小時改動,ROI 600%
    • 中等以上複雜度的功能都應該寫設計文檔

    前提:已寫好 CLAUDE.md(第 2 篇) 時間投入:20-30 分鐘設計 + 2 小時實施(vs 8 小時傳統方式) 成果:90%+ 一次正確,最多微調 1-2 處


    核心觀點

    CLAUDE.md:永遠的規則(不變)
       ↓
    設計文檔:這次功能的具體需求(會變)
       ↓
    實施:Claude 讀完兩者,一次到位

    實際效果

    傳統:
    user: "加個 PDF 匯出功能"
    claude: 實施... 但漏了 QR code、沒考慮大文件、錯誤處理不完善
    result: 改 3 次,花 8 小時
    
    ===
    
    設計優先:
    user: 先寫「PDF 匯出設計文檔」
       ├─ 輸出什麼欄位
       ├─ 格式細節
       ├─ 大文件怎麼處理
       └─ 邊界情況怎麼做
    
    claude: 讀完設計,實施功能
    result: 一次到位,花 2 小時

    為什麼設計文檔這麼關鍵

    原因 1:Claude 不是心靈讀者

    你想要:
    "PDF 應該很專業,像官方發票"
    
    Claude 理解的:
    "Generate a PDF" (可能就是基礎格式)
    
    ===
    
    如果你寫:
    "PDF 格式:
     - 頁眉:公司 logo + 發票編號
     - 內容:3 欄表格 (品項|數量|金額)
     - 頁尾:二維碼 + 簽章區域
     - 字體:14pt 標題,11pt 內容"
    
    Claude 理解的:
    正確無誤 ✅

    原因 2:邊界情況很容易漏

    你沒說的情況:
    - 如果發票超過 1 頁怎麼辦?
    - 品項名稱很長怎麼折行?
    - 金額超過 99,999,999 怎麼顯示?
    
    Claude 的猜測:
    - 默認假設只有 1 頁
    - 品項名稱截斷
    - 金額省略號或出錯
    
    ===
    
    設計文檔說清楚:
    - 多頁:自動翻頁,每頁重複頁眉
    - 長品項:自動折行到 2-3 行,調整行高
    - 大金額:科學計數法或分行顯示
    
    Claude:
    做對 ✅

    原因 3:審核快得多

    沒有設計文檔:
    你看代碼 → "嗯... 這個邏輯有點問題?"
                → 要改 → 再看一遍 → 還要改
    時間:1-2 小時審核
    
    ===
    
    有設計文檔:
    設計文檔清楚 → Claude 一次到位
    審核只需檢查「有沒有按設計文檔做」
    時間:15 分鐘審核

    一人公司的設計文檔長什麼樣

    最小版本(20 分鐘寫完)

    假設你要加「發票篩選功能」:

    # Invoice Filter Feature
    
    ## What
    用戶可以按日期、狀態、金額篩選發票列表
    
    ## How
    ### Page Flow
    1. 使用者進入「發票清單」頁面
    2. 頁面上方顯示篩選器:
       - Date range picker (from - to)
       - Status dropdown (全部 / 草稿 / 已提交 / 已申報)
       - Amount range slider (0 - 999,999)
    3. 用戶選擇條件 → 自動篩選列表(無需按搜尋按鈕)
    4. 篩選結果顯示在表格
    
    ### Data Model
    ```sql
    -- 輸入參數
    filter: {
      dateFrom: Date,
      dateTo: Date,
      status: enum ['DRAFT', 'SUBMITTED', 'FILED'],
      amountMin: number,
      amountMax: number
    }
    ```
    
    ### Edge Cases
    - 沒有搜尋結果 → 顯示「沒有符合條件的發票」
    - 篩選中 → 顯示 loading spinner
    - API 錯誤 → 顯示「載入失敗,請重試」
    
    ## Why
    - 用戶有 100+ 發票,手動找很慢
    - 會計需要按日期整理報表
    - 管理者需要看特定金額範圍的交易

    花時間:20 分鐘 代碼行數:20-30 行(因為清晰,不用試錯)

    完整版本(30 分鐘寫完)

    如果功能更複雜,加這些:

    # Invoice PDF Export Feature
    
    ## 業務背景
    台灣政府要求發票有統一格式(GUN 標準)
    用戶要匯出發票給客戶或存檔
    
    ## 用戶故事
    "作為發票系統使用者,我想點擊『匯出 PDF』按鈕,
      得到一份官方格式的 PDF,這樣我可以寄給客戶或稅務局"
    
    ## 功能範圍
    ### 必須有
    - [ ] PDF 包含所有發票欄位(發票號碼、日期、品項、金額等)
    - [ ] GUN 格式(台灣政府標準)
    - [ ] 二維碼(可掃描驗證)
    - [ ] 頁眉和頁尾
    - [ ] 多頁自動分頁
    
    ### 可以有(下個版本)
    - [ ] 批量匯出(多張發票 1 個 PDF)
    - [ ] 自訂 logo
    - [ ] 簽章區域
    
    ### 不包含
    - [ ] 自訂格式(template 系統太複雜)
    - [ ] 列印功能(瀏覽器列印已足)
    
    ## API/Data
    ### Input
    ```typescript
    POST /api/invoices/{id}/export-pdf
    
    // Response
    {
      pdf_url: "https://..../invoice_2024_001.pdf",
      generated_at: "2024-03-25T10:30:00Z"
    }
    ```
    
    ## UI/UX
    ### 按鈕位置
    - 在「發票詳情」頁面右上角
    - 按鈕文字:「匯出 PDF」
    - 點擊後:shows loading 3 秒,下載 PDF
    
    ### 錯誤情況
    - 網路錯誤 → 「無法生成 PDF,請重試」
    - 發票不完整 → 「發票資料不完整,無法匯出」
    - 檔案太大(> 10MB) → 「檔案過大,請聯絡管理員」
    
    ## 技術決策
    ### Why jsPDF instead of server-side?
    - jsPDF:快速、實時、不佔服務器資源 ✅
    - Server-side:需要 Node.js 套件、佔内存
    
    ### Why QR code?
    - Taiwan GUN requirement
    - Users can verify authenticity by scanning
    
    ## 測試 Checklist
    - [ ] PDF 內容完整(所有欄位都在)
    - [ ] 格式符合 GUN 標準(對齐、字體大小)
    - [ ] 二維碼可掃描
    - [ ] 多頁發票能正確分頁
    - [ ] 邊界情況:長品項名稱、大金額
    - [ ] 錯誤訊息清晰
    
    ## 完成條件(Acceptance Criteria)
    - [ ] 用戶點擊按鈕能下載 PDF
    - [ ] PDF 格式符合 GUN 標準
    - [ ] 二維碼正確生成
    - [ ] 網路慢時顯示 loading
    - [ ] 有錯誤時顯示清晰的訊息
    - [ ] 所有測試通過(coverage > 85%)

    花時間:30 分鐘 代碼行數:50-80 行(因為設計完整,邊界情況少)


    如何快速寫設計文檔(給一人公司老闆)

    方法 1:從 User Story 開始(最快)

    ## 功能
    允許用戶標記發票為「已審核」
    
    ## 用戶故事
    "As a manager, I want to mark invoices as reviewed,
     so I can track which invoices have been checked"
    
    ## 怎麼做
    1. 發票表格增加「審核」按鈕
    2. 點擊後標記為「已審核」,按鈕變灰
    3. 可以「取消審核」改回去
    
    ## Edge Cases
    - 多人同時審核同一張發票? → 最後一次改動獲勝
    - 已提交的發票能審核嗎? → 能,審核和提交獨立
    
    ## Done When
    - [ ] 按鈕會出現
    - [ ] 狀態能改變
    - [ ] 數據持久化
    - [ ] 網路慢時有 loading

    花時間:10-15 分鐘

    方法 2:從技術問題開始(有爭議時)

    ## 問題
    稅務計算邏輯現在在 service/taxCalculator.ts,
    很難測試,也難新增新稅種
    
    ## 提議
    用 Strategy Pattern 重構
    
    ## 對比
    ### 現狀(有問題)
    ```typescript
    if (type === 'standard') {
      tax = amount * 0.05;
    } else if (type === 'zero') {
      tax = 0;
    }
    // 很多 if,難擴展
    ```
    
    ### 改進後
    ```typescript
    const strategy = TaxStrategyFactory.get(type);
    tax = strategy.calculate(amount);
    // 新稅種只需新建 class,無需改舊代碼
    ```
    
    ## 工作
    1. 建立 TaxStrategy interface
    2. 建立 StandardTaxStrategy, ZeroTaxStrategy, ExemptTaxStrategy
    3. 建立 TaxStrategyFactory
    4. 遷移現有邏輯
    5. 寫測試
    
    ## 完成條件
    - [ ] 所有現有測試通過
    - [ ] 無新 bug
    - [ ] 代碼行數 < 現狀(因為減少 if)
    - [ ] 新稅種能在 30 分鐘內加入

    花時間:15-20 分鐘


    設計文檔和 CLAUDE.md 的區別

    項目CLAUDE.md設計文檔
    頻率一年改幾次每個功能寫一份
    內容規則、標準這次功能的細節
    例子「所有 component 用 PascalCase」「篩選器有 date picker 和 status dropdown」
    變化不變常變
    時效永遠有用功能完成後就 archive

    常見問題

    Q: 設計文檔很麻煩嗎?

    A: 不麻煩。其實省時間。

    對比:

    • ❌ 不寫設計文檔:2 小時設計(腦子裡)+ 8 小時實施 + 5 小時改 = 15 小時
    • ✅ 寫設計文檔:30 分鐘寫 + 2 小時實施 + 0.5 小時改 = 2.5 小時

    省時 6 倍。

    Q: 如果需求改了怎麼辦?

    A: 更新設計文檔,再讓 Claude 改。

    原設計:篩選器是下拉選單
    新需求:改成複選框(可選多個狀態)
    
    做法:
    1. 更新設計文檔的 UI/UX 部分
    2. Prompt: "按照新設計文檔改篩選器"
    3. Claude 改
    4. 完成

    Q: 小功能也要寫設計文檔嗎?

    A: 看複雜度

    • 簡單(邏輯 < 5 行):無需文檔,直接 prompt
    • 中等(邏輯 20-50 行):寫簡單版設計文檔(10 分鐘)
    • 複雜(邏輯 > 50 行,多頁面):寫完整版設計文檔(30 分鐘)

    一般來說:中等及以上都要寫


    實戰範例:Taiwan Invoice 設計文檔

    這是真實的設計文檔,你可以直接改成自己的:

    # Taiwan Invoice System - Design Doc
    
    ## 概述
    系統需要符合台灣官方發票格式 (GUN)
    用戶可以生成、儲存、匯出發票
    
    ## 模組 1: Invoice Data Model
    
    ### 資料結構
    ```sql
    CREATE TABLE c_invoice (
      id UUID PRIMARY KEY,
      invoice_number VARCHAR(10),  -- e.g., "001", "002"
      invoice_date DATE,
      company_name VARCHAR(255),
      company_tax_id VARCHAR(8),
      customer_name VARCHAR(255),
      customer_tax_id VARCHAR(8),
      items JSONB,  -- [{name, qty, price, amount}, ...]
      subtotal DECIMAL(12,2),
      tax_amount DECIMAL(12,2),
      total DECIMAL(12,2),
      status ENUM('DRAFT', 'SUBMITTED', 'FILED'),
      created_at TIMESTAMP,
      updated_at TIMESTAMP
    );
    ```
    
    ## 模組 2: Tax Calculation
    
    ### 規則
    - 標準稅率:5%(大部分商品)
    - 零稅率:0%(出口商品)
    - 免稅:0%(非營利組織)
    - 進項稅扣除:同月內才能計算
    
    ### 計算邏輯
    ```
    total_tax = sum(item.tax for item in items)
    where tax = item.amount * tax_rate
    
    if invoice.status == 'SUBMITTED':
      deductible_tax = tax (可抵扣)
    else:
      deductible_tax = 0 (草稿狀態不計)
    ```
    
    ## 模組 3: PDF Export
    
    ### 輸出格式
    頁面:A4 (210mm x 297mm)
    邊距:10mm
    
    頁眉:
    - 左:公司 logo (40x40mm)
    - 中:「統一發票」(20pt bold)
    - 右:發票號碼 (16pt)
    
    內容:
    - 發票日期
    - 買賣雙方資訊
    - 3 欄表格:品項、數量、金額
    - 合計 / 稅額 / 總金額
    
    頁尾:
    - QR code (25x25mm)
    - 簽章區域
    
    ## 完成條件
    - [ ] 資料模型完整
    - [ ] 稅務計算正確
    - [ ] PDF 格式符合 GUN 標準
    - [ ] 所有 edge cases 測試通過

    一人公司老闆的建議

    做法 1:檔案形式

    寫在 docs/designs/ 資料夾:

    docs/designs/
    ├── invoice-filter.md
    ├── invoice-pdf-export.md
    └── tax-calculation.md

    提交到 git,成為代碼庫的一部分。

    做法 2:更新設計文檔的時機

    • 需求改變時
    • 發現 bug 時
    • 新的 edge case 出現時

    加一句:

    ## 更新日誌
    - 2024-03-25:初版
    - 2024-03-26:加入多頁分頁需求
    - 2024-03-27:修正邊界情況 (長品項名稱)

    下一步

    現在就做

    選一個你想要的功能(不用很大),寫設計文檔:

    1. 打開編輯器

    bash touch docs/designs/[feature-name].md

    1. 按照上面的「最小版本」模板寫
    • What (是什麼)
    • How (怎麼做)
    • Edge cases (邊界情況)
    • Done when (完成條件)
    1. 花時間:15-20 分鐘
    1. 給 Claude

    “`bash claude user: “這是 [功能名稱] 的設計文檔 [貼上設計文檔]

    請按照這個設計實施” “`

    1. 對比傳統方式
    • 時間縮短 60-70%
    • 修改次數 ÷ 3
    • Bug 數量 ÷ 2

    重點回顧

    CLAUDE.md:「怎樣寫好代碼」(寫一次,永遠用)
       ↓
    設計文檔:「這次要寫什麼」(每功能一份)
       ↓
    Claude:一次實施正確 ✅

    投資回報

    • 每份設計文檔花 30 分鐘
    • 省 6 小時實施時間
    • 一年 (~50 功能) 省 300 小時 = 6 周工作量!

    下一篇預告

    第 4 篇:Hook 自動化

    有了 CLAUDE.md 和設計文檔,代碼質量大幅提升。

    但還有很多重複的手動工作:

    • 每次編輯後手動 lint
    • 每次 commit 前手動執行測試
    • 每週手動檢查依賴更新

    Hooks 自動化這些!

    下一篇會告訴你:

    • 怎樣 5 分鐘設置 3 個最重要的 Hook
    • 節省每週 5-10 小時手動工作
    • 實例:after-edit (auto-format) + before-commit (auto-test)

    現在就開始寫第一個設計文檔! 👋

  • Claude Code 系列文 (1/5):一人公司的開發穩定性秘密

    ⚡ 重點摘要

    • 一人公司最大問題:時間少,重複改動多
    • 規劃優先方法:CLAUDE.md + 設計文檔 → Claude一次做對
    • 每個功能開發時間從8-16小時縮短到2-3小時
    • 本系列5篇教你建立完整的一人公司開發系統

    寫給:一人公司老闆、獨立開發者 痛點:時間少、要求多、不能重複勞動 解決方案:用規劃優先的工作流 + Claude Code


    你的困境(認真的)

    你一個人同時是:

    • 💼 產品經理(要什麼功能)
    • 🔨 開發者(怎麼建)
    • 🧪 QA(有沒有 bug)
    • 📚 文檔編寫者(怎麼用)
    • 🚀 運維(部署和監控)

    時間分配很絕望

    • 實際寫代碼:可能只有 30%
    • 重複做同樣的決策:20%
    • 找 bug、修 bug:20%
    • 手動測試:15%
    • 其他雜事:15%

    結果

    • 一個月才能交付一個功能
    • 沒時間優化
    • 沒時間文檔
    • 夢裡都在 debug

    一般人的解決方案(都不對勁)

    ❌ 方案 1:招一個開發者

    • 成本:月薪 $2000-4000
    • 你的增加成本:70-80% (管理、協調、溝通)
    • 結果:不划算,特別是你的需求變化快

    ❌ 方案 2:外包給開發公司

    • 成本:$1000-3000 per feature
    • 問題:
    • 他們不懂你的業務邏輯
    • 一堆 bug 需要反覆修
    • 根本沒人維護
    • 改 UI 要等一周

    ❌ 方案 3:用低代碼/無代碼工具

    • 優點:快速上手
    • 缺點:
    • 超過基本功能就卡住
    • 無法擴展
    • 數據鎖定在平台
    • 月費永不停止

    ✅ 我的方案:Claude Code + 規劃優先

    這個方案的核心理念:

    少 prompt(提示詞)→ 多文檔(規劃文件)→ 穩定開發

    運作邏輯

    傳統 Claude Code 用法:
    user: "加個登入功能"
    claude: "好,現在實施..."
    結果: 80% 對,20% 要改,改 3 次才對 ❌
    
    ===
    
    我的方法:
    user: 先寫設計文檔
       ├─ 登入流程圖
       ├─ 數據模型
       ├─ API 規格
       ├─ 錯誤情況
       └─ 安全檢查點
    
    claude: 讀完設計文檔
           → 一次到位 ✅
           → 90%+ 對
           → 最多微調 1-2 次

    為什麼效果這麼好?

    1. 你花 2 小時規劃,省 8 小時改
    • Claude 少猜測 80%
    • 實施清晰,bug 少
    1. 從此不重複決策
    • 設計一次,可重用
    • 新人接手也看得懂
    • 6 個月後改需求,有據可查
    1. Claude 更聰明
    • 它讀懂需求精細度 ↑ → 代碼品質 ↑
    • 不再「我猜你想要」
    • 自動找出邊界情況
    1. 自動化率提高
    • Hooks 自動 lint + format
    • 測試自動跑
    • 手動操作 ↓ 50%

    一人公司的黃金公式

    CLAUDE.md (5 min 寫)
      ↓
    設計文檔 (20-30 min 寫)
      ↓
    Claude Code 實施 (1-2 hours)
      ↓
    驗收 (15 min)
      ↓
    上線 (5 min)
      ↓
    自動化監控 (0 min,Hook 搞定)
    
    總時間:2-3 hours per feature ✅

    vs

    傳統方式:
    實施 → 測試 → 修改 1 → 測試 → 修改 2 → ...
    總時間:8-16 hours per feature ❌

    這個系列會教你什麼

    📖 第 1 篇 (本篇):為什麼規劃優先

    📖 第 2 篇:建立你的「編碼憲法」

    • CLAUDE.md 怎麼寫
    • 一次性規則,永遠生效
    • 讓 Claude 記住你的風格和要求

    你寫一次:「所有 API 返回都要帶 error_code」
    之後:Claude 永遠自動加這個,不用提醒

    📖 第 3 篇:設計文檔模板

    • Invoice 系統設計文檔怎麼寫
    • 從業務需求到技術規格
    • 讓 Claude 能一次實施正確

    📖 第 4 篇:自動化 Hook

    • 自動格式化、自動測試、自動檢查
    • 從此沒有手動 lint 這種事
    • 節省每週 5-10 小時

    📖 第 5 篇:實戰案例 – Taiwan Invoice System

    • 完整的一人公司開發流程
    • 從零到部署,3 天內完成
    • 如何用 Plan Mode 少 prompt

    一人公司老闆應該知道的三件事

    事實 1:你的時間不是資源,是稀缺商品

    你的時間 ≠ 開發者的時間

    你 1 小時的時間價值 = 你一個小時的營收機會成本

    所以

    • ✅ 花 30 分鐘規劃(你做)
    • ❌ 不要花 8 小時反覆改(讓 Claude 做,正確率 90%+)

    事實 2:文檔是最好的投資

    一個一人公司最怕什麼?

    • 不是 bug
    • 不是需求改變
    • 是「我忘了為什麼這樣設計」

    3 個月後

    • ❌ 沒文檔:「為什麼税務計算這樣寫?誰知道… 反正改不了」
    • ✅ 有文檔:「哦,這是因為台灣稅法 §96,我記得」

    事實 3:規劃優先,自動化第二

    很多人想著「如何自動化我的工作」

    正確的順序是「如何規劃好我的工作」才能「自動化」

    類比

    • 製造業 1.0:手工 → 效率低
    • 製造業 2.0:流程化 + 自動化 → 效率高
    • 開發 1.0:隨意寫代碼 + 手動測試 → 慢
    • 開發 2.0:規劃 + 自動化 → 快

    你應該期待什麼結果

    Week 1(學習)

    • 讀完這個系列(2 小時)
    • 寫出你的 CLAUDE.md(1 小時)
    • 設置 Hook(30 分鐘)
    • 第一個功能用新方法(3 小時)

    Week 2-4(習慣)

    • 每個功能都有設計文檔(快速發現問題)
    • 自動化 lint/test(省去手動操作)
    • 改需求不再是「全部改」,而是「增量改」

    Month 2(收穫)

    • 開發速度 ×3
    • bug 率 ÷2
    • 個人壓力 ÷3
    • 有時間優化產品

    Month 3+(習慣)

    • 文檔成為資產(不是負擔)
    • 新功能開發時間可預測(不再「要多久」→「大概 2 天」)
    • 可以考慮擴招(有文檔,新人能快速上手)

    下一篇預告

    第 2 篇:CLAUDE.md – 你的編碼憲法

    我會教你怎樣用一份文檔,讓 Claude 永遠記住:

    • 你的代碼風格
    • 你的業務邏輯
    • 你的命名約定
    • 你的安全要求

    寫一次,永遠受用。


    現在就開始

    問自己三個問題:

    1. 我上週浪費了多少時間在「改 bug」上?
    • < 3 小時:你還不夠痛苦,可以緩一緩
    • 3-10 小時:現在該改了
    • \> 10 小時:你應該昨天就開始
    1. 我有沒有寫過設計文檔?
    • 沒有:你損失了 80% 的時間
    • 有,但是手寫的:轉換成模板化的吧
    1. 我願不願意花 2 小時規劃,換 8 小時省下來?
    • 願意:到第 2 篇見!
    • 不願意:你可能不是一人公司老闆該有的效率思維

    系列文快速導航

    篇章標題重點你需要做什麼
    1️⃣為什麼規劃優先理解痛點讀完,認同理念
    2️⃣CLAUDE.md 編碼憲法寫一份文檔複製模板,填入自己的規則
    3️⃣設計文檔模板學會規劃為下個功能寫設計文檔
    4️⃣Hook 自動化節省時間設置 3-5 個 Hook
    5️⃣實戰:Taiwan Invoice看完整案例套用到自己的項目

    核心觀念一句話

    「規劃優先,少 prompt;文檔優先,少反覆。」

    多花 30% 規劃時間,省 70% 改動時間。

    一人公司的職責太多,不能靠「反覆試錯」活著。

    下一篇見!👋

  • Claude Code Agent Teams:從穩定執行到自動化代碼審查的完整指南

    Claude Code Agent Teams:從穩定執行到自動化代碼審查的完整指南

    本文整合三部分內容:(1) Agent Teams 的穩定執行框架;(2) 全局代碼審查規則系統的設計與實施;(3) 自動化雙 Agent 審查機制(架構師 + PM)的完整實現方案。這是一份實踐導向的指南,涵蓋從資源評估、權限配置、到自動觸發流程的所有細節。

    第一部分:Agent Teams 的三層穩定執行框架

    1.1 評估層(Assessment)— 前置資源檢查

    每次建立 Agent Team 前,必須執行三個評估動作:

    1. 記憶體現狀:執行 free -h 或查看 Docker stats,確認可用容量
    2. 計算容量:根據模型選擇計算最大並行 agent 數(opus ~1GB、sonnet ~600MB、haiku ~400MB)
    3. 決策與確認:列出 agent 角色、模型、預估記憶體,取得用戶確認後才建立

    模型選擇口訣

    • 需要「想」 → Opus(架構決策、安全設計、業務邏輯、複雜 SQL、Code Review)
    • 需要「做」 → Sonnet(CRUD 實作、API 對接、測試撰寫、文件撰寫)
    • 需要「找」 → Haiku(檔案掃描、配置對比、API 整合)

    1.2 確認層(Confirmation)— 用戶決策前置

    建立 Team 前,必須向用戶列出清晰的角色定義和資源計劃,包括:

    • 各 agent 的角色名稱與職責
    • 指定的 AI 模型及其預估記憶體
    • 總計容量和系統可用容量
    • 並行數量和預期執行順序

    只有在用戶明確確認後,才啟動 TeamCreate 和後續任務建立。這一步防止了資源耗盡、權限誤配、以及 agent 之間通訊不暢的根本原因。

    1.3 執行層(Staged Execution)— 分階段序列化

    即使資源充足,也不應讓所有 agent 同時轟炸執行。分階段策略包括:

    1. 第 1 階段:啟動基礎設施 agent(如資源管理、環境配置)
    2. 第 2 階段:啟動 researcher agent,進行資訊搜集與分析
    3. 第 3 階段:啟動 architect agent,設計方案
    4. 第 4 階段:啟動 developer agent,進行實作
    5. 第 5 階段:啟動驗證 agent,進行測試與審查

    各階段 agent 完成任務後,主動進入「空閒」狀態並通知團隊。不進行「拉取」操作,而是由前置 agent 完成後才推進下一階段。這種設計確保:

    • 前置依賴滿足後才啟動
    • 消息傳遞清晰,無需輪詢
    • 系統記憶體壓力均勻分散
    • 故障範圍可控,易於除錯

    第二部分:全局代碼審查規則系統架構

    2.1 雙層規則設計

    代碼審查規則分為兩層,確保通用性和專案適應性的平衡:

    • 全局層~/.claude/memory/):所有項目共享的代碼品質標準(SOLID 原則、Design Pattern、代碼異味、測試規範、語言特定規範)
    • 項目層項目/.claude/code-review-rules.md):專案特定的業務邏輯規則、設計稿映射、外部驗證清單

    2.2 全局規則內容結構

    code-review-global-rules.md(SOLID、Pattern、Code Smell、Testing)

    • SOLID 五項原則的定義和違反示例
    • Design Pattern 反面示例(God Object、Feature Envy 等)
    • 代碼異味檢查清單(N+1、Magic Number、過長方法、過多參數、重複代碼、複雜邏輯)
    • 單元測試最低標準(80%+ 覆蓋、邊界情況、Mock vs Real Dependency)

    code-review-languages.md(Java、Python、JavaScript/TypeScript、SQL)

    • 命名規範(類名、方法名、變數名、常數、包名)
    • 包結構約定(分層架構:domain/service/repository/validator 等)
    • 異常處理規範
    • 語言特定工具規範(Lombok、OSGi、Type Hint、Docstring 等)

    code-review-feedback.md(架構師與 PM Agent 職責和對焦框架)

    • 架構師 Agent:SOLID 遵循度(1-5 分)、Design Pattern、Code Smell、測試覆蓋、異常處理、語言規範
    • PM Agent:功能 vs 設計稿對齐、API 返回值、邊界情況、業務邏輯、用戶體驗、外部驗證需求
    • 雙方對焦框架:架構師問「代碼設計能支持你檢查的功能嗎?」,PM 反問「這些功能需求會造成架構問題嗎?」

    code-review-process.md(自動觸發、Agent 角色、聯合報告格式)

    • 觸發點:Task marked as completed
    • Agent 角色 Prompt(初版):架構師評估、PM 評估、聯合對話
    • 聯合報告格式:分離的評估 + 統一優先級排序 (P0/P1/P2)
    • 最終判定:Pass / Needs Work / Fail

    2.3 項目層規則(台灣發票系統範例)

    項目規則分為三類:

    A. 業務邏輯規則(優先級最高)
    • 進項稅計算公式(進項稅金額 = 發票金額 × 5%,DECIMAL(19,2) 向下取整)
    • 三聯式(不含稅)vs 二聯式(含稅)的會計處理邏輯
    • 進項稅折讓的強制申報期限(當期內必須申報,無延後例外)
    • 兼營營業人的比例扣抵公式(可扣抵進項稅 = 總進項稅 × (應稅銷售額 / 總銷售額))
    • 發票號碼連續性檢查和遺失空白發票記錄
    • 發票開立日期 → 申報期間的映射(1-2月→第1期、3-4月→第2期 等,共六期)
    B. 設計稿對齐規則(優先級次之)
    • API 端點的返回格式和欄位定義
    • 邊界情況的預期響應(零金額、負數、超大金額)
    • 數據型態和範圍檢查
    C. 外部驗證清單(優先級最低,但定期更新)
    • 進項稅可扣抵期限是否仍為 10 年
    • 電子發票強制規定的生效狀態
    • 設計稿版本確認
    • 技術規範(iDempiere PO 模型、OSGi Bundle)

    第三部分:自動化雙 Agent 審查機制的實現

    3.1 TaskCompleted Hook 配置

    .claude/settings.local.json 中配置 TaskCompleted Hook,每當任務標記完成時,自動觸發架構師和 PM 兩個 agent 進行深度審查:

    {
      "hooks": {
        "TaskCompleted": [
          {
            "hooks": [
              {
                "type": "agent",
                "prompt": "Conduct comprehensive code review: (1) Architecture: SOLID principles (1-5), design patterns, code smells (P0/P1/P2), testing, exceptions. (2) Functional: spec alignment, API contracts, boundary cases, business logic (Taiwan tax rules). Provide unified P0/P1/P2 priority with Pass/Needs Work/Fail decision and file:line recommendations.",
                "model": "opus",
                "statusMessage": "Running code review on completed task...",
                "timeout": 300
              }
            ]
          }
        ]
      }
    }

    3.2 架構師 Agent 職責細節

    架構師 Agent 按以下維度進行評估,每項 1-5 分自評:

    1. SOLID 原則遵循度:檢查 S(單一職責)、O(開閉)、L(里氏替換)、I(接口隔離)、D(依賴倒轉)五項是否遵循
    2. Design Pattern 應用恰當性:是否應用了合適的設計模式,是否存在過度設計
    3. 代碼異味程度:N+1 查詢、Magic Number、過長方法(>20 行)、過多參數(>3 個)、重複代碼、複雜邏輯(圈複雜度 > 10)
    4. 測試覆蓋度:目標 80%+,是否涵蓋邊界情況(null、empty、max/min)
    5. 異常處理完整性:是否避免過寬泛的異常捕捉,異常信息是否有意義,是否吞掉異常
    6. 語言特定規範遵循度:根據 code-review-languages.md 檢查命名、包結構、工具使用規範

    輸出:各維度評分 + 具體改進建議(標記優先級 P0/P1/P2 和代碼位置)

    3.3 PM Agent 職責細節(含 QA)

    PM Agent 進行務實檢查,確保功能實現和業務邏輯正確性:

    1. 功能 vs 設計稿對齐:設計稿的所有功能點是否實現,是否有範圍蠕動
    2. API 返回值對齐:返回欄位是否與文檔一致,資料型態是否正確,必需欄位是否都有
    3. 邊界情況涵蓋:null 輸入、空集合、最大值/最小值、負數、零值是否處理
    4. 業務邏輯正確性:根據項目規則(進項稅計算、發票號碼、申報期間映射等)是否正確
    5. 用戶體驗:錯誤提示是否清楚,用戶流程是否順暢,是否有令人困惑的行為
    6. 外部驗證需求:是否需要查證業務規定(優先 C)、設計稿(優先 A)、技術規範(優先 B)

    輸出:功能層缺陷清單、QA 項目、待驗證項(註明 C/A/B 優先級)

    3.4 聯合報告與優先級統一排序

    架構師和 PM 分別完成評估後,進行深度對話:

    • 架構師問 PM:「代碼結構能支持你檢查的功能嗎?」
    • PM 反問架構師:「這些功能需求會造成架構問題嗎?」

    基於對話結果,生成聯合報告:

    • P0(Critical):N+1 查詢、安全漏洞、死鎖風險、未處理的邊界情況、違反台灣稅務規則
    • P1(Important):過長方法、重複代碼、Magic Number、缺失測試、不清晰的錯誤提示
    • P2(Nice to Have):輔助方法提取、考慮設計模式、日誌增強

    最終判定

    • Pass:P0 問題 0 個,P1 問題可接受(≤2 個或不影響核心功能)
    • ⚠️ Needs Work:P0 問題 1-3 個,或 P1 問題 >3 個,或測試覆蓋度 <70%
    • Fail:P0 問題 ≥3 個,或安全漏洞,或違反重要法規

    第四部分:審查流程與反覆迭代

    4.1 外部驗證流程

    當 PM Agent 提出待驗證項時,按優先級啟動查詢:

    優先級 C(業務邏輯)— 需人工驗證
    • 用戶透過稅務官網或法規文件進行人工查證(AI 查詢易出錯)
    • 驗證結果更新到項目規則
    • 重新審查涉及的代碼
    優先級 A(設計稿)— 查閱項目文檔
    • 查閱設計文件、API 文檔
    • 如無對應文件,提示用戶補充
    • 確認後更新 code-review-rules.md
    優先級 B(技術規範)— 查詢官方文檔
    • 查詢 iDempiere、OSGi 官方文檔
    • 標記為參考(變動機會低)

    4.2 修改與重審流程

    當報告判定為 Needs Work 或 Fail 時:

    1. 開發者查看報告,收到 P0/P1/P2 改進清單
    2. 開發者修改代碼並完成新測試
    3. 重新標記 Task 為 completed(或手動觸發 /code-review-force)
    4. 自動重審(流程回到架構師 + PM 評估)
    5. 迴圈進行,直到最終判定 Pass

    第五部分:系統集成與迭代計劃

    5.1 全局記憶結構

    所有規則和流程信息保存在用戶的全局記憶庫中:

    • ~/.claude/memory/code-review-global-rules.md — SOLID、Pattern、Code Smell、Testing
    • ~/.claude/memory/code-review-languages.md — Java、Python、JS、SQL 規範
    • ~/.claude/memory/code-review-feedback.md — 架構師/PM 職責與對焦框架
    • ~/.claude/memory/code-review-process.md — 自動觸發、報告格式、判定標準

    5.2 項目級別記憶結構

    • 項目/.claude/code-review-rules.md — 業務邏輯規則 + 設計稿映射 + 外部驗證清單
    • 項目/.claude/settings.local.json — TaskCompleted Hook 配置

    5.3 三個迭代階段

    Phase 1(現在)
    • 建立全局規則知識庫(4 個記憶文件)
    • 編寫項目層規則(code-review-rules.md)
    • 配置 TaskCompleted Hook
    • 在項目中試用審查機制
    Phase 2(2-4 週後)
    • 根據實際審查結果優化規則(哪些規則發現了 bug、哪些規則太寬泛)
    • 改進 Agent Prompt(增加上下文、更清晰的指導)
    • 補充項目層規則細節(特別是邊界情況和特殊規則)
    Phase 3(1-2 月後)
    • 考慮集成到 CI/CD(每次 PR 自動審查)
    • 累積審查報告,形成項目代碼品質歷史
    • 調整 Hook 超時和 Agent 模型選擇

    第六部分:常見問題與實踐建議

    Q1:如果審查花太長時間怎麼辦?

    A:初版 timeout 設為 300 秒。如果超時,可調整為 600 秒,或簡化 Agent Prompt 去掉某些維度。對大型代碼改動,可分成多個小 Task,每個分別審查。

    Q2:外部驗證項目誰負責查證?

    A:初版由用戶或 PM 手動查證(特別是業務邏輯 C 項)。後續可考慮集成更多自動化(如 WebSearch for C 項、文檔連接 for A 項)。

    Q3:PM Agent 如何知道設計稿的內容?

    A:初版需在 code-review-rules.md 的 B 項中維護設計稿摘要(API 返回格式、欄位定義、邊界情況)。後續可考慮直接連接設計文件或 API 文檔鏈接。

    Q4:審查報告輸出到哪裡?

    A:初版直接輸出到對話(用戶可複製保存或導出)。後續可考慮存到 Task comment、Markdown 文件或項目文檔。

    Q5:如何確保 Agent Teams 穩定運行?

    A:遵循三層框架:

    • 評估層:前置資源檢查和確認,不盲目建立 Team
    • 確認層:列出角色、模型、容量,取得用戶確認
    • 執行層:分階段序列化,避免並行轟炸,讓 agent 主動進入空閒狀態而不是被拉取

    以及定期檢查記憶體、監控 agent 通訊、設置合理的超時時間。

    結論

    穩定可信的 Agent Teams 不是靠運氣,而是靠紮實的前置規劃、清晰的資源評估、以及精心設計的執行流程。本文提供的三層框架(評估→確認→分階段執行)確保了 Team 運行的穩定性。配合全局規則庫 + 項目規則 + 自動審查機制,可以建立一套完整的代碼品質保證體系,既有通用性,也有靈活性。

    從 Phase 1 的試用開始,逐步優化規則和 Agent Prompt,經過 2-4 週的實踐,可以達到穩定的審查效果。最終目標是讓代碼審查成為自動化流程的一部分,開發者無需手動申請審查,系統自動評估和反饋,確保每個 Task 完成時都經過架構師和 PM 的雙重把關。

  • 舊系統不死,AI 讓它進化:不重寫也能持續成長

    重點摘要

    • 舊系統不是問題,缺乏 AI 輔助才是問題——AI 讓「不重寫、持續演進」成為可行選項
    • 歷史證明:超過 80% 的「重寫計畫」以失敗或兩個系統都要維護收場
    • AI 最確定的價值是讀懂舊代碼、補文件、補測試,讓團隊敢繼續開發
    • 「AI 能不能讓大規模翻新變安全」——這是尚待驗證的命題,不宜過度樂觀

    你的公司有一套跑了十年的系統。它能動,它撐起了整個業務,但沒有人敢碰它。文件不齊、邏輯散落在各處、原始開發者早就離職了。每次有人提議「重寫」,討論就會陷入沉默——因為大家心裡都知道,這條路走過很多次,沒幾次是成功的。

    AI 的出現,讓這個困境有了新的解法。但不是你想像中的那種解法。

    為什麼重寫這麼難?歷史給了殘酷的答案

    軟體界有個著名的現象叫做 Second System Effect(第二系統效應),由《人月神話》作者 Fred Brooks 提出:工程師在重寫時,往往會把所有「本來想做卻沒做」的功能都塞進去,結果新系統比舊系統更複雜、更難維護。

    但更根本的問題是:舊系統裡有隱藏的業務邏輯,它們沒有寫在文件裡,只存在於代碼的行為中——某個奇怪的判斷式、某個例外處理、某個只在特定情境才觸發的路徑。這些邏輯,是十年來無數個「為什麼這樣做?」的答案。

    重寫計畫的典型失敗模式

    • 兩個系統並行期拉太長:新舊系統同時維護,工程師精力分散,bug 在兩邊都出現
    • 上線那天發現漏了邏輯:舊系統某個角落的行為,新系統根本沒有對應
    • 商業壓力中斷重寫:計畫進行到一半,業務需求改變,只能把新舊系統黏在一起
    • 重寫後反而更慢:新架構雖然「漂亮」,但少了十年累積的效能優化細節

    這不是悲觀,這是現實。重寫不是不可能,但它的成功率遠低於大多數人的預期。在 AI 出現之前,面對舊系統,企業只有兩條路:硬撐,或者賭一把。

    AI 帶來了第三條路:輔助成長

    AI 最確定的價值,不是幫你重寫系統,而是讓「不重寫、持續演進」這件事變得可持續。

    過去,舊系統的最大問題不是代碼本身,而是「沒有人理解它」。原始開發者離職了,知識沒有傳承;文件過時了,沒有人有時間更新;要改一個功能,必須花三天理解上下文,才敢動一行代碼。

    AI 改變了這個方程式。

    AI 能為舊系統做什麼?

    挑戰 過去的困境 AI 輔助後
    理解舊代碼 要花幾天甚至幾週閱讀 AI 幾分鐘內產出架構圖和流程說明
    補充文件 沒時間寫、寫了也快過時 AI 根據現有代碼生成,每次修改後更新
    補充測試 舊系統通常 0 測試,改動沒有安全網 AI 針對現有行為補寫測試,改動有保護
    修復 bug 怕改了 A 壞了 B,只敢最小化改動 AI 追蹤影響範圍,降低連帶破壞風險
    新人上手 要跟著老人學幾個月才敢動 AI 隨時解釋任何一段代碼的邏輯和背景
    新增功能 不知道該插在哪裡,怕破壞現有邏輯 AI 建議最小侵入式的擴充點

    實際做法:AI 如何輔助舊系統成長

    第一步:讓 AI 讀懂系統,產出活的文件

    不要急著改代碼。第一件事是讓 AI 理解現有系統,然後把理解結果固化成文件。

    # 讓 AI 讀整個 codebase,產出架構說明
    # 在 Claude Code 中,直接描述你的需求:
    
    「請閱讀這個專案的所有代碼,並產出:
    1. 系統架構圖(模組與模組之間的關係)
    2. 核心業務流程說明(從使用者角度描述主要流程)
    3. 高風險區域列表(邏輯最複雜、最不敢動的地方)
    4. 技術債清單(有哪些地方明顯需要改善)」

    這份文件不是給外部人看的,是給你的團隊每天使用的工作手冊。它會隨著系統改動而更新——這一點很重要,因為過去文件之所以沒用,是因為沒有人有時間維護它。AI 讓維護文件的成本降低了 90%。

    第二步:為現有行為補測試,建立安全網

    舊系統的問題不是「代碼爛」,而是「沒有測試保護」。任何一個修改都是在沒有安全網的情況下走鋼絲。

    AI 可以閱讀現有代碼,理解它的行為,然後為這些行為寫測試——即使這些行為從來沒有文件。

    # 範例:讓 AI 為現有函式補測試
    「這個函式 calculateDiscount() 已經跑了八年,
    請分析它的所有分支條件,為每個分支寫一個測試案例,
    包括正常情況、邊界值和異常情況。
    不要改動現有邏輯,只補充測試。」

    有了測試,團隊才敢改動。改動有安全網,系統才能持續演進而不是不斷累積技術債。

    第三步:最小侵入式地新增功能

    新增功能不等於重構整個模組。AI 擅長找到「最小侵入式的擴充點」——在不動現有邏輯的前提下,把新功能插進去。

    這個原則來自 Open/Closed Principle(開放封閉原則):對擴充開放,對修改封閉。即使舊系統沒有遵循這個原則,AI 也可以建議如何在外圍包一層,讓新功能不影響舊邏輯。

    第四步:漸進式現代化,而非大爆炸式重寫

    如果真的有部分需要改善,AI 輔助的方式是:一次只動一個模組,改完之後讓它穩定跑一段時間,確認沒有問題再動下一個。

    這不是「重寫」,這是「漸進式現代化」。兩者的關鍵差異:

    重寫 漸進式現代化
    範圍 全部 一次一個模組
    風險 集中在上線日 分散,每步都可以回滾
    業務中斷 長期並行維護兩個系統 系統持續運作,局部更新
    AI 的角色 「幫我重新實作這一切」 「幫我安全地改善這一塊」

    那麼,「重寫」這條路呢?

    這是一個需要誠實面對的問題。

    過去的答案很清楚:重寫計畫成功率低,風險高,通常不是好選擇。大多數成功的案例,仔細看都是「漸進式替換」而不是「一次性重寫」。

    AI 會改變這個答案嗎?

    這是一個尚待驗證的命題。AI 確實讓理解舊系統更容易,讓知識遷移成本降低,理論上應該讓重寫的準備工作做得更完整。但「做得更完整的準備」不等於「執行時不會出問題」。隱藏的業務邏輯、時序問題、效能細節——這些在代碼裡只有在跑了幾百萬筆資料之後才會浮現。

    更誠實的說法是:

    • AI 讓「輔助成長」這條路變得可行——這是現在就可以驗證的事
    • AI 讓「重寫」變得更安全——這是有可能的,但還需要更多實際案例來驗證
    • AI 能取代「漸進式替換」的謹慎原則——不太可能,這個原則的價值在於限制風險暴露,而不是技術能力

    所以,如果有人告訴你「有了 AI,重寫就不危險了」——保持懷疑。如果有人告訴你「AI 讓你不需要擔心舊系統的技術債了」——同樣保持懷疑。

    如何判斷你的系統需要什麼?

    面對舊系統,用這個框架來判斷方向:

    優先考慮 AI 輔助成長,如果:

    • 系統仍然在提供商業價值,只是難以維護
    • 核心業務邏輯複雜,沒有人完整理解
    • 團隊規模小,無法支撐兩個系統並行
    • 業務需求變化頻繁,不能停下來等重寫完成

    可以考慮漸進式替換(不是重寫),如果:

    • 某個模組已經明顯成為瓶頸,且邊界清晰
    • 有足夠的測試保護現有行為
    • 可以部署影子流量,讓新舊模組並行驗證
    • 有明確的回滾機制

    謹慎考慮大規模重寫,只有當:

    • 現有系統在技術上已經無法繼續擴充(不只是難,而是真的不可能)
    • 有足夠的資源支撐至少 18 個月的並行期
    • 有完整的行為規格文件(或 AI 幫你產出的等效文件)
    • 組織願意接受在過渡期期間功能停滯

    結語:舊系統不是問題,缺乏支援才是

    回到最初的問題:那套跑了十年的系統,它的問題不是年齡,而是孤立。沒有人理解它,沒有測試保護它,沒有文件說明它,改動它需要承擔巨大的個人風險。

    AI 能做的,是讓這個系統不再孤立。它可以成為每個工程師的「老前輩」——隨時解釋任何一段邏輯,隨時分析改動的影響,隨時生成測試保護現有行為。

    這不是重寫的故事,這是陪伴成長的故事。

    至於重寫——如果未來真的需要,AI 會讓你準備得更充分。但那是另一個故事,而且它的結局還沒有寫完。