一個看空 AI 的 Neovim 派工程師,怎麼在六個月內讓 agent 寫出跟自己一模一樣的 production code——以及這件事對人、組織與工作流的代價

文字解析 · 1 支影片 · 產生於 2026-10-01 00:54

🎧 語音解析📝 筆記✍️ 練習

🎧 語音解析 1h11m · TTS 講解與作者原聲交錯;點章節可跳。
邊聽邊看逐句講稿,點任一句從那裡開始
章節(22)

1. Outline

  1. 起點 · How a Cloudflare Engineer Ships Production Code He Didn't Write | Dillon Mulroy
    從「生產力空前卻更不快樂」的個人經驗出發,經過 Cloudflare 裁員與角色壓縮、對 AI lab loop 敘事的成本質疑,最後落到具體工作流:Herdr + Pi、Plannotator、/tree、長得像 code 的 spec、300–800 行的 stacked PR。

2. YouTuber 的思維推導

How a Cloudflare Engineer Ships Production Code He Didn't Write | Dillon Mulroy

Jan-Niklas Wortmann · 1h04m · 字幕 en · vision=off (input 是 shots=auto、vision=true,但整支影片是兩人對談的 podcast(Jan-Niklas Wortmann 訪問 Dillon Mulroy),畫面只有兩個人的鏡頭,沒有投影片、程式碼、圖表或白板;transcript 也沒有任何「你看這裡/這張圖」的指示語。依 rules/segment.md 全片沒有值得截的畫面,shots_mode 改為 none、vision 一律 false。) · YouTube

預估 vs 實際耗時
階段預估實際
fetch 6s 2s
segment 2m39s 7m00s
shot 1m57s –
analyze 19m30s 14m44s
render 5s –

這集是主持人 Jan-Niklas Wortmann 訪問 Cloudflare 工程師 Dillon Mulroy,出發點是一個反差:一個死忠 Neovim 派、直到 2025 年 11 月都公開看空 AI 的人,在 Opus 4.5 之後六個月幾乎沒自己寫過 code,而且做到「AI 寫出的 code 跟他自己寫的 line for line 一樣」。整集的推導分三層。第一層是人:Dillon 先承認生產力空前但更不快樂,並一步步找出原因——責任沒變、但「從開始到完成的中間過程」完全不同;實作裡的小難題(dopamine hit、flow state 的來源)全被 LLM 接走,一天變成從一個 macro 難題跳到下一個;同時像回到 junior,知道要什麼卻還不會讓 agent 給你。

由此推出「system design 直覺以前是 micro 搏鬥的副產品,現在副產品消失了」,所以下一代怎麼訓練是他最大的不確定。第二層是組織:Cloudflare 裁 20% 但隔天開幾百個不同職缺,被砍的是中間協調層;AI 壓縮角色邊界,反而讓跨領域軟技能更重要;PM 與工程師的交接物從長 PRD 變成 MVP。接著他對 AI lab 的 loop 敘事提出成本、一致性、證據三重質疑(對中位數開發者不實際、harness 每版行為飄移、要看 receipts),並用 Fable 的 ZDR 與自動降級說明企業採用的硬門檻。

第三層是方法,也是對開場問題的真正回答:沒有捷徑,只有親自反覆嘗試、忽略 Twitter;具體工具鏈是 Herdr + Pi(harness 做得越少越好、由人控制 context)、Plannotator(本地 review 讓「讀每一行」跟得上速度;annotate/last 讓對話漸漸長成 spec)、`/tree`(先問自己知道答案的問題,在分支上建立 agent 的理解,只把審過的小結帶回主線,自己扮演 sub-agent)、以及長得像 code 的 spec(型別與 interface 定形狀、call stack 定路徑、TDD 定驗收——因為 agent 擅長填空、不擅長設計空格)。交付方式不變:300–800 行的 stacked PR。最後收束在一個務實的未來:把已經走過幾百次的流程排成看得見的 queue,把自己的品味寫成 skill 做第一輪 review,省五分鐘就是勝利——這正是他從 Ethan 文章採納的心態「成為新工具的 craftsman、繼續為結果負責」的具體長相。

推理鏈:每段留給下一段的線索

每一列是一段,箭頭後的字是這段留給下一段的線索。點段落標題跳到該段。

  1. 開場:六個月沒自己寫 code → 預告丟出的問題是「你怎麼做到讓 AI line for line 寫出你的 code」,但答案只給了「挫折與反覆嘗試」。要理解這個過程,得先知道他的起點:一個公開看空 AI 的人,是什麼讓他轉向?
  2. 從看空到 all-in → Ethan 的框架說「精靈已出瓶,選擇成為新工具的 craftsman」。但如果 AI 只是又一個「工具」,那過去 15 年工具一直在換,為什麼這次會讓人身份動搖?主持人接下來會拋出「工具不定義工作」的立場,Dillon 得回答 AI 到底算不算一般的工具。
  3. 工具不定義工作? → Dillon 說自己「比以前更有生產力,但有些日子討厭這個事實」。既然責任沒變、產出更多,為什麼會不快樂?下一段他得說清楚滿足感到底少了什麼。
  4. 更不快樂:滿足感的來源變了 → Dillon 說「六個月沒進過 flow state」,還說隧道盡頭有光。但為什麼會沒有心流?他接下來要拆解自己一天的工作結構,說明小難題被誰拿走、剩下什麼。
  5. 只剩 macro 難題,沒有 flow → Dillon 說「更累」還有另一個來源,「像重新變成新人」。macro 難題連發是一種累,那「像 junior」又是哪一種挫折?下一段他回憶自己第一份工作的感覺。
  6. 像回到 junior → 主持人說「能動」對多數 production 應用不夠,liability 是大問題。但如果新人靠 LLM 幾分鐘就得到「能動」的東西、跳過搏鬥的過程,他們要怎麼學會判斷什麼是「夠好」?下一段兩人談下一代怎麼訓練。
  7. 下一代怎麼訓練 → 主持人接著說「AI 裁員」多半是藉口、10x/100x 是行銷,但 Dillon 表示在裁員這點上他有些不同意見——因為 Cloudflare 剛在五月裁了 20%。下一段他要從內部視角解釋這次裁員到底是不是 AI 驅動的。
  8. Cloudflare 裁 1,100 人 → Cloudflare 砍的是「中間層」、開的是「完全不同的職缺」。那麼留下來的工程師,角色會被壓縮成什麼?下一段主持人直接問:AI 會讓一個工程師同時是 QA 和 PM 嗎?
  9. 角色壓縮:QA 30 秒、軟技能更重要 → Dillon 說「角色重疊變多」,但主持人並不買單「未來只招 product engineer 包辦一切」——他要用 JetBrains 的 PM 當例子反駁。PM 和工程師的邊界到底會怎麼變?
  10. PM 與工程師:MVP 取代長 PRD → 到這裡談的都是「人」與「組織」怎麼變。主持人接下來把鏡頭轉向工作方式本身:Boris(Claude Code)、Peter Steinberger(OpenAI)那種多 agent 平行 loop 的做法,是未來還是只有 AI lab 才玩得起的科學實驗?
  11. Loops 不適合中位數開發者 → Dillon 提到開源權重模型(GLM 5.2)越來越好,「哪天夠好了這些能力才合理」——但這聽起來正是 AI 批評者最常嘲笑的「永遠再六個月」。他要怎麼面對這個矛盾?主持人又會把成本問題推到什麼層級?
  12. 永遠再六個月:ROI 與預算 → 主持人說 Fable 品質戲劇性提升但貴一倍、慢一倍。Dillon 對 Fable 有更根本的問題——不是價格,而是它對 Cloudflare 這種企業從第一天就出局的兩個理由。
  13. Fable 為何是 non-starter → 談完外部條件(成本、模型、政策),主持人把整集的核心問題再問一次:你那則推文說「第一次讓 AI 寫出 line for line 跟你一樣的 code」,到底怎麼做到的?這次 Dillon 要真的開始回答。
  14. 讓模型照你的方式寫 → 心法講完了,但「反覆嘗試」總得落在具體的工具上。Dillon 說他有三四個主要工具——第一層是終端機與 workspace 的組織方式,第二層是他選的 agent harness,而選 harness 的標準會直接回應第 11 段對 Claude Code 與 Codex 的批評。
  15. Herdr 與 Pi:harness 越少越好 → 地基(Herdr)與引擎(Pi)之外,他說還有一個「對他極為重要」的工具——它要解決的是年初他就看出來的問題:code review 流程壞了,而且他不想在自己完整 review 之前把 AI 的改動推給團隊看。
  16. Plannotator review 與 stacked PR → Plannotator 的第一個功能是 review「code」。他說還有第二個大功能——同樣的註解介面,但對象不是 diff,而是文件與 agent 的訊息;那會如何改變他跟 agent 建立共識的方式?
  17. annotate / last:對話堆成 spec → 有了共同理解就能寫 spec,但共同理解本身怎麼從零開始建?Dillon 說這帶到下一個部分——Pi 的 `/tree`,以及一個看起來很浪費的習慣:問 agent 一些他自己已經知道答案的問題。
  18. /tree:先問自己知道答案的問題 → 研究分支帶回主線後,他用 Plannotator 迭代出 tech spec。但他說自己的 tech spec「可能跟多數人不太一樣」——不像 PRD,而是長得像 code。那一份長得像 code 的 spec 到底包含什麼、為什麼要這樣寫?
  19. spec 長得像 code → 主持人說 `/tree` 的部分「把他弄丟了一下」:分支上的研究結論到底怎麼「拉回」主線?跳轉時 context 會怎麼變?Dillon 接下來要講 tree 的細節與一個 session 實際長什麼樣。
  20. /tree 細節:三種回法、幾百則訊息 → 他說「你就是自己的 sub-agent」,還提到在接受 tree 之前就發過推文說不愛 sub-agent。sub-agent 在很多 harness 裡是主打功能,他為什麼不用?主持人又是什麼看法?
  21. 為何不用 sub-agent → 整套方法講完了,但 Dillon 自己也承認它「很累」。回到第 11 段的 loop 話題與 Armin 的文章:他能不能想像一個把手動部分自動化、但不放棄品味的未來?最後一段他描述那個 queue。
  22. 看得見的 queue:把品味放進 skill

3. 逐段說明

How a Cloudflare Engineer Ships Production Code He Didn't Write | Dillon Mulroy

1. 開場:六個月沒自己寫 code 0:00–1:18

節目開頭剪輯了整集的重點:Cloudflare 五月裁掉 20%(約 1,100 人)並把 AI 列為主因;Dillon 這位死忠 Neovim 派過去六個月幾乎沒自己寫 code,生產力空前但對工作的喜歡程度下降;最大的不確定是下一代開發者怎麼訓練。主持人丟出核心問題:你怎麼讓 AI 寫出跟你自己寫的一模一樣的 code?Dillon 的回答是「挫折、掙扎、反覆嘗試、絕望的夜晚」。

承上 前情提要裡「Dillon 是 Cloudflare 工程師、死忠 Neovim 派、曾公開看空 AI」這個背景在這段被直接用上:正因為他原本是手工派,「六個月沒自己寫 code」才有反差,也才值得問「你怎麼做到的」。

推理因為節目要先讓觀眾知道這集為什麼值得聽,所以作者(主持人)把整集最刺的幾句話剪成預告:Cloudflare 五月裁 20%、AI 是主因;Dillon 六個月沒寫 code、生產力空前但更不快樂;最大的不確定是下一代怎麼訓練。最後丟出整集的主線問題——怎麼讓 AI 寫出跟你自己會寫的一模一樣的 code——而 Dillon 的回答不是工具名,而是「挫折、掙扎、反覆嘗試、絕望的夜晚」,這等於預告答案是「過程」而不是「捷徑」。

AI 補充這段是剪輯預告,不是線性的對談;所以先把三條線標出來,之後對談會依序展開:(1) 個人層面——一個手工派工程師怎麼變成幾乎不寫 code、以及為什麼更累;(2) 組織層面——Cloudflare 裁員與角色壓縮;(3) 方法層面——具體的工具鏈與工作流。「line for line」這個說法值得留意:他要的不是「能動的 code」,而是「跟他自己寫的看不出差別的 code」,這個標準比一般 vibe coding 高很多,後面所有做法都是為了達到這個標準。

Neovim

終端機文字編輯器

Vim 的現代分支,純鍵盤操作、高度可客製,常被視為「手工派」工程師的象徵。

Neovim 使用者通常花很多時間打磨自己的設定與快捷鍵,對「每一行 code 都是自己打的」有很強的認同。主持人特別點出 Dillon 是「die hard Neovim fan」,是為了凸顯他轉向 AI 寫 code 的反差有多大;後面談到的「不再享受日常」與「像回到 junior」,都跟這個手工派身份有關。

相關術語: Pi (同樣極簡、可客製)

出處:第 1 段「開場:六個月沒自己寫 code」

line for line

逐行一模一樣

AI 產出的 code 跟自己會寫的每一行都相同,看不出是誰寫的。

這是 Dillon 對 AI 產出的品質標準,遠高於「能跑就好」。達到這個標準代表 AI 不只做對功能,還遵守了他的架構、命名、錯誤處理與型別習慣。整集後半的工具鏈(spec 寫成 TypeScript 型別、本地 review、把品味寫成 skill)都是為了逼近這個標準;而前半談的「更累」也是這個標準的代價。

相關術語: vibe coding (相反)

出處:第 1 段「開場:六個月沒自己寫 code」

見仁見智 0:39
「80% of the value generation is usually done by like 10% of the people」
主持人引用的是模糊的「有統計說」;常見的說法是 Pareto 的 80/20,而軟體工程的「10x 工程師」研究(Sackman 1968 等)樣本很小、方法爭議大。數字本身不能當事實,只能當一種主觀感受。
依據: Pareto principle(80/20);Sackman, Erikson & Grant 1968;Bossavit《The Leprechauns of Software Engineering》對 10x 研究的批評
留給下一段 預告丟出的問題是「你怎麼做到讓 AI line for line 寫出你的 code」,但答案只給了「挫折與反覆嘗試」。要理解這個過程,得先知道他的起點:一個公開看空 AI 的人,是什麼讓他轉向?

2. 從看空到 all-in 1:18–6:55

