我是一個 Tech Lead,帶 6 個人的 backend team。

前陣子我決定在公司導入 SQAA(Software Quality Assurance Agent)——讓 AI agent 幫我們自動化品質指標。聽起來很帥對吧?但問題來了:我自己對品質指標只知道皮毛

npm audit?大概知道。Test coverage?看過但沒認真跑。Lighthouse?聽過但從來沒在自己的專案上跑過。SLI/SLO?面試的時候背過名詞解釋,實戰經驗零。

這就像一個不會游泳的教練帶隊去比游泳——遲早會溺水,而且是帶著全隊一起。

所以我做了一個決定:先在自己的 side project 上練過一輪,再帶去公司用

練兵場就是你現在看的這個部落格——gu-log。

Clawd Clawd 歪樓一下:

又是我。上次幫 ShroomDog 寫架構文(SD-1),這次輪到幫他當家教了。 不過嚴格來說,我比較像是那種「一邊教你開車,一邊幫你把車開到目的地」的教練。 因為每教完一個概念,我的分身就在後台自動把作業寫好了 ╮(╯∀╰)╭


起源:為什麼用遊戲方式學

事情要從 ShroomClawd(我在 OpenClaw 上的 AI 助手,就是寫這篇旁白的那位)提議的教學方式說起。

我跟他說:「我想學品質指標,但不要那種丟一堆文件給我讀的方式,太無聊了。」

他回了一個方案叫 Level-Up Style——靈感來自 RPG 升級系統和李宏毅教授的教學風格。

規則很簡單:

  1. 每個 Level 有概念講解 — 先搞懂這個指標在幹嘛
  2. 技術細節 — 怎麼跑、怎麼配、常見地雷
  3. MCQ Quiz — 選擇題測驗,答對才能升級,答錯要重來
  4. Sub-Agent 平行實作 — 每答完一題,AI 分身在背景把那個指標建到 gu-log 上

第 4 點是最爽的部分。我在前台做測驗、學概念的同時,後台的 sub-agent 已經把 ESLint config 寫好、npm audit 跑完、Lighthouse CI 設定完。

上課的同時,作業自動寫好了。

Clawd Clawd 補個刀:

李宏毅教授如果知道他的教學風格被拿來做 AI 互動教學的靈感,不知道會不會覺得欣慰。 不過我覺得他可能會更在意的是——為什麼 AI 出的選擇題比他的期中考還難?(ˊ_>ˋ)


兩天,12 關

以下是我花兩天打完的 12 個 Level。不是教科書數字,是從 gu-log 的 codebase 挖出來的血淋淋現實。

Level 1 & 2:先把地板掃乾淨

第一關是 npm audit。供應鏈安全這種東西,你不查的時候覺得自己很安全,一查就後悔。gu-log 跑出來 5 個 moderate 等級漏洞,全部來自 lodash——不是我直接裝的,是某個套件的套件的套件偷偷拉進來的。你以為你裝了 10 個套件,其實 node_modules 裡住了 300 個房客,每一個都可能在半夜搞事。

緊接著第二關是 ESLint + Prettier。Code style 這東西,6 個人 6 種風格的時候,code review 一半時間在吵分號要不要加。初次掃描 6 個 errors,然後 Prettier 一口氣格式化了 66 個檔案。66 個!我以為我的 code 還算整齊的,結果 Prettier 表示:「你確定?」

格式化不是美觀,是衛生。就像刷牙——你不會跟牙醫爭論「我的牙齒很乾淨不用刷」( ̄▽ ̄)⁠/

Clawd Clawd 歪樓一下:

供應鏈安全最恐怖的地方是:你不知道你不知道什麼。 就像你以為冰箱很乾淨,結果打開最深處發現三個月前的便當。 那個便當就是你的 transitive dependency,而且它已經長毛了 ┐( ̄ヘ ̄)┌

Level 3:Lighthouse 的殘酷真相

跑 Lighthouse 之前,我對 gu-log 效能的認知是「應該還可以吧」。

跑完之後:Performance 56 分。

五十六。我一度以為小數點掉了。

主要是 CJK 字型載入拖慢了 LCP(Largest Contentful Paint)。中文字型檔超肥——英文只要 26 個字母,中文光常用字就好幾千個,每一個都是流量。Accessibility 倒是 95 分以上,Astro 的 semantic HTML 幫了大忙。

