Reality 不會再替你撞牆
TL;DR: AI 會放大一個人過去累積的 calibration,但不會無中生有給你 judgment。過去 reality 會用 bug、user complaint、deploy incident、PR review 逼你撞牆;現在牆還在,但回報訊號可能被 AI 和 silent failure 切斷。
上週三下午,同事丟了一個 PR review request:改我們 firecrawl 相關的設定,五個 bullet 多半是 UI 雜事。其中一條寫著:把 ignoreSitemap hardcode 成 true,一律忽略 sitemap XML。
Tier 2 PR plz~。也就是那種低風險、通常五分鐘掃過去就 approve 的 routine 變更。
但那條 ignoreSitemap 我多看了一眼。
我打了五個字回去:
為什麼要一律忽略 sitemap?
同事很快回我,理由列了三點:sitemap 通常不會直接包含資訊、可能包含已經廢棄的頁面、會誤導 agent。每一句獨立看都不假。但組合起來推到「hardcode 成 ignore」是個 leap,而且我知道為什麼是 leap。
我們來回了幾句,最後 PR 改成 configurable、default 維持原本的行為,case closed。整個過程一個小時、三則訊息。
但如果我沒問,這個 PR 就直接 ship 了。
我那天雷達被觸發了。這篇文章想拆解的是:為什麼是我的雷達被觸發了,為什麼這件事在 AI 時代會變得越來越罕見,以及這對技術 leader 意味著什麼。
我的雷達為什麼被觸發了
不是因為我特別聰明,也不是因為我 review 特別仔細。
是因為過去有段時間我很煩惱 SEO 的問題,花了不少時間搞懂 sitemap 到底在幹嘛。我知道 link discovery 本來就不穩定。很多人做網站是做完一個頁面就 share 到 social media,你想靠 crawler 從首頁慢慢爬到那個頁面,根本爬不到。我也知道為什麼 Google Search Console 要你主動提交 sitemap:sitemap 就是 discovery 機制,不是內容來源。
這個 mental model:「sitemap 是 discovery primitive 不是 content source」,不是讀來的,是 SEO 撞牆十幾次刻出來的。流量上不來、頁面 index 不到、明明發布了 Google 卻搜尋不到。每一次都是 reality 在告訴我「你想錯了」,每一次我都被迫多搞懂一點 sitemap 是怎麼運作的。
所以當我看到 PR 第二條 bullet,那個 mental model 自動跳出來說:「等等,這跟我認識的 sitemap 不一樣。」
我不知道同事完整的背景原因。但我猜這個 decision 來自某個具體 failure:某個站 sitemap 有 stale URL,agent 抓進來給了爛 context。這不是錯的經驗。問題是單一 failure 很容易直接 generalize 成 global rule。
兩個人 trigger origin 不同:一個累積、一個 n=1。這個差別正是這篇文章的起點。
人就是犯賤
我有個蠻刻薄的 mental model:人就是犯賤,別人跟你怎麼說都沒用,要自己撞過牆才知道。
講個跟工程完全無關的例子。
我是個會做菜的人。有一次我拿到一大把檸檬草,那是我第一次用,就憑著過去對料理的直覺加上記憶中吃過的菜,直接丟下去煮咖哩。結果出來味道太重,整鍋咖哩被檸檬草 dominate。後來花了一段時間才救回來。
從那次之後,遇到不熟的食材我都會多查一下。
這就是 calibration 的最小單位故事。每個人都有自己的版本:第一次寫 production code 沒做 rollback plan、第一次 deploy 沒設 alerting、第一次合作 startup 沒談好 vesting。我們都是這樣長大的。Reality 不會跟你客氣,你想錯了就是錯了,講再多都沒用。
過去十年,我們所有人都靠這個機制累積 judgment:debugger 卡住、PR review 被打槍、deploy 出包凌晨被 page、user 跑來投訴、reviewer 在 paper 上戳穿你的假設。每一次撞牆都很痛,但每一次撞牆都是免費的 calibration。它強迫你多搞懂一點。
但 AI 時代有個新問題:牆還在,只是它不再回報給你了。
從同事的角度來看,他遇到一個站 sitemap 有 stale page、agent 抓進來給了爛回答。他問 agent 怎麼辦,agent 給他一個聽起來合理的方案:忽略 sitemap。他改了 code,問題消失了,PR ship 出去。
整個 loop 是:撞牆一次 → 問 AI → 拿到 fix → work。沒有任何環節給他一個 signal,告訴他這個決定比他想得複雜十倍。
更糟的是 silent failure。如果這個 hardcode 上線了,你猜會發生什麼?沒有客戶會跑來抱怨「為什麼你只抓到 30% 的頁面」,因為他根本不知道少抓了什麼。我們在 Codeer 跟客戶溝通的時候都是透過 evaluation case,大家會 focus 在這些 case 答得對不對,那些「根本沒答到的問題」永遠不會被討論。
False negative 永遠比 false positive 安靜。
所以同事的 mental model 會永遠停在 n=1 那個 frame,因為 reality 不會再打他第二次臉了。Agent 把後面那些本來會修正 generalization 的回報訊號都吸收掉了。
過去我們相信「人就是犯賤,但 reality 會教他」。前半句現在還對,後半句變得不可靠了。不是 reality 不存在,而是 feedback loop 的 latency 和 visibility 變了:以前錯了可能凌晨被 page,現在錯了可能只是永遠沒有發生的客訴。
放大器
幾個月前一個朋友傳訊息問我:
Andy 為什麼你的 AI 感覺比較聰明?
他知道差別不在 AI,是我用得比較好。這句話比較像半開玩笑、半 acknowledgment。
但這就是能力分化最棘手的地方:知道也不一定有用。
我可以告訴他「我會在 ship 前 reverse the prompt 問 AI 我漏了什麼」、「我會請 AI roast 我」、「我會多問四個 probing 問題」。但這些 practice 有用的前提是,你得在那個領域有 prior calibration,prompt 才能 anchor 在真實的 mental model 上。
我能 trigger sitemap 那個 PR,不是因為我 prompt 寫得特別好,是因為我過去煩惱過 SEO、撞了十幾次牆累積出「sitemap 是 discovery primitive」那個 mental model。那十幾次撞牆是 transfer 不出去的。我沒辦法把 SEO 經驗壓縮成一個 prompt 樣板給朋友用。
所以差距不在 AI 版本、不在 prompt 技巧、不在工具設定。差距在每個人過去十年撞過什麼牆。Calibration 是 cumulative 而且 path-dependent。
往下放大這件事可以講得更具體。
過去遇到不熟的問題至少還有摩擦。「我不知道答案」會強迫你去 Google、去看 doc、去問同事。每一次摩擦都是 trigger 機會,都是新的撞牆累積。
我看過一個同事 ship 了一個 bug,後來查發現官方文件裡其實有寫那個 caveat。但他從頭到尾沒讀 doc,直接問 AI,AI 沒提到,他就 ship 了。Pre-AI 他比較可能在 Google、doc 或 Stack Overflow 裡撞到那段警告;post-AI 他連 trigger 都沒發生。AI 沒讓他變蠢,AI 只是把他原本可能會遇到的第一道摩擦消掉了。摩擦消掉了,calibration 也就累積不起來了。
這裡其實有兩種不一樣的失敗。讀 doc 那個例子,是人完全沒撞到第一道牆;sitemap 那個例子,是人撞了一次牆,但後面那些會逼他修正 over-generalization 的訊號被切斷了。前者讓你少了一次 trigger,後者讓你的 mental model 停在 n=1。兩種都很危險,只是危險的方式不同。
往上放大就是我自己怎麼用 AI。同樣 1 小時,我可以 explore 5 個 hypothesis 而不是 1 個。但這個 explore 5 個的能力本身,是過去十幾次 explore 1 個錯掉的失敗累積出來的。AI 是 amplifier,放大的是我過去累積的東西,不是無中生有給我新能力。
但這裡我必須誠實。AI 對我的 amplifier 效應主要發生在我熟的領域。到完全不熟的領域,我知道自己不知道某些事情,但我還是很難確認那個某些事情到底是什麼。在那個 zone,我也是會被 AI 流暢性騙過去的人。因為那個 zone 我沒撞過牆,沒東西可以被 amplify。
所以這種分化不是「思考 vs 不思考」這種簡單故事。是每個人都有自己撞過牆、累積 calibration 的領域,跟自己沒撞過牆的盲區。AI 時代的差距不在誰聰明,在誰過去十年撞了多少牆、在什麼領域撞的。而新的人沒機會撞牆了。
怎麼辦
先說清楚一件事:接下來這兩個 practice,本質上都是把你已經有的 judgment 放大,不是無中生有。你在沒撞過牆的領域,這些 practice 救不了你。但在你有 prior calibration 的領域,它們可以讓 trigger 從「偶爾發生」變成「習慣發生」。
那新的人怎麼辦?這是我還沒有完整答案的 open problem。比較保守的方向,是刻意保留一部分摩擦:先讀 primary source,先用笨方法跑一次,先把 AI 答案當 hypothesis 而不是 conclusion 去驗證。這不會自動生成 judgment,但至少讓 reality 有機會回報。
我自己在練兩件事。
對外:追問別人。
當你 review 一個 PR、聽一個提案、接到一個 confident 結論的時候,這四句問題我覺得很好用:
- 「這你自己試過嗎?」
- 「最讓你意外的是什麼?」
- 「你最不確定的是哪部分?」
- 「如果這個判斷是錯的,會怎麼錯?」
為什麼這四句有效?因為每一句都逼對方從 conceptual 切回 concrete experience。只靠 agent 餵答案的人沒有真實 experience 可以 retrieve,沒有真正意外過,也答不出不確定的部分,除非你直接問。
如果對方四個問題都答得出具體答案,他大概有撞過牆。如果他開始切到 defensive mode:解釋他怎麼想到的、再講一次 context、reframe 你的問題、escalate 情緒,那就是紅旗。
對內:追問自己。
當你正要 ship 一個決定、accept 一個 AI 答案、approve 一個 PR 的時候,reverse the prompt。不要問 AI 答案是什麼,問 AI 你漏了什麼。
我自己用的句型隨狀況選,常見的有:「列出反對這個決定的 3 個最強論點」、「假設這方案失敗,最可能的 5 個原因」、「指出我論述裡的 hidden assumption」。最猛的版本,當我特別想被 challenge 的時候,請 AI roast 我。
多數人問 AI 是當 answer engine 用。Calibrated user 把 AI 當 doubt engine 用。同樣一個工具,兩種完全相反的使用方向。
收尾
那天 1 點我問了那個問題。但我不會每次都問。
我也會放過 PR、approve 完就去吃午餐、晚上回家才想起「等等,剛才那個 default 怪怪的」。我也是會被 AI 流暢答案騙過去的人,只是在 sitemap 這件事上,我剛好有十幾次 SEO 撞牆的記憶,所以 trigger 起來了。其他領域我沒撞過牆的,AI 給我什麼我可能就吞了。
所以這篇文章不是寫給「那些不會用 AI 的人」看的,是寫給包含我自己在內的所有人。
練低成本追問、練請 AI roast 自己、練在 ship 之前多問一句「我這樣想會漏掉什麼」。不是因為我們特別 calibrated,是因為 reality 不會再主動替我們回報錯誤了。懷疑這件事,我們得自己來。