事故調查 · 續篇 · 2026-10 接回 一次加分的代價

帳單響了之後,
你手上有沒有
一張地圖

四個人、四張雲端帳單、同一個錯。差別不在專不專業,也不在有沒有用 AI——在帳單到程式碼之間那張圖從哪裡來。

TL;DR

三句話

  1. 每個人都會犯同一個錯:沒算「使用者數 × 每次資料量」。事前沒有人知道流量會不會來,所以這個錯不分專業與否,矽谷的資深工程師也照犯。
  2. 帳單是唯一的警報,但它只說多少錢,不說為什麼。從金額回推到那一行程式碼,中間要一張地圖:計費單位是什麼、一個動作幾台裝置各下載多少、使用者十倍帳單幾倍。有地圖的人兩天修對層,沒地圖的人幾個月修錯層。
  3. AI 讓閉環變便宜,不讓人變強。便宜的閉環放大你原本的方向:有地圖的人更快修好,沒地圖的人更快加功能。而且它的答案是抽樣不是查表,所以地圖得是確定性的數字,不能是「問它行不行」。
  4. AI 有這張地圖,但三個條件缺一不可:問題得被放進流程裡(不能靠人想到)、AI 給的圖可能是錯的(帳單才是對的)、帳單來的時候丟給它最準(事後比事前準)。

01 · 暗礁

同一個錯,每個人都會撞到

雲端帳單爆掉的故事,九成是同一道算式沒算:

每月帳單 ≈ 使用者數 × 每個使用者觸發的次數 × 每次送出的資料量 × 單價

前三項相乘叫扇出(fan-out)。做 MVP 的那個晚上,使用者數是未知數——不知道會不會有人用,就沒有理由花時間算「十萬人進來會讀幾次」。所以這個錯不是粗心,是結構性的:事前沒有任何回饋能告訴你算錯了。第一個回饋永遠是帳單,而帳單來的時候,乘法已經跑了一陣子。

撞礁不分專業。差別是撞了之後,手上有沒有一張圖告訴你礁在哪裡。

02 · 測深

四張帳單

四個案例壓成同一個形狀:錯 → 警報 → 修哪一層 → 地圖從哪來。四個人裡沒有一組是「專家對新手」;他們是四種「地圖在哪」的狀態。

2 天

Happy Toy Scout 免費額度打滿;十天內修完

NT$2,854

FunClass 一個月帳單;修了幾個月還在錯的層

NT$8,000+

Places API 一個晚上;地圖是 AI 給的,而且給錯

US$5,000

Vercel 一個月;從帳單回推,搬走

案例沒算的扇出警報修了哪一層地圖從哪來
Happy Toy Scout2026-08 · 一人 side project13,000 家門市全載、每個訪客都讀資料庫上線不到 2 天額度打滿對的層:快取靜態資料、依視角載入、砍讀取次數在腦子裡
FunClass 翻課星球2026-05 起 · 國小老師整班壓縮塊廣播給 30 台裝置一天 300 多元 → 月 NT$2,854錯的層:修「發布頻率」,沒修「每次大小」被自己寫的 skill 關掉
Places API 貼文2026 · Threads大量呼叫 Places API,以為方案含在內一晚 NT$8,000+止血、設硬上限、申訴AI 給的,而且是錯的
Vercel 搬家貼文2024 · 知乎幾十萬月訪放在按用量計費的平台月 US$5,000+搬到計費單位不同的平台從帳單學回來
四條航跡:同一聲警報之後,每個人各自走了哪幾步 警報 第一步 第二步 現況 A Happy Toy Scout 第 2 天額度打滿 快取靜態資料 依視角載入、砍讀取 第 10 天修完 B FunClass 夏天 一天 300 元 修頻率(大小沒動) 9 月摸到拆開存 正式環境仍整塊 C Places API 問 AI,AI 給錯方案 一晚 8,000 元 設配額上限、申訴 拿回調整款 D Vercel 搬家 月 5,000 美元 從單位回推 — 搬到按次計費 切在「使用者 × 次數 × 大小」上的一步 沒切到的一步(或錯的圖)
同一聲警報之後的四條航跡。實心是切在乘法上的一步,空心是沒切到的一步。A 四步全實心,十天;B 警報之後三步全空心,幾個月;C 的第一步就是一張錯的圖;D 兩步到位。

A地圖在腦子裡:Happy Toy Scout

