工商時間

選型、模組拆解、里程碑與驗收標準——這些設計期的功夫,課程裡是拿一整套企業級專案從頭做給你看的。

《AI 賦能全端開發:從零打造企業級智慧應用》:用同一套 AI CRM 專案,從 Spring Boot 後端、React 前端到資料庫與權限,一路加上 Spring AI、RAG 與 AI Agent,完成真正能上線的企業級應用。

👉 前往 Hahow 課程頁

主題一|設計期:先別急著寫——可審查產物系列・站 2

嗨,我是凱文大叔。

上期在想法期把「能不能做」換成了可行性評估報告。這期進第二站:設計期——你確定要做了,但還沒開始寫。

一句話裡藏的決定

❌ 別說:「幫我用 React 寫一個報修系統。」

這句話有一個很隱密的問題:你已經幫它決定了技術棧,而你憑什麼確定 React 是對的?也許這個工具只有你一個人用、畫面只有三頁、資料量三百筆——一個純 HTML 加一點 JS 就夠了;也許你的團隊全是 Java 人,前端只有一個人扛。

不先分析就點名技術,AI 不會反駁你——它會照做(上期講過的討好傾向,這裡再度登場)。所以設計期的換句話,是一句換三句:

  1. 先做選型分析:列候選方案、優缺點、適用情境、推薦與理由
  2. 再寫開發計畫:模組、里程碑、驗收標準——先不要寫程式碼
  3. 才照計畫實作第一階段

設計期三段式產物鏈:先把需求與限制攤開,做選型分析,再寫含模組、里程碑與驗收標準的開發計畫,最後才進入第一階段實作;中間以「先不要寫程式碼」保留審查點

① 選型分析:沒有限制的建議等於沒建議

提示詞全文(可直接複製)

我要做【需求】。我的限制是:
- 開發環境:【例:Windows + PowerShell】
- 團隊技能:【例:熟 Java,前端只有一人】
- 部署環境:【例:公司內網,不能連外】
- 時程與人力:【…】

請列出 2-4 個可行的技術選型方案,每個方案說明:
優點、缺點、適用情境、在我上述限制下的契合度。
最後給出你的推薦與理由,並說明什麼情況下你會改推薦別的方案。

重點在「我的限制是」那四個欄位。不先講限制,AI 會直接套訓練資料裡出現最多次的組合——那是「大家最常用的」,不是「你能用的」。把環境、技能、時程寫進提示詞,等於把驗收條件搬到生成之前——這一招叫約束前置(constraint-first),後面幾站會反覆用到。

最後一句也很關鍵:「說明什麼情況下你會改推薦別的方案。」實際跑出來是這樣:

選型分析的「改推薦條件」表:列出時程、使用人數、畫面數、資料量等邊界,任一條成立推薦就會變

這張表比推薦本身更重要。它告訴你這個決定的有效邊界:時程放寬到三天以上、這工具要給團隊用、畫面超過八個、資料到數萬筆——任何一條成立,推薦就會變。一個沒有附上邊界條件的建議,你沒辦法判斷它什麼時候會過期。

② 開發計畫:一句一定要加的話

提示詞全文(可直接複製)

採用【選定方案】。請寫一份開發計畫:
1. 模組拆解:每個模組的職責與相依關係
2. 里程碑:分幾個階段,每階段的產出是什麼
3. 每階段的驗收標準:怎樣算做完(要可驗證,不要「功能正常」這種寫法)
4. 風險點與對應的先行驗證

先不要寫程式碼。

「先不要寫程式碼」這句請一定要加。為什麼?因為開發計畫是一個便宜的中間產物——

計畫改一行,程式碼改一天。

計畫寫在紙上,你才看得出它哪裡不準;程式寫完才發現方向錯,成本差一個數量級。沒有這句話,AI 很樂意直接動工,把你還沒審過的假設全部寫進程式碼裡。

另一個重點是第三項驗收標準的寫法:「怎樣算做完,要可驗證,不要『功能正常』這種寫法。」實際產出長這樣:

開發計畫的里程碑驗收標準:每一條都是可打勾的具體判準,例如空專案回 0、三任務完成一個回 1/3、循環相依被拒絕

每一條都能打勾:空專案進度回 0、三個任務完成一個回 1/3、A→B→A 的循環相依被拒絕……「功能正常」四個字你沒辦法審查,這批句子可以。

而且先劇透一件事:這批驗收標準等一下會直接變成測試——下一站你會看到它們一模一樣地出現在測試名稱裡。這就是「可審查產物」會產生的複利:這一站的產物,是下一站的輸入。

站 2 收工

設計期的換句話練習:一句「幫我寫」拆成三句——選型分析逼出有效邊界、開發計畫給你便宜的審查點、然後才動工。外加一句護身符:「先不要寫程式碼。」

下一站是全系列最大的一站:開發驗收期。「幫我測試程式有沒有問題」這句話的毛病在哪?為什麼 AI 寫完程式再補的測試,會變成「證明自己對」的測試?還有一招我覺得整場最划算的——讓測試跑完自己長出一份操作手冊。下期見。


主題二|為什麼 AI Agent 一定要非同步

上期的結論是:Spring 的 publishEvent() 預設是同步的,監聽器跟發布端跑在同一條執行緒上。

那時候留了一個問題沒回答——

AI CRM 的「產生客戶摘要」要呼叫 LLM,一跑就是三十秒。如果監聽器跟發布端同一條執行緒,使用者按下「儲存客戶資料」之後,畫面就得轉三十秒的圈圈。

而且問題不只是「久」。

三十秒會引發的連鎖反應

使用者不會乖乖等。他會:重新整理,然後再按一次儲存。

於是第二次請求進來,第二次 LLM 呼叫也開始跑。第一次那個沒有停——它還在別的地方跑著,只是沒人在等它的結果了。

你付了兩次錢,拿到一個沒人要的結果。

更糟的是,這件事有很大機率不是使用者主動觸發的。反向代理有預設逾時(Nginx 常見是 60 秒)、瀏覽器有逾時、前端的 HTTP 客戶端通常也設了重試——這條鏈上任何一環先放棄,重試就自動發生了,使用者甚至不知道自己送出了兩次。

Agent 跟一般 CRUD 不一樣的三件事

一般的 CRUD 操作,同步做完全沒問題:查個資料庫幾毫秒,慢也慢不到哪去。但 Agent 有三個特性,讓「同步」從小缺點變成真問題:

一般 CRUD AI Agent
快慢 毫秒級 數秒到數十秒
成本 幾乎為零 按 token 計費,跑一次付一次
可重複性 重跑結果一樣 重跑結果不一樣

第三點最容易被忽略。一般的重試是安全的——重算一次總額,答案還是同一個。但 LLM 重跑會給你不同的摘要,於是「重試」不再是無害的補救,而是變成資料不一致的來源。

所以結論很直接:Agent 這類工作,不該讓使用者的請求在原地等它。

要把「更新客戶資料」和「產生 AI 摘要」在時間上切開——前者立刻做完回應使用者,後者自己在背景慢慢跑。

上期我們已經把它們在結構上切開了(事件解耦)。這期補上時間上的那一刀。

同步與非同步的時間軸對比:同步時「存檔→呼叫 LLM 產生摘要→回應使用者」串在一條線上,使用者從按下儲存到畫面有反應要等三十秒,等不及重新整理就會讓 LLM 再跑一次;非同步時 main 執行緒只做「存檔→回應使用者」零點幾秒就結束,呼叫 LLM 產生摘要移到背景執行緒