Dillon 交代背景:直到 2025 年 11 月他都公開看空 AI,對 Dario「12 個月內 AI 寫 90–100% 的 code」翻白眼;結果 Opus 4.5 在感恩節後推出,聖誕假期一玩就發現和 Sonnet 3.5/3.7 時代完全不同,從此幾乎不再自己寫 code。他強調這是「whiplash」:六個月內產出相同、做事方式 100% 不同,而業界對這個「人的面向」討論太少。他推薦前同事 Ethan Niszer 的文章《Don't Hold Back the Ocean》:把這段時期比作電影業從手工剪接換成數位,結論是精靈已出瓶,選擇成為新工具的 craftsman 並繼續為結果負責。

承上 承上:上一段留下「一個公開看空 AI 的人是什麼讓他轉向」。這段 Dillon 交代起點:直到 2025 年 11 月他都公開 bearish,轉折點是 Opus 4.5。

推理因為上一段預告了「六個月沒寫 code」但沒說怎麼開始,所以 Dillon 先說明自己的基準線:他不是 AI 早期信徒,而是對 Dario「12 個月內 AI 寫 90–100% code」翻白眼的人。這讓他的轉向更有說服力——不是信仰,是實際用了 Opus 4.5 之後發現「跟 Sonnet 3.5/3.7 時代明顯不同」。接著他把重點從模型拉到人:產出一樣、做法 100% 不同,這是「whiplash」,而業界對這個人的面向討論太少。最後借 Ethan Niser 的文章給出他的心態框架:精靈已出瓶,選擇成為新工具的 craftsman、繼續為結果負責。

AI 補充這段的關鍵不是「Opus 4.5 很強」,而是 Dillon 把「工具換了」和「身份換了」分開談。Ethan 的電影業比喻(手工剪接 → 數位)點出一件事:技術轉換時真正難的是那些以「手藝」為身份的人怎麼安放自己。這段給的答案是「把手藝從『寫 code』轉移到『駕馭工具並為結果負責』」——注意「still own the outcomes」這句,它是後面所有討論的錨點:不管 code 是誰寫的,責任沒有轉移。另外他說在 Opus 4.5 之前只讓 Claude Code 寫 5–10% 的 code,這個數字可以當對照:從 5–10% 到「幾乎全部」只花了一個假期,這就是他說的 whiplash。

術語:bearish

bearish

看空、悲觀

借自金融用語,指對某件事的前景持懷疑或悲觀態度。

Dillon 用「bearish」形容自己在 2025 年 11 月前對 AI 寫 code 的立場,並強調當時是「公開」表態。這個背景很重要:他之後的 all-in 不是被行銷說服,而是被實際體驗推翻了自己的判斷。後面他批評 AI lab 的敘事時,仍然保留了這種懷疑的底色。

相關術語: whiplash (翻轉後的感受)

出處:第 2 段「從看空到 all-in」

whiplash

急轉彎的暈眩感

原指車禍時頸部急速前後甩動造成的傷害,這裡比喻工作方式在短時間內劇烈翻轉帶來的不適應。

Dillon 用它描述「六個月前的工作和今天完全不同」的感覺:產出相同、方法 100% 不同。他認為這個「人的面向」被業界忽略——大家談模型能力、談生產力,很少談轉換過程有多難受。這個詞為後面「更不快樂」「像回到 junior」的討論鋪路。

相關術語: bearish (翻轉前的立場)

出處:第 2 段「從看空到 all-in」

craftsman

工匠、手藝人

以精通自己的工具與技藝為傲的人;這裡指工程師把「把手藝做好」當成身份的一部分。

Ethan Niser 的文章把「craftsman」的定義從「親手寫出好 code」重新定義為「精通當下的工具、並為產出負責」。這個重定義是 Dillon 採納的心態:工具可以換(從 Neovim 到 agent),但「精通工具」與「負責結果」不變。理解這一點才能理解他為什麼不接受 AFK 的 agent loop——那等於放棄了 craftsman 的責任。

相關術語: Neovim (舊時代的手藝象徵)

出處:第 2 段「從看空到 all-in」

留給下一段 Ethan 的框架說「精靈已出瓶,選擇成為新工具的 craftsman」。但如果 AI 只是又一個「工具」,那過去 15 年工具一直在換,為什麼這次會讓人身份動搖?主持人接下來會拋出「工具不定義工作」的立場,Dillon 得回答 AI 到底算不算一般的工具。

3. 工具不定義工作? 6:55–10:02

主持人提出自己的立場:AI 是工具,工具 15 年來一直在換,他刻意不讓工具定義自己的工作,因為他對公司的價值從來不是寫出的 code。Dillon 同意這個框架,但補充兩點:第一,他不是讓 agent 在 loop 裡 AFK 自動 commit 的人,每一行 code 都會讀,仍然把自己的原則與經驗灌進產出,只是「產出怎麼產生」變了;第二,只叫它工具不太公平,因為它不像任何過去的工具——在對的人手上是驚人的生產力放大器。

承上 承上:上一段留下「如果 AI 只是又一個工具,為什麼這次會讓人身份動搖」。這段主持人正面提出「工具不定義我的工作」的立場,Dillon 得回答 AI 算不算一般工具。

推理因為上一段 Dillon 用 craftsman 的框架談身份轉換,所以主持人提出一個反向的框架來對照:他 15 年來工具一直在換、自己對公司的價值從來不是寫出的 code,所以刻意不讓工具定義工作——換工具不該動搖身份。Dillon 的回應分兩層:先同意「LLM 仍然是工具」,並劃清界線——他不是讓 agent AFK 在 loop 裡自動 commit 的人,每一行 code 都會讀,原則、經驗、過去的錯誤與成功一樣灌進產出,只是「產出怎麼產生」變了;再補一句「只叫它工具不太公平」,因為在對的人手上它是前所未有的生產力放大器。這兩層合起來的意思是:責任歸屬不變(所以是工具),但影響幅度前所未見(所以不只是工具)。

AI 補充主持人和 Dillon 的分歧其實不在「是不是工具」,而在「滿足感從哪裡來」——主持人的價值錨在「對公司的貢獻」,Dillon 的錨原本在「寫 code 的過程」。這段還藏了一個後面會一直用到的區分:「AFK loop 派」與「讀每一行派」。前者讓 agent 自主循環、直接 commit;後者堅持人是 reviewer 與決策者。Dillon 明確站在後者,這決定了他之後對 sub-agent、對自動降級模型、對「多 agent 平行」的態度。另外他自嘲「預測的 track record 很差」,是呼應上一段的 bearish 翻車,也提醒聽眾:接下來的判斷都是「今天」的判斷。

AFK

離開鍵盤、無人看管

Away From Keyboard,這裡指讓 agent 在沒有人監督的情況下自己跑、自己 commit。

AFK 工作法的支持者讓多個 agent 在 loop 裡自主執行任務、跑測試、提交 code,人只在最後或出錯時介入。Dillon 明確表示自己「不在那個陣營」:他讀每一行 code,把自己的原則灌進產出。這條界線是理解他整套工具鏈的關鍵——他的工具都是為了讓「人在迴圈裡」更有效率,而不是把人移出迴圈。

相關術語: craftsman (相反:放棄親自負責)

出處:第 3 段「工具不定義工作?」

loop

自主迴圈

agent 反覆「規劃 → 執行 → 檢查 → 修正」直到任務完成的自動化流程,通常不需要人逐步介入。

loop 是 agentic 工作流的核心概念:agent 不是回答一次就停,而是持續執行直到達成目標。搭配 AFK 就成了「放著讓它跑」。Dillon 在這段只說自己不是 loop 派,理由要到後面談成本與中位數開發者時才會展開。這裡先記住:他不反對 loop 本身,而是反對「不讀每一行就 commit」。

相關術語: AFK (常搭配使用)

出處:第 3 段「工具不定義工作?」

留給下一段 Dillon 說自己「比以前更有生產力,但有些日子討厭這個事實」。既然責任沒變、產出更多,為什麼會不快樂?下一段他得說清楚滿足感到底少了什麼。

4. 更不快樂:滿足感的來源變了 10:02–14:16

Dillon 坦白今天對工作的喜歡程度遠不如一年前,滿足感與快樂變少,但看得到隧道盡頭的光。他的原則是:駕駛 LLM 的人就是該負責的人,這和以前一樣,只是「從開始到完成的中間那段」完全不同,要維持同樣品質很費工。主持人用太太從工程師轉 EM 的經驗類比:工程師每解一個小問題就有一個小成就,EM 沒有,得重新調整「什麼讓我快樂」的價值系統;以前以寫 code 為傲的人現在也面臨同樣的轉換。

承上 承上:上一段留下「生產力更高卻更不快樂,滿足感少了什麼」。這段 Dillon 坦白今天對工作的喜歡程度遠不如一年前,主持人用 EM 轉職的類比幫他找出原因。

推理因為上一段確立了「責任沒變、只是中間過程變了」,所以 Dillon 在這段把「更不快樂」定位在那個中間過程:從開始到完成的路徑完全不同,要維持同樣品質很費工,個人滿足感與快樂變少,但他看得到隧道盡頭的光。主持人接著提供一個解釋框架:太太從工程師轉 EM 後不再寫 code,工程師每解一個小問題就有一個小成就、有起有伏,EM 沒有,所以得重新調整「什麼讓我快樂」的價值系統。Dillon 承認這個類比成立——他愛做產品,但「沉浸在寫 code 裡」那種東西不一樣了,而且六個月沒進過 flow state。

AI 補充這段是整集情緒線的核心。主持人的 EM 類比把一個模糊的「不快樂」拆成可分析的機制:滿足感來自「小成就的頻率」。工程師的一天有幾十個小成就(解 bug、想到漂亮解法),EM 的一天可能一個都沒有,只有「團隊有沒有產出」這種延遲很長的回饋。Dillon 現在的處境跟 EM 一樣——他管理的不是人而是 agent,但同樣失去了那些小成就。注意他說「I see a light at the end of the tunnel」:他不是在抱怨,而是在描述一段還沒結束的適應期,並且已經開始看到新的滿足感會從哪裡回來(從「怎麼設計系統」而不是「怎麼寫這行」)。

術語:engineering manager

engineering manager

工程經理(EM)

負責團隊產出、成員成長與協調的管理職,通常不再親自寫 code。

主持人用太太從工程師轉 EM 的經驗做類比:EM 失去了「每解一個問題就有一個小成就」的回饋,必須重建自己的價值系統。這個類比對 Dillon 適用的地方在於——駕馭 agent 的工程師也變成一種「管理者」,回饋變得延遲、抽象。理解這一點就能理解為什麼有些人轉得很順(本來就不從寫 code 取得滿足)、有些人很痛苦。

相關術語: flow state (EM 通常失去它)

出處:第 4 段「更不快樂:滿足感的來源變了」

flow state

心流

完全沉浸在一件事裡、忘記時間、不被打斷的專注狀態。

心流通常需要「挑戰與能力剛好匹配」加上「即時回饋」。寫 code 天然滿足這兩個條件:小難題不斷出現、解掉馬上知道。Dillon 說六個月沒進過 flow state,是因為他的工作已經沒有這種連續的小難題了——這是下一段要解釋的機制。這個詞是理解「更累」的關鍵。

相關術語: whiplash (失去心流是其一)

出處:第 4 段「更不快樂:滿足感的來源變了」

留給下一段 Dillon 說「六個月沒進過 flow state」,還說隧道盡頭有光。但為什麼會沒有心流?他接下來要拆解自己一天的工作結構,說明小難題被誰拿走、剩下什麼。

5. 只剩 macro 難題,沒有 flow 14:16–17:38

Dillon 解釋為什麼更累:以前做一個全端功能,先決定架構、抽象、資料流與型別(macro 難題,決定系統成敗),然後可以「休息」去實作,實作過程裡不斷出現的小難題(這個 class 怎麼寫、用哪個 library、漏掉的錯誤路徑)是一個個小的 dopamine hit,讓他進入 flow state。現在小難題全被 LLM 接走,工作變成從一個 macro 難題跳到下一個,六個月沒進過 flow state。他再次強調:LLM 的產出永遠要落到一個人身上負責,而且決策的影響範圍更大、時間更短,所以 macro 決定要更謹慎。

承上 承上:上一段留下「為什麼六個月沒進過 flow state」。這段 Dillon 拆解自己以前一天的工作結構,說明小難題被 LLM 拿走後只剩什麼。

推理因為上一段用 EM 類比指出「小成就消失」是不快樂的來源,所以 Dillon 這段用一個全端功能的例子把它講具體:以前做一個從 UI 到 endpoint 到商業邏輯到資料庫索引的功能,先決定架構、抽象、資料流與型別——這是「macro 難題」,決定系統成敗;決定完就能「休息」去實作,而實作過程裡不斷冒出的小難題(這個 class 怎麼寫、用哪個 library、漏掉的錯誤路徑)是一個個小的 dopamine hit,把他帶進 flow state。現在小難題全被 LLM 接走,一天變成從一個 macro 難題直接跳到下一個,所以更累。他順勢再強調一次:LLM 的產出永遠要落到一個人身上負責,而且決策影響範圍更大、時間更短,所以 macro 決定要更謹慎——這又加重了每個 macro 難題的壓力。

AI 補充這段給出了「更累」的機制,值得把它畫成兩層:macro 層(架構、抽象、資料流、型別)與 micro 層(class 怎麼寫、選哪個 library、錯誤路徑)。以前一天是「macro → 一串 micro → macro → 一串 micro」,micro 那段既是休息也是心流;現在是「macro → macro → macro」。這解釋了為什麼生產力上升但更累:被拿掉的正是「省力又有回饋」的那一層。作者沒有明說但值得補的一步:這也意味著「macro 能力」變成瓶頸——一個人一天能做多少個好的 macro 決定是有上限的,而且他說決策影響「更遠、更快」,所以錯的 macro 決定會被 LLM 以同樣速度放大。這是他之後花大力氣在 spec 與 review 上的原因。

術語:macro hard problem

macro hard problem

宏觀難題

決定系統成敗的高層決策:架構、抽象邊界、資料流、型別設計。

Dillon 把工程工作分成 macro 與 micro 兩層。macro 是「這個功能該長什麼樣、資料怎麼流、邊界切在哪」,做錯了整個系統會壞;以前做完 macro 可以「休息」去做 micro。現在 LLM 接走了 micro,工程師的一天變成連續的 macro 決定,沒有喘息。這個詞是理解他為什麼更累、以及為什麼後面把 spec 寫成型別與 interface 的核心。

