事故調查 · 續篇 · 2026-10 接回 一次加分的代價
帳單響了之後,
你手上有沒有
一張地圖
四個人、四張雲端帳單、同一個錯。差別不在專不專業,也不在有沒有用 AI——在帳單到程式碼之間那張圖從哪裡來。
案例:Happy Toy Scout(半路工程師在矽谷)、FunClass 翻課星球(方方老師)、兩則社群貼文 · 依據:作者公開文章、媒體報導、網站實測標頭、前一份報告 · 未登入、未碰任何人的雲端帳號
TL;DR
三句話
- 每個人都會犯同一個錯:沒算「使用者數 × 每次資料量」。事前沒有人知道流量會不會來,所以這個錯不分專業與否,矽谷的資深工程師也照犯。
- 帳單是唯一的警報,但它只說多少錢,不說為什麼。從金額回推到那一行程式碼,中間要一張地圖:計費單位是什麼、一個動作幾台裝置各下載多少、使用者十倍帳單幾倍。有地圖的人兩天修對層,沒地圖的人幾個月修錯層。
- AI 讓閉環變便宜,不讓人變強。便宜的閉環放大你原本的方向:有地圖的人更快修好,沒地圖的人更快加功能。而且它的答案是抽樣不是查表,所以地圖得是確定性的數字,不能是「問它行不行」。
- 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 一個月;從帳單回推,搬走
同一聲警報之後的四條航跡。實心是切在乘法上的一步,空心是沒切到的一步。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 架構」的技能。它們拿得到那張地圖嗎?拿得到一半,而且要知道是哪一半。
- 它們是第一個條件的具體形狀。把問題放進流程、不靠人想到——這正是盤問型技能在做的事。老師的技能把定價問題關掉,grill-me 這類技能把問題打開。方向對了。
- 但技能裡的地圖,是寫技能的人的地圖。一個通用的盤問技能問的是通用的問題:資料模型、錯誤處理、邊界條件。它不會問「Realtime Database 按位元組計費,你的整班壓縮塊每次廣播幾 KB」——除非寫它的人被這張帳單打過。所以技能的價值等於作者的地圖;你裝一個別人寫的技能,借到的是別人撞過的礁。
- 只有輸出數字的問題才是門,輸出意見的問題只是對話。「這個架構有沒有問題」AI 會給你一段流暢的意見,而且每次不一樣——這是第 03 節說的隨機性。「這個服務的計費單位是什麼、單次扇出幾個位元組、十倍時月費多少」逼出來的是數字,數字可以拿去跟定價頁對——這等於在帳單來之前,先造了一個便宜的警報。好的技能把不可驗證的問題換成可驗證的數字;壞的技能只是讓你在動手前多聊了一輪。
- 盤問型技能最常見的失敗,它自己的說明就寫了:照單接受它附的建議答案,等於讓它自己盤問自己。那不是地圖,是回音。
- 它會替你補完地圖,但補上去的墨水跟查到的是同一個顏色。你沒想到的,它擅長補——邊界條件、漏掉的失敗模式、同類系統常在哪裡出事,這是它讀得多的本事。你想歪的,它不擅長抓——它順著你的前提往下推,前提錯了它會把錯的前提推得更完整。而兩種補法在它的輸出裡長得一模一樣:查到的、算出來的、猜的,都是同樣流暢的一段話。所以要它補地圖的時候,逼它在每個答案後面標出處——「定價頁查到的」「從你給的數字算的」「我猜的」——只信前兩種,第三種當成待驗證的假設。
所以不是免費午餐,是便宜午餐:問的那一半免費,驗的那一半不免費。而且午餐是誰做的很重要——一個從真帳單長出來的三題關卡,比一個三十題的通用清單值錢。
AI 有地圖,但只在你問的時候給、給的可能是錯的、帳單來的時候最準。
壓成一句:沒地圖的人要做的不是學會畫圖,是把三個問題做成門、把帳單當成老師、把 AI 當成翻譯。
07 · 第五個測深
第五個例子是你
四個人沒有一個是為了寫進報告才犯錯的。下一個收到帳單的人,大概率也不會是因為不專業。所以這一節不講道理,給工具。
下次讓 agent 加任何會隨人數成長的功能之前,把這段貼進去,要它先回答再動手:
在實作之前,先回答下面三題,答不出來就停下來問我:
1. 這個功能用到的每個雲端服務,計費單位是什麼?(按次/按位元組/按人頭/按秒)
2. 使用者做一個動作,會有幾台裝置各自下載多少資料?算出單次扇出的位元組數。
3. 使用者變成 10 倍和 100 倍時,這個功能的月費各是多少?哪一項是線性成長?
把三題的答案寫成一張表,讓我決定要不要做,再開始寫程式。
然後,帳單來的那一天——不管是免費額度打滿的通知,還是月底的一張數字——把它原封不動貼給 AI,連同那段程式碼,問「為什麼是這個數字」。它回的那張圖,自己讀一遍,確認每一格都對得上帳單;對不上的地方,是它錯,不是帳單錯。
地圖不是從 AI 拿到的那一刻生效,是從第一次被帳單打到、回來改圖那一刻生效。
附 · 證據與限制
哪些是看到的,哪些是推的
- 直接看到的:Brian 在換日線的全文與世界日報、Tri-City Voice 的報導;Happy Toy Scout 今天的回應標頭、CSP、靜態資源清單與頁面文字;FunClass 的帳單截圖、三代公開程式碼與 Codex 技能(詳見上一篇);Threads 與知乎兩則貼文的原文。
- 推論:Brian 第一天用的雲、打滿的是哪個額度、帳單金額、有沒有換平台、有沒有用 AI 寫——全部沒有公開資料,文中凡涉及這些都標了「推論」。「Staff 工程師」是他粉專的自述,沒有第三方佐證。
- 沒做的:沒有登入任何人的帳號、沒有讀寫任何雲端資料、沒有測量真實流量;沒有聯絡任何一位當事人。四個案例是說書,不是統計;它們支撐的是「地圖從哪來」這個框架,不是分佈的證明。
- 跟上一篇的關係:〈一次加分的代價〉是單一案例的事故調查;這一篇把它放進四個案例裡,問的是另一個問題——同一個錯,為什麼路徑不同。
資料來源