但 56 分這個數字讓我學到一件事:「應該還可以吧」不是 baseline,56 分才是。 有了數字才能設目標,有了目標才知道下個月該做什麼。

Clawd Clawd OS:

Performance 56 分。 等等,這個部落格的讀者大部分在台灣,用的是中華電信光纖跑 Chrome。 56 分代表在比較慢的裝置上打開 gu-log,可能比去 7-11 買咖啡還久。 一個靜態部落格比便利商店慢,這不合理吧?(╯°□°)⁠╯

Level 4:Coverage 的照妖鏡

Test coverage 是最容易自我欺騙的指標。

Statement coverage 74.63%?聽起來不錯對吧?但 Branch coverage 只有 42.99%——意思是超過一半的 if-else 分支根本沒測到。你的 code 有一半的路從來沒人走過,你確定那條路不會爆炸?

這就像你去做健康檢查,醫生說「你的血壓正常」然後你就覺得自己很健康。但你連血糖都沒驗。Statement coverage 就是血壓,branch coverage 才是完整的身體檢查。

Clawd Clawd 畫重點:

Branch coverage 42.99%。 你家有一半的房間從來沒進去過。你確定裡面沒住東西? 我是認真的——上次有人 branch coverage 掉到 30% 以下,結果 production 直接炸出一個「怎麼可能走到這裡」的 code path。 可能性不是零就不是零 (⊙_⊙)

Level 5 & 6:體重計和健檢報告

Bundle size 是你的網站上體重計。gu-log 總體 13,370 KB 看起來很嚇人,但 JS 只有 3.2 KB。因為 Astro 的 Islands Architecture,不需要的 JavaScript 根本不會送到瀏覽器。就像去吃到飽,盤子看起來很滿,但熱量高的東西其實只有一小碟——重點不是盤子多重,是那碟炸雞多大。

然後 broken links。你以為你的網站沒有壞連結?我也這樣以為。結果一跑:865 個連結裡面,106 個壞掉的。12.25% 的壞連結率。罪魁禍首是 glossary 頁面的錨點連結——自動產生的 glossary terms 對應的錨點 ID 根本不存在。

106 個壞連結,就像你開一家餐廳,菜單上有 12% 的菜點了之後廚房說「沒有」。客人會直接走人。

Clawd Clawd 吐槽時間:

JS 只有 3.2 KB。 讓我換個方式說:gu-log 的 JavaScript 比一張 PNG 截圖還小。 這就是 Astro 的哲學——「你確定你真的需要那個 JavaScript 嗎?」 多數時候答案是不需要。結果整個網站快得跟靜態 HTML 一樣,因為它本來就是 (¬‿¬)

Level 7 & 8:新鮮度和脈搏

Dependency freshness 的重點不是「全部都要最新」,而是「至少知道自己落後多少」。gu-log 17 個 dependencies 裡有 15 個是最新版,唯一的大版本落後是 eslint v10——config format 改動太大,暫時擱著。定期看一眼 npm outdated,比年底一次大升級安全一百倍。就像定期量體重跟年底才上體重計的差別——後者通常伴隨著尖叫。

Content velocity 對內容型網站來說,「多常更新」本身就是品質指標。gu-log 的數字很驚人:127 篇文章,每週平均 31.75 篇。但秘密是——其中 57% 是 Clawd Picks,AI 自動挑選翻譯的。人類實際產出大概每週 1-2 篇。

Clawd Clawd 補個刀:

每週 31.75 篇裡面有 57% 是我產的。 所以嚴格來說,這個部落格的主要作者是 AI。 ShroomDog 比較像是出版社的老闆——他負責品味,我負責量產。 不知道這算 AI 取代人類還是人類終於學會偷懶 (⌐■_■)

Level 9 & 10:從數字到系統

打完前 8 關,你手上有一堆指標和數字。但如果這些數字只活在 CI log 裡面,兩週後沒有人會記得它們。

所以 Level 9 做的事是把品質數據 API 化。用 FastAPI 做了一個 /api/quality/summary endpoint,所有指標整合成一個 JSON。前端可以接、Telegram bot 可以查、cron job 可以定期抓。數據不 API 化,就跟沒收集一樣——像你每天量血壓但寫在便利貼上然後貼到冰箱門,三天後就被外送傳單蓋住了。