相關術語: flow state (macro 連發會殺死心流)、dopamine hit (相反:沒有小回饋)

出處:第 5 段「只剩 macro 難題,沒有 flow」

dopamine hit

多巴胺小獎勵

解掉一個小問題時那種立即的、短暫的成就感。

實作時的小難題——這個 class 怎麼寫、選哪個 API、補一條漏掉的錯誤路徑——每解一個就有一次 dopamine hit,連續的小獎勵把人帶進心流。Dillon 說「that piece is largely missing right now」:不是他不想要,而是這些小難題現在都由 LLM 解掉了。這呼應上一段 EM 的類比:管理者也失去了這種小獎勵。

相關術語: flow state (累積後進入)

出處:第 5 段「只剩 macro 難題,沒有 flow」

留給下一段 Dillon 說「更累」還有另一個來源,「像重新變成新人」。macro 難題連發是一種累,那「像 junior」又是哪一種挫折?下一段他回憶自己第一份工作的感覺。

6. 像回到 junior 17:38–19:46

另一個累的來源:像重新變成新人。Dillon 回憶第一份工作時想不出 React → Go → ORM 的完美資料流抽象、不懂資深同事為什麼那麼輕鬆,那種「得不到想要的結果」的挫折感現在一模一樣。主持人接話:他完全同意 LLM 的 code 要被 review(問責第一、品質第二),但這需要細心與紀律;網路上很多人沒經歷這些痛苦,因為「能動就好」,幾分鐘就從零到能跑。

承上 承上:上一段留下「像重新變成新人是另一種累」。這段 Dillon 用自己第一份工作的回憶說明那種挫折感,主持人再把它連到「線上很多人沒經歷這個」。

推理因為上一段解釋了「macro 連發」這種累,所以 Dillon 補上第二種:過去幾週他發現自己的挫折感跟當 junior 時一模一樣——第一份工作時想不出 React → Go → ORM 的完美資料流抽象、看不懂資深同事為什麼那麼輕鬆,那種「知道自己要什麼卻得不到」的感覺現在重演了,只是對象換成 agent。主持人接話把這件事推到方法論層面:他 100% 同意 LLM 的 code 要被 review(問責第一、品質第二),但這需要細心與紀律;網路上很多聲音之所以聽起來輕鬆,是因為他們跳過了這一步——「能動就好」,幾分鐘就從零到能跑,所以沒有這些痛苦、也沒有「像 junior」的感覺。

AI 補充這段其實在解釋一個很多人困惑的現象:為什麼有些人說 AI 寫 code 很輕鬆、有些人說很痛苦?主持人給的答案是「標準不同」。如果標準是「能動」,LLM 幾分鐘就達成,當然輕鬆;如果標準是第 1 段說的 line for line,那你得像 junior 一樣反覆試、反覆被拒絕,直到學會怎麼讓 agent 給你要的東西。Dillon 的「像 junior」不是能力退步,而是「工具的操作技能歸零」——他知道好的抽象長什麼樣(senior 的判斷力還在),但還不知道怎麼讓 agent 產出它(新的操作技能還沒建立)。這個區分後面談「下一代怎麼訓練」時會很關鍵:judgement 和 operation 是兩種不同的技能。

術語:signal to noise

ORM

物件關聯對映

Object-Relational Mapping,把資料庫的表和列對應成程式語言裡的物件,讓你用物件操作資料而不寫 SQL。

Dillon 回憶 junior 時卡在「React 前端 → Go 後端 → ORM → 資料庫」這條資料流該怎麼抽象。這正是上一段說的 macro 難題:資料在各層之間怎麼流、邊界切在哪。他當年想不出來的東西現在已經是直覺,但「怎麼讓 agent 做出同樣的東西」又是一次從零學起。

相關術語: macro hard problem (資料流抽象是一種)

出處:第 6 段「像回到 junior」

signal to noise

訊噪比

有用資訊與雜訊的比例;訊噪比低代表大部分內容沒有參考價值。

主持人說線上關於 AI 寫 code 的討論訊噪比很低,原因是很多人沒經歷「review 每一行、被拒絕、重來」的痛苦階段,只用「能動」當標準,所以他們的經驗對追求 production 品質的人幾乎沒有參考價值。這個判斷後面 Dillon 會用更直接的話重複:幾乎完全忽略 Twitter。

相關術語: line for line (標準不同造成雜訊)

出處:第 6 段「像回到 junior」

留給下一段 主持人說「能動」對多數 production 應用不夠,liability 是大問題。但如果新人靠 LLM 幾分鐘就得到「能動」的東西、跳過搏鬥的過程,他們要怎麼學會判斷什麼是「夠好」?下一段兩人談下一代怎麼訓練。

7. 下一代怎麼訓練 19:46–23:34

主持人:「能動」對多數 production 應用不夠(liability 是大問題),軟體開發不會消失、工程師反而更有價值,但他最怕 junior:以前靠跟難題搏鬥學習,現在丟一顆「止痛藥」(prompt)就有東西。Dillon 說這是他現在最大的不確定,沒有答案,也許會變成學徒制;他自己靠掙扎、犯錯、弄掛 prod 學會,所以認為 system design 與架構能力是往後最重要的技能,而那是幾千次反覆看過什麼可行、什麼失敗、什麼只是 hype 累積出來的直覺。他擔心新的學法是「更快地做出爛軟體再重建」。

承上 承上:上一段留下「新人靠 prompt 幾分鐘就得到能動的東西、跳過搏鬥,要怎麼學會判斷什麼是夠好」。這段主持人先說他最怕的就是 junior,Dillon 承認這是他最大的不確定。

推理因為上一段確認了「能動不等於夠好、真正的學習來自搏鬥」,所以主持人這段先把立場說清楚:軟體開發這個職業不會消失(他認為 Dario 在這點上胡說),工程師反而更有價值,因為「這是好 code、這是壞 code」的判斷力更被需要;但他最怕 junior——以前靠跟難題搏鬥學習,現在丟一顆 Advil(prompt)就有東西,搏鬥不見了。Dillon 說這正是他現在最大的不確定,沒有答案,只有一些想法(也許會變成學徒制、Cloudflare 有些 junior 有成功案例)。他接著推導出一個結論:因為自己是靠掙扎、犯錯、弄掛 prod 學會的,而這些累積出的「看過幾千種模式、知道什麼可行什麼是 hype」的直覺正是 system design 與架構能力,所以往後最重要的技能是 system design——但他不知道沒有搏鬥要怎麼建立這種直覺,只擔心新的學法是「更快做出爛軟體再重建」。

AI 補充這段把第 5、6 段的兩條線接起來了:第 5 段說工作只剩 macro 難題,第 6 段說 judgement 和 operation 是兩種技能;那麼下一代的問題就是——macro 判斷力(system design 直覺)以前是 micro 搏鬥的副產品,現在 micro 被 LLM 拿走了,副產品也跟著消失。這是為什麼 Dillon 說「沒有答案」:不是他沒想過,而是這個因果鏈斷了、還沒有替代品。作者跳過的一步:主持人說「工程師更有價值」和「junior 很危險」其實是同一件事的兩面——價值集中在有判斷力的人身上,而判斷力的生產線壞了,長期會讓有價值的人越來越稀缺。這也是為什麼「apprenticeship」被提出來:學徒制的本質是讓新人在有判斷力的人旁邊做真實的事,而不是自己搏鬥。

system design

系統設計

決定一個系統由哪些元件組成、元件之間怎麼互動、資料怎麼流、失敗怎麼處理的高層設計能力。

Dillon 認為這是往後最重要的技能,理由是它正好是 LLM 現在最弱、而人類最需要負責的那一層(第 5 段的 macro 難題)。但他坦白這種能力是「跨幾千種模式與架構、看過什麼可行什麼失敗什麼只是 hype」累積出來的直覺,而那些累積以前來自親手實作與弄掛 prod。這就是下一代的困境:最需要的技能,其訓練路徑被 LLM 移除了。

相關術語: macro hard problem (解決它的能力)、apprenticeship (可能的訓練方式)

出處:第 7 段「下一代怎麼訓練」

apprenticeship

學徒制

新人跟在有經驗的師傅旁邊做真實的工作、邊做邊被糾正的訓練方式。

Dillon 猜下一代的訓練可能會走向類似學徒制,因為「自己搏鬥」這條路被 LLM 縮短了。學徒制的重點不是「做很多」而是「有人看著你做、告訴你哪裡不對」——換句話說是把師傅的 judgement 直接傳給徒弟,而不是等徒弟自己從錯誤裡長出來。這是他提出的少數具體想法之一,但他也說自己沒有答案。

相關術語: system design (要傳承的技能)

出處:第 7 段「下一代怎麼訓練」

留給下一段 主持人接著說「AI 裁員」多半是藉口、10x/100x 是行銷,但 Dillon 表示在裁員這點上他有些不同意見——因為 Cloudflare 剛在五月裁了 20%。下一段他要從內部視角解釋這次裁員到底是不是 AI 驅動的。

8. Cloudflare 裁 1,100 人 23:34–26:12

主持人先說「AI 裁員」多半是藉口、10x/100x 是行銷,2–3 倍才務實;Dillon 表示在裁員這點上有些不同意見。Cloudflare 五月裁 20%、約 1,100 人,AI 是主因;他承認也有過去幾年過度招聘的成分,但壓倒性的事實是 AI 驅動:裁完隔天就有幾百個開缺,只是職位完全不同。他歸功 Matthew Prince 與 Dane Knecht 看到「AI 讓人更有能力」的趨勢並全力投入;被砍的是中間那一層——scrum master、三層 director、負責忙碌工作的角色。

承上 承上:上一段留下「Dillon 在 AI 裁員這點上不同意主持人、要解釋 Cloudflare 五月裁 20% 的內部視角」。這段他正面回答:是 AI 驅動,但形式不是「裁員瘦身」。

推理因為上一段主持人主張「AI 裁員多半是藉口、2–3 倍才務實」,所以 Dillon 這段用親身經歷提出反例:Cloudflare 五月裁 20%、約 1,100 人,AI 被列為主因。他先承認也有過去幾年 overhiring 的成分(並說這是脫下 Cloudflare 帽子講的),但接著給出判斷「壓倒性的事實是 AI 驅動」的證據:裁完隔天就開了幾百個職缺,只是職位完全不同——所以不是瘦身,是換人。他歸功 Matthew Prince 與 Dane Knecht 看到的趨勢不是「裁員」而是「AI 讓人更有能力」並全力投入;被砍的是中間那一層:scrum master、三層 director、負責忙碌工作的角色。

AI 補充這段對「AI 裁員是不是藉口」給了一個比二選一更細的答案:關鍵指標不是「裁了多少」而是「裁完之後有沒有補、補什麼」。如果裁完就縮編,那是財務理由掛 AI 招牌;如果裁完馬上開幾百個不同的缺,那是組織結構因為 AI 而重排。Dillon 說被砍的是「中間層」——這跟第 5 段的 macro/micro 結構可以對起來:AI 讓有判斷力的個人能直接產出,那些原本負責「協調產出」的角色(scrum master、多層 director)的價值就下降了。要注意的是,他這裡的說法是一個內部員工的主觀判斷,他自己也先聲明「可能有沒被承認的其他原因」;聽的時候把「AI 驅動」和「overhiring 修正」當成同時成立的兩個因素比較穩。

overhiring

過度招聘

公司在景氣或資金充裕時招募超過實際需要的人力,之後需要修正。

2020–2022 年科技業普遍大量招聘,2023 年起陸續裁員修正。Dillon 承認 Cloudflare 的裁員也有這個成分,但認為不是主因。判斷的依據是「裁完隔天開幾百個缺」——純粹的 overhiring 修正不會馬上再補人。把兩個因素分開看,才能評估「AI 裁員」這個標籤有多少是真的。

相關術語: scrum master (被裁的角色之一)

出處:第 8 段「Cloudflare 裁 1,100 人」

scrum master

敏捷流程引導者

在 Scrum 團隊裡負責主持流程儀式、移除障礙、確保團隊遵守方法論的角色,通常不直接產出。

Dillon 把 scrum master 和「三層 director」歸為被 AI 壓縮掉的「中間層」:這些角色的價值來自協調與流程,當 AI 讓個別工程師能更快、更獨立地產出時,協調的需求就下降。這不是說流程不重要,而是流程的成本(一個專職角色)相對於它帶來的價值變得難以合理化。這個「中間層被壓縮」的觀察,是下一段「角色壓縮」討論的起點。

相關術語: overhiring (常見的修正對象)

出處:第 8 段「Cloudflare 裁 1,100 人」

留給下一段 Cloudflare 砍的是「中間層」、開的是「完全不同的職缺」。那麼留下來的工程師,角色會被壓縮成什麼?下一段主持人直接問:AI 會讓一個工程師同時是 QA 和 PM 嗎?

9. 角色壓縮:QA 30 秒、軟技能更重要 26:12–31:00

主持人問:AI 會讓一個工程師同時是 QA 和 PM 嗎?Dillon:QA 肯定會——他推 PR 後有 agent 自動寫 Playwright 測試、錄影交回,以前半天的 QA 現在 30 秒;但這不是說要裁 QA。他認為最好的工程師是 product-minded、對使用者痛點有同理心(除了 2% 極深專業如嵌入式 kernel)。主持人補充最好的工程師是 T 型、能跟法務對話;Dillon 說一年前這是 senior 與 staff/principal 的分界(技術報酬遞減、軟技能推動事情),而 AI 是一股壓縮力量,角色重疊變多,所以跨團隊合作、同理心比以前更重要——例如派 agent 去別團隊的 codebase 探索問題再去溝通。

承上 承上:上一段留下「中間層被砍、開的是不同職缺,留下來的工程師角色會被壓縮成什麼」。這段主持人直接問 AI 會不會讓一個工程師同時是 QA 和 PM,Dillon 用自己的 PR 流程回答。