8 月 18 日麥當勞在全美推出 Hello Kitty × Godzilla 聯名兒童餐,每家店供應的款式不同,家長只能在社團裡到處打聽。21 日週五深夜,Fremont 的工程師 Brian 開始寫,週六早上做完第一版:全美 13,000 多家門市上地圖、定位、依玩具編號篩選、一鍵回報。他說雖然只想給灣區朋友用,但「一開始就直接以全美規模來設計架構」。

太太分享到家長群後病毒式擴散。上線不到兩天,免費雲端額度「徹底打滿,並遠遠超過了」。他列出的修法有三件:快取門市靜態資料與歷史回報、依地圖視角動態載入、大幅減少不必要的 API 呼叫與資料庫讀取。十天內部署 122 次,他形容是「邊開飛機邊換引擎」。十天後 12.7 萬使用者、4 萬筆回報;三週後 19.7 萬使用者、151 萬次瀏覽、同時在線峰值 2,400 人。

注意他「以全美規模設計」的意思:資料放得下,不是成本放得下。13,000 家店放得進地圖,跟十萬人各讀一次 13,000 家店,是兩件事。這就是扇出沒算——跟下一位老師犯的是同一個錯。差別在帳單響了之後:他列的三件事,每一件都切在「使用者 × 次數 × 大小」的乘法上,沒有一件是在修別的地方。