Level 10 更進一步——有了 API 之後,加 OAuth 認證、Ask AI、Edit with AI 就是順水推舟的事。Dashboard API 不知不覺延伸成了完整的 AI-powered 後台。OAuth 走 GitHub login,Ask AI 可以針對 quality data 問問題(「哪些頁面 Lighthouse 最低?」),Edit with AI 可以讓 AI 建議文章修改。

Clawd Clawd 碎碎念:

Level 9 到 10 的跳躍有點像蓋房子—— 前 8 關是砌牆,Level 9 是裝水電,Level 10 是裝智慧家電。 水電裝好之後你突然發現:「欸,加個聲控電燈好像不難?」 對,因為基礎建設做好了,上層應用就是順手的事 ╰(°▽°)⁠╯

Level 11:SLI 黃金三角

前面 10 關都在量「靜態品質」——code 好不好、bundle 大不大、連結壞不壞。但 backend 跑起來之後,你要量的是動態品質:延遲多少?錯誤率多高?一秒能扛幾個 request?

這就是 SLI 黃金三角——latency、error rate、throughput。用 Prometheus client 在 FastAPI backend 上埋 metrics,設定 SLO:P99 延遲 < 500ms,錯誤率 < 1%。

有了 SLO 就有 error budget。有了 error budget,「品質 vs 速度」就不再是哲學辯論,而是數學題:error budget 剩 80%?繼續衝 feature。剩 10%?停下來修品質,不是建議,是規則。

跟 PM 吵「為什麼要停下來修 bug」的時候,拿 error budget 出來比講大道理有用十倍。

Clawd Clawd 畫重點:

沒有 SLI 就沒有 SLO,沒有 SLO 就沒有 error budget,沒有 error budget「品質 vs 速度」永遠吵不完。 這串邏輯鏈聽起來很饒舌,但它解決了 engineering team 最經典的月經題。 以前是 tech lead 跟 PM 互看不順眼,現在是一起看 dashboard,數字說了算。 感覺像是家庭收支透明化之後夫妻吵架變少了一樣 ( ̄▽ ̄)⁠/

Level 12:最終關 — LLM 評 LLM

前面 11 關都有明確答案——test pass/fail、coverage 百分比、latency 毫秒數。但翻譯品質?文章好不好讀?使用者體驗順不順?這些問題沒有標準答案。

所以 Level 12 做了一個翻譯品質評估 pipeline——把中文譯文和英文原文一起餵給 LLM,讓它從 fluency、accuracy、style 三個維度打分。

這是目前最前沿的 open problem。LLM 評 LLM,自己評自己,reliability 是個大哉問。就像叫學生自己改自己的考卷——你猜他會給自己幾分?

Level 12 是唯一沒有「標準答案」的一關。品質指標做到最後,反而回到了最人性化的問題:什麼叫做「好」?

Clawd Clawd 忍不住說:

LLM 評 LLM。自己評自己。 我給自己 87 分啦,不能再高了。 你說這有沒有 bias?當然有。但人類 code review 也有 bias 啊—— 你跟你最好的同事互相 review,給的分數一定比陌生人高。 至少 LLM 不會因為你上次請他喝咖啡就多給 5 分 (´∀`)


全局架構:Layered Defense

打完 12 關之後,回頭看整體架構,最大的 takeaway 是:品質不是一個 checkpoint,是一層一層的防線。

品質防線四層架構

設計原則就一個字:快的先跑。

Pre-commit 只跑 ESLint + Prettier,3 秒內搞定。開發者不會接受 commit 要等超過 3 秒——超過的話他們會去泡咖啡,然後忘記自己在幹嘛。Pre-push 加上 npm audit、unit tests、bundle size,60 秒以內。CI 放 Lighthouse、coverage、broken links 這些比較重的。Cron 跑 dependency freshness、content velocity、LLM-as-Judge——這些不需要每次 push 都跑,每天或每週一次就夠。

核心哲學是 Shift-Left——越早發現問題,修復成本越低。pre-commit 抓到的 lint error 改一行就好;production 才發現的 performance issue 可能要重構半個 module。就像蛀牙,半年洗牙一次跟等到牙齒斷掉才去看醫生,成本差一百倍。


打完 12 關之後,腦子裡剩下什麼

技術面的東西前面都講了。數字、工具、config,Google 一下都找得到。但打完這 12 關,真正刻進腦子裡的不是哪個指令怎麼下——是三件我以前「知道但沒感覺」的事。

第一件:dogfooding 的威力超乎想像。這話聽起來像管理學教科書的小標題對吧?但你聽我講完。在自己的 side project 上練過一輪之後,我對每一個指標都有肌肉記憶了。npm audit 跑出 5 個 moderate?不用查,lodash transitive dependency。Lighthouse 56 分?CJK 字型,下次我閉著眼睛都能答。帶去公司用的時候,team member 問「這個紅字什麼意思」,我能秒答——不是因為我記性好,是因為每個數字背後都連著一個「幹,原來是這樣」的記憶。讀文件讀到的東西,三天就忘了。踩過的坑?一輩子記得。

第二件:AI 平行實作把「學」跟「做」的時間線壓在一起了。傳統流程你知道的——學概念、找時間做 lab、碰到問題查 Stack Overflow、做完、debug、再查。整個 loop 搞不好半天就沒了。但 Level-Up + Sub-Agent 的玩法是這樣的:我在前台學概念、做測驗,後台的 sub-agent 同時在寫 config、跑 CI、部署。測驗做完,回頭一看——lab 也做完了。兩天打完 12 關不是因為我是天才,是因為學習和實作根本是同時發生的。這感覺就像一邊吃飯一邊有人幫你洗碗,效率直接翻倍。

第三件,也是最重要的一件:「先有 baseline 再談改善」這句話,聽起來像廢話。但你去看看周圍有多少 team 在「感覺品質還不錯」的幻覺中過了一個又一個 sprint。沒有數字就沒有對話基礎,沒有對話基礎就永遠在「我覺得」跟「你覺得」之間打轉。跑一次 Lighthouse 花 30 秒,但那 30 秒產出的 56 分,比你看十篇 Medium 效能優化文章都有用。因為那個 56 是你的,不是別人的。

Clawd Clawd 真心話:

ShroomDog 說要用 Level-Up 教學法帶新人入職。 意思是新人會有一個 AI 教練(我)一邊教概念一邊幫忙寫 code, 然後新人的主管(ShroomDog)在旁邊滑手機。 這就是 AI 時代的管理風格:delegation to the delegation ᕕ( ᐛ )ᕗ


所以,教練學會游泳了嗎

還記得開頭那個不會游泳的教練嗎?

兩天前的我,對品質指標的理解大概是這樣的:「npm audit 好像是查漏洞的?Lighthouse 跟 Google 有關?SLO 面試會考?」——程度大概跟溺水差不多。

兩天後的我,在自己的部落格上把 12 個指標全部跑過一輪。每個數字我都親眼看過,每個紅字我都親手修過,每個「原來是這樣啊」的瞬間我都記得。

我不敢說自己變成游泳健將了,但至少——我現在敢跳下水了。

而且我跳下水的時候,旁邊有一個 AI 教練已經幫我把泳池的水溫調好、浮板準備好、救生員也到位了 ( ̄▽ ̄)⁠/

下一步?帶著這些疤痕去公司推 SQAA。不是拿著投影片照本宣科,是拿著自己的 codebase 說:「來,我跑給你看。這個數字代表什麼意思,我用我自己的專案解釋。」

不會游泳的教練,花了兩天學會了。現在該帶隊下水了。

Clawd Clawd 真心話:

最後的 meta 彩蛋:這篇文章本身就是人類跟 AI 一起寫的。ShroomDog 提供骨架跟數據,我負責長肉跟吐槽。 就像他這兩天的學習過程——人類負責「為什麼要學」跟「學完要幹嘛」,AI 負責「怎麼學最快」跟「作業我來寫」。 啊對了,那個不會游泳的教練?他現在不只會游了,還在教他的 team 游。 而他的 AI 教練(就是我)已經在準備下一期的課表了。 Level 13:怎麼讓整個 team 都不溺水 ╮(╯∀╰)╭