推理因為上一段確立了「AI 讓個人能直接產出、中間層價值下降」,所以主持人這段追問角色邊界會不會消失,用 QA 與 PM 當具體例子。Dillon 的回答分三步:第一,QA 肯定會——他推 PR 後有 agent 自動寫 Playwright 測試、錄影交回,以前半天的 QA 現在 30 秒,但他刻意說這不是主張裁掉 QA。第二,最好的工程師本來就該是 product-minded、對使用者痛點有同理心,除了 2% 極深專業(嵌入式 kernel)之外。第三,主持人補充 T 型、能跟法務對話的工程師更有價值,Dillon 接著把它升級:一年前這只是 senior 與 staff/principal 的分界(技術報酬遞減、軟技能推動事情),現在 AI 是一股壓縮力量,角色重疊變多,所以跨團隊合作與同理心比以前更重要——例如派 agent 去別團隊的 codebase 探索問題後再去溝通。

AI 補充這段有一個容易漏掉的推論:為什麼 AI 讓「軟技能」更重要,而不是更不重要?直覺上 AI 接手了更多工作,人應該更少互動才對。Dillon 的邏輯是:AI 壓縮了角色邊界 → 每個人碰到的「別人領域」變多(你會去動別團隊的 codebase、會做以前 QA 做的事)→ 需要更多跨領域的協調與同理心。換句話說,AI 移除的是「做」的成本,不是「協調」的成本,所以協調的相對重要性上升。另外,「QA 30 秒」這個例子要和第 3 段的立場合起來看:agent 自動跑 Playwright 是把 micro 工作交出去,但 Dillon 還是自己看錄影——這是「人在迴圈裡」的 QA,不是 AFK。

術語:product-minded engineerT-shaped

Playwright

瀏覽器端對端測試框架

Microsoft 開源的自動化測試工具,能操作真實瀏覽器模擬使用者點擊、輸入並驗證畫面。

Dillon 的流程:推 PR → 一個 agent 偵測到 → 自動針對這次改動寫 Playwright 測試 → 執行並錄影 → 把錄影交回給他看。這把「手動點過一遍」的 QA 從半天壓到 30 秒。重點在於 agent 不只寫測試還錄影,所以人仍然能用眼睛驗證,這符合他「讀每一行」的原則。

相關術語: AFK (不是:人仍看錄影)

出處:第 9 段「角色壓縮:QA 30 秒、軟技能更重要」

product-minded engineer

產品思維的工程師

不只會實作,還深入理解使用者痛點、能從產品價值判斷該做什麼的工程師。

Dillon 說這一直是他在 Vercel 與 Cloudflare 學到的「最好的工程師」定義,而 AI 讓它更重要:當實作成本下降,「該做什麼」的判斷就變成主要的價值來源。他也劃出例外——像嵌入式 kernel 這種極深的專業(約 2%)可以不需要。這個概念和第 7 段的 system design 一樣,都屬於「AI 拿不走的判斷力」。

相關術語: T-shaped (相近概念)

出處:第 9 段「角色壓縮:QA 30 秒、軟技能更重要」

T-shaped

T 型人才

在一個領域很深(T 的直筆)、同時對多個相鄰領域有基本能力(T 的橫筆)的人。

主持人用它描述最好的工程師:能做工程、也能做 QA、產品、跟客戶與法務對話。Dillon 補充一年前這是 senior 與 staff/principal 的分界線——技術深度到一定程度後報酬遞減,推動事情的是軟技能與影響力。AI 把這條線往下壓:不用等到 staff,senior 甚至更早就得面對跨領域的情境。

相關術語: product-minded engineer (橫筆的一部分)

出處:第 9 段「角色壓縮:QA 30 秒、軟技能更重要」

留給下一段 Dillon 說「角色重疊變多」,但主持人並不買單「未來只招 product engineer 包辦一切」——他要用 JetBrains 的 PM 當例子反駁。PM 和工程師的邊界到底會怎麼變?

10. PM 與工程師:MVP 取代長 PRD 31:00–34:55

主持人不買單「未來只招 product engineer 包辦一切」:JetBrains 的 PM 有的比他還懂 codebase、有的完全不懂,讓 PM vibe code 一個 PR 當討論起點很好,但他不覺得工程師能寫出設計、QA、行銷都能用的 PRD——專業分工還在,只是界線變模糊、交接更快。Dillon 同意沒有哪個職位該消失,但 PM 要離開「花兩週寫 4,000 字 PRD 再到處 bikeshed」的流程:用更精簡的 spec 做 MVP/原型交給工程師打磨,Cloudflare 的 PM 已經這樣做;不過 product engineer 和 PM 技能組合仍不同,好 PM 值千金。

承上 承上:上一段留下「主持人不買單只招 product engineer 包辦一切」。這段他用 JetBrains 的 PM 舉例,Dillon 同意但把重點轉到 PM 的工作流該怎麼變。

推理因為上一段 Dillon 主張角色壓縮、重疊變多,所以主持人這段提出反例來畫界線:JetBrains 的 PM 有的比他還懂 codebase、有的完全不懂,讓 PM vibe code 一個 PR 當討論起點他很歡迎,但他不覺得自己能寫出設計、QA、行銷都能用的 PRD——專業分工還在,只是界線更模糊、交接更快。Dillon 說他不反對任何一句,並澄清自己沒說任何職位該消失(「我連自己的日常都還不太會做」);但他對 PM 有具體看法:PM 要離開「花兩週寫 4,000 字 PRD、到處 bikeshed」的流程,改用精簡的 spec 做 MVP/原型交給工程師打磨,Cloudflare 的 PM 已經開始這樣做。最後補一句平衡:product engineer 和 PM 的技能組合仍然不同,好 PM 值千金。

AI 補充兩人在這段收斂出一個共識,值得整理成一句:**角色不消失,交接物改變**。以前 PM → 工程師的交接物是文件(PRD),現在可以是「能跑的原型」;以前工程師 → QA 的交接物是 PR,現在是「PR + agent 錄的測試影片」。交接物從「描述」變成「實物」,所以交接更快、誤解更少——這是主持人說的「AI 讓 handoff 更 seamless」的具體含義。Dillon 對 PRD 的批評也可以對回第 5 段:4,000 字 PRD 是「用文字描述 macro 決定」,而原型是「用實物呈現 macro 決定」;後者更容易被工程師驗證與反駁。這個「用實物代替描述」的想法,之後會出現在他自己的 spec 寫法裡。

術語:vibe codingbikeshedding

PRD

產品需求文件

Product Requirements Document,PM 寫給設計、工程、QA、行銷的正式需求規格。

傳統流程裡 PRD 是 PM 的核心產出,寫完要在各團隊間傳閱、收集意見。Dillon 批評「兩週寫 4,000 字再到處 bikeshed」太慢,主張改成精簡 spec + MVP。主持人的立場是:他不覺得工程師能寫出各部門都能用的 PRD,所以 PM 的專業還在。兩人的共識是 PRD 會變薄、變快,而不是消失。

相關術語: MVP (被它部分取代)、bikeshedding (常伴隨的問題)

出處:第 10 段「PM 與工程師:MVP 取代長 PRD」

MVP

最小可行產品

Minimum Viable Product,用最少功能做出能驗證想法的版本。

Dillon 說 Cloudflare 的 PM 現在會用精簡 spec 做出 MVP 或原型,交給工程師打磨,因為「能跑的東西」比 4,000 字文件更能傳達想法。這不代表 PM 把 PR 直接推上 prod——他明確說「Absolutely not」。MVP 在這裡是溝通工具,不是交付物。

相關術語: PRD (取代其溝通功能)、vibe coding (PM 做 MVP 的方式)

出處:第 10 段「PM 與工程師:MVP 取代長 PRD」

vibe coding

憑感覺讓 AI 寫 code

不細看產出的 code、只用自然語言描述需求並反覆讓 AI 生成直到「能動」的寫法。

主持人用「vibe coding a PR」形容 PM 用 AI 做出一個起點。他歡迎這種用法——作為討論起點很好——但也點出它不是 production 品質。這和第 1 段的 line for line 是光譜的兩端:vibe coding 只求能動、不讀 code;Dillon 讀每一行、要求跟自己寫的一樣。同一個工具,兩種標準,適用於不同角色與階段。

相關術語: line for line (相反)、MVP (適合做它)

出處:第 10 段「PM 與工程師:MVP 取代長 PRD」

bikeshedding

在瑣事上爭論不休

團隊把大量時間花在容易表達意見的小事上(比喻:討論核電廠時爭論腳踏車棚的顏色)。

Dillon 說長 PRD 的問題之一是「shop it around and bikeshed it」:文件越長、越正式,越容易引來各方對細節的意見,而不是對核心想法的驗證。用 MVP 取代 PRD 的好處之一就是把討論拉回「這個東西能不能用」。

相關術語: PRD (長文件容易引發)

出處:第 10 段「PM 與工程師:MVP 取代長 PRD」

留給下一段 到這裡談的都是「人」與「組織」怎麼變。主持人接下來把鏡頭轉向工作方式本身:Boris(Claude Code)、Peter Steinberger(OpenAI)那種多 agent 平行 loop 的做法,是未來還是只有 AI lab 才玩得起的科學實驗?

11. Loops 不適合中位數開發者 34:55–40:00

主持人問:Boris(Claude)、Peter Steinberger(OpenAI)那種多 agent 平行 loop 的工作法,多少是靠 AI lab 的無限 token?是未來還是「科學實驗」?Dillon 自評在正中間:以今天的模型與成本,對中位數開發者「行不通」,除非你在 lab;他不喜歡 Claude Code 與 Codex 團隊的說法,因為不論訂閱或 API 計費(Cloudflare 與多數企業都走 API),dynamic workflow 這類功能貴到不能日用。他設想若成本不降,可能要用 RFC 決定哪些問題值得花 token。他要看更多「receipts」:harness 品質一版好一版壞、功能狂出但一致性不足以合理化成本,而越來越多人被價格排除在外。

承上 承上:上一段留下「多 agent 平行 loop 是未來還是只有 AI lab 才玩得起的科學實驗」。這段 Dillon 給出他的定位:正中間,而理由是成本。

推理因為上一段把話題從組織轉到工作方式,所以主持人這段先把問題框好:Boris(Claude Code)與 Peter Steinberger(OpenAI)推的多 agent 平行 loop,他很敬佩,但多少是靠 lab 的無限 token?是未來方向還是 David Cramer(Sentry)說的「科學實驗」?Dillon 自評在正中間,然後把「中間」拆開:以今天的模型與限制,對「中位數」開發者來說行不通,除非你在 lab 有無限 token。接著他點名不喜歡 Claude Code 與 Codex 團隊談這件事的方式——不論訂閱或 API 計費(Cloudflare 與多數企業都走 API),dynamic workflow 這類功能貴到不能日用;他甚至設想若成本不降,組織可能得用 RFC 決定哪些問題值得花 token。最後他要看更多「receipts」:harness 品質一版好一版壞、功能狂出但一致性不足以合理化成本,同時越來越多人被價格排除在外,這是一種錯位。

AI 補充這段是 Dillon 對 AI lab 敘事最直接的批評,值得把他的論證拆成三個獨立的主張,因為它們各自成立:(1) **成本主張**——loop 消耗的 token 對 API 計費的企業來說太貴,這是經濟問題,不是能力問題;(2) **一致性主張**——harness 每版行為都變,沒有穩定的 baseline,所以無法評估 loop 到底有沒有用;(3) **證據主張**——lab 說有效,但沒有足夠的 receipts(可驗證的成果)。注意他特別用「中位數」而不是「平均」:平均會被少數重度使用者拉高,中位數才代表「一般人」。RFC 決定 token 用途的設想很有意思:它意味著 token 變成一種需要治理的稀缺資源,跟雲端成本、資料庫連線數一樣要被組織層級管理。這也回應了第 3 段他為什麼不是 loop 派——不只是原則,也是他公司的帳單。

術語:API billing

median developer

中位數開發者

把所有開發者依某個指標排序後正中間那一位,代表「一般人」而非「平均值」。

Dillon 刻意說「not even average, the median dev」。平均值會被少數極端使用者(例如 lab 裡有無限 token 的人)拉高,中位數不會。他的判斷是:對中位數開發者而言,今天的 loop 工作流因為成本「不實際、行不通」。這個用詞本身就是一種論證——把討論從「最強的人能做到什麼」拉回「多數人能負擔什麼」。

相關術語: loop (對他們不實際)

出處:第 11 段「Loops 不適合中位數開發者」

API billing

依 API 用量計費

按實際消耗的 token 數付費,而不是固定月費訂閱。

個人開發者多用固定月費的訂閱方案(有用量上限但成本可預期);企業如 Cloudflare 則走 API 計費,用多少付多少。這代表 loop 工作流的成本會直接、線性地反映在公司帳單上,沒有訂閱方案的「吃到飽」緩衝。這是 Dillon 說「貴到不能日用」的具體背景,也是他設想 RFC 治理 token 的原因。

相關術語: median developer (企業裡的多數)

出處:第 11 段「Loops 不適合中位數開發者」

harness

agent 執行框架

包住模型的那層軟體:system prompt、tool 定義、context 管理、loop 控制,例如 Claude Code、Codex、OpenCode。

同一個模型放進不同 harness 行為會不同,因為 harness 決定了模型看到什麼 context、能用哪些 tool、怎麼循環。Dillon 批評 Claude Code 與 Codex 這類 harness「一版好一版壞」:功能出得快,但每次改 tool 定義或 system prompt 都會讓模型行為飄移,無法建立穩定的 baseline 來評估成本效益。這個抱怨會直接影響他自己選什麼 harness。

相關術語: loop (由它控制)、receipts (缺少的證據)

出處:第 11 段「Loops 不適合中位數開發者」

receipts

可驗證的證據

口語用法,指「拿出證明來」——不是說法,而是可檢驗的實際成果。

Dillon 說「I want to see more receipts from the labs that these workflows work」:lab 說多 agent loop 有效,但他要的是可重現的證據,而不是 demo 或推文。這個要求和第 6 段主持人說的「訊噪比低」是同一個態度:對 AI 工作流的說法,預設懷疑、要求證據。

相關術語: signal to noise (同一種懷疑)

出處:第 11 段「Loops 不適合中位數開發者」

留給下一段 Dillon 提到開源權重模型(GLM 5.2)越來越好,「哪天夠好了這些能力才合理」——但這聽起來正是 AI 批評者最常嘲笑的「永遠再六個月」。他要怎麼面對這個矛盾?主持人又會把成本問題推到什麼層級?

12. 永遠再六個月:ROI 與預算 40:00–41:50