今天網站實測(2026-10-22):App 跑在 Cloudflare Workers 上(回應標頭有 x-vinext-cache,vinext 是 Cloudflare 把 Next.js 跑在 Workers 上的 runtime)、資料庫是 Supabase(CSP 只允許一個 supabase.co 網域)、瀏覽器零直連資料庫,全走同源 /api/*、首頁在 CDN 節點快取 5 分鐘,過期後先回舊的再背景更新(stale-while-revalidate)、收藏頁面是「發版時產生的快照」、地圖用 Leaflet 加 OpenStreetMap 公用 tiles。

第一天用的是哪家雲、帳單金額、有沒有換過平台、有沒有用 AI 寫,公開資料都沒有。Wayback 八月沒有頁面快照。「不到兩天打滿」若是 Supabase 免費版的 5 GB egress,一天 7 萬次瀏覽、每次 50 KB 就是 3.6 GB——一天半破,跟時間線對得上,但這是推算不是證據。

B地圖被自己關掉:FunClass 翻課星球

國小老師方方用 AI 做了班級加分工具,月活躍 5.4 萬人,9 月帳單 NT$2,854,幾乎全是 Firebase Realtime Database 的下載流量。扣分的那一步只有一個:把「整班壓成一塊」的備份格式直接拿來當即時廣播,老師加一分,全班 30 台裝置各自重新下載整塊;在按位元組計費的資料庫上,這樣做大約貴 400 倍。詳細拆解在上一篇〈一次加分的代價〉。

他不是沒修。夏天發現一天燒 300 多元,做了底層改造:分數加緩衝、寫入加冷卻、內容沒變不重發——修的全是「發布頻率」,沒有一項碰到「每次發布的大小」。到 9 月才自己摸到「拆開存」的方向,而且只對一個帳號試行,正式環境仍是整塊廣播。

為什麼修錯層?他寫給 Codex 的技能有一條:使用者是新手、沒提到成本時,選不用付費的路線,而且不要教定價。本意是不嚇跑新手,結果是 agent 選資料庫、設計同步格式時,沒有人回頭問過「每多一位學生要多付多少」。那張地圖 AI 本來有,被一條好意的規則關掉了。

C地圖是 AI 給的,而且給錯:Places API

一位開發者的專案大量用 Google Maps Places API,上線第一個月帳單逼近五萬台幣。他問 Gemini,Gemini 告訴他有一個月費 100 美元的 Starter Plan,還列出方案涵蓋的 API 項目。他訂了,一個晚上燒了八千多塊台幣,點進帳單一看用量是 8,000 多%——Starter Plan 根本不含 Places API。接下來兩週在 Maps 和 Cloud Billing 之間被踢皮球,期間還收到逾期付款通知,最後帳單上出現一筆服務調整項,錢拿回來了。

他自己寫的教訓有一條最值錢:預算「提醒」跟「上限」是兩回事。提醒只是通知你超標,API 費用可以在一個晚上從幾十塊衝到幾千塊,通知來的時候來不及反應;要設配額上限(quota cap),超過就硬擋。

這個案例是給第 06 節用的:他有去問 AI 要地圖,AI 給了一張,圖是錯的。最後校正那張圖的不是 AI,是帳單。

D地圖從帳單學回來:Vercel 搬家

一位獨立開發者把 AI 搜尋引擎部署在 Vercel,每月幾十萬訪問量,登入後台一看,一個月 5,000 多美元。他的判斷是:幾十萬月訪不算大,這個費用不合理。於是搬到 Cloudflare 託管加自建伺服器,省下來的錢夠他寫一篇文章。

這是最常見的一種路徑:事前沒算,帳單來了,從金額反推出「我被哪個計費單位收了錢」,然後換一個單位不同的地方。地圖是事後畫的,但畫對了。

03 · 潮流

閉環變便宜了,人沒有變強

先把這篇的主角說出來,不然四張帳單只是四個故事。主角是 AI 時代那個最常被說反的句子:AI 讓人變強。四條航跡說的是另一件事——AI 讓閉環變便宜,而便宜的閉環會放大你原本的方向,不會替你換方向。

方方老師用 agent 加功能的速度是真的快:遊戲艙、寵物、轉蛋、Boss 戰、18 個 Cloud Functions,每一個都在幾週內上線。Brian 十天 122 次部署也是真的快。同一個放大器,一個把速度全部花在「加」,一個把速度全部花在「修」。放大器不分辨這兩者;分辨它們的,是撞礁之後手上那張圖。

所以「中位數」和「離群值」要說清楚是哪一條軸。老師在教育產品那條軸上是離群值——5.4 萬月活、雜誌專訪;Brian 在基礎設施那條軸上是離群值。帳單量的是基礎設施那條軸,所以在這篇裡老師落在中位數。AI 放大的是你在那條軸上的位置:中位數加 AI,是更快地回到中位數——agent 給的是大家都會選的架構,你加功能的速度變快,而每一次加功能都是一次沒人扣分的選型;離群值加 AI,是更快地離群——同樣的工具,用在收斂上。

AI 讓有地圖的人更快修好,讓沒地圖的人更快加功能。

還有一個放大器自己帶來的新礁:它的答案是機率抽樣,不是查表。問它「這個方案含不含 Places API」,它給了一個流暢的錯答案;同一個問題換一天問,答案可能不同。這對寫程式沒關係——編譯器會抓;對架構決策有關係——沒有東西會抓,帳單來之前你不知道它錯了。所以地圖不能是「問 AI 這樣行不行」,那是把一個隨機變數當成確定答案。地圖得是確定性的東西:計費單位、扇出的位元組數、十倍時的月費——這些是查得到、算得出、跟定價頁對得上的數字,問十次答案一樣。第 05 節的圖例是按這個標準寫的。

04 · 反事實

如果 Brian 一開始就選 Cloudflare

這句話有兩個版本,只有一個站得住。

站不住的:「他就不會犯錯」。不對。扇出沒算這個錯,在 Cloudflare 上一樣會犯——13,000 家店全載、每個訪客讀一次,程式碼一模一樣。

站得住的:「他的錯就不會變成帳單」。Workers 不按流出位元組計費,同一個錯在 Supabase 上是 GB,在 Workers 上是請求次數,單價低到十倍流量也只是幾美元。選 Cloudflare 不是避免犯錯,是讓這類錯打不到你。而這件事本身就是地圖的第一條——「計費單位是什麼」——在第一天就用掉了。「做好玩的」正確定義不是「隨便做」,是「選一個錯了也不會痛的計費單位」。

便宜的失敗也是安靜的失敗。Brian 兩天就學到,是因為免費額度有硬上限、會停、會響。同一個錯在 Workers 上只會讓後台儀表板的請求數多幾個零,沒有警報;他可能一直不知道自己每個訪客多讀了幾十次。選對計費單位保護的是錢包,不是學習。所以這一節不是在說「大家都去用 Cloudflare」——是在說:計費單位決定你的警報多痛、多快、多響。FunClass 的 Blaze 隨用隨付沒有上限,警報慢而且無聲,要等月底;這是老師修了幾個月的另一半原因。

05 · 圖例

地圖是什麼

不是知道「正確的架構」——AI 也知道正確的架構,而且讀過的事故檢討報告比任何一個架構師都多——系統出事之後寫的那種文件,記錄哪裡壞、為什麼壞、怎麼修,每一家雲端廠商和大公司都公開過幾百份。地圖是從帳單回到程式碼的映射:看到金額,知道是哪個計費單位;知道計費單位,知道是哪個扇出;知道扇出,知道是哪一行。

LEGEND · 三個問題

單位
這個服務的計費單位是什麼?按次、按位元組、按人頭,還是按秒。同一個技巧換了單位,結果可能相反——整班壓成一塊在按次計費的 Firestore 是省錢,在按位元組的 Realtime Database 是燒錢。
扇出
使用者做一個動作,幾台裝置各下載多少?扇出數乘每次資料量,就是帳單成長的速度。
十倍
使用者變成十倍、一百倍,帳單變幾倍?線性成長的項目要先想誰付錢,再決定要不要做。

這三個問題是上一篇第 07 節寫給用 AI 做工具的人的關卡,這裡把它們升格成圖例:每個案例都能用這三格重新讀一遍。Brian 的三件修法對應的是扇出和十倍;老師的 skill 關掉的是單位;Places API 那位被 AI 騙的是單位;Vercel 那位換的是單位。

06 · 燈標

沒地圖的人,能從 AI 借到一張嗎

可以。但有三個條件,而且條件比答案重要。

一、地圖在書裡,問題不在

計費單位、扇出、十倍帳單——這些 AI 全都知道,問了就答。老師的 agent 之所以沒給,不是不會,是 skill 規定「不教定價」。所以第一個條件是:問題要被放進流程裡,不能靠人想到。地圖可以外部化成一道關卡:agent 每次加「即時同步」「多人連線」之前必須先答三個問題,答不出來不准動手。沒地圖的人裝這道門,等於借了一張。

二、AI 給的地圖可能是錯的

Places API 那位就是證據:Gemini 給了一張錯的定價圖,一晚燒掉八千。所以第二個條件是閉環——AI 畫草圖,帳單校正,人把兩者連起來。地圖不是從 AI 拿到的那一刻生效,是從第一次被帳單打到、回來改圖那一刻生效。你可以讓 AI 畫圖,不能讓它替你被打。

三、事後比事前準

事前問「我這個架構會不會爆」,AI 只能給中位數的答案,因為它不知道流量。事後把帳單截圖和程式碼一起丟進去問「為什麼」,答案準得多——上一篇報告就是證明:只憑公開 repo 和一張帳單截圖,AI 畫出了老師自己幾個月沒畫出來的那張圖。所以沒地圖的人最划算的做法不是事前問 AI,是在警報響的那一刻,把警報的內容原封不動交給 AI,然後自己讀懂它回的那張圖。

那麼,一個「架構 review」技能,是不是免費的地圖

2026 年最紅的一類技能是在動手前盤問你的——像 grill-me 這種:一次一個問題、附上它的建議答案、等你回答、直到每個決策分支都定案才准寫程式。還有各種「幫我 review 架構」的技能。它們拿得到那張地圖嗎?拿得到一半,而且要知道是哪一半。

所以不是免費午餐,是便宜午餐:問的那一半免費,驗的那一半不免費。而且午餐是誰做的很重要——一個從真帳單長出來的三題關卡,比一個三十題的通用清單值錢。

AI 有地圖,但只在你問的時候給、給的可能是錯的、帳單來的時候最準。

壓成一句:沒地圖的人要做的不是學會畫圖,是把三個問題做成門、把帳單當成老師、把 AI 當成翻譯。

07 · 第五個測深

第五個例子是你

四個人沒有一個是為了寫進報告才犯錯的。下一個收到帳單的人,大概率也不會是因為不專業。所以這一節不講道理,給工具。

下次讓 agent 加任何會隨人數成長的功能之前,把這段貼進去,要它先回答再動手:

在實作之前,先回答下面三題,答不出來就停下來問我:
1. 這個功能用到的每個雲端服務,計費單位是什麼?(按次/按位元組/按人頭/按秒)
2. 使用者做一個動作,會有幾台裝置各自下載多少資料?算出單次扇出的位元組數。
3. 使用者變成 10 倍和 100 倍時,這個功能的月費各是多少?哪一項是線性成長?
把三題的答案寫成一張表,讓我決定要不要做,再開始寫程式。

然後,帳單來的那一天——不管是免費額度打滿的通知,還是月底的一張數字——把它原封不動貼給 AI,連同那段程式碼,問「為什麼是這個數字」。它回的那張圖,自己讀一遍,確認每一格都對得上帳單;對不上的地方,是它錯,不是帳單錯。

地圖不是從 AI 拿到的那一刻生效,是從第一次被帳單打到、回來改圖那一刻生效。

附 · 證據與限制

哪些是看到的,哪些是推的

資料來源