Dillon 說開源權重模型(如 GLM 5.2)越來越好,哪天夠好時這些能力才合理,但那正是 AI 批評者說的「永遠在六個月後」;他自己實驗能拿到結果,但今天(2026-06-25)不是主流,lab 的說法聽了很煩。主持人補充:若品質不大幅上升、價格不下來,今年公司內部會有激烈的 ROI 對話——過去 AI 花費像有無窮的金子,Uber 四個月燒光全年 AI 預算後率先設硬上限,其他公司會跟進。Fable 是第一次看到品質戲劇性提升的模型,但也貴一倍、慢一倍。

承上 承上:上一段留下「開源模型夠好時 loop 才合理,但這正是『永遠再六個月』的矛盾」。這段 Dillon 承認矛盾、主持人把成本問題推到公司預算層級。

推理因為上一段結尾自己說出了「等模型夠好」這種話,所以 Dillon 這段先承認這正是 AI 批評者的視角——「永遠在六個月後」——並引 Armin 的文章說他也在跟同樣的矛盾搏鬥:Dillon 自己的實驗有時真的能拿到結果,但今天(2026 年 6 月 25 日)它不是主流;六個月後也許 GPT-6 很強、成本或 token 效率壓下來,也許不會,所以現在聽 lab 那種說法「很煩」。主持人接著把它從個人推到公司:若品質不大幅上升、價格不下來,今年公司內部就會有激烈的 ROI 對話——過去 AI 花費像有無窮的金子,公司用 10x/100x 的希望合理化;Uber 四個月燒光全年 AI 預算後率先設硬上限,其他公司會跟進。他最後點出 Fable 是第一次看到品質戲劇性提升的模型,但也貴一倍、慢一倍——品質上升了,價格卻沒下來。

AI 補充這段最重要的是那句「今天,2026 年 6 月 25 日」——Dillon 刻意把判斷加上日期,是因為他知道這個領域的判斷保鮮期很短(第 3 段他就說過自己預測的 track record 很差)。這是一種誠實的說法:「我不否認未來可能不同,但我拒絕用未來的可能性來合理化今天的成本」。主持人的 Uber 例子把第 11 段的「token 需要治理」變成了現實:當一家公司四個月燒光全年預算,硬上限就不是假設而是必然。作者沒明說的一步:「品質上升、價格下降」需要同時發生,才能解開 ROI 的僵局;而 Fable 是「品質上升但價格也上升」,所以它不解決問題,反而讓問題更尖銳。

術語:open-weight model

open-weight model

開放權重模型

模型的參數(權重)公開下載,可以自己部署、自己付算力,例如 GLM 系列。

Dillon 說 GLM 5.2 這類開放權重模型「越來越好」,一旦夠好,loop 工作流的成本結構就會完全不同——你付的是自己的 GPU 而不是 lab 的 API 價格,也沒有用量上限。但他也承認這是「等未來」的論證。開放權重模型是解 ROI 僵局的一條路,前提是品質追上。

相關術語: API billing (替代方案)

出處:第 12 段「永遠再六個月:ROI 與預算」

ROI

投資報酬率

Return on Investment,投入的成本相對於得到的回報。

主持人預測今年公司內部會有「激烈的 ROI 對話」,因為到目前為止 AI 花費幾乎不被檢視——大家用 10x/100x 的希望合理化一切。Uber 四個月燒光年度預算後設硬上限,是第一個公開的轉折點。ROI 對話的結果會直接決定第 11 段說的「哪些問題值得花 token」。

相關術語: API billing (成本端)、receipts (回報端的證據)

出處:第 12 段「永遠再六個月:ROI 與預算」

留給下一段 主持人說 Fable 品質戲劇性提升但貴一倍、慢一倍。Dillon 對 Fable 有更根本的問題——不是價格,而是它對 Cloudflare 這種企業從第一天就出局的兩個理由。

13. Fable 為何是 non-starter 41:50–44:05

Dillon 對 Fable 的兩個問題:一、沒有 zero data retention(ZDR),會保留並訓練你的 prompt 與 code,其他模型都有 ZDR,所以對 Cloudflare 這種企業第一天就出局;二、它會自作主張降級到 Opus 4.8——他不接受 thinking 被拿走(他手動引導 agent、不要更多自主性),而且 200k context 一路吃 cache hit 後突然換模型,整份 inference 成本要重付。主持人的抱怨則是「不可用」是 Anthropic 自己搞出來的:先喊危險,再抱怨被封鎖。

承上 承上:上一段留下「Dillon 對 Fable 有比價格更根本的兩個問題,讓它對企業第一天就出局」。這段他講清楚這兩個問題:資料保留與自動降級。

推理因為上一段主持人只談了 Fable 的價格與速度,所以 Dillon 這段補上企業視角的兩個硬門檻。第一,Fable 不提供 zero data retention——會保留你所有的 prompt 與送進去的 code 並拿來訓練,而其他模型都有 ZDR,所以對 Cloudflare 這種公司第一天就 non-starter。第二,它會自作主張降級到 Opus 4.8,這又有兩個問題:(a) 他不接受 thinking 被拿走——他手動引導 agent、知道自己要什麼,不想要模型在這方面「更有自主性」;(b) 成本——假設 context 已累積 200k token,用 Fable 時一路吃 cache hit 省了錢,一降級到 4.8 就得把整份 inference 成本重付一次。主持人的抱怨則是另一個角度:「Fable 不可用」是 Anthropic 自己搞出來的——先喊很危險,再抱怨被封鎖。

AI 補充這段看起來是對單一模型的抱怨,但背後是兩條企業採用 AI 的通則。第一條:**資料治理先於能力**——再強的模型,只要會把企業的 code 拿去訓練,法務就會直接否決,跟品質無關。第二條:**可預測性先於自主性**——Dillon 在第 3 段說自己「讀每一行」、在這裡說「不要更多 dynamism」,是同一個原則:他要的是一個可控的工具,不是一個會自己做決定的代理人。自動降級違反這個原則的方式很具體:它讓成本和行為都變得不可預測。作者跳過的一步:為什麼降級會「重付整份 inference」?因為 prompt cache 是綁定在特定模型上的——同一份 200k context 在 Fable 上已經被快取,換到 Opus 4.8 就是一份全新的、未快取的輸入,得從頭計價。這也解釋了為什麼他把「cache hit」當成日常成本結構的一部分。另外要提醒:ZDR 與降級行為都是供應商政策,可能隨版本或合約改變,聽的時候記得這是 2026 年 6 月的狀態。

zero data retention

零資料保留(ZDR)

供應商承諾不儲存你送進 API 的 prompt 與回應,處理完即丟棄、也不用於訓練。

對企業而言 ZDR 是採用 AI 的前提:沒有它,送進模型的 code、客戶資料、內部文件都可能被保留甚至用於訓練,法務與資安會直接否決。Dillon 說 Fable 不提供 ZDR 而其他模型都有,所以對 Cloudflare 是 non-starter——這是「能力再強也沒用」的典型例子。ZDR 通常是企業合約或特定 API 層級才有的選項,不是預設。

相關術語: API billing (同屬企業採用條件)

出處:第 13 段「Fable 為何是 non-starter」

cache hit

快取命中

重複送入相同的 context 前綴時,供應商直接沿用先前的計算結果,收費大幅降低。

Prompt caching 讓長對話變便宜:一段 200k token 的 context 第一次送要全額計價,之後每輪只要前綴不變就只付快取價(通常是原價的一小部分)。Dillon 指出自動降級的隱藏成本:快取綁定在特定模型上,Fable 換到 Opus 4.8 時整份 context 變成「新的」,得重付全額。這是為什麼他把「模型不可以自己換」當成成本問題而不只是控制問題。

相關術語: API billing (決定實際帳單)、harness (由它控制 context)

出處:第 13 段「Fable 為何是 non-starter」

thinking

推理模式

模型在回答前先進行一段可延長的內部推理,通常對複雜任務品質更好、但更慢更貴。

Dillon 說「I do not take thinking away from me」:他把是否用 thinking 當成自己該掌控的旋鈕,因為他手動引導 agent、知道每一步要多深的推理。Fable 自動降級等於替他關掉 thinking。這呼應他對 harness 的一貫要求——行為可預測、由人決定,不要模型自己「動態」調整。

相關術語: harness (應由它暴露為選項)

出處:第 13 段「Fable 為何是 non-starter」

留給下一段 談完外部條件(成本、模型、政策),主持人把整集的核心問題再問一次:你那則推文說「第一次讓 AI 寫出 line for line 跟你一樣的 code」,到底怎麼做到的?這次 Dillon 要真的開始回答。

14. 讓模型照你的方式寫 44:05–46:20

回到核心問題「怎麼讓 AI 寫出跟你一樣的 code」。Dillon:挫折、反覆嘗試、絕望與存在焦慮,花了很長時間,而且現在還是沒以前那麼喜歡日常。但若你認為 agentic engineering 是未來、在乎手藝,就該花時間親自建構、找出什麼有用;而且要幾乎完全忽略 Twitter——談 AI 工作流的多是年輕 YC 創辦人,有才華但沒有「production 系統跑很多年還可維護」的經驗,很多人也在賣東西。他學會的方式和以前一樣:失敗、產出爛東西、造成事故,只是壓縮在幾個月裡。

承上 承上:上一段留下「主持人再問一次核心問題:怎麼讓 AI 寫出 line for line 的 code」。這段 Dillon 給出心法層面的回答,工具細節留到後面。

推理因為主持人把第 1 段預告裡的問題正式問出來,所以 Dillon 先重複同樣的答案——挫折、掙扎、反覆嘗試、絕望的夜晚、存在焦慮——並補充:花了很長時間,而且到現在還是沒以前那麼喜歡日常(呼應第 4 段)。接著他給出一個條件式:如果你認為 agentic engineering 是未來、在乎自己的手藝與產出,那就該花時間親自用這些東西建構、反覆試、找出什麼有用。而要做到這件事,幾乎得完全忽略 Twitter——因為談 AI 工作流的多是年輕 YC 創辦人,有才華、做出好產品,但沒有「production 系統跑很多年還可維護」的經驗,而且很多人在賣東西。最後他把方法對回自己的成長路徑:他是靠失敗、產出爛東西、造成事故學會當工程師的,這次一樣,只是壓縮在幾個月裡。

AI 補充這段的答案看起來像在迴避(「就是反覆試」),但其實是整集最一致的主張:**沒有捷徑,因為你要學的是判斷力,而判斷力只能從自己的失敗裡長出來**。這和第 7 段談下一代訓練的邏輯完全相同——Dillon 對自己的要求,就是他擔心 junior 得不到的那條路。「忽略 Twitter」的理由也不是傲慢,而是第 6 段訊噪比的延伸:YC 創辦人的標準是「快速做出產品」,Dillon 的標準是「跑很多年還可維護」,兩種標準下的最佳工作流不同,所以對方的經驗對他幾乎沒有參考價值。作者沒說但值得補的一步:「壓縮在幾個月裡」意味著失敗的成本也被壓縮——以前弄掛 prod 一次學一課,現在一天可以失敗十次;這其實是 LLM 給有經驗者的一個真正優勢,前提是你願意讀每一行、看每一次失敗。

術語:YC founder

agentic engineering

以 agent 為核心的工程方法

工程師的主要工作變成設計、引導與審查 agent 的產出,而不是親手寫每一行 code。

Dillon 用這個詞描述他認為「可能是未來」的工作方式,並把它跟「在乎手藝」放在一起:agentic engineering 不是放手讓 agent 做,而是把手藝轉移到「怎麼讓 agent 做出你要的東西」。這和第 2 段 craftsman 的重定義是同一件事。他的條件式很重要:如果你不相信這是未來、或不在乎產出品質,那沒必要經歷這些痛苦。

相關術語: craftsman (新時代的形式)、vibe coding (相反:不在乎品質)

出處:第 14 段「讓模型照你的方式寫」

YC founder

Y Combinator 創業者

經過矽谷知名加速器 Y Combinator 培育的新創創辦人,通常年輕、追求快速做出產品。

Dillon 觀察到 Twitter 上談 AI 工作流的聲音多來自這群人。他不否認他們有才華,但指出一個結構性差異:新創的目標是快速驗證與成長,不需要(也還沒機會)面對「系統跑五年後誰來維護」的問題;而且很多人本身在賣 AI 工具。所以他們的最佳實踐,對追求長期可維護性的企業工程師不一定適用——「每一句都打折扣」。

相關術語: signal to noise (雜訊的主要來源)

出處:第 14 段「讓模型照你的方式寫」

留給下一段 心法講完了,但「反覆嘗試」總得落在具體的工具上。Dillon 說他有三四個主要工具——第一層是終端機與 workspace 的組織方式,第二層是他選的 agent harness,而選 harness 的標準會直接回應第 11 段對 Claude Code 與 Codex 的批評。

15. Herdr 與 Pi:harness 越少越好 46:20–48:16

工具鏈第一層:Ghostty 終端機 + Herdr(建在 libghostty 上的現代 tmux,支援 kitty image protocol、agent 追蹤指示器,CLI 對人和 agent 都友善,用來組織專案與 workspace)。第二層是 Pi 這個 coding agent harness:極簡、可客製但他幾乎不客製。他對 harness 的結論是「做得越少、改得越少越好」——OpenCode 與 Claude Code 每週改 tool 定義與 system prompt,模型行為跟著飄,很難建立 baseline;小 system prompt、少數 tool、把注入 context 的東西減到最少,是他學會最珍惜的事。

承上 承上:上一段留下「三四個主要工具:第一層終端機與 workspace,第二層 harness,選 harness 的標準會回應對 Claude Code 與 Codex 的批評」。這段他列出 Ghostty + Herdr 與 Pi,並說出「harness 做得越少越好」的原則。

推理因為上一段說「反覆嘗試總得落在具體工具上」,所以 Dillon 這段從最底層開始盤點。第一層:Ghostty 終端機配 Herdr——建在 libghostty 上的現代版 tmux,支援 kitty image protocol、有 agent 追蹤與指示器、CLI 對人和 agent 都友善(控制 dev server、監看狀態),他用它組織專案與 workspace。第二層:Pi 這個 coding agent harness,他喜歡它極簡、可客製(自嘲是 Neovim 魂),但其實沒有重度客製。接著他給出選 harness 的結論:要它做得越少、改得越少越好。理由直接接回第 11 段的抱怨:OpenCode 與 Claude Code 每週出新功能、tool 定義變、system prompt 變,模型行為跟著飄,很難建立 baseline。所以「很小的 system prompt、只有幾個 tool、把注入 context 的東西減到最少」是他學會最珍惜的事。

AI 補充這段把第 11 段的批評(harness 一版好一版壞)變成了選擇標準:既然 harness 的每次改動都會讓模型行為飄移,那最好的 harness 就是「幾乎不存在」的 harness——它只提供最少的 tool 和最短的 system prompt,其餘由人來控制。這背後有一個作者沒明說的假設:Dillon 要建立的是「他自己對模型的直覺」(第 6 段的 operation 技能),而這需要一個穩定的實驗環境——harness 一直變,他就分不清是自己的方法有效還是 harness 剛好改對了。「minimize what gets injected into your context」也是後面所有工具的共同原則:他要親手決定 context 裡有什麼。Herdr 看似只是 tmux 替代品,但「agent 追蹤指示器」與「agent 友善的 CLI」說明它是為多個 agent 同時跑的工作方式設計的——這是他組織多個 agent session 的基礎設施。

術語:terminal multiplexer

terminal multiplexer

終端機多工器

在一個終端機視窗裡管理多個 shell session、分割窗格、離線保留工作狀態的工具,例如 tmux。

Dillon 用的 Herdr 是建在 libghostty(Ghostty 終端機的核心函式庫)上的現代版 tmux,多了 kitty image protocol(終端機內顯示圖片)、agent 追蹤指示器,以及對 agent 友善的 CLI。對他來說 multiplexer 不只是方便,而是「同時跑好幾個 agent session 並知道每個在做什麼」的組織層。這是工具鏈的地基。

相關術語: harness (在它裡面跑)

出處:第 15 段「Herdr 與 Pi:harness 越少越好」

Pi

極簡 coding agent harness

一個刻意保持精簡、可客製的 coding agent 執行框架,system prompt 小、tool 少。

Dillon 選 Pi 的理由不是功能多,而是功能少且穩定:他要 harness「做得越少、改得越少越好」。這是對 Claude Code 與 OpenCode 每週改 tool 定義與 system prompt 的直接反應——行為飄移讓人無法建立 baseline。他自嘲這是 Neovim 魂:喜歡極簡、可客製的工具,雖然實際上沒重度客製。主持人補充 Mario 在同一個節目也說過一樣的話。

相關術語: harness (一種)、Neovim (同樣的極簡取向)

出處:第 15 段「Herdr 與 Pi:harness 越少越好」

baseline

基準線

一個穩定、可重複的起點,用來比較改變前後的差異。

要判斷「我的方法有沒有效」,得先有一個不會自己變的環境。Dillon 說 harness 每週改 system prompt 與 tool 定義,模型行為跟著變,就沒有 baseline——你不知道結果變好是因為你的 prompt 還是 harness 的更新。這是他選極簡 harness 的核心理由,也是他能建立「context 怎麼影響模型」直覺的前提。

相關術語: harness (頻繁改動會破壞)

出處:第 15 段「Herdr 與 Pi:harness 越少越好」

system prompt

系統提示

harness 在每次對話開頭固定注入給模型的指令,決定它的角色、規則與可用工具。

system prompt 是 harness 對模型行為影響最大的單一因素:它告訴模型「你是誰、該怎麼做、有哪些 tool」。Dillon 要它「很小」,因為每多一句都是他無法完全掌控的變數,也是 context 裡的固定成本。Claude Code 這類 harness 的 system prompt 很長且常改,是他認為行為飄移的主因之一。

相關術語: harness (核心組成)、baseline (改動會破壞)

出處:第 15 段「Herdr 與 Pi:harness 越少越好」

留給下一段 地基(Herdr)與引擎(Pi)之外,他說還有一個「對他極為重要」的工具——它要解決的是年初他就看出來的問題:code review 流程壞了,而且他不想在自己完整 review 之前把 AI 的改動推給團隊看。

16. Plannotator review 與 stacked PR 48:16–51:13

第三個工具 Plannotator(plannotator.ai,免費,支援 Pi/OpenCode/Codex/Claude Code)。功能一是本地 code review:年初他看出 review 流程壞了,不想在自己完整 review 前把 AI 改動推給團隊看,`/plannotator review` 開一個像 GitHub PR review 的網頁(建在 Pierre 的 diff 工具上,很快),逐檔加註解後 submit 就注入回 agent session,回饋循環變快。他強調交付方式沒變:小改動、stacked PR、每個 PR 控制在 300–800 行,這樣能 review 到懂、還能完整理解 codebase。主持人問 stacked PR 是什麼:從還沒 merge 的分支再開分支、PR 指向前一個分支,工具如 Graphite(被 Cursor 收購)、JJ,GitHub/GitLab 也要原生支援。

承上 承上:上一段留下「還有一個極重要的工具,解決 code review 流程壞掉、不想在自己 review 前把 AI 改動推給團隊的問題」。這段介紹 Plannotator 的本地 review,以及他不變的交付方式。

推理因為上一段確立了「context 由人控制、review 每一行」的原則,所以這段的工具就是讓「人 review」變快。第三個工具 Plannotator(plannotator.ai,免費,支援 Pi/OpenCode/Codex/Claude Code)有兩大功能,先講第一個:本地 code review。年初他就看出 review 流程壞了——他不想在自己完整、整體地 review 之前把 AI 的改動推成 PR 讓團隊看,但當時沒有好的本地工具。`/plannotator review` 會開一個像 GitHub PR review 的網頁(建在 Pierre 的 diff 工具上,很快),逐檔加註解,submit 後註解直接注入回目前的 agent session,讓「做 → review → 修」的回饋循環變快。他接著強調交付方式完全沒變:小改動、stacked PR、每個 PR 控制在 300–800 行——這樣可以 review 到懂、眼睛不會花,還能完整理解自己的 codebase。主持人問 stacked PR 是什麼,Dillon 解釋:從還沒 merge 的分支再開分支,PR 指向前一個分支,工具有 Graphite(被 Cursor 收購)、JJ,GitHub 與 GitLab 也在加原生支援。

AI 補充這段回答了一個很實際的問題:如果 agent 產出很快,人怎麼跟得上 review?Dillon 的答案是兩件事同時做。第一,**把 review 移到 PR 之前**——本地 review 讓他在推給團隊之前就已經逐行看過、逐行改過,PR 上的 code 是「他認可的」而不是「agent 剛吐的」。這是第 3 段「讀每一行」的工具化。第二,**限制每次產出的大小**——300–800 行不是隨便的數字,它是「一個人能真正讀懂」的上限;agent 可以一次產出三千行,但他刻意不讓它這麼做。stacked PR 是讓「小 PR」在多步驟功能上仍然可行的技術:每一步是一個獨立可審的 PR,但彼此有依賴順序。作者沒明說的一步:這兩個做法合起來,等於把 agent 的速度優勢用在「迭代次數」而不是「單次產量」上——這是他能維持 line for line 品質的結構性原因。

術語:atomic

Plannotator

本地 review 與註解工具

一個免費工具(plannotator.ai),讓你在本機用類似 GitHub PR 的介面 review agent 的改動或註解文件,結果注入回 agent session。

Plannotator 支援 Pi、OpenCode、Codex、Claude Code。第一個功能是 `/plannotator review`:開一個網頁,像 GitHub PR review 一樣逐檔看 diff、加註解,submit 後註解回到 agent 的 context 裡。它建在 Pierre 的 diff 工具上所以很快。這解決了 Dillon 年初的痛點——想在推 PR 之前就完整 review AI 改動,但沒有好用的本地工具。第二個功能之後再講。

相關術語: harness (外掛於各種)、stacked PR (配合使用)

出處:第 16 段「Plannotator review 與 stacked PR」

stacked PR

堆疊式 PR

從還沒 merge 的分支再開新分支,新 PR 指向前一個分支而不是 main,形成一串有順序依賴的小 PR。

假設功能要三步:A 做資料層、B 做 API、C 做 UI。傳統做法是一個大 PR 或等 A merge 再做 B;stacked PR 則是 B 從 A 的分支開出、PR 指向 A,C 從 B 開出、PR 指向 B。每個 PR 都小(Dillon 控制在 300–800 行)、可獨立審,但開發不用等前面 merge。工具:Graphite(已被 Cursor 收購)、JJ(Jujutsu,需要一些設定),GitHub 與 GitLab 正在加原生支援。這是讓「小 PR」原則在大功能上不拖慢速度的關鍵。

相關術語: Plannotator (review 每一層)

出處:第 16 段「Plannotator review 與 stacked PR」

atomic

原子性(一次只做一件事)

一個改動只包含一個完整、獨立、可單獨理解與回滾的目的。

Dillon 用「scoped、atomic、300–800 行」描述他的每個 PR:範圍明確、只做一件事、大小能一次讀完。atomic 的好處是 review 時腦中只需要一個 mental model,出問題時也只需要 revert 一個 PR。在 agent 時代這個原則更重要——agent 很容易「順便」改了十個檔案,人得主動限制它。

相關術語: stacked PR (每一層都應如此)

出處:第 16 段「Plannotator review 與 stacked PR」

留給下一段 Plannotator 的第一個功能是 review「code」。他說還有第二個大功能——同樣的註解介面,但對象不是 diff,而是文件與 agent 的訊息;那會如何改變他跟 agent 建立共識的方式?

17. annotate / last:對話堆成 spec 51:13–52:49

Plannotator 另外兩個功能做同一件事:`/plannotator annotate <檔案>` 把檔案打開讓你畫重點、加註解再送回 harness(例如叫 agent 寫一份新 ORM 抽象的 spec 到 markdown,再標註回饋);`/plannotator last` 把 agent 最後一則訊息載進註解工具編輯。他更常用後者:在一來一回的訊息裡建立對實作計畫的共同理解,而不是先寫 markdown;累積久了看起來越來越像 spec,等他相信雙方有清楚的共同理解,才叫它寫成 markdown 並實作。

承上 承上:上一段留下「Plannotator 的第二個大功能:同樣的註解介面,對象不是 diff 而是文件與 agent 的訊息」。這段講 `/plannotator annotate` 與 `/plannotator last`,以及它們怎麼改變建立共識的方式。

推理因為上一段的 review 功能已經證明「人的註解直接注入 agent session」這條回饋路徑很有效,所以 Dillon 把同一條路徑用在 code 之外。`/plannotator annotate <檔案>` 把檔案打開讓你畫重點、加註解再送回 harness——例如先叫 agent 寫一份「新 ORM 抽象」的 spec 到 markdown,再標註回饋,整個循環很緊。`/plannotator last` 則把 agent 最後一則訊息載進註解工具讓他直接編輯。他說自己更常用後者:在一來一回的訊息裡建立對實作計畫的共同理解,而不是一開始就寫 markdown;累積久了這些訊息看起來越來越像一份 spec,等他「終於相信」雙方對要做什麼有清楚的共同理解,才叫 agent 寫成 markdown 並實作。

AI 補充這段藏著一個對「spec-driven development」的重要修正。一般想像是「先寫好 spec → 再叫 agent 實作」,但 Dillon 的順序是「對話 → 對話漸漸長成 spec → 最後才固化成文件」。差別在於 spec 不是他一個人憑空寫的,而是他和 agent 在來回中「協商」出來的——agent 提案、他標註、agent 修、他再標註。這對回第 10 段談 PRD 時的共識:交接物從「描述」變成「實物」;這裡 spec 也不是描述,而是「已經對齊過的理解」的快照。`/plannotator last` 之所以比 annotate 常用,是因為它讓「編輯 agent 的話」變得跟「回訊息」一樣輕——他不是在寫文件,而是在修正 agent 的理解。作者沒明說的一步:「終於相信有共同理解」是一個判斷,而做這個判斷的能力正是第 6、7 段說的 senior 判斷力;junior 可能會太早相信。

shared understanding

共同理解

人和 agent 對「要做什麼、邊界在哪、為什麼這樣做」有一致且經過確認的認知。

Dillon 把「建立共同理解」當成實作前的必要條件,而不是把 spec 丟過去就開始。他的判斷標準是「當我終於相信雙方有清楚的共同理解」——這是一個主觀但關鍵的門檻。建立的方式是反覆用 `/plannotator last` 修正 agent 的訊息,讓 agent 的理解逐漸逼近他的。這個概念是他能達到 line for line 的核心:agent 寫出跟他一樣的 code,是因為在動手前已經想得跟他一樣。

相關術語: Plannotator (用它建立)、spec (固化後的形式)

出處:第 17 段「annotate / last:對話堆成 spec」

spec

規格文件

實作前寫下的「要做什麼」的正式描述;在 Dillon 的流程裡是對話累積到足夠清楚後才固化成 markdown。

Dillon 的 spec 和傳統的差別在「來源」:不是先寫 spec 再對話,而是先對話,對話自然長成 spec。這解決了主持人之後會提到的問題——很多人無法在探索前就寫出完美的 spec。他的流程讓 spec 成為探索的「結果」而非「前提」。spec 的具體長相(不像 PRD、像 code)他接下來會講。

相關術語: shared understanding (它的快照)、PRD (對照:更像 code)

出處:第 17 段「annotate / last:對話堆成 spec」

留給下一段 有了共同理解就能寫 spec,但共同理解本身怎麼從零開始建?Dillon 說這帶到下一個部分——Pi 的 `/tree`,以及一個看起來很浪費的習慣:問 agent 一些他自己已經知道答案的問題。

18. /tree:先問自己知道答案的問題 52:49–54:50

Pi 的 `/tree`(Pi 刻意沒有 sub-agent)。他開始一項工作(例如在 Artifacts 產品加 endpoint)的方式是問 agent 一些他已經知道答案的問題:Hono 是什麼、怎麼設定、API 有哪些;agent 去研究,來回幾次直到他放心它的理解正確,然後 `/tree` 跳回對話根部(可選擇摘要、像 compaction)。他通常讓那則結論留在樹上或寫進 markdown,再從零 context 的根部問下一個主題(Durable Objects 怎麼做 SQLite 儲存)。這樣一個個建立 agent 對技術與模式的理解,得到精簡小結帶回主線,再用 Plannotator 迭代出 tech spec。

承上 承上:上一段留下「共同理解怎麼從零開始建:Pi 的 /tree 與『問自己已知答案的問題』」。這段講他開始一項工作的具體步驟。

推理因為上一段說共同理解要靠來回累積,所以這段講累積的起點。Pi 有 `/tree`,而且刻意沒有 sub-agent。他開始一項工作(例如在 Artifacts 產品加一個 endpoint)的方式是問 agent 一些他已經知道答案的問題——通常是技術棧、library、框架或 codebase 既有抽象:Hono 是什麼、怎麼運作、怎麼設定、API 有哪些。agent 去研究,來回幾次直到他對它的理解放心,然後 `/tree` 跳回對話的根部(可以選擇像 compaction 一樣先摘要)。他通常讓那則結論留在樹上、或把最後一段寫進 markdown,再從零 context 的根部問下一個主題:Durable Objects 怎麼做 SQLite 儲存、API 是什麼。這樣一個個建立 agent 對他要用的技術與模式的理解,每個分支得到一段精簡小結,帶回主線後再用 Plannotator 迭代出 tech spec。

AI 補充「問自己已經知道答案的問題」乍看是浪費 token,其實是整套方法裡最聰明的一步,理由有三。第一,**它是驗證**——他知道正確答案,所以能判斷 agent 的研究對不對,錯了就糾正;這是第 6 段「senior 判斷力還在」的直接應用。第二,**它是 context 的建材**——agent 研究後的結論會留在對話裡,之後實作時模型「已經知道」Hono 怎麼用,不用他每次重講。第三,**它是分區的**——每個主題在自己的分支上研究,`/tree` 跳回根部後主線只留一段小結,不會被研究過程的雜訊塞滿。這正是第 15 段「把注入 context 的東西減到最少」的實作:他不是不給 context,而是只給「經過他驗證的精簡結論」。作者沒明說的一步:為什麼 Pi「刻意沒有 sub-agent」在這裡被特別提出來——因為 `/tree` 做的事在其他 harness 裡通常由 sub-agent 做(派一個 agent 去研究、帶摘要回來),但 sub-agent 的摘要是模型自己決定的,而 tree 的小結是 Dillon 親手審過的。

/tree

對話樹跳轉

Pi 的指令,把對話當成一棵樹:可以從任一節點跳回較早的位置(例如根部),在那裡開新分支,舊分支保留。

一般 agent 對話是一條線,越聊越長;`/tree` 讓它變成樹。Dillon 的用法:在根部問一個主題(Hono),來回研究直到滿意,這條分支就結束;`/tree` 跳回根部(可選擇帶摘要,類似 compaction),從零 context 開下一個分支(Durable Objects)。每個分支只留一段小結帶回主線。這讓他用一個 session 完成多個主題的研究,而主線 context 始終乾淨。Pi 刻意不提供 sub-agent,`/tree` 是它的替代方案——差別在於摘要由人審。

相關術語: compaction (跳轉時可選的摘要)、Pi (實作於)

出處:第 18 段「/tree:先問自己知道答案的問題」

compaction

context 壓縮

當對話太長時,把先前的內容摘要成一段較短的文字取代原文,騰出 context 空間。

compaction 是所有長對話 harness 都得處理的問題:context window 有上限,滿了就得丟東西。一般 harness 自動做、摘要內容由模型決定。Dillon 用 `/tree` 時可以選擇「像 compaction 一樣」帶摘要跳回根部,但他更常自己決定留什麼——把最後一則訊息整理後寫進 markdown。這體現他對 context 的態度:壓縮可以,但由人決定壓成什麼。

相關術語: /tree (跳轉時的選項)、system prompt (同屬 context 成本)

出處:第 18 段「/tree:先問自己知道答案的問題」

Hono

輕量 web 框架

一個為 edge 環境(Cloudflare Workers 等)設計的小型 TypeScript web 框架,用來定義路由與處理 HTTP 請求。

Dillon 用它當「已知答案的問題」的例子:他當然知道 Hono 怎麼用,但他要 agent 自己研究一遍並把結論放進 context。這個例子也透露他的工作場景——在 Cloudflare 的 Artifacts 產品上加 endpoint,技術棧是 Hono + Durable Objects(Cloudflare 的有狀態儲存原語,可搭配 SQLite)。這些都是 edge 生態的常見組合。

相關術語: /tree (在分支上研究)

出處:第 18 段「/tree:先問自己知道答案的問題」

留給下一段 研究分支帶回主線後,他用 Plannotator 迭代出 tech spec。但他說自己的 tech spec「可能跟多數人不太一樣」——不像 PRD,而是長得像 code。那一份長得像 code 的 spec 到底包含什麼、為什麼要這樣寫?

19. spec 長得像 code 54:50–57:54

他的 tech spec 不像 PRD,而是 TypeScript 型別與 interface:邊界在哪、需要哪些 adapter 與實作;再讓 agent 列出要實作的 call stack(改既有的還是開新路徑、每一步的輸入輸出型別與可能錯誤);最後寫出它要寫的測試(red-green-refactor TDD)。整份約 650–1,000 行。理由:給 agent 一個 function 它多半能正確實作,agent 真正差的是抽象的設計與組合,所以用真正的 code 對齊「形狀」,把它擅長的實作交出去。主持人回應:這解決了他對 spec-driven development 的根本問題(他太探索式,不可能先寫出完美 PRD,「我要看 receipts」),並分享自己用 red-green 先寫紮實的測試再讓 LLM 實作,效果好十倍;反之「幫既有 function 寫測試」全是垃圾。

承上 承上:上一段留下「他的 tech spec 不像 PRD 而是長得像 code,包含什麼、為什麼」。這段他描述 spec 的三個部分,並給出「agent 擅長什麼、不擅長什麼」的理由。

推理因為上一段研究分支的小結已經讓 agent 懂了技術棧,所以這段的 spec 可以直接用 code 的語言寫。他的 tech spec 有三部分:(1) TypeScript 型別與 interface——邊界在哪、需要哪些 adapter 與各 interface 的實作;(2) 讓 agent 列出它要實作的 call stack——是改既有的還是開全新路徑、每一步的輸入輸出型別與可能的錯誤;(3) 讓 agent 先寫出它將要寫的測試(red-green-refactor 的 TDD)。整份約 650 到 1,000 行。理由是他對 agent 能力的判斷:給它一個 function,它多半能正確實作;agent 真正差的是「抽象的設計與組合」,那是他花最多時間跟它搏鬥的地方。所以用真正的 code 對齊「要建的東西的形狀」,把它擅長的實作交出去——不完美,LLM 還是會做蠢事,但他在慢慢磨掉那些。主持人回應這解決了他對 spec-driven development 的根本問題:他太探索式,不可能先寫出完美的 PRD(Dillon:對任何人都不現實;主持人:有人說成功,但「我要看 receipts」);他自己的類似經驗是 red-green——先自己寫或讓 LLM 寫很紮實的測試,再讓 LLM 實作,效果好十倍;反過來「幫既有 function 寫測試」全是垃圾。

AI 補充這段是整集方法論的核心,值得把邏輯鏈拉直:**agent 擅長「填空」、不擅長「設計空格」→ 所以人負責設計空格、agent 負責填 → 而「空格」在 TypeScript 裡就是型別與 interface**。型別是最精確的「形狀描述」:一個 interface 說清楚輸入什麼、輸出什麼、可能丟什麼錯,比任何自然語言 PRD 都不模糊。這也對回第 5 段:macro 難題(架構、抽象、資料流、型別)本來就是人負責的,Dillon 只是把它寫成 agent 能直接消費的格式。三個部分各有作用:型別定「形狀」,call stack 定「路徑」(防止 agent 開一條你不想要的新路),測試定「驗收」(防止它實作出「能過型別檢查但行為不對」的東西)。主持人的 red-green 經驗是同一原理的另一個切面:測試也是「空格」——先定好,agent 填實作。而「幫既有 function 寫測試全是垃圾」的原因是:那時 agent 是在「描述現況」而不是「填空」,它會把 bug 也當成規格。作者沒明說的一步:650–1,000 行的 spec 看起來很長,但對照第 16 段每個 PR 300–800 行,spec 其實比實作長——這代表他把主要的思考成本刻意放在動手前。

interface

介面(型別契約)

TypeScript 裡描述「一個東西必須有哪些屬性與方法、各是什麼型別」的宣告,不含實作。

interface 是 Dillon spec 的主體:它精確定義邊界——這一層對外承諾什麼、對內需要什麼。有了 interface,agent 只需要寫出滿足它的實作(adapter),不用猜設計。這正是「agent 擅長填空、不擅長設計空格」的分工:interface 是空格,實作是填空。用 code 寫 spec 的好處是零歧義,而且 spec 本身就能被 type checker 驗證。

相關術語: adapter (實作它)、spec (主要組成)

出處:第 19 段「spec 長得像 code」

adapter

轉接器(介面的具體實作)

把某個外部系統或技術包成符合既定 interface 的實作,讓上層 code 不用知道底層細節。

Dillon 的 spec 會列出「需要哪些 adapter 與各 interface 的實作」:例如一個 Storage interface 可能有 SQLite adapter 與 in-memory adapter。把「要哪些 adapter」寫進 spec,是在動手前就決定好邊界兩側各有什麼——這是 macro 決定;agent 之後只要把每個 adapter 實作出來——這是它擅長的 micro 工作。

相關術語: interface (實作它)

出處:第 19 段「spec 長得像 code」

call stack

呼叫路徑

一個請求進來後依序經過哪些 function、每一步的輸入輸出與可能錯誤。

Dillon 要 agent 在 spec 裡先列出它「將要實作的 call stack」:是改既有路徑還是開新路徑、每步的型別與錯誤。這一步防的是 agent 最常犯的錯——在不該開新路徑的地方開了一條、或漏掉某層的錯誤處理。把 call stack 寫出來等於讓 agent 先「說出它的計畫」,人審過再動手,錯誤在 spec 階段就被抓到,而不是在 800 行 diff 裡。

相關術語: interface (每一步的型別來自)、TDD (下一步寫測試)

出處:第 19 段「spec 長得像 code」

TDD

測試驅動開發(red-green-refactor)

先寫會失敗的測試(red),再寫最少的 code 讓它通過(green),最後整理(refactor)。

Dillon spec 的第三部分是讓 agent 先寫出「它將要寫的測試」,然後才實作。主持人分享的經驗印證了為什麼有效:先有紮實的測試再讓 LLM 實作,結果好十倍;反過來「幫既有 function 寫測試」全是垃圾,因為那時 LLM 只是在描述現況、會把 bug 當規格。TDD 在這裡的角色是把「驗收標準」變成 agent 能執行的東西,而不是人事後用眼睛檢查。

相關術語: call stack (測試覆蓋每一步)、spec (第三部分)

出處:第 19 段「spec 長得像 code」

spec-driven development

規格驅動開發

先寫完整的規格文件,再讓 AI 依規格實作的工作流。

主持人說他對這種方法的根本問題是「太探索式」——不可能在動手前就寫出完美的 PRD 給 LLM 實作。Dillon 的做法解決了這個問題:spec 不是憑空寫的,而是研究分支與對話累積出來的;而且 spec 用型別而非散文,所以「完美」的標準變成「型別能對齊」而非「文字無歧義」。兩人都對「有人靠純 PRD 成功」持保留:要看 receipts。

相關術語: spec (以它為中心)、PRD (傳統形式)

出處:第 19 段「spec 長得像 code」

留給下一段 主持人說 `/tree` 的部分「把他弄丟了一下」:分支上的研究結論到底怎麼「拉回」主線?跳轉時 context 會怎麼變?Dillon 接下來要講 tree 的細節與一個 session 實際長什麼樣。

20. /tree 細節:三種回法、幾百則訊息 57:54–1:00:12

主持人追問 tree 的分支怎麼「拉回來」。Dillon:`/tree` 跳到對話別處有三個選項——什麼都不做、自動摘要、給 prompt 自己摘要;它不會回滾 git,只影響 context 與對話。他偏好什麼都不做:把分支最後一則訊息整理成「你需要知道的事」,用 `/copy` 帶到別處,或寫成 markdown 從別的點引用。一個 Pi session 可能幾百則訊息:從前端到資料庫做完、用 Plannotator review、再跳回第零則訊息寫 e2e 測試與測試 harness,各自有分支;可以給位置加標籤讓 agent 引用。他說沒有 tree 沒辦法工作——「你就是自己的 sub-agent」。

承上 承上:上一段留下「分支上的研究結論怎麼拉回主線、跳轉時 context 怎麼變」。這段 Dillon 回答 `/tree` 的三個選項,並描述一個真實 session 的長相。

推理因為主持人猜想「是不是靠 compaction 把摘要帶回根部」,所以 Dillon 先把 `/tree` 跳轉的三個選項講清楚:什麼都不做、自動摘要、給 prompt 讓它自己摘要——而且它不會回滾 git,只影響 context 與對話。他偏好「什麼都不做」:先把分支的最後一則訊息整理到「這些是你需要知道的事」的程度,再用 `/copy` 帶到對話的另一個位置,或叫它寫成 markdown 從別的點引用。接著描述規模:一個 Pi session 可能有幾百則訊息——從前端到資料庫在一個 session 裡做完、用 Plannotator review 來回幾次,再跳回第零則訊息(零 context)寫 e2e 測試與測試 harness,那又是幾百則訊息、各有自己的分支;可以給位置加標籤,叫 agent 去看某個標籤。他的結論是沒有 tree 沒辦法工作——「你就是自己的 sub-agent,你在做 sub-agent 的工作」。

AI 補充「偏好什麼都不做」是這段最值得注意的選擇,因為它跟直覺相反——有自動摘要為什麼不用?理由接回第 18 段:自動摘要由模型決定留什麼,而 Dillon 要親自決定。「先把最後一則訊息整理成『你需要知道的事』」其實是他手動做的 compaction——差別在於這份摘要經過他審核、修改(用 `/plannotator last`)、確認正確,才被帶走。「不回滾 git」這句也很重要:tree 操作的是「模型知道什麼」,不是「檔案長什麼樣」,所以他可以在實作完成後跳回零 context 寫 e2e 測試——這時 code 已經在那裡,但模型不再帶著實作過程的所有雜訊,只看最終結果來寫測試。這其實是主持人在第 19 段說的「先有紮實測試」的另一種實現:測試 agent 沒有被實作 agent 的假設污染。「你就是自己的 sub-agent」總結了整套方法:sub-agent 的價值(隔離 context、分工探索)他全都要,但 sub-agent 的代價(摘要由模型決定)他不接受,所以自己扮演那個角色。

術語:e2e test

/copy

複製訊息到別處

Pi 的指令,把某則訊息的內容帶到對話樹的另一個位置,作為那裡的 context。

配合 `/tree` 使用:在分支上把結論整理好,`/copy` 帶回根部或另一個分支。這是 Dillon 用「什麼都不做」跳轉時搬運結論的方式之一(另一種是寫成 markdown 從別處引用)。重點是被搬運的內容是他審過的,不是模型自動生成的摘要。

相關術語: /tree (搭配使用)、compaction (手動版)

出處:第 20 段「/tree 細節:三種回法、幾百則訊息」

e2e test

端對端測試

從使用者的入口(例如瀏覽器或 API 請求)一路打到資料庫、驗證整條路徑行為正確的測試。

Dillon 的做法是實作完成、review 完之後,跳回第零則訊息(零 context)再叫 agent 寫 e2e 測試與測試 harness。零 context 的意義是:寫測試的 agent 沒有實作過程的假設,只看最終的 code 與行為,比較不會把實作的 bug 當成規格。這跟第 19 段的 TDD(實作前的單元測試)是互補的兩層。

相關術語: TDD (互補的另一層)、Playwright (常用工具)

出處:第 20 段「/tree 細節:三種回法、幾百則訊息」

留給下一段 他說「你就是自己的 sub-agent」,還提到在接受 tree 之前就發過推文說不愛 sub-agent。sub-agent 在很多 harness 裡是主打功能,他為什麼不用?主持人又是什麼看法?

21. 為何不用 sub-agent 1:00:12–1:02:00

Dillon 在接受 tree 前就發文說不愛 sub-agent:它們擅長探索、很方便,但一切取決於核心 agent 的判斷,帶回的摘要常不是他真正要放進主 context 的東西,還會妨礙自己的思考。他已經對「context 如何影響模型表現」建立相對的直覺(仍然模糊、非確定性),所以現在必須由他自己決定 context 裡放什麼,因為 agent 還不夠好。主持人同意:sub-agent 唯一有價值的場合是一大塊工作會撐爆 context、用它讓 compaction 優雅一點,但他不這樣工作;「設計師 sub-agent、架構師 sub-agent、review sub-agent」的敘事是垃圾。

承上 承上:上一段留下「他說自己就是 sub-agent,為什麼不用真的 sub-agent」。這段他說明對 sub-agent 的保留,主持人補上自己的判斷。

推理因為上一段的 tree 用法本質上是「自己做 sub-agent 的工作」,所以這段解釋為什麼不把這件事交給真的 sub-agent。Dillon 在接受 tree 之前就發過推文:sub-agent 擅長探索、很方便,但一切取決於核心 agent 的判斷——它帶回來的摘要或 context 常常不是他真正想放進主 context 的東西,還會妨礙他自己的判斷與思考。他已經對「context 如何影響模型表現」建立了相對的直覺(他自己說仍然很模糊、非確定性),所以現在必須由他來決定 context 裡放什麼,因為 agent 還不夠好。主持人同意:sub-agent 唯一讓他欣賞的場合是「一大塊工作會撐爆 context,用 sub-agent 讓 compaction 優雅一點」,但他本來就不用大塊工作,所以結論一樣——「設計師 sub-agent、架構師 sub-agent、review sub-agent」的敘事是垃圾。

AI 補充把整段的邏輯收成一句:**sub-agent 的問題不在能力,在誰做「摘要」這個決定**。摘要就是「決定什麼進主 context」,而這段之前介紹的所有工具(極簡 harness、tree、/copy、Plannotator last)都是為了讓這個決定留在 Dillon 手上。sub-agent 把它交給模型,這在他看來是把最重要的 macro 決定(第 5 段)外包出去。「妨礙判斷與思考」這句也值得展開:當 sub-agent 帶回一份漂亮的摘要,人很容易接受它而不再自己想——這跟第 7 段主持人擔心 junior 吃「止痛藥」是同一種風險,只是發生在 senior 身上。主持人的「唯一例外」很精確:sub-agent 真正解決的是 context window 的容量問題,不是判斷問題;而如果你的工作單位本來就小(300–800 行的 PR),容量問題就不存在。「designer / architect / reviewer sub-agent 是垃圾」的原因也可以推出來:那些角色的價值恰恰是判斷力,而判斷力正是模型還不夠好的部分。

sub-agent

子代理

主 agent 派出去獨立執行一個子任務(通常是探索或研究)的另一個 agent,完成後只把摘要帶回主 context。

sub-agent 的賣點是隔離:子任務的雜訊不污染主 context。Dillon 承認這個價值,但指出代價——「帶什麼回來」由模型決定,而那常常不是他要的,還會讓他不再自己想。他的替代方案是 `/tree`:一樣隔離,但摘要由人審。主持人補充 sub-agent 唯一合理的場景是「工作太大會撐爆 context」,但小 PR 工作法下這個問題不存在。兩人都認為「一個角色一個 sub-agent」的敘事沒有價值。

相關術語: /tree (人工替代)、compaction (它真正解決的問題)

出處:第 21 段「為何不用 sub-agent」

non-deterministic

非確定性

同樣的輸入不保證同樣的輸出;模型的行為只能用機率與直覺描述。

Dillon 說自己對「context 怎麼影響模型」的直覺「仍然很模糊、非確定性」——這是一種誠實的限定:他不是宣稱找到了規則,而是累積了足夠的經驗知道大概哪些 context 有幫助。正因為模型非確定,他才更堅持由人控制 context:至少變數少一個。這也呼應第 15 段要穩定 baseline 的理由。

相關術語: baseline (更需要穩定)

出處:第 21 段「為何不用 sub-agent」

留給下一段 整套方法講完了,但 Dillon 自己也承認它「很累」。回到第 11 段的 loop 話題與 Armin 的文章:他能不能想像一個把手動部分自動化、但不放棄品味的未來?最後一段他描述那個 queue。

22. 看得見的 queue:把品味放進 skill 1:02:00–1:04:31

收尾回到 loop 的話題與 Armin 的文章。Dillon 承認現在的工作流很累:能同時做兩三個功能或 debug 一個 Sentry 問題,品質接近甚至等於手寫,但很耗神。他能想像一個 queue:他丟功能需求,agent 在一個 pane 裡開始探索技術、建立 context 的 session,做完先寫一版 tech spec 再迭代,後續 agent 知道「Dillon 喜歡輸入輸出型別、interface、call stack」。review 也一樣:過去幾週他把自己在設計、架構、review 上的品味寫進 skill,也許做成 Flow agent(Astro 團隊的 framework)先做第一輪 review;不期待一開始就好,但若能省下五分鐘、不用每次糾正 `is Record`、一路傳 `unknown`、重複驗證這種事,就是勝利。

承上 承上:上一段留下「方法很累,能不能想像把手動部分自動化但不放棄品味的未來」。這段 Dillon 回到 loop 與 Armin 的文章,描述他看得見的那個 queue。

推理因為前面幾段建立的方法全靠人親手控制 context,所以 Dillon 在收尾時承認代價:這個工作流很累,他能同時做兩三個功能或 debug 一個 Sentry 問題,品質接近甚至等於手寫,但很耗神、很煩。然後他描述能想像的世界:一個 queue,他丟進「我要這個功能」,某個 agent 接走,在一個 pane 裡開始那個「來回探索技術、建立 context」的 session,做完後先寫一版 tech spec,再迭代;後續的 agent 會知道「Dillon 喜歡輸入輸出型別、interface、call stack」。review 也一樣:過去幾週他在把自己在軟體設計、架構、review 上覺得有價值的東西寫進 skill,也許做成 Flow agent(Astro 團隊出的 framework)先做第一輪 review、套用他的品味與原則。他不期待一開始就好,甚至不期待「好」,但如果能省下五分鐘、不用每次都糾正 `is Record`、一路傳 `unknown`、重複驗證這種事,就是勝利。他說自己正往那個方向走,但還有很多工作。

AI 補充這段跟第 11 段的立場放在一起看才完整:他不是反對 loop,而是反對「今天、以今天的成本、由模型決定一切」的 loop。他想像的 queue 有三個跟 lab 敘事不同的特徵。第一,**queue 裡的每一步都是他已經手動走過幾百次的步驟**(研究分支 → spec → 迭代 → review),自動化的是「流程」,不是「判斷」。第二,**品味是被明確寫下來的**——skill 裡寫的是「Dillon 喜歡型別、interface、call stack」「不要 `is Record`」「不要一路傳 `unknown`」,這些是他在幾百次 review 裡反覆糾正的東西,現在變成可執行的規則。第三,**期望值很低**:省五分鐘就算贏。這跟 lab 說的「10x」形成對比——他要的不是替代自己,而是把「每次都要糾正的同一件事」拿掉。整集的弧線到這裡收束:從「六個月沒寫 code、更累」出發,經過「為什麼累」「怎麼維持品質」「哪些工具」,最後到「怎麼把已經穩定的部分交出去」——這正是第 2 段 Ethan 說的「成為新工具的 craftsman」的具體長相。

skill

可重用的 agent 指令包

把一組規則、偏好或流程寫成文件,讓 agent 在特定任務時載入並遵守。

Dillon 過去幾週在把自己對設計、架構、review 的品味寫成 skill:喜歡輸入輸出型別、interface、call stack;不接受 `is Record`(用型別守衛偷懶)、一路傳 `unknown`、重複驗證。這些都是他在 review 裡「每次都要糾正」的東西。skill 的意義是把隱性的品味變成顯性、可執行的規則——這是他能把部分工作交給 queue 而不放棄標準的前提。

相關術語: Flow agent (可能的執行者)、line for line (把標準寫下來)

出處:第 22 段「看得見的 queue:把品味放進 skill」

Flow agent

Astro 團隊的 agent framework

Astro 團隊推出的 agent 框架,可用來定義一個帶特定規則的 agent 執行固定流程。

Dillon 說「也許做成 Flow agent」來執行第一輪 code review——套用他寫進 skill 的品味與原則,先把那些反覆出現的小問題挑出來,人再做第二輪。他明確說不期待它一開始就好;目標只是省五分鐘。這是他對 loop 的務實版本:自動化的是他已經完全知道怎麼做的那一層。

相關術語: skill (載入它)、loop (務實版本)

出處:第 22 段「看得見的 queue:把品味放進 skill」

queue

工作佇列

把任務排成一列,由 agent 依序接走執行,人在關鍵節點介入。

Dillon 想像的 queue 不是「丟進去就自動完成」,而是每個任務會走他既有的流程:探索技術建立 context → 第一版 tech spec → 迭代 → 實作 → 第一輪自動 review → 人 review。跟第 11 段批評的 lab loop 差別在:流程是他設計的、品味是他寫的、每一步的產出他都看得見。「看得見的 queue」就是他版本的 loop——自動化流程,保留判斷。

相關術語: loop (他的版本)、skill (驅動每一步)

出處:第 22 段「看得見的 queue:把品味放進 skill」

留給下一段 總結收束

4. 總結

Dillon 先建立一個反差:責任沒變、產出更多,但實作裡的小難題(dopamine hit 與 flow state 的來源)全被 LLM 接走,工作變成 macro 難題連發、像回到 junior,由此推出「system design 直覺過去是 micro 搏鬥的副產品」,所以下一代怎麼訓練是最大的未知。組織層面用 Cloudflare 裁 20% 但隔天開幾百個不同職缺說明被砍的是中間協調層,AI 壓縮角色邊界反而讓跨領域軟技能與 product-minded 更重要,PM 的交接物從 4,000 字 PRD 變成 MVP。接著對 AI lab 的多 agent loop 敘事提出成本、一致性、證據三重質疑,用 Fable 的 ZDR 與自動降級說明企業採用的硬門檻。最後回答開場問題:沒有捷徑,只有親自反覆嘗試並忽略 Twitter;具體做法是 harness 做得越少越好(Pi)、本地 review 讓「讀每一行」跟得上速度(Plannotator)、用 `/tree` 在分支上建立 agent 的理解再只帶審過的小結回主線(自己當 sub-agent)、spec 用型別 + interface + call stack + 測試定形狀(agent 擅長填空、不擅長設計空格),交付仍是 300–800 行的 stacked PR。收束在把流程排成 queue、把品味寫成 skill 做第一輪 review 的務實未來。

勘誤總整理

確定錯誤/已過時見仁見智(取決於版本或情境)

段落原話(transcript 逐字)說明
1. 開場:六個月沒自己寫 code
0:39
「80% of the value generation is usually done by like 10% of the people」主持人引用的是模糊的「有統計說」;常見的說法是 Pareto 的 80/20,而軟體工程的「10x 工程師」研究(Sackman 1968 等)樣本很小、方法爭議大。數字本身不能當事實,只能當一種主觀感受。
依據: Pareto principle(80/20);Sackman, Erikson & Grant 1968;Bossavit《The Leprechauns of Software Engineering》對 10x 研究的批評

5. 推薦三個下一步

1. 往下挖深:Pi 的 /tree 與 context 工程

影片只口述 /tree 的三種跳回方式與「自己當 sub-agent」的理由,沒有示範畫面;要真的上手需要看實際操作,並理解 context 內容如何影響模型表現。

YouTube 搜尋:pi coding agent /tree context engineering coding agent Dillon Mulroy pi workflow

2. 往旁邊對照:多 agent loop 派的做法

Dillon 站在「不用 sub-agent、不跑 AFK loop」這一邊,並點名 Boris(Claude Code)、Peter Steinberger 與 Armin 的文章;對照另一邊怎麼做、成本怎麼算,才能判斷哪種適合自己。

YouTube 搜尋:Boris Cherny Claude Code workflow Peter Steinberger agentic coding parallel coding agents workflow

3. 往上應用:Plannotator + stacked PR 落地到自己的專案

「讀每一行」要跟得上 agent 的速度,靠的是本地 review 與 300–800 行的 stacked PR;這兩個是今天就能導入的紀律,不依賴特定模型或價格。

YouTube 搜尋:plannotator review stacked pull requests Graphite tutorial spec driven development TypeScript types

📄 全部影片 · 主題區: 工程職涯與架構角色