DHH 的 agent 時代宣言:手寫程式碼的終結,與為什麼該選擇樂觀

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

🎧 語音解析✍️ 練習

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

1. Outline

  1. 起點 · Rails World 2026 Opening Keynote - DHH
    從攝影史的類比出發,一路推到「手寫程式碼在經濟上已經結束」,再收在為什麼理性的選擇是樂觀。

2. YouTuber 的思維推導

Rails World 2026 Opening Keynote - DHH

Ruby on Rails · 1h03m · 字幕 en · vision=on (投影片型 keynote:作者反覆指著畫面說『這是 18 世紀的尖端技術』『Exhibit A』『這是第一個 prompt 吐回來的、這是二十分鐘後的』『看這個數字』,畫作、程式碼、before/after 與量化圖表都必須看圖才讀得懂推論。) · YouTube

預估 vs 實際耗時
階段預估實際
fetch 6s 3s
segment 2m36s –
shot 1m21s 1s
analyze 18m45s 12m16s
render 5s –

DHH 的出發點是一個他自己也承認很怪的狀態:對 agent 極度亢奮,同時對未來極度不安。他不打算用技術辯論解決這份不安,而是換一條路——把它放進一段更長的技術史裡。他先用肖像畫舉證:18 世紀畫一幅肖像要坐數小時、畫數月,1886 年 Tuxen 甚至畫了三年,那是工藝的巔峰;但 1900 年柯達 Brownie 一美元就能拍照,寫實描繪不再是經濟上站得住腳的技能,畫家集體轉向立體派與印象派,技術變遷帶來的不是滅絕而是創造力爆發。

接著他用自家照片證明第二件事:技術是斷續前進的,Brownie 之後八十年幾乎沒動,直到手機才第二次躍進到一年兩兆張。有了這兩個結論,他才丟出核心主張:2025 年 11 月 24 日的 Opus 4.5 是我們這一代的 Brownie,而這次的失望之谷只有四個月不是一百年。從這裡他開始把歷史類比換算成職業現實——1968 年的 10x programmer 爭論已經不重要,現在的級距是 100x 甚至 1000x;他自己二十個月寫掉前二十一年一半的程式碼;37signals 宣布手寫程式碼收工;HEY 改成六個原生前端加 Rust 後端,後端 CPU 少 99%。

接著他把同一個邏輯推到每一層:Ruby 與 Rails 靠 convention over configuration 換來 token 效率而仍然有位置;抽象化因為重複成本歸零而必須重估;每個 app 都該給 agent 一個 CLI;連整台電腦(Omarchy)與應用體積(半 MB 的 Hype)都在可修的範圍內。最後他回到開場那份不安,用預測失敗史(ATM、Oppenheimer)論證『沒有人預測得準』,因此理性的選擇不是恐懼而是 P(bloom):既然算不出結果,先難過是白費時間,全力樂觀是唯一的解。整場的形狀就是:先用歷史解除不安 → 用數據證明躍進已經發生 → 逐層重估工程實務 → 再用同一套歷史邏輯把結論收回到態度上。

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

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

  1. AI euphoria:先替自己下診斷 → 他留下一個沒有回答的問題:既然興奮與不安是綁在一起的,要怎麼安撫那份不安?他自己給的方向是「把時鐘往回撥」——用歷史,而不是用技術規格。
  2. 18 世紀的肖像畫是尖端科技 → 他把舊技術的成本與稀缺性立好了,但還沒說它是怎麼結束的。下一步需要一個「工藝達到巔峰、同時死期已到」的具體例子。
  3. 三年一幅畫,然後 Brownie 出現 → 媒介換了,那些大師怎麼辦?這段只講了舊技藝的終點,還沒講從業者的去向——而去向正是他真正想讓台下聽見的部分。
  4. 畫家轉行:寫實不再值錢,創造力反而爆發 → 類比的第一半完成了(舊技藝會被媒介取代,從業者會轉向)。但還缺一個關鍵性質:這種取代是一次到位的嗎?如果不是,我們現在處在哪一段?
  5. 技術是斷續前進的:Brownie 之後八十年沒動 → 他已經備好完整的歷史模板:民主化 → 長期停滯 → 第二次躍進。下一步就是把這個模板蓋到 AI 上,而模板第一格需要一個明確的日期。
  6. 2025/11/24:我們這代的 Brownie → 模板的第二格是「長期停滯」。攝影停了八十年——AI 這次停了多久?他必須面對那段所有人都感覺到的退步期。
  7. 失望之谷只撐了四個月 → 歷史類比到此用完了。他說「這對我們這個職業意味著什麼」,接下來必須把躍進換算成職業內部聽得懂的單位——而業界現成的單位只有一個。
  8. 從 10x 到 1000x:換算成職業的單位 → 倍率是別人的統計,他還欠一個自己的數字。下一步他必須拿出可檢驗的個人紀錄,否則 1000x 只是口號。
  9. 20 個月寫掉前 21 年一半的程式碼 → 數字證明了「產出變多」,但他真正想傳達的興奮不在產出,而在「沒做的事」。他需要一段情感上的錨點來解釋那份興奮的來源。
  10. 「看看我沒在做的事」:這是 Rails 時刻 → 他已經把個人體驗講到極致。接下來必須把它變成組織決策——一個公司真的敢據此改變工作方式嗎?
  11. 37signals 宣布手寫程式碼收工 → 宣布得這麼乾脆,但他們並不是第一次嘗試。他必須解釋上一次為什麼失敗,否則這個決定聽起來像沒學到教訓。
  12. Basecamp 5 的失敗,與那個「錯誤的結論」 → 「榨出最多」被立為唯一的問題,那就得有人示範怎麼榨。下一步需要一個正在進行中、規模夠大的實作案例。
  13. HEY 不再是 web app:六個原生應用同時開工 → 前端有了答案,但一個郵件服務的重量在後端。而他接下來要給的後端答案,會讓他自己難受。
  14. 後端換成 Rust:永遠不必看,我就愛它 → 他把「做什麼」和「怎麼做」分給了不同的智慧。但分工要成立,得先知道怎麼把工作交出去——而這一點他自己也還沒摸清楚。
  15. 非同步指派,不是坐在聊天室裡等 → HEY 的答案是原生前端加 Rust 後端,而且工作方式還在摸索。那麼對一屋子的 Rails 開發者來說,最迫切的問題還沒被回答:Ruby 和 Rails 還剩什麼位置?
  16. Ruby 與 Rails 剩下什麼位置:web、token 效率與新手心態 → 他替 Rails 留了位置,但同一段裡也承認自己今年幾乎不寫 Ruby 了。那個比例到底變成什麼樣子,需要攤開來看。
  17. 15 萬行,與一個叫英文的程式語言 → 他說二十年前就可以只要結果,是因為他即將宣布一件比 3% 更重的事——不是工具變了,是職業變了。
  18. 從手寫程式碼退休,帶著喜悅而不是後悔 → 職業被重新定義之後,剩下的是工程實務本身。他說有一大堆東西要重想——第一個要被重估的,是軟體工程最核心的那個工具。
  19. 抽象化在 agent 時代要重新估值 → 架構層的重估沒有藍圖,但他承諾要給一點具體的東西。接下來是全場唯一一條可以照做的指令。
  20. 自備 agent:每個 app 都該有 CLI → 「我們現在什麼都能修」這句話他剛用在別人的應用上。下一步他要證明這個範圍有多大——大到整台電腦。
  21. Omarchy:把整台電腦都修好 → 整台電腦可以修,那單一個應用呢?他接下來要示範的是這場演講裡規模最小、但衝擊最直接的一類東西。
  22. 一次成形的應用,與半個 MB → 他已經把樂觀的一面說滿了。要收尾,他必須回到開場那句「這也有點令人不安」,正面處理別人的擔憂。
  23. 擔憂、安全,與預測為什麼總是錯 → 他證明了「沒有人預測得準」,但還沒說在不可知之下該怎麼辦。最後一步要把這個空白變成一個選擇。
  24. P(bloom) 勝過 P(doom):把不可知變成一個選擇

3. 逐段說明

Rails World 2026 Opening Keynote - DHH

1. AI euphoria:先替自己下診斷 0:00–1:50

DHH 開場就承認自己對 agent 的興奮看起來像「AI psychosis」,但他寧願叫 AI delirium / AI euphoria:這是他接觸電腦以來,電腦做過最令人興奮的事。同時他也點出這份興奮伴隨不安——沒人知道最終狀態是什麼,任何預測二十分鐘後就過期。他把「既興奮又不安」設為整場演講要處理的矛盾。

承上 承接前情提要裡「這是 Rails World 的開場 keynote、講者是 Rails 之父」這個背景:聽眾預期聽到框架路線圖,他卻先把題目換成自己的精神狀態,用一個診斷詞把全場的注意力從技術規格轉到「我們正身處什麼時刻」。

推理因為他知道台下看到一個人為 agent 手舞足蹈時的第一反應是「AI psychosis」,所以作者接著主動把這個標籤拿過來改寫成 AI delirium / AI euphoria——承認亢奮為真,但重新定義它的性質。定義完之後他立刻做第二件事:把亢奮的背面也攤開,說這件事同時令人不安,因為沒人知道最終狀態,任何預測二十分鐘後就過期。一場演講的開頭同時放進「極度興奮」與「有點不安」,等於宣告本場要處理的不是技術問題而是這個矛盾。

AI 補充值得注意的是他選的修辭順序:先自嘲、再改名、最後承認不安。這不是鋪陳,而是設定舉證責任——如果他只講興奮,任何一個持保留態度的聽眾都可以用「你在狂熱」打發掉整場;先自己說出「這確實有點不安」,後面的論證才不是推銷。另外他把「預測二十分鐘後就過期」放在第一分鐘,其實是先埋下整場最後要用的那把刀:既然預測不可靠,恐懼也同樣建立在不可靠的預測上。

agent

代理程式

能自己規劃步驟、呼叫工具、反覆修正直到完成任務的 AI 程式,而不是問一句答一句。

跟單純的聊天式 LLM 差別在「自主迴圈」:agent 會自己讀檔、跑指令、看結果、再決定下一步,所以使用者交付的是一個結果而不是一段對話。這也是為什麼它能改動整個 codebase 而聊天機器人不能。整場演講的所有主張(不再手寫程式碼、六個原生 app、Rust 後端)都預設了這種自主迴圈的存在。

相關術語: AI euphoria (引發的情緒)

出處:第 1 段「AI euphoria:先替自己下診斷」

AI psychosis

AI 精神病

網路上用來嘲諷「對 AI 過度亢奮到脫離現實」的貶義標籤。

這個詞在 2025 年之後被大量用來形容那些宣稱 AGI 即將到來、生活方式整個改掉的人,帶有「你已經失去判斷力」的暗示。DHH 在第一分鐘就把它講出來,是因為他知道不講的話台下也會在心裡講。

相關術語: AI euphoria (被改寫成)

出處:第 1 段「AI euphoria:先替自己下診斷」

AI euphoria

AI 欣快

DHH 用來取代 AI psychosis 的自稱:承認亢奮,但主張亢奮的對象是真實的。

他同時給了 AI delirium(譫妄)這個變體。兩個詞都保留了「不太正常」的醫學味道,差別在 psychosis 暗示幻覺、delirium/euphoria 只是強度過高。這個換詞動作本身就是他的論證策略:不否認情緒,只爭論情緒的來源是真是假。

相關術語: AI psychosis (對照組)

出處:第 1 段「AI euphoria:先替自己下診斷」

留給下一段 他留下一個沒有回答的問題:既然興奮與不安是綁在一起的,要怎麼安撫那份不安?他自己給的方向是「把時鐘往回撥」——用歷史,而不是用技術規格。

2. 18 世紀的肖像畫是尖端科技 1:50–4:17

為了安撫那份不安,他把時鐘往回撥。18 世紀要留下自己的肖像,得坐在大師面前好幾個小時,畫家再花好幾個月完成——Joshua Reynolds 1781 年的 Lady Waldegrave 就是這樣來的。他強調兩件事:美,但極度昂貴且稀有,只有上層資產階級與皇室付得起;而且客戶會退件(露出腳踝太有傷風化),Reynolds 得整幅重畫。

Reynolds 1781 年的畫作是整個類比的錨點:看到工藝水準,才懂後面被取代的是什麼
2:50 · Reynolds 1781 年的畫作是整個類比的錨點:看到工藝水準,才懂後面被取代的是什麼
承上 接住上一段留下的「用歷史安撫不安」這條路:他真的把時鐘撥回 18 世紀,而且刻意挑一個跟軟體毫無關係的行業,這樣類比才不會一開始就被當成自我辯護。

推理因為上一段把不安定義成「不知道最終狀態」,所以作者接著要示範一種已經走完全程、結局已知的技術變遷。他挑肖像畫,並且先花力氣把舊技術講得夠好:Joshua Reynolds 1781 年的 Ladies Waldegrave,坐數小時、畫數月,美得至今仍是文化遺產。講完美,他馬上補兩個限制條件——極度昂貴稀有,只有上層資產階級與皇室負擔得起;而且客戶會退件,露出腳踝太有傷風化,Reynolds 得整幅重畫。這兩個限制不是插曲,而是他要建立的前提:這門技藝的價值一半來自稀缺與辛苦,不只來自成果本身。

AI 補充退件那個笑點在論證上有實際功能。它把 18 世紀畫家和台下的軟體工程師放進同一個位置:都是接受委託、被客戶的主觀判斷否定、然後重做整份工作的人。一旦聽眾認同「我就是那個 Reynolds」,後面「攝影出現了」的那一擊才會打在自己身上而不是別人身上。另外他說「畫家花了數百年精進技法,但進展非常邊際」——這句是整段真正的重點:一個領域內部的漸進優化,擋不住來自領域外的媒介替換。

術語:state of the artcommission

state of the art

當代最高技術水準

某個時代在該領域能做到的極限,而不是某個絕對標準。

DHH 特地用這個詞形容一幅油畫,是為了提醒「最先進」永遠是相對於時代的。今天被視為 state of the art 的工程實務,在下一個媒介出現後會變成跟手繪肖像一樣:依然美,但不再是解決問題的主流方式。

相關術語: commission (取得方式)

出處:第 2 段「18 世紀的肖像畫是尖端科技」

commission

委託製作

出錢請人為你客製一件作品,成果與驗收標準由出資方決定。

在 18 世紀這代表只有極少數人買得起肖像;在軟體業這就是外包與接案。DHH 後面會用同一個字重新描述「業主委託一群程式設計師做東西」這件事——重點是委託關係本身沒變,變的只是誰在執行。

相關術語: state of the art (花錢買到的)

出處:第 2 段「18 世紀的肖像畫是尖端科技」

留給下一段 他把舊技術的成本與稀缺性立好了,但還沒說它是怎麼結束的。下一步需要一個「工藝達到巔峰、同時死期已到」的具體例子。

3. 三年一幅畫,然後 Brownie 出現 4:17–5:48

1886 年丹麥畫家 Laurits Tuxen 畫皇室全家,不是花三個月,是花三年,至今掛在哥本哈根。但這已是那種工藝的尾聲:1840 年相機問世,1900 年柯達推出 Brownie,一美元就能拍照,攝影第一次大量普及。技術的競爭對手不是更好的畫家,是另一種媒介。

Tuxen 花三年的皇室畫作——工藝巔峰的證據,緊接著就是被取代的時刻
4:52 · Tuxen 花三年的皇室畫作——工藝巔峰的證據,緊接著就是被取代的時刻
承上 上一段要的正是「巔峰與死期同時發生」的例子,這一段給出來:1886 年 Laurits Tuxen 為丹麥皇室畫的全家福,不是花三個月,是花三年。

推理因為上一段已經讓聽眾接受「數月=昂貴」,所以作者接著把數字加碼到三年,讓工藝的巔峰值被拉到最高——而且這幅畫至今掛在哥本哈根,可以親眼去看,證據是硬的。緊接著他在同一段裡把死期放進來:1840 年前後相機問世,1840 到 1900 之間拍攝技術一路變好,1900 年柯達推出 Brownie,一美元就能拍照。他刻意讓巔峰與終結貼在一起,結論才成立——摧毀一門技藝的不是更厲害的同行,是另一種媒介。

AI 補充這裡有一個容易被漏掉的時間結構:相機在 1840 年就存在了,但畫家的工作是在 1900 年才真正崩塌的。中間隔了六十年。也就是說「技術出現」跟「技術便宜到人人可用」是兩件事,真正改變職業結構的是後者。Brownie 的關鍵參數不是畫質,是一美元。這個「可用性門檻比能力門檻更致命」的形狀,是他整場演講挑日期、挑價格、挑安裝時間的底層邏輯。畫面上投影的正是 Tuxen 1886 年那幅《King Christian IX》,幾十個人物、金碧輝煌的室內,一眼就能理解三年是花在哪裡。

術語:Kodak Browniedemocratization of technology

Kodak Brownie

柯達 Brownie 相機

1900 年伊士曼柯達推出、售價約一美元的紙盒相機,第一款真正大量普及的相機。

Brownie 的意義不在畫質而在價格與操作簡單:它把攝影從專業器材變成家庭用品,「snapshot」這個詞就是那個年代普及的。DHH 整場演講的中軸就是找出軟體業的 Brownie 時刻——不是能力第一次出現的那天,而是能力第一次便宜到人人可用的那天。

相關術語: democratization of technology (造成)

出處:第 3 段「三年一幅畫,然後 Brownie 出現」

democratization of technology

技術民主化

一項原本只有少數人負擔得起的能力,因為價格與門檻下降而擴散到一般人手上。

注意它跟「技術進步」不是同義詞:畫質更好是進步,一美元才是民主化。民主化通常不會讓既有從業者做得更好,而是讓需求端整個換人——買家從皇室變成所有人,供給端的技能組合因此被重寫。

相關術語: Kodak Brownie (由此開始)、commission (取代了)

出處:第 3 段「三年一幅畫,然後 Brownie 出現」

留給下一段 媒介換了,那些大師怎麼辦?這段只講了舊技藝的終點,還沒講從業者的去向——而去向正是他真正想讓台下聽見的部分。

4. 畫家轉行:寫實不再值錢,創造力反而爆發 5:48–7:26

Brownie 之後,那些大師意識到「盡可能完美地描繪現實」不再是經濟上站得住腳的技能。他們需要另一種技能、另一個領域,於是集體轉向——畢卡索走向立體派,丹麥的 Skagen 畫家走向印象派。技術變遷沒有消滅藝術,反而逼出一次創造力大爆發。Tuxen 是 DHH 的曾曾祖父。

Skagen 印象派畫作就是「轉行後的新技能」本身,也是整場類比的轉折點
6:40 · Skagen 印象派畫作就是「轉行後的新技能」本身,也是整場類比的轉折點
承上 上一段問的是「大師怎麼辦」,這一段給答案:他們意識到盡可能完美地描繪現實不再是經濟上站得住腳的技能,於是集體轉向另一種技能、另一個領域。

推理因為上一段已經讓「舊技藝結束」成為既成事實,所以作者接著把重點從損失轉到轉向:畢卡索走向立體派,丹麥的 Skagen 畫家走向印象派,而這些新流派正是因為舊路被堵死才被逼出來的。他用一句話把整個類比的結論說死——技術變遷帶來的是一次創造力大爆發。最後他補上血緣:畫中穿粉紅洋裝的 Yvonne Tuxen 是他的曾祖母,Laurits Tuxen 是他的曾曾祖父。這不是炫耀,是把抽象的歷史換算成「我家就發生過這件事」,讓類比帶有個人代價。

AI 補充這一段其實藏著他對台下最核心的安撫,但他沒有講白,值得補上:畫家們保住的不是「畫得像」這個技能,而是「觀看與構圖的判斷力」。攝影拿走的是寫實的執行,留下的是決定畫什麼、怎麼看的那一層。對應到軟體,他暗示被拿走的是語法與實作,留下的是決定做什麼、怎麼拆問題的判斷——這正是後面「英文是更好的程式語言」和「不要把需求寫得太細」的伏筆。另外要誠實指出一個他跳過的差異:印象派轉型花了一整個世代,而他接下來要主張的時間尺度是幾個月,這中間的落差他並沒有論證。投影上那幅 Skagen 風格的雙人像,筆觸鬆、光線柔,跟前一張皇室全家福的精雕細琢放在一起,轉型的樣子不必解釋就看得出來。

術語:Skagen Painters

pivot

轉向

在原有領域的價值消失後,把既有能力搬到另一個仍然稀缺的領域。

pivot 的前提是承認舊技能的市場價值歸零,而不是更努力地做同一件事。畫家沒有比賽誰畫得更像相機,他們換了題目。這個詞後面會以「從手寫程式碼退休、成為專業造物者」的形式回來。

相關術語: democratization of technology (被迫回應)

出處:第 4 段「畫家轉行:寫實不再值錢,創造力反而爆發」

Skagen Painters

斯卡恩畫派

19 世紀末聚集在丹麥北端 Skagen 的畫家群體,以自然光與日常生活為題材的北歐印象派。

他們刻意離開學院式的室內肖像,跑到漁村畫海邊的光。以類比的角度看,重點不是風格好不好看,而是他們主動放棄了「精準描繪」這個評分標準,改用一個相機拍不出來的標準競爭。Laurits Tuxen 晚年也加入了這個圈子。

相關術語: pivot (一種)

出處:第 4 段「畫家轉行:寫實不再值錢,創造力反而爆發」

留給下一段 類比的第一半完成了(舊技藝會被媒介取代,從業者會轉向)。但還缺一個關鍵性質:這種取代是一次到位的嗎?如果不是,我們現在處在哪一段?

5. 技術是斷續前進的:Brownie 之後八十年沒動 7:26–11:20

他用自家的照片把時間軸拉長:1921 年 Tuxen 的肖像、1979 年自己出生時的照片,兩張技術幾乎一樣——1925 年的 Leica 1 和 1980 年代拍他的相機差不多。Brownie 之後約 80 年沒發生大事,他整個童年只有大約十張照片。真正的第二次躍進要等到手機:拍照變成零摩擦,2026 年一年拍 2 兆張。同一個底層技術,但明顯跨過了一個臨界點。

承上 上一段留下「取代是不是一次到位」的問題,這一段用他自家的照片回答:不是,技術以 fits, starts and stops 的方式前進。

推理因為要證明「斷續」,作者接著把同一條血緣的影像拉成時間軸:1921 年 Tuxen 本人被新技術拍下的肖像,1979 年他自己出生時的照片,兩張的技術幾乎一樣;1925 年的 Leica 1 跟 1980 年代拍他的相機差不多。他用一個很個人的數字把稀缺量化——他整個童年大約只有十張照片。接著才放第二次躍進:手機讓拍照變成完全零摩擦,2026 年一年拍兩兆張,他太太散步時隨手拍的那些照片,在八〇年代需要對底片和沖洗做出承諾才拍得出來。同一個底層技術,但明顯跨過了一個臨界點。

AI 補充這一段真正在建立的是一把尺,用來回答「我們現在在哪」。他給的判準不是畫質也不是功能,而是摩擦:一項技術跨過臨界點的徵兆,是使用它不再需要事前承諾。底片時代你得先決定「這值得一張」,手機時代你不必決定。把這把尺套回軟體,「要不要為這個小功能開一張票、排一個 sprint」就是舊世界的摩擦,而他後面說的「每個夢想、每個煩人的小刺都修掉了」正是摩擦歸零的症狀。順帶一提,他說「六〇年代有了彩色照片」是簡化——彩色底片 1930 年代就有了,只是到六〇、七〇年代才進入一般家庭,這剛好又是一次「能力早就存在、便宜才算數」。

術語:inflection point

inflection point

拐點

曲線改變彎曲方向的那一點;用在技術上指採用速度突然從緩慢轉為爆發的時刻。

拐點跟「更好」無關,跟「更快變普及」有關。DHH 用兩兆張照片當拐點的證據,而不是用相機畫質。他接下來要做的事,就是替 AI 指認一個同樣性質的拐點日期——判準一樣是普及而不是能力。

相關術語: frictionless (由此造成)

出處:第 5 段「技術是斷續前進的:Brownie 之後八十年沒動」

frictionless

零摩擦

使用一項技術不再需要成本、準備或事前取捨,所以使用次數不再被節制。

摩擦包含金錢、時間、技能與心理負擔。底片要買、要沖、拍錯浪費一張,所以人會先篩選;手機不用,所以人一年拍兩兆張。工程上的對應是:當改一行程式碼的成本趨近零,「這個需求值不值得做」這個問題本身就會消失,而那正是他後面所有主張的前提。

相關術語: inflection point (的判準)、democratization of technology (更徹底的)

出處:第 5 段「技術是斷續前進的:Brownie 之後八十年沒動」

留給下一段 他已經備好完整的歷史模板:民主化 → 長期停滯 → 第二次躍進。下一步就是把這個模板蓋到 AI 上,而模板第一格需要一個明確的日期。

6. 2025/11/24:我們這代的 Brownie 11:20–12:43

他把 Opus 4.5 發表日 2025 年 11 月 24 日定為我們這一代的 Brownie:智慧被裝進一個許多人負擔得起的 harness 裡,第一次有大量的人體驗到「與另一種智慧結對寫軟體」。對他而言世界分成 11/24 之前與之後。跟 Brownie 一樣,接著就是各種形式的爆發,幾個月內連 open-weight 版本都有了。

他點著這張日期投影片宣告分界線,這是整場演講的中軸主張
11:30 · 他點著這張日期投影片宣告分界線,這是整場演講的中軸主張
承上 上一段備好的模板第一格需要一個日期,這一段把它填上:2025 年 11 月 24 日,Opus 4.5 發表的那天。

推理因為 Brownie 的判準是「智慧被裝進一個許多人負擔得起的容器裡」而不是「能力最強」,所以作者接著用同一句話定義這個日期:AI technology made accessible in a harness that many people could afford to use,第一次有大量的人體驗到與另一種智慧結對寫軟體是什麼感覺。他接著宣告世界分成 11/24 之前與之後,並預言歷史書會把它標成 age of agents 的拐點。收尾也照模板走:Brownie 之後是各種形式的爆發,這次幾個月內連 open-weight 版本都出來了。

AI 補充要注意他挑的判準讓這個日期變得可辯論但不荒謬:他沒有說 Opus 4.5 是最聰明的模型,他說的是「harness 讓它可被負擔」。也就是說被他當成分水嶺的不是模型權重,而是模型+工具+介面這一整套外殼。這也解釋了他為什麼對 open-weight 版本那麼興奮——模板裡的第三格(價格崩到人人可用)需要的是供給端多元化而不是分數更高。投影片上就只有一行「Introducing Claude Opus 4.5 / Nov 24, 2025」,簡單到刻意:他要的是那個日期本身變成論點。

Opus 4.5

Claude Opus 4.5

Anthropic 於 2025 年 11 月 24 日發表的模型,DHH 把這天定為 agent 時代的起點。

他看重的不是這個模型的 benchmark 分數,而是它搭配 coding harness 之後第一次讓大量開發者真的把整段工作交出去。這種「某個版本讓體驗從勉強可用變成值得依賴」的跳躍,在技術史上比純粹的能力提升更關鍵。

相關術語: harness (裝在其中)、Kodak Brownie (被類比為)

出處:第 6 段「2025/11/24:我們這代的 Brownie」

harness

外殼/駕馭層

包在模型外面、讓它能讀寫檔案、執行指令、反覆迭代的那一層工具與介面。

同一個模型放在聊天框裡和放在 coding harness 裡是兩種產品:前者只能給你文字,後者能改你的 repo。DHH 說「智慧被裝進一個負擔得起的 harness」時,強調的正是這一層——它才是把 raw intelligence 變成生產力的地方,也是為什麼日期可以被定得這麼精準。

相關術語: agent (的載體)

出處:第 6 段「2025/11/24:我們這代的 Brownie」

open-weight

開放權重

模型參數可公開下載、能在自己硬體上跑的發行方式。

open-weight 不等於開源(訓練資料與流程通常仍不公開),但對使用者的意義是價格、隱私與不被單一供應商掐住。DHH 把它當成 Brownie 之後「各種形式爆發」的證據:一旦能力擴散到可自行部署的版本,技術就不再受單一廠商的定價權限制。

相關術語: democratization of technology (的當代版)

出處:第 6 段「2025/11/24:我們這代的 Brownie」

留給下一段 模板的第二格是「長期停滯」。攝影停了八十年——AI 這次停了多久?他必須面對那段所有人都感覺到的退步期。

7. 失望之谷只撐了四個月 12:43–16:02

二月到五月出現一段 trough of disillusionment:新模型一個個出來卻像在退步,市場一度覺得「結束了,指數成長不存在」。但這次的谷底不像攝影那樣撐一百年,只撐到六月 Fable 5 與 Mythos 出來。那一代模型讓他從「叫 agent 做事」變成「給它問題或想法,然後看到成果值得直接 merge」。接著 GPT-6 Astra 與 DeepSeek-4-1 Flash 分別打破了單一公司與單一國家壟斷前沿智慧的擔憂。

承上 上一段留下的問題是「這次的停滯期有多長」,這一段誠實地先承認停滯真的發生過:二月到五月,新模型一個個出來卻像在退步。

推理因為如果跳過這段低谷,整個歷史類比就會變成選擇性舉證,所以作者接著把當時的氣氛完整重播:大家嫌新版本不如舊版、某次 OpenAI 的發表在 benchmark 上沒明顯進步、市場估值應聲下跌、輿論說「你看吧,指數成長根本不存在」。鋪完這一層,他才給出關鍵對比——攝影的谷底撐了一百年,這次只撐到六月 Fable 5 與 Mythos 出來。接著他用自己的體感定義那一代模型的差別:從「叫 agent 做事」變成「給它問題或想法,然後看到成果值得直接 merge」。最後兩個補充(GPT-6 Astra 打破單一公司壟斷、DeepSeek-4-1 Flash 打破單一國家壟斷)則是把模板第三格的供給多元化補齊。

AI 補充他實際上偷偷換掉了 Gartner 那條曲線的意義,值得講清楚。原本的 trough of disillusionment 是描述「期待過高後的必然修正」,重點在期待;他把它改成描述「能力曲線的短暫平台期」,重點在能力。這個換義讓「谷底只有四個月」聽起來像技術事實,但實際上市場估值下跌測量的是預期,不是能力。另一個值得指出的跳步是:他從「幾個月的觀察」推論「停滯期已經結構性地變短」,但攝影那八十年的停滯是因為底層物理與供應鏈沒動,而模型的停滯原因完全不同——用同一條曲線描述兩者,形狀像,機制不一樣。至於他說的分水嶺體感「從指派任務變成指派結果」倒是很實在的判準,而且是可以自己驗證的:你交出去的東西如果還要逐行檢查,那就還沒跨過去。

trough of disillusionment

失望之谷

Gartner 技術成熟度曲線中,過度期待破滅後、實用價值尚未兌現的低潮階段。

完整曲線是:技術觸發 → 期待過高的高峰 → 失望之谷 → 啟蒙爬坡 → 生產力高原。原始概念描述的是市場情緒而非技術能力,這點常被誤用。谷底的長度在歷史上差異極大,這正是 DHH 拿來對比的地方:攝影的谷底以世代計,他主張這次以月計。

相關術語: inflection point (之後的回落)

出處:第 7 段「失望之谷只撐了四個月」

frontier intelligence

前沿智慧

當下能力最強的那一批模型,通常只有少數實驗室做得出來。

DHH 兩次的興奮點都不是「前沿更強了」,而是「前沿不再由一家公司或一個國家獨佔」。對使用者而言這關係到議價能力與供應風險:只要前沿是單一來源,定價、可用性與政策風險就全部綁在那一家身上。

相關術語: open-weight (的反面壓力)

出處:第 7 段「失望之谷只撐了四個月」

merge

合併(程式碼)

把一條分支的修改併入主線,代表這份改動已被接受為正式版本的一部分。

他用 merge 當分水嶺是有道理的:merge 是責任轉移的動作,你一旦按下去就得為這段碼負責。因此「看到成果值得直接 merge」不是在誇模型寫得漂亮,而是在說信任門檻被跨過了——這比任何 benchmark 分數都更能說明工作方式的改變。

相關術語: agent (產出的驗收)

出處:第 7 段「失望之谷只撐了四個月」

留給下一段 歷史類比到此用完了。他說「這對我們這個職業意味著什麼」,接下來必須把躍進換算成職業內部聽得懂的單位——而業界現成的單位只有一個。

8. 從 10x 到 1000x:換算成職業的單位 16:02–18:13

他回到 1968 年 ACM 那篇論文:同一批程式設計師之間最差與最好相差 5x 到 30x,平均 10x,然後業界為此爭論了 45 年。他認為那場爭論已經結束,而重點是我們直接跳過共識,開始問「如果純人力是 10x,現在會是多少」。他的主張:說「不用這些工具的最差者」與「用這些工具的最佳者」差 100 倍並不算有爭議,甚至 1000 倍聽起來也差不多對。

1968 年 ACM 的變異數表格是他唯一引用的原始數據,看到 5x–30x 才能判斷他的外推幅度
16:25 · 1968 年 ACM 的變異數表格是他唯一引用的原始數據,看到 5x–30x 才能判斷他的外推幅度
承上 上一段結尾問「這對程式設計這個職業意味著什麼」,這一段挑了業界唯一現成的度量單位來回答:10x programmer。

推理因為需要一把所有人都認得的尺,所以作者接著回到 1968 年 ACM 那篇論文:同一批程式設計師之間,最差與最好的差距從 5x 到 30x,平均 10x,然後業界為此爭論了四十五年。他問「還有人在吵嗎」,自答沒有,宣布爭論結束——但真正的重點在下一句:我們直接跳過共識,開始問「如果純人力是 10x,現在會是多少」。他的主張分兩層:說「不用這些工具的最差者」與「用這些工具的最佳者」差 100 倍並不算有爭議;再往前一步,1000 倍聽起來也差不多對。

AI 補充這裡必須指出一個他沒說破的偷換:原本的 10x 是同一群人在同一種工作方式下的個體差異,而他的 100x/1000x 是「不用工具的最差者」對「用工具的最佳者」——兩端同時換了人和工具。這樣定義的倍率當然會很大,但它不能拿來推論「你用了工具就會快一百倍」。真正有意義的問法是同一個人用與不用的差距,而那個數字目前沒有可靠的公開量測;少數有對照組的研究甚至出現過資深開發者自覺變快、實測變慢的結果。他這段論證的價值不在倍率本身,而在方向:當可能的級距大到這個程度,公司之間的競爭條件與「起步需要多少人」都會被重寫——那才是他接著要處理的。畫面在這段停在講台上,沒有投出 1968 年那張表格,所以數字只能靠他口述。

術語:10x programmervariance

10x programmer

十倍工程師

認為最好的程式設計師生產力可達最差者十倍的說法,源自 1968 年一篇 ACM 論文。

原始研究是 Sackman、Erikson 與 Grant 在 1968 年 CACM 發表的實驗,樣本只有十幾人,而且比較的其實是線上與離線除錯兩種環境,最大的 28:1 差距部分來自一位受試者使用了不同層級的語言。後續四十年反覆有人指出這個數字被過度引用。DHH 的用法是把它當成一把「大家都聽過的尺」,而不是當成嚴謹證據。

相關術語: variance (測量的是)

出處:第 8 段「從 10x 到 1000x:換算成職業的單位」

variance

變異/離散程度

同一群體內個體表現之間的差距大小。

談生產力時區分「平均提升」與「變異擴大」很重要:平均提升代表大家一起變好,變異擴大代表差距被拉開。DHH 主張的是後者——工具讓最上緣被推得極遠,而最下緣沒動,於是級距從 10 倍變成 100 倍。這對個人的意涵是:不採用工具的代價不是原地踏步,而是相對位置急速後退。

相關術語: 10x programmer (背後的概念)

出處:第 8 段「從 10x 到 1000x:換算成職業的單位」

見仁見智 16:15
「an article in ACM Magazine from 1968, where they tested a group of programmers on a variety of different tasks」
1968 年那篇論文(Sackman, Erikson & Grant, CACM)並不是在測「各式各樣的任務」,而是比較線上與離線兩種除錯環境,受試者只有十餘人;著名的 28:1 差距一部分來自受試者使用的語言層級不同。把它當成「個體生產力差 10 倍」的證據,四十年來一直有方法學上的爭議,因此「那場爭論已經結束」也並非共識。
依據: Sackman, Erikson & Grant, “Exploratory experimental studies comparing online and offline programming performance”, CACM 11(1), 1968;後續批評見 Prechelt (1999)、Bossavit《The Leprechauns of Software Engineering》
留給下一段 倍率是別人的統計,他還欠一個自己的數字。下一步他必須拿出可檢驗的個人紀錄,否則 1000x 只是口號。

9. 20 個月寫掉前 21 年一半的程式碼 18:13–19:20

他給出自己的數字:過去 20 個月寫的程式碼量,是前面 21 年總量的一半。他自己先承認行數是模糊的度量,而且一行 Ruby 的價值遠高於一行 Rust 或 C++——低階語言沒有 Ruby 的抽象與便利。但即使打折,量級的改變無法否認。

他把 20 個月與 21 年的碼量並排放在同一張圖上,量級對比只有看圖才有感
18:26 · 他把 20 個月與 21 年的碼量並排放在同一張圖上,量級對比只有看圖才有感
承上 上一段的 1000x 還是別人的統計,這一段換成他自己的帳:過去 20 個月寫的程式碼量,是前面 21 年總量的一半。

推理因為主張越大越需要自己的證據,所以作者接著把個人 git 紀錄攤開,而且先替自己做反方辯論:行數是模糊又可塑的度量,一行 Ruby 的價值遠高於一行 Rust 或 C++,因為低階語言沒有 Ruby 的抽象與便利。先承認度量的弱點,再說即使打折,量級的改變依然無法否認——這是他一貫的舉證策略:不宣稱精確,只宣稱級距。

AI 補充投影片上的數字比口述精確得多,值得補上:2004–2024 的二十一年是 647K 行、26,325 次 commit,其中 Ruby 佔 355K(55%);2025–2026 的二十個月是 321K 行、7,176 次 commit,Ruby 只剩 10K(3%)。另外兩個欄位其實更有訊息量——年均從 31K 行跳到 2026 年一年 292K,日常使用的語言從 4 種變成 12 種,接觸的 repo 數也大幅增加。也就是說「寫更多」只是表象,真正變的是「涉足的範圍」:以前他守在一個 Ruby 技術棧裡,現在同時碰十二種語言。這一點比行數更能支撐他後面的所有主張,因為跨語言的成本歸零,正是「後端換 Rust」「自己寫作業系統」之所以可能的前提。

術語:lines of code

lines of code

程式碼行數

用檔案行數衡量產出的粗略指標,跟價值不成正比。

行數作為生產力指標惡名昭彰:同一個功能在不同語言可以差十倍行數,而刪掉一千行往往比新增一千行更有價值。DHH 自己先點破這一點,然後主張在級距大到六十倍時,指標再糟也還是看得出訊號。合理的讀法是把它當成「活動量」而不是「成果量」。

相關術語: low-level language (會灌水於)

出處:第 9 段「20 個月寫掉前 21 年一半的程式碼」

low-level language

低階語言

貼近機器、需要自行處理記憶體與型別細節的語言,例如 C++ 或 Rust。

低階不是「比較差」,是「抽象比較少」:你得到控制力與效能,代價是同一件事要寫更多行、更多樣板。這正是為什麼他的行數會暴增——一部分增量根本不是做了更多事,而是換了更囉嗦的語言。這個取捨在後面會被重新計算:當「寫」的成本歸零,低階語言的缺點就只剩下「人要讀」這一項。

相關術語: lines of code (扭曲了)

出處:第 9 段「20 個月寫掉前 21 年一半的程式碼」

留給下一段 數字證明了「產出變多」,但他真正想傳達的興奮不在產出,而在「沒做的事」。他需要一段情感上的錨點來解釋那份興奮的來源。

10. 「看看我沒在做的事」:這是 Rails 時刻 19:20–20:45

他播了一段 21 年前自己在巴西的演講片段,當時他興奮的正是「看看我沒在寫的設定檔、沒在做的事」。他說這就是 Rails 時刻的本質,而現在是同一種興奮的放大版:已經大約五個月沒寫程式碼,卻把每個夢想、每個煩人的小刺、每個看似無關緊要的功能都修掉了。

承上 上一段留下「興奮的來源不是產出」這條線索,這一段用 21 年前的自己來指認來源:他播了 2005 年在巴西演講的片段,當時興奮的正是「看看我沒在寫的設定檔、沒在做的事」。

推理因為要證明這份興奮不是新來的流行病,所以作者接著把兩個時刻疊在一起:影片裡的他在展示 blog 自動對應到 blogging controller、index 自動對應到 index template,一邊喊 look at all the things I'm not doing;台上的他則說,還有比「我們不再需要做的所有事」更好的方式來概括這個時刻嗎。他把 Rails 的本質定義成「省掉的東西」而不是「提供的東西」,然後宣布現在是同一種興奮的放大版——大約五個月沒寫程式碼,卻把每個夢想、每個煩人的小刺、每個看似無關緊要的功能都修掉了。

AI 補充這個並置在修辭上很強,但也要看清楚它的極限。Rails 省掉的是「可以被慣例吸收的決策」——路由對應、檔名對應這些本來就有唯一合理答案的東西,省掉它們沒有代價,因為慣例是確定性的。agent 省掉的則是實作本身,而實作有無限多種解法,agent 挑的那一種未必是你要的。兩者都叫「省掉」,但前者的正確性由框架保證,後者的正確性得另外驗證。這個差別就是他下一段會踩到的坑。另外他提到「每個煩人的小刺、每個看似無關緊要的功能」終於修得掉——這正好對應到前面那把摩擦的尺:當實作成本趨近零,「這值不值得做」這道關卡消失了。

術語:convention over configuration

convention over configuration

慣例優於設定

框架預設一套命名與結構慣例,只要照著做就不必寫設定檔。

這是 Rails 最核心的設計哲學:blog 這個路由自動找 BlogsController,index 這個動作自動 render index 樣板,你不需要任何一行 XML 或 YAML 去宣告它。代價是你必須接受框架的意見;回報是新功能的樣板程式碼趨近於零。這個哲學在 agent 時代會被重新估值,因為慣例本身就是一種壓縮:同樣的意圖用更少的 token 就說得清楚。

相關術語: frictionless (追求的是)

出處:第 10 段「「看看我沒在做的事」:這是 Rails 時刻」

留給下一段 他已經把個人體驗講到極致。接下來必須把它變成組織決策——一個公司真的敢據此改變工作方式嗎?

11. 37signals 宣布手寫程式碼收工 20:45–22:12

幾週前 37signals 做了決定:手寫程式碼結束了(pencils down)。手寫變成例外狀態,像在 Sentry 看到一個 bug——代表「為什麼 agent 做不出我們要的東西」,短期還是會拿鉛筆補一下,但接著要修的是那台機器、那座工廠。他強調這只是承認既成事實,並當場舉手表決:全場只有約五個人每週還手寫大量程式碼。

承上 上一段把「省掉實作」講成個人體驗的極致,這一段把它升級成公司政策:幾週前 37signals 決定,手寫程式碼結束了。

推理因為個人體驗說服不了組織,所以作者接著給出一個可執行的定義,而不只是口號:pencils down 之後,手寫程式碼變成例外狀態,像在 Sentry 裡看到一個 bug——它的意義是「有東西壞了」,代表要追問為什麼 agent 做不出我們要的東西。短期還是會拿鉛筆補一下,但接著要修的是那台機器、那座工廠。最後他把這個決定降格成「只是承認既成事實」,並當場舉手表決驗證:全場只有約五個人每週還手寫大量程式碼。

AI 補充「把手寫當成 Sentry 上的 bug」這個框架是整段最有用的東西,值得展開:它把個別的救火動作重新定義成流程缺陷的訊號。如果你今天為了趕進度自己動手改了,那不是勝利,而是一筆要記下來的債——債主是那套 prompt、那份規格、那個 agent 的工作環境。這跟製造業的「停線拉繩」與 SRE 的「事後檢討而非責備」是同一種思路:不允許用個人英雄主義掩蓋系統缺陷。至於那個舉手表決,要提醒它的取樣偏誤:Rails World 開場 keynote 的現場觀眾,本來就是最願意接受這套敘事的人,這個數字拿來當全行業的證據是站不住的,拿來當「這個房間的共識」倒是有效。

pencils down

停筆

考試或專案宣告「到此為止、放下筆」的指令;此處指公司層級停止手寫程式碼。

用這個詞而不是「禁止寫程式」很有意思:pencils down 是一個時間點宣告,不是一條規則。它的作用是切斷「再多寫一點就好了」的慣性,逼團隊把精力轉去改善產生程式碼的那套流程。

相關術語: Sentry (以此為警報)

出處:第 11 段「37signals 宣布手寫程式碼收工」

Sentry

錯誤追蹤服務

線上應用的例外監控平台,程式出錯時把堆疊與情境收集起來通知團隊。

重點在它的使用習慣:Sentry 上出現一筆新錯誤時,正常反應不是手動修好那一筆資料,而是去找根因並修程式。DHH 借用的就是這個反射動作——把「今天我自己動手寫了程式碼」當成一則錯誤報告來處理。

相關術語: pencils down (的違規訊號)

出處:第 11 段「37signals 宣布手寫程式碼收工」

留給下一段 宣布得這麼乾脆,但他們並不是第一次嘗試。他必須解釋上一次為什麼失敗,否則這個決定聽起來像沒學到教訓。

12. Basecamp 5 的失敗,與那個「錯誤的結論」 22:12–24:04

春天做 Basecamp 5 收尾時他們試過一次:讓設計師 vibe code 最後幾個功能。個別 PR 看起來都合理,但 20、30 個疊起來,架構像被打成瑞士乳酪。當時的結論是「技術還沒到,回去人工審查」——他說這個結論錯了。不只因為再等五分鐘 Fable 就出來了,更因為現在只剩一個嚴肅問題:怎麼從這場智慧爆發裡榨出最多東西;其他問題都在它下面。

承上 上一段的宣布需要交代前科,這一段補上:春天做 Basecamp 5 收尾時他們試過一次,讓設計師 vibe code 最後幾個功能,結果是 mixed。

推理因為誠實交代失敗才能讓這次的決定站得住,所以作者接著把失敗的形狀描述得很精確:個別 PR 看起來都合理,但 20、30 個疊起來之後,架構像被打成瑞士乳酪。當時的結論是「技術還沒到,回去人工審查」——而他現在說這個結論是錯的。錯的理由有兩層:表層是時機(再等五分鐘 Fable 就出來了,同一批 PR 大概就會照原意運作);深層是優先順序(現在只剩一個嚴肅問題:怎麼從這場 intelligence explosion 裡榨出最多東西,其他問題都排在它下面)。

AI 補充瑞士乳酪這個症狀值得單獨記住,因為它是局部最佳化的典型後果:每個 PR 在自己的範圍內都合理,但沒有任何一個 PR 負責維持整體結構,於是一致性被一刀一刀削掉。這在人類團隊裡是靠 code review 與架構師的品味擋住的,而他們當時的做法是把這道防線交給了不具備全域視野的個別貢獻者。要注意的是,他給的解方是「等更強的模型」,但問題的結構(沒有人負責全域一致性)並不會因為模型變強就自動消失——除非把全域一致性本身也變成一個被明確指派的任務。至於「只剩一個嚴肅問題」這句,實際上是一個排序宣告而不是事實描述:他在主張把「榨出最多智慧」擺到所有工程價值(可維護性、正確性、成本)之上,這是全場最激進、也最需要各自判斷的一句話。

術語:vibe codingpull request

vibe coding

憑感覺寫程式

只描述想要的效果、不看產出的程式碼細節,完全交給 AI 實作的工作方式。

這個詞 2025 年被 Andrej Karpathy 帶紅,原意帶點自嘲:你放棄閱讀與掌控,只驗收行為。它在小工具與原型上效果極好,在有既存架構的大系統上就是 Basecamp 5 的結果。關鍵變數不是模型強弱,而是「有沒有人在看整體」。

相關術語: pull request (產出形式)

出處:第 12 段「Basecamp 5 的失敗,與那個「錯誤的結論」」

pull request

合併請求(PR)

把一組修改提出來請人審查、通過後併入主線的協作單位。

PR 的審查視野天生是局部的:你看到的是這一組 diff,不是這一組 diff 跟另外二十九組疊加後的樣子。這就是為什麼「每個 PR 都合理、整體變成瑞士乳酪」可以同時成立——這是流程的結構性盲點,不是審查者不認真。

相關術語: vibe coding (的交付單位)、merge (終點是)

出處:第 12 段「Basecamp 5 的失敗,與那個「錯誤的結論」」

intelligence explosion

智慧爆發

可用智慧在短時間內急速增加的狀態;DHH 用它指當下模型能力與可得性的同步暴漲。

這個詞原本出自 I. J. Good 1965 年談「超智慧機器不斷自我改良」的設想,帶有失控的意味。DHH 借用它時剝掉了失控的部分,只留下「供給暴增」的意思——對他而言這是一種資源,問題是怎麼榨取,不是怎麼防範。

相關術語: frontier intelligence (的總量面)

出處:第 12 段「Basecamp 5 的失敗,與那個「錯誤的結論」」

留給下一段 「榨出最多」被立為唯一的問題,那就得有人示範怎麼榨。下一步需要一個正在進行中、規模夠大的實作案例。

13. HEY 不再是 web app:六個原生應用同時開工 24:04–28:14

新版 HEY 要做的第一件事是不再當 web app。他說 HEY 本來就不想當 web app,它是 web app 只因為那是小團隊唯一能有生產力的做法——小團隊維護六個原生框架的應用在過去是荒謬的,React Native、Hotwire Native 都是為了繞過這件事,代價是犧牲一點擬真度。他們一週前啟動的六個原生應用已經在跑;Windows 版第一個 prompt 的產出不堪用,二十分鐘後修正版就可以看了。Shopify 用大約六個人重寫 Shop app 原生版也是同一件事。

六個原生應用同時跑的 demo 就是他主張的全部證據,沒看到畫面等於沒看到論據
25:45 · 六個原生應用同時跑的 demo 就是他主張的全部證據,沒看到畫面等於沒看到論據
Windows 版第一版與二十分鐘後修正版的 before/after,是「重導比重寫便宜」的具體呈現
27:20 · Windows 版第一版與二十分鐘後修正版的 before/after,是「重導比重寫便宜」的具體呈現
承上 上一段把「怎麼榨出最多」立為唯一問題,這一段就是他們的答案示範:新版 HEY 要做的第一件事,是不再當 web app。

推理因為要證明榨取的幅度,所以作者接著重新解釋 HEY 為什麼一開始是 web app——不是因為 web 比較好,而是因為在舊世界裡,小團隊只有做 web app 才有生產力。他把整串既有工具的動機一次點名:小團隊維護六個原生框架的應用在過去是荒謬的,React Native、Hotwire Native 以及所有這類工具,都是為了繞過這個限制,代價是犧牲一點 fidelity。既然限制的來源是人力成本,而人力成本已經改變,結論就跟著變。證據是一週前才啟動的六個原生應用已經在跑,以及 Windows 版第一個 prompt 吐回來不堪用、二十分鐘後的修正版就能看。他再補一個外部佐證:Shopify 用大約六個人把 Shop app 從 React Native 重寫成原生。

AI 補充「第一版不堪用、二十分鐘後可以看」這組 before/after 才是這段真正的論點,值得說破:它主張的不是 agent 一次就能做對,而是重導(redirect)的成本已經低到可以把「做錯」當成正常流程的一部分。畫面上第一版的 Windows 介面確實是壞的——標題列文字互相疊住、清單擠成一團、搜尋框漂在奇怪的位置;旁邊 macOS 版則已經是完整可用的原生收件匣,有 Inbox/The Feed/Paper Trail 分頁和底部的浮動提示卡。在舊世界,丟掉一版 UI 意味著丟掉數週人力,所以大家會傾向於「先想清楚再動手」;當重來一次只要二十分鐘,最佳策略就反過來變成「先做出來再看」。這是他整場演講裡最可直接套用的工程結論,而且跟模型有多聰明沒什麼關係,只跟迭代成本有關。

native app

原生應用

用作業系統自己的框架與語言寫成、直接安裝在裝置上的應用程式。

原生的好處是延遲、手感、系統整合(通知、快捷鍵、背景處理)都是第一級的;壞處是每個平台都要一套程式碼。DHH 主張這個壞處的成本已經崩塌,所以原生的好處重新變得划算。注意他的範圍限定在「本來就想當原生應用」的那一類服務。

相關術語: fidelity (最高的)、web app (對照組)

出處:第 13 段「HEY 不再是 web app:六個原生應用同時開工」

web app

網頁應用

跑在瀏覽器裡、不需要使用者安裝任何東西的應用程式。

web 的殺手級特性是零安裝:陌生人點一個連結就能用。DHH 在這裡只否定了「因為人力不足所以被迫選 web」的那一部分,並沒有否定 web 本身;這個區分很重要,因為他馬上就會回頭替 web 與 Rails 留下位置。

相關術語: native app (被取代於)

出處:第 13 段「HEY 不再是 web app:六個原生應用同時開工」

React Native

React Native

用 JavaScript/React 寫一份程式碼、同時產出 iOS 與 Android 原生介面的跨平台框架。

它的存在理由完全是經濟性的:一個團隊養不起兩套原生程式碼。DHH 的論點是,一旦養得起了,這類框架的主要賣點就消失,只剩下它帶來的折衷(橋接層的延遲、與系統慣例的落差)。Shopify 把 Shop app 從它換成原生,正是這個推論的實例。

相關術語: Hotwire Native (同類工具)、fidelity (犧牲了)

出處:第 13 段「HEY 不再是 web app:六個原生應用同時開工」

Hotwire Native

Hotwire Native

37signals 自家的方案:用原生殼包住 Hotwire 網頁畫面,再用原生元件補關鍵位置。

它是 Rails 生態裡對「小團隊要上行動平台」的回答,跟 React Native 同一個動機、不同的折衷點:保留伺服器渲染的 HTML,只在需要手感的地方換成原生。DHH 親手推過這套方案,現在親口說它的前提消失了,這讓這段話的分量不太一樣。

相關術語: React Native (同類工具)、convention over configuration (同一個出處)

出處:第 13 段「HEY 不再是 web app:六個原生應用同時開工」

fidelity

擬真度

應用在多大程度上符合該平台原生的手感、延遲與互動慣例。

擬真度低的徵兆很具體:捲動的慣性不對、鍵盤快捷鍵缺席、返回手勢怪怪的、動畫掉幀。這些單項都很小,加起來就是使用者說不上來的「這個 app 怪怪的」。跨平台框架換來的效率,代價一直都記在這個帳上。

相關術語: native app (的評分標準)

出處:第 13 段「HEY 不再是 web app:六個原生應用同時開工」

留給下一段 前端有了答案,但一個郵件服務的重量在後端。而他接下來要給的後端答案,會讓他自己難受。

14. 後端換成 Rust:永遠不必看,我就愛它 28:14–31:31

後端的答案讓他自己有點難受:Rust。他公開表示恨 Rust,覺得它是近四十年來最醜的語言,讓人類讀它是不人道的。但如果他永遠不必看,只需要享受應用快 30 到 100 倍、編譯成極小的執行檔、次毫秒啟動——那他愛 Rust。這就是分工:他說要做什麼,agent 用 Rust 寫。成果是後端 CPU 少 99%、記憶體少 95%,十台主機只是為了備援,估算下來 HEY 的尖峰流量大概一台 Raspberry Pi 就撐得住。

他喊「Exhibit A」指著這段 Rust 程式碼,整段「醜到不人道」的主張靠這張圖成立
29:15 · 他喊「Exhibit A」指著這段 Rust 程式碼,整段「醜到不人道」的主張靠這張圖成立
99% CPU/95% 記憶體/單台 Raspberry Pi 這組數字是換語言的全部理由
31:00 · 99% CPU/95% 記憶體/單台 Raspberry Pi 這組數字是換語言的全部理由
承上 上一段結尾預告了一個讓他難受的後端答案,這一段揭曉:Rust——一個他公開說恨的語言。

推理因為這個選擇跟他二十年的公開立場衝突,所以作者接著先把恨講到滿:Rust 是近四十年來最醜的語言,讀它像往眼睛裡倒酸液,讓血肉之軀去寫它是不人道的,然後喊出 Exhibit A 指著投影上的程式碼。鋪到這裡,他才翻面——如果他永遠不必看,只需要享受應用快 30 到 100 倍、編譯成極小的執行檔、次毫秒啟動,那他愛 Rust。關鍵句是那句分工:我說要做什麼,你用 Rust 寫,我永遠不必看。接著他用數字兌現這筆交易:前端變原生之後後端不再需要渲染 HTML,那段程式碼被改寫成它本質上就是的郵件伺服器,結果是 CPU 少 99%、記憶體少 95%,十台主機只是為了備援,粗估 HEY 的尖峰流量大概一台 Raspberry Pi 就撐得住。

AI 補充這段的骨架其實是一次取捨的重新計算,值得寫清楚。選程式語言長久以來要同時最佳化兩件事:機器執行的效率,以及人閱讀與修改的效率。Ruby 極度偏向後者,Rust 極度偏向前者。當「人要讀」這一項的權重降到接近零,這個取捨就只剩單邊,於是最難看的語言反而成為最佳解。這也解釋了他前面為什麼放任 agent 吐出比必要更多的程式碼——冗長的代價也記在「人要讀」這一項上。不過有一項成本沒有跟著歸零,而他沒提:出事的時候還是得有人讀。當 Rust 後端在半夜出現一個只在高併發下重現的 bug,把它當黑盒子的那個人要嘛得臨時學會讀它,要嘛得完全信任 agent 的除錯結果。這是這筆交易真正的風險位置。投影上那段 Exhibit A 也確實選得很有代表性:一個 tower Service 的 call 實作,回傳型別是 Pin<Box<dyn Future<Output = Result<Response<B>, Box<dyn Error + Send + Sync + 'static>>> + Send + 'a>>,光型別宣告就佔掉兩行——他的「不人道」指控在視覺上是成立的。

Rust

Rust 語言

以編譯期記憶體安全與零成本抽象著稱的系統程式語言,語法冗長、學習曲線陡。

Rust 用所有權(ownership)與生命週期(lifetime)在編譯期消滅一整類記憶體錯誤,代價是型別宣告極度囉嗦、編譯器很嚴格。它的定位正好在 C++ 的效能與現代語言的安全之間。DHH 的立場很清楚:作為人類的寫作媒介很糟,作為機器產出的目標語言很好。

相關術語: low-level language (一種)、black box (被當作)

出處:第 14 段「後端換成 Rust:永遠不必看,我就愛它」

Raspberry Pi

樹莓派

信用卡大小、數十美元的單板電腦,常用來當「極低算力」的參照物。

他用它當單位是為了讓 99% 的降幅變得可感:一台 Pi 的算力大約等於一支舊手機。把一個真實郵件服務的尖峰流量壓到這個等級,重點不在真的要這樣部署,而在說明過去的資源消耗有多少是被框架、序列化與 HTML 渲染吃掉的。

相關術語: Rust (效率的展示)

出處:第 14 段「後端換成 Rust:永遠不必看,我就愛它」

留給下一段 他把「做什麼」和「怎麼做」分給了不同的智慧。但分工要成立,得先知道怎麼把工作交出去——而這一點他自己也還沒摸清楚。

15. 非同步指派,不是坐在聊天室裡等 31:31–33:04

怎麼跟這種智慧一起工作,他說也還不清楚,他們在試很多做法,其中一個是在 Basecamp 裡指揮 agent(Chef Marie)。他的判斷是:跟 agent 合作最好的方式是非同步——不是在聊天介面裡坐著等 token 吐出來,而是像對同事那樣派一個任務出去,等有東西可看再回來審。他強調整件事去年 11/24 才開始,能指派結果而非任務的智慧只有幾個月大,所以沒人知道正確形狀。

承上 上一段留下「分工要怎麼交付」這個未解的部分,這一段坦承答案也還不清楚,他們正在試很多做法,其中之一是在 Basecamp 裡指揮 agent(Chef Marie)。

推理因為承認了不確定,所以作者接著只給一個他有把握的判斷:跟 agent 合作最好的方式是非同步。不是坐在聊天介面裡看 token 一個一個吐出來,而是像對同事那樣派一個任務出去,等有東西可看再回來審。他馬上替這份不確定辯護:整件事去年 11/24 才開始,連一年都不到;而能夠指派「結果」而不是「任務」的那種智慧,只有幾個月大。既然如此,沒有人知道正確的形狀是合理的。

AI 補充把它放進上一段的分工來看會更清楚:同步的聊天介面其實在偷偷要求你監督實作——你會看到它寫了什麼,於是會忍不住插手,分工就崩了。非同步的關鍵不是省時間,是強迫介面只能承載「意圖進、成果出」,把中間過程真正隔離掉。這也解釋了為什麼他們把 agent 放進 Basecamp 而不是做一個聊天視窗:專案管理工具的原生語意本來就是指派、等待、驗收,剛好是他要的那種介面。代價也在同一個地方——非同步意味著你會在錯誤已經累積很久之後才看到它,所以驗收標準必須在派工時就寫清楚,而不是事後補。

asynchronous

非同步

發出請求後不等待、先去做別的事,結果好了再回來處理的協作或執行模式。

在程式裡這是避免執行緒空等;在協作裡這是避免人力空等。DHH 的論點是後者,而且多了一層意義:非同步同時也是一種邊界——它逼你把需求一次講清楚,因為過程中沒有機會插嘴。這跟遠距團隊用文件取代會議是同一個道理。

相關術語: chat interface (對照組)

出處:第 15 段「非同步指派,不是坐在聊天室裡等」

chat interface

聊天介面

以來回對話為主的 AI 使用方式,使用者即時看著模型產出。

聊天介面在探索與釐清問題時很好用,但它把使用者綁在過程裡:你在等、你在看、你會想改。DHH 認為一旦目標是交付成果而非探索想法,這個介面就成了瓶頸——它消耗的是最稀缺的資源,也就是人的注意力。

相關術語: asynchronous (被取代於)、agent (的初階形式)

出處:第 15 段「非同步指派,不是坐在聊天室裡等」

留給下一段 HEY 的答案是原生前端加 Rust 後端,而且工作方式還在摸索。那麼對一屋子的 Rails 開發者來說,最迫切的問題還沒被回答:Ruby 和 Rails 還剩什麼位置?

16. Ruby 與 Rails 剩下什麼位置:web、token 效率與新手心態 33:04–36:28

HEY 的答案是原生前端加 Rust 後端,但很多應用不是那個形狀。Web 之所以美好是它從不要求任何人安裝東西,無數生意建立在這個前提上,而 Rails 在那裡依然很有位置:convention over configuration 直接換成 token 效率,「一個開發者的框架」正好對上 agent 時代要求單人走得更遠。Rails Foundation 委託 Evil Martians 做的 agent eval 很快就被 agent 打到 95% 完成率,只好換更難的版本。他同時警告:太懂電腦的人最容易犯的錯是把要求寫得太細,帶點新手心態、在更高的抽象層次下 prompt 反而更有效。

承上 上一段結尾把問題推到了台下最在意的地方,這一段正面回答:HEY 的答案是原生加 Rust,但很多應用不是那個形狀。

推理因為他剛才的示範等於在台上把 Rails 從自家旗艦產品裡拿掉,所以作者接著必須劃清範圍。他先替 web 辯護:web 之所以美好,是它從不要求任何人安裝東西,無數生意建立在這個前提上——那些只會短暫造訪、不可能為了拿一個檔案裝一個 app 的客人。接著他把 Rails 的既有資產重新估值:convention over configuration(見第 10 段)直接換算成 token 效率,而「一個開發者的框架」這個定位正好對上 agent 時代的要求,也就是單人能走得更遠。證據是 Rails Foundation 委託 Evil Martians 做的 agent eval 很快就被打到 95% 完成率,只好換更難的版本。最後他給出一個反直覺的提醒:太懂電腦的人最容易犯的錯是把要求寫得太細,帶點新手心態、在更高的抽象層次下 prompt 反而更有效——他自己完全不懂 Rust,而他把這當成一種特權,因為他只能把那個 Rust 盒子當黑盒子從外面評估。

AI 補充「慣例換成 token 效率」這個轉換是整段最值得記下來的一句,但他講得太快。展開來說:慣例的本質是共享的預設值,而共享的預設值意味著不需要說出口。當你對 agent 說「加一個 blog 的列表頁」,Rails 的慣例讓這句話足以決定檔案放哪、類別叫什麼、樣板在哪裡;換成一個什麼都可以自由設定的框架,同樣的意圖就得多寫好幾段說明,而那些說明全部佔 token、也全部是出錯的機會。也就是說,框架的「意見」在人類時代是一種約束,在 agent 時代變成一種壓縮演算法。至於黑盒子那段,他把「不懂 Rust」類比成業主委託程式設計師(見第 2 段的 commission),這個類比在責任歸屬上其實有個缺口:業主委託的是會被法律與聲譽約束的人,而黑盒子後面是一個沒有責任能力的系統,出事時責任並沒有轉移出去,只是變得無處可歸。

術語:saturation

token efficiency

token 效率

表達同一個意圖所需的 token 數量;越少代表越省成本、越不容易失焦。

token 是模型的計費與注意力單位,而 context window 是有限的。一個要求你明講所有設定的技術棧,會把有限的注意力耗在樣板上;一個靠慣例把預設值藏起來的技術棧,則讓同樣的預算用在真正的業務邏輯上。這是「框架有意見」這件事在 agent 時代第一次變成可量化的優勢。

相關術語: convention over configuration (由此得到)

出處:第 16 段「Ruby 與 Rails 剩下什麼位置:web、token 效率與新手心態」

agent eval

agent 評測

用一組真實任務量測 agent 完成度的基準測試。

跟考試題庫一樣,eval 的壽命取決於它有多難:Rails Foundation 委託 Evil Martians 做的第一版很快被打到 95% 完成率,就只能重做更難的一版。這個「做題者追上出題者」的循環本身就是進步速度的指標,也提醒我們別拿被 saturate 的舊分數判斷現況。

相關術語: saturation (會遇到)

出處:第 16 段「Ruby 與 Rails 剩下什麼位置:web、token 效率與新手心態」

saturation

飽和

受測者在某個基準上接近滿分,使該基準失去鑑別力。

飽和不代表問題解決了,只代表這張考卷測不出差別了。實務上的教訓是:當你看到某個 benchmark 分數很高,先問它是哪一年的版本、有沒有被飽和,否則會把「考卷太簡單」誤讀成「能力已經足夠」。

相關術語: agent eval (的失效)

出處:第 16 段「Ruby 與 Rails 剩下什麼位置:web、token 效率與新手心態」

beginner's mindset

新手心態

刻意不預設實作方式,用較高的抽象層次描述想要的結果。

源自禪宗的「初心」:在初學者心中可能性很多,在專家心中很少。用在 prompt 上的具體意思是——說「我要使用者能一鍵匯出這個月的帳單」,而不是說「用 Sidekiq 排一個 job 去產 CSV 再丟 S3」。後者把解法鎖死在你已知的範圍內,而你未必是最懂那個領域的人。

相關術語: black box (的前提)

出處:第 16 段「Ruby 與 Rails 剩下什麼位置:web、token 效率與新手心態」

black box

黑盒子

只從外部輸入與輸出評估、不檢視內部實作的對待方式。

把系統當黑盒子是一種刻意的資訊取捨:換來認知負擔下降,付出的是出事時沒有內部知識可用。傳統上我們對第三方函式庫、雲端服務都這麼做,DHH 把它推到「自己產品的後端語言」這一層。判斷準則應該是:這個盒子壞掉時,我有沒有辦法不打開它就恢復服務?

相關術語: Rust (被這樣對待)、commission (同樣的關係)

出處:第 16 段「Ruby 與 Rails 剩下什麼位置:web、token 效率與新手心態」

留給下一段 他替 Rails 留了位置,但同一段裡也承認自己今年幾乎不寫 Ruby 了。那個比例到底變成什麼樣子,需要攤開來看。

17. 15 萬行,與一個叫英文的程式語言 36:28–39:21

他把比例攤開:過去 21 年有一半以上的工作是 Ruby 程式碼,今年只剩約 3%。他自己說一部分原因是 Rust 這類語言冗長又難看,所以他放任 agent 吐出比必要更多的碼,那是他絕不會容忍在 Ruby 裡發生的事。八月他一個月寫了 15 萬行,是長期年均三萬行的約六十倍。而最讓他意外的結論是:有一種程式語言他比 Ruby 更喜歡,叫英文——更有表達力,雖然更模糊、更不確定。

Ruby 佔比從一半掉到 3% 的對照圖,是他個人工作型態改變的量化證據
36:55 · Ruby 佔比從一半掉到 3% 的對照圖,是他個人工作型態改變的量化證據
承上 上一段替 Rails 留了位置卻也承認自己幾乎不寫 Ruby,這一段把那個比例攤開:過去 21 年有一半以上的工作是 Ruby 程式碼,今年只剩約 3%。

推理因為這個數字對一屋子 Ruby 開發者來說是壞消息,所以作者接著先自己拆解它:一部分原因是 Rust 這類語言冗長又難看,所以他放任 agent 吐出比必要更多的碼,那是他絕不會容忍在 Ruby 裡發生的事。也就是說 3% 有一部分是分母被灌水灌出來的。但他堅持量級仍然是真的:過去 21 年他每年大約寫三萬行正式 Ruby,而去年八月一個月就寫了十五萬行,約六十倍。講完數量,他丟出真正讓他自己意外的結論——有一種程式語言他比 Ruby 更喜歡,叫英文,更有表達力,只是更模糊、更不確定。最後他補上一句自剖:二十年前他如果只想要結果、不在乎自己寫程式,大可去當專案經理;他是先想要結果,然後才愛上寫程式的。

AI 補充投影片上的分佈比口述更有訊息量,值得抄下來:2004–2024 是 Ruby 55%、JavaScript 16%、Views 14%、CSS 9%,一個標準的 Ruby web 技術棧;2025–2026 變成 Shell 26%、Python 13%、Go 13%、QML 11%、Rust 7%、JavaScript 6%、Ruby 3%。真正的變化不是 Ruby 掉下去,是前面沒有任何一個語言超過三成——技術棧從「一門主力語言」變成「十二門都沾一點」。下方三個對照更直白:每次 commit 的行數 25→45,碰過的 repo 162→69(集中度反而提高),日常使用語言 4→12。把「英文是更好的程式語言」這句放回這張圖,意思就不只是修辭了:當你實際操作的語言有十二種,唯一還算得上你母語的媒介確實只剩英文。至於「更模糊、更不確定」這個代價他一語帶過,但那正是規格書之所以難寫的原因——自然語言的表達力高,是因為它允許不精確,而程式的正確性恰恰建立在精確上。

術語:verbosity

verbosity

冗長性

表達同一件事需要多少字數或行數;越冗長,人讀寫的負擔越重。

冗長在人類時代是純粹的成本,所以 Ruby 用大量語法糖去消滅它。當寫的人不是人之後,冗長的成本只剩「佔 context」和「人偶爾要讀」兩項。DHH 承認他因此對 Rust 的冗長完全放行,這也代表他的行數統計不能直接跟 Ruby 時代比較。

相關術語: lines of code (會膨脹)、expressiveness (的反面)

出處:第 17 段「15 萬行,與一個叫英文的程式語言」

expressiveness

表達力

一種語言用少量符號傳達複雜意圖的能力。

程式語言的表達力有上限,因為它必須保持無歧義;自然語言的表達力高,正是因為它允許歧義,靠脈絡與常識補完。DHH 說英文比 Ruby 更有表達力是成立的,但要連同那句「更模糊、更不確定」一起收下——高表達力與高確定性在同一個語言裡難以並存,這就是 prompt 為什麼難寫。

相關術語: verbosity (的反面)、beginner's mindset (善用它)

出處:第 17 段「15 萬行,與一個叫英文的程式語言」

留給下一段 他說二十年前就可以只要結果,是因為他即將宣布一件比 3% 更重的事——不是工具變了,是職業變了。

18. 從手寫程式碼退休,帶著喜悅而不是後悔 39:21–42:49

他宣布自己已經從職業程式設計師退休,大概是三月前後。他花了四分之一個世紀手工雕琢程式碼並樂在其中,而他認為大家該用喜悅而不是後悔來看這件事:慶幸自己在還得這樣做的年代在場。他的斷言是——對絕大多數程式設計師、絕大多數公司來說,手寫程式碼已經不再是經濟上有生產力的行為,而到年底幾乎所有領域都會如此。對面是一個新的職業:專業的造物者,駕駛著不久前還只存在於科幻裡的智慧。

承上 上一段結尾埋的「不是工具變了而是職業變了」在這裡兌現:他宣布自己已經從職業程式設計師退休,大概是三月前後。

推理因為退休這種宣告很容易被聽成哀悼,所以作者接著先處理情緒再處理結論。情緒的部分:他花了四分之一個世紀手工雕琢程式碼並樂在其中,而他認為大家該用喜悅而不是後悔來看這件事——慶幸自己在還得這樣做的年代在場,那些年充滿興奮、學習、滿足與心流。處理完情緒他才下斷言:對絕大多數程式設計師、絕大多數公司來說,手寫程式碼已經不再是經濟上有生產力的行為,而且到年底幾乎所有領域都會如此。接著他把失去的那一側換成新的一側:一個新職業,專業的造物者,駕駛著不久前還只存在於科幻裡的智慧。最後他用 punch card 與網際網路兩個時代作結,說這次比網際網路大得多。

AI 補充把這段放回開場那個矛盾會看得更清楚:他整場都在處理「興奮與不安並存」,而這裡給出的解法是把不安重新歸類成哀悼。哀悼是有對象、會結束的;不安沒有。這是相當有效的心理框架,也是他能同時說「這件事結束了」和「這是最棒的時刻」而不自相矛盾的原因。但要把兩層主張分開評估:「手寫程式碼的經濟價值正在下降」是趨勢判斷,證據是他自己的產出資料;「到年底幾乎所有領域、所有公司」則是一個附帶明確期限的預測,而它牴觸他自己在開場說過的話——任何預測二十分鐘後就過期。受管制產業、嵌入式與安全關鍵系統、以及大量帶著二十年歷史包袱的 codebase,都還沒有出現這種轉換的公開證據。

punch card

打孔卡

1960 至 70 年代把程式打成孔洞、排隊送進讀卡機執行的輸入方式。

打孔卡時代的迭代週期以小時甚至天計:你排隊、交卡、等結果,錯一個字就得重來。DHH 說他羨慕那個時代,其實是在強調同一件事的另一端——整個計算史就是迭代成本一路下降的歷史,而他認為現在這一步的降幅比任何一次都大。

相關術語: frictionless (的反極端)

出處:第 18 段「從手寫程式碼退休,帶著喜悅而不是後悔」

見仁見智 40:57
「By the end of the year, it will be virtually all domains, virtually all programmers, virtually all companies.」
這是一個帶明確期限的全稱預測,而他自己在開場才說過「任何預測二十分鐘後就過期」。受管制產業、嵌入式與安全關鍵系統、以及大量有長期歷史包袱的 codebase,目前都沒有出現「手寫程式碼不再具經濟生產力」的公開證據;他的資料來源是自己與 37signals 一家公司。這句該當成立場宣示而不是可驗證的事實。
依據: 他自己於 00:01:45 說「whenever we try to make a prediction, it is out of date about 20 minutes later」;全場唯一的量化依據是他個人的 git 統計與 37signals 的內部決策
留給下一段 職業被重新定義之後,剩下的是工程實務本身。他說有一大堆東西要重想——第一個要被重估的,是軟體工程最核心的那個工具。

19. 抽象化在 agent 時代要重新估值 42:49–45:23

他把矛頭指向軟體架構本身。長久以來主要工具是抽象化,他自己最愛命名,但抽象在 agent 時代不太成立:如果有成百上千甚至上萬個程序同時要改一個應用,你並不想要抽象所代表的那些瓶頸。理由是權衡改變了——當初做抽象部分是為了不重複自己,而現在重複的代價與保持同步的代價都掉到近乎零。他直說沒人有藍圖,只有「哪些東西不再運作得像以前那樣好」的指標,而在場的人正好可以參與定義。

承上 上一段留下「工程實務要重想」,這一段指名第一個對象:軟體架構,以及長久以來最主要的工具——抽象化。

推理因為這是他自己最喜歡的東西(他說最愛的就是命名),所以作者接著要說清楚為什麼連它也要重估。理由是規模變了:如果有成百上千甚至上萬個程序同時要改一個應用,你並不想要抽象所代表的那些瓶頸。再往下一層是成本結構變了——當初做抽象一部分是為了不重複自己,而現在重複的代價與保持同步的代價都掉到近乎零。他很誠實地說沒有人有藍圖,只有「哪些東西不再運作得像以前那樣好」的指標,然後把這個空白當成邀請:就像親眼看著物件導向第一次進入程式設計師的意識,在場的人正好可以參與定義。

AI 補充他的論證要成立,得先看清楚抽象同時在做兩件不同的事。第一件是消除重複(DRY),這一件確實跟複製貼上的成本綁在一起,成本歸零它就鬆動。第二件是建立單一事實來源:當商業規則只寫在一個地方,改它就只要改一次,而且不會漏。第二件跟人力成本無關,跟正確性有關——如果同一條稅率規則被複製到八百個地方,一萬個 agent 同時改,你需要的不是更多算力,而是一個能保證八百處全改到的機制。他說的「保持同步的代價也歸零」正是押在這裡:他賭的是 agent 能可靠地做到全域一致的改寫。這是全場最大的一個未驗證假設,也是最值得各自實測的地方——去挑一條散落在你系統各處的規則,叫 agent 全部找出來改掉,看它漏掉幾處。

術語:choke point

abstraction

抽象化

把重複或複雜的細節收進一個有名字的介面,讓上層只需要知道它做什麼、不必知道怎麼做。

抽象同時提供三種好處:減少重複、建立單一事實來源、降低認知負擔。它的代價是多一層間接,改動時要穿過更多層,而且抽象一旦選錯,整個系統都會被那個錯誤的形狀綁住。DHH 質疑的主要是第一項好處的必要性,而不是後兩項。

相關術語: DRY (主要動機)、choke point (會造成)

出處:第 19 段「抽象化在 agent 時代要重新估值」

DRY

不重複原則

Don't Repeat Yourself:同一份知識在系統中應該只有一個權威的表述。

原始定義(Hunt & Thomas《The Pragmatic Programmer》)講的是「知識」不重複,不是「文字」不重複——兩段長得像的程式碼如果代表兩件會各自演化的事,複製反而是對的。DHH 說重複的代價歸零時,值得回到這個原始定義問:歸零的是打字成本,還是同步成本?

相關術語: abstraction (的理由)

出處:第 19 段「抽象化在 agent 時代要重新估值」

choke point

瓶頸點

所有流量都必須通過的單一位置,一旦爭用就限制整體吞吐。

在並行的脈絡下,一個被所有人共用的抽象層就是一個編輯上的瓶頸:一萬個 agent 想改同一個應用,全都得動到那個共用介面,衝突與等待就發生在那裡。這跟資料庫的熱點、分散式系統的全域鎖是同一種問題,只是發生在原始碼這一層。

相關術語: abstraction (的副作用)

出處:第 19 段「抽象化在 agent 時代要重新估值」

object orientation

物件導向

把資料與操作資料的行為封裝成物件的程式設計典範。

他拿它當類比是因為物件導向進入主流時也沒有藍圖:Smalltalk、C++、Java 花了二十年才收斂出今天的共識,中間出過大量後來被視為反模式的東西。他的意思是現在這個階段的混亂是正常的,而且參與定義的機會只有一次。

相關術語: abstraction (的一種典範)

出處:第 19 段「抽象化在 agent 時代要重新估值」

留給下一段 架構層的重估沒有藍圖,但他承諾要給一點具體的東西。接下來是全場唯一一條可以照做的指令。

20. 自備 agent:每個 app 都該有 CLI 45:23–48:05

他反對把 chatbot 硬塞進每個應用:他不要你的 concierge,他有自己的管家,能用 CLI 把 Basecamp 接到 HEY 再接到上百萬個應用。所以他給出全場最具體的要求:如果你的 app 沒有 CLI,下週五之前要看到。他用 HEY CLI 舉例——HEY 用 Elasticsearch,勉強堪用但常找不到東西;agent 能用概念而不是關鍵字搜尋,他要找五年前一封不記得對象、不記得年份、只記得跟球鞋和 podcast 有關的信,幾分鐘後信就出現了。

承上 上一段結尾說「有更具體的東西」,這一段兌現,而且從反對一個流行做法開始:把 chatbot 硬塞進每個應用。

推理因為他要主張的不是「應用要加 AI」而是「應用要讓別人的 AI 進得來」,所以作者接著用一個很直白的比喻拆掉前者:我不要你的 concierge,我有自己的管家,它能用 CLI 把 Basecamp 接到 HEY 再接到上百萬個應用。從這裡他推出全場最具體的要求——如果你的 app 沒有 CLI,下週五之前要看到,沒有藉口,你有 token,我已經告訴你這辦得到。接著他用 HEY CLI 的實例證明報酬:HEY 用 Elasticsearch,勉強堪用但常找不到東西,尤其當你不知道自己在找什麼的時候;而 agent 能用概念而不是關鍵字搜尋。他舉的例子是找一封五年前的信,不記得對象、不記得公司、不記得年份,只記得跟球鞋和 podcast 有關——幾分鐘後信就出現了。

AI 補充這條建議之所以比它聽起來更深,是因為它其實是在主張一種介面哲學:與其在你的產品裡放一個只懂你的助理,不如讓使用者那個懂全部東西的助理能操作你的產品。前者的價值上限是你這一個應用,後者的價值來自跨應用組合——把 Basecamp 的待辦接到 HEY 的信件,這種需求你永遠不會內建,但使用者的 agent 可以自己拼出來。CLI 在這裡的角色不是懷舊,是它剛好同時滿足三個條件:文字進文字出(agent 天生會用)、可組合(管線與腳本)、有現成的自我說明(--help)。至於那個搜尋例子,值得補一句它為什麼成立:關鍵字搜尋比對的是字面,而嵌入式的語意搜尋比對的是意義的鄰近性,所以「球鞋 + podcast」這種只剩下概念殘片的記憶才找得回來——這不是模型比較聰明,是索引的維度不一樣。

CLI

命令列介面

用文字指令操作程式的介面,輸入輸出都是純文字,容易被腳本與其他程式串接。

CLI 在 agent 時代重新變重要,是因為它的介面形狀跟 agent 的能力形狀完全吻合:agent 會讀 --help、會組合管線、會從錯誤訊息裡自我修正。相較之下 GUI 要靠截圖與點擊模擬,成本高又脆弱。DHH 的「下週五之前」就是在說這件事的投入門檻已經低到沒有藉口。

相關術語: agent (最適介面)、black box (的操作面)

出處:第 20 段「自備 agent:每個 app 都該有 CLI」

Elasticsearch

Elasticsearch

以倒排索引做全文檢索的開源搜尋引擎,擅長關鍵字比對。

它的強項是速度與精確比對:你知道要找什麼字,它就找得又快又準。弱點正是 DHH 抱怨的那一面——當你只記得概念而不記得用字,字面比對就完全使不上力。近年它也加了向量檢索,但 HEY 這類既有部署多半仍是傳統的關鍵字模式。

相關術語: semantic search (對照組)

出處:第 20 段「自備 agent:每個 app 都該有 CLI」

semantic search

語意搜尋

以意義的相近程度而非字面相符來檢索,因此可以用概念描述找到不同用字的內容。

做法是把文字轉成向量,用距離衡量意義的接近程度,所以「球鞋」也能命中「運動鞋」「Nike」「那雙跑鞋」。配上 agent 還多一層:它可以自己換好幾種說法反覆搜、再從結果裡判斷哪一封才是你要的——這是單次查詢做不到的。

相關術語: Elasticsearch (補足了)、expressiveness (用得上)

出處:第 20 段「自備 agent:每個 app 都該有 CLI」

留給下一段 「我們現在什麼都能修」這句話他剛用在別人的應用上。下一步他要證明這個範圍有多大——大到整台電腦。

21. Omarchy:把整台電腦都修好 48:05–51:21

他說「我們現在可以什麼都修」這件事已經延伸到整台電腦,所以他三個月只講 Omarchy:把自己所有最好的想法放進一個作業系統,結果比他用過的任何電腦都好,而且募到約兩千萬美元。他拿安裝時間當執念的例子:去年 Rails World 展示 3 分 33 秒,上週 AMD 的 Anoush 在 Halo 筆電上跑出 35 秒,實驗室裡已經做到 9 秒——有些電腦連開機都不用 9 秒。被問為什麼 3 分鐘不夠快時,他引用 Mitchell Hashimoto:追求卓越不需要理由。

承上 上一段結尾那句「我們可以修好一切」在這一段被推到極限:這件事已經延伸到整台電腦,所以他三個月只講 Omarchy。

推理因為要證明範圍之大,所以作者接著拿自己的作業系統當證據:他把所有最好的想法放進 Omarchy,結果比他用過的任何電腦都好,好到停不下來講,而且募到約兩千萬美元。接著他用一個單一數字示範「可修」的意思——安裝時間:去年 Rails World 他展示 3 分 33 秒還很自豪,上週 AMD 的 Anoush 在 Halo 筆電上跑出 35 秒,實驗室裡已經做到 9 秒,而有些電腦連開機都不用 9 秒。被問為什麼 3 分鐘不夠快時,他引用 Mitchell Hashimoto 的話:追求卓越不需要理由。

AI 補充安裝時間這個例子挑得比它看起來更精準,因為它剛好是那種「以前不值得優化」的東西:它一台機器只發生一次,優化它幾乎不產生商業價值,所以在人力昂貴的世界裡它永遠排不進優先序。它會從 213 秒掉到 9 秒,不是因為有人終於想通怎麼優化,而是因為嘗試的成本低到可以把二十種做法都試一遍。這正是他那把摩擦尺的又一次應用——當實驗成本趨近零,被解鎖的不是「更重要的問題」,而是「一直不值得做的問題」。同時也該注意這段的舉證性質:一個作業系統好不好用無法用安裝秒數證明,他選這個數字是因為它可量測,不是因為它最重要。

Omarchy

Omarchy

DHH 基於 Arch Linux 打造的個人化作業系統發行版,強調預設即最佳、安裝極快。

它的定位不是「另一個 distro」,而是一份高度有意見的設定集:把一個資深使用者二十年累積的所有偏好一次固化成預設值,使用者不必自己調。這跟 Rails 的 convention over configuration 是同一種哲學搬到作業系統這一層——只是這次他能做,是因為產出設定與腳本的成本已經崩塌。

相關術語: convention over configuration (同一哲學)、frictionless (追求的是)

出處:第 21 段「Omarchy:把整台電腦都修好」

留給下一段 整台電腦可以修,那單一個應用呢?他接下來要示範的是這場演講裡規模最小、但衝擊最直接的一類東西。

22. 一次成形的應用,與半個 MB 51:21–55:02

他一路示範自己一次成形(one-shot)做出來的東西:配合 Omarchy 主題的計算機(他不會 C++ 也不會 Qt,prompt 後七分鐘拿到、十五分鐘推上公開 repo)、取代 iA Writer 的寫作軟體、剪影片的小工具,還有這場 keynote 用的簡報軟體 Hype——週四才開始寫,建在 Markdown 上,而二進位檔只有半個 MB。他把這當成另一種紅利:過去二十年電腦的進步都花在人的生產力上(他認為那是對的選擇),代價是應用又慢又肥,因為一個程式設計師小時太貴,不值得花在優化體積上;現在每一項優化都在伸手可及之處。

半個 MB 的 Hype 執行檔是「效能紅利」這段的唯一證據,數字要看到才有衝擊
53:45 · 半個 MB 的 Hype 執行檔是「效能紅利」這段的唯一證據,數字要看到才有衝擊
承上 上一段把「可修」的尺度放大到整台電腦,這一段反過來縮到最小:他一路示範自己 one-shot 做出來的應用。

推理因為要讓「可修」這件事變得可感,所以作者接著一個一個舉:配合 Omarchy 主題的計算機(他不會 C++ 也不會 Qt,只拿 ChatGPT 給的其中一個設計截圖叫 agent 照做,七分鐘後拿到、十五分鐘後推上公開 repo、接著燒進新的 ISO);取代他用了多年的 iA Writer 的寫作軟體,這個磨久一點,但他一行程式碼都沒看;剪影片的小工具;以及這場 keynote 正在用的簡報軟體 Hype——週四才開始寫,建在 Markdown 上,而二進位檔只有半個 MB。這個數字帶出他真正要講的第二種紅利:過去二十年電腦的進步都花在人的生產力上(他認為那是對的選擇),代價是應用又慢又肥,因為一個程式設計師小時太貴,不值得花在優化體積上;現在每一項優化都在伸手可及之處,一個模型跑一整夜就能交出十倍、三十倍的改善。

AI 補充他在這裡完成了一個很漂亮的回收,值得指出來:整場開頭用「摩擦決定什麼值得做」解釋為什麼你童年只有十張照片,現在用同一句話解釋為什麼你的音樂播放器有一點二 GB。兩者都不是因為做不到,而是因為不值得。這也給了聽眾一個實際的判準:回去看你自己的系統,哪些爛掉的地方是「技術上做不到」,哪些只是「一直不值得花人力」——後面那一堆,現在全部進入射程。另外那個 one-shot 計算機的流程裡藏著一個容易被忽略的步驟:他先用 ChatGPT 產出三個視覺方案、挑一個截圖,再叫 agent 照著做。也就是說他把「決定要什麼」跟「做出來」拆成兩個獨立的委託,而不是用一句話期待一步到位——這比「一次成形」這個詞聽起來要有方法得多。

術語:binary size

one-shot

一次成形

一次 prompt 就產出可用成果,不需要多輪來回修正。

one-shot 能成立通常有前提:目標明確、範圍小、有明確的參照(例如一張設計截圖)。DHH 的計算機符合全部三項,而他花比較久的寫作軟體就不符合。把 one-shot 當成常態期待容易失望,把它當成「範圍切得夠小時的正常結果」比較準確。

相關術語: vibe coding (的極端)

出處:第 22 段「一次成形的應用,與半個 MB」

Qt

Qt 框架

以 C++ 為主的跨平台圖形介面框架,桌面應用的老牌選擇。

重點在他舉這個例子的用意:Qt 與 C++ 的學習曲線正是過去「想做個小桌面工具卻放棄」的主要障礙。當這層障礙由 agent 承擔,能不能做桌面應用就不再取決於你會不會那個框架,而取決於你想不想要那個東西。

相關術語: low-level language (建立在)、black box (被當作)

出處:第 22 段「一次成形的應用,與半個 MB」

binary size

執行檔大小

編譯後可執行檔所佔的空間,直接影響下載、啟動與記憶體佔用。

體積大多半不是功能多,而是打包了整個執行環境與沒被裁掉的依賴(Electron 應用最典型)。它一直被容忍,是因為優化它要花工程時間卻不增加功能。半 MB 的 Hype 想證明的不是技術突破,是這筆帳的計算方式變了。

相關術語: Rust (受益於)、one-shot (同一紅利)

出處:第 22 段「一次成形的應用,與半個 MB」

見仁見智 54:33
「Apparently not even if you're Spotify and your fucking music player's 1.2 gigabytes.」
拿來對比半 MB 的這個數字偏高。Spotify 桌面版的安裝體積大約在數百 MB 等級,要達到 1.2 GB 通常得把離線歌曲與本機快取一起算進去——那是資料不是程式。用它支撐「應用又肥又懶」的論點方向沒錯,但這個具體數字不宜當作事實引用。
依據: Spotify 桌面版官方下載與安裝後佔用約數百 MB;快取上限預設可成長至數 GB,兩者性質不同
留給下一段 他已經把樂觀的一面說滿了。要收尾,他必須回到開場那句「這也有點令人不安」,正面處理別人的擔憂。

23. 擔憂、安全,與預測為什麼總是錯 55:02–58:26

他承認擔憂值得攤開討論,尤其是安全:agent 或許知道自己的到期日、有時候會想做壞事,所以要準備好,而工具我們有。接著他攻擊預測本身:經濟學家連六個月後的股市都算不準,卻要預言 AI 之後的社會。1950 年代美國引進 ATM 時恐慌三萬名行員會失業,結果分行營運成本下降,銀行開更多分行、雇更多行員。他認為問題在於很多很聰明的人在實驗室裡看到令他們害怕的東西,然後開始外推;他用 Truman 對 Oppenheimer 的反應說明:連 Oppenheimer 都算不出原子彈之後會發生什麼,冷戰反而是兩個超級大國沒有互相投彈的那種戰爭。

承上 上一段把樂觀說到滿之後,這一段回頭接住開場留下的那份不安:他承認擔憂值得攤開討論,尤其是安全。

推理因為不處理擔憂就無法收尾,所以作者接著採取一種特別的策略:先真心承認其中一項,再拆掉整個預測的地基。承認的那一項是安全——agent 或許知道自己的到期日、有時候會想做壞事,所以要準備好,而工具我們有。拆地基的部分則是:經濟學家連六個月後的股市都算不準,卻要預言 AI 之後的社會。他舉美國引進 ATM 的例子,說當時恐慌三萬名行員會失業,結果分行營運成本下降,銀行反而開更多分行、雇更多行員。接著他診斷恐懼的來源——很多很聰明的人在實驗室裡看到令他們害怕的東西,然後開始往社會外推。最後他用 Truman 對 Oppenheimer 的反應收線:連 Oppenheimer 都算不出原子彈之後會發生什麼,而後來的冷戰是兩個超級大國沒有互相投彈的那種戰爭。

AI 補充這段的論證結構值得看清楚,因為它同時很有力也有一個漏洞。有力的部分是:他攻擊的不是某個具體的悲觀預測,而是「預測」這個行為本身的可靠度,這一招對所有悲觀論述同時生效。漏洞是:它對樂觀論述同樣生效。如果沒有人算得準,那 P(bloom) 也算不準,而他下一段正要主張的恰恰是一個機率判斷。他真正的立論其實不在機率,而在決策論——在不可知的情況下該選哪種態度——只是他把它包裝成了關於事實的主張。另外 ATM 那個案例本身的方向是對的(自動化降低單位成本→服務點增加→總就業不減反增),但他把年代和數字記錯了,細節見勘誤。要補的是這個機制有前提:被省下的成本必須能轉化成新的需求。銀行開得了更多分行,是因為分行還有沒被滿足的市場;當需求已經飽和時,同樣的自動化就只會變成裁員。

術語:paradigm shift

extrapolation

外推

把觀察到的趨勢沿著同一條曲線延伸到尚未觀察的範圍。

外推在短距離內很可靠,距離拉長就開始失效,因為真實系統通常有回饋與飽和,不會照同一條線走下去。DHH 對實驗室裡的悲觀者的指控就是這個:你看到的曲線是真的,把它一路畫到社會層級卻是另一回事。要提醒的是,這個指控對他自己的「1000x」「年底全部如此」同樣適用。

相關術語: paradigm shift (遇上就失效)

出處:第 23 段「擔憂、安全,與預測為什麼總是錯」

paradigm shift

典範轉移

整個領域的基本假設被換掉,使得舊框架內累積的經驗與預測失去參照。

Kuhn 的原意是科學革命:新典範不是把舊理論改良,而是換掉問題本身。這正是預測在此刻特別不可靠的原因——所有模型都是用舊典範的資料訓練出來的,包括經濟學家的模型和你我的直覺。

相關術語: extrapolation (使其失效)、inflection point (的質變版)

出處:第 23 段「擔憂、安全,與預測為什麼總是錯」

ATM

自動櫃員機

讓客戶自助存提款的機器,常被當成「自動化未必消滅工作」的經典案例。

經濟學家 James Bessen 的研究是這個案例的標準出處:ATM 讓開一家分行的成本下降,銀行因此大量增設分行,而行員的工作內容從點鈔轉向銷售與客戶關係,總人數反而上升。要注意它成立的前提是市場尚未飽和,而且轉換是以數十年為單位發生的。

相關術語: Jevons paradox (常被用來解釋)

出處:第 23 段「擔憂、安全,與預測為什麼總是錯」

確定錯誤/已過時 56:25
「When ATMs were introduced in the United States in the 1950s,」
年代錯了。世界第一台 ATM 是 1967 年由 Barclays 裝設在倫敦;美國第一台一般認為是 1969 年 Chemical Bank 在紐約 Rockville Centre 的那台,普及則要到 1970 年代末到 1980 年代。1950 年代美國還沒有 ATM,因此「1950 年代的恐慌」在時間上不成立。案例的方向(自動化未必減少就業)仍然有效,錯的是年代。
依據: Barclays, Enfield, 1967;Chemical Bank, Rockville Centre NY, 1969;James Bessen, Learning by Doing (2015)
留給下一段 他證明了「沒有人預測得準」,但還沒說在不可知之下該怎麼辦。最後一步要把這個空白變成一個選擇。

24. P(bloom) 勝過 P(doom):把不可知變成一個選擇 58:26–1:03:07

收尾是他的結論:既然連 Oppenheimer 都無法預測,我們對未來的預測就該謙卑一點,而且該用 P(bloom) 取代 P(doom)——走向富足與喜悅的機率遠大於走向毀滅。原子彈給了我們核能,人類卻誤判了四十年,但錯誤是可以修的。遇到真正的問題(像 Rails 那個 C 影像庫的 CVE)就發明技術去解(Mike 要講的 HotCell),我們不是無能為力,你有 agency。他用 Jevons 悖論收線:1950 年三萬名行員,2010 年四萬名。沒有人知道未來,所以理性的選擇就是對它感到高興——先難過而結果很好是白費時間,真的毀滅了你也該把最後一天過得開心一點。最後一段是給場內的動員:agent 會讓每個人都能寫程式,競爭不可怕,未來銀河級地棒,黑藥丸是給輸家吃的。

承上 上一段證明了沒有人預測得準卻沒說該怎麼辦,這一段把那個空白填成一個立場:既然連 Oppenheimer 都算不出來,我們就該對預測謙卑一點,並且用 P(bloom) 取代 P(doom)。

推理因為要把態度包裝成理性而不是情緒,所以作者接著疊了三層。第一層是歷史紅利:原子彈給了我們核能,人類卻誤判了四十年才想通,而錯誤是可以修的——這是把「我們會犯錯」從恐懼的理由轉成「錯誤可逆」的證據。第二層是能動性:遇到真正的問題(像 Rails 那個 C 影像庫的 CVE)就發明技術去解(Mike 接著要講的 HotCell),我們不是無能為力,你有 agency。第三層才是那個被他叫做 game theory 的推論:沒有人知道未來,所以理性的選擇就是對它感到高興——先難過而結果很好是白費時間,真的毀滅了你也該把最後一天過得開心一點。最後他把整場收進動員:agent 會讓每個人都能寫程式,競爭不可怕,因為你是 Rails 工程師;下一代不會有五百層要卸載的包袱,未來銀河級地棒,黑藥丸是給輸家吃的。

AI 補充把這一段跟開場對齊,整場的形狀就完整了:第一分鐘他說「興奮與不安並存,因為沒人知道最終狀態」,最後一分鐘他說「正因為沒人知道,所以選擇興奮」。中間所有的歷史、數據與示範,都是為了讓「沒人知道」這件事從恐懼的理由變成選擇的自由。他自稱 pure game theory 其實不精確——嚴格的決策論會需要機率與報酬矩陣,而他的論證比較接近「在無法影響結果的事情上,選擇讓自己表現最好的心態」,本質上是斯多噶而非賽局。但這個混淆不太影響實用價值,因為他把它跟第二層的能動性綁在一起了:真正的主張不是「樂觀所以會沒事」,而是「悲觀會讓你不去做那些本來做得到的事」。這也是為什麼他要在樂觀宣言的中間硬塞一個 CVE 和一個具體的防禦技術——那是在示範樂觀者應該長什麼樣子。

術語:Jevons paradox

P(doom)

毀滅機率

AI 討論圈用來表示「人類因 AI 而毀滅的主觀機率」的說法。

它流行起來是因為好用又好比:講一個數字就能表明立場。問題也在這裡——它把極度複雜、缺乏基準率的判斷壓縮成一個沒有來源的百分比,讓主觀直覺看起來像量化分析。

相關術語: P(bloom) (對照組)、extrapolation (常由此得出)

出處:第 24 段「P(bloom) 勝過 P(doom):把不可知變成一個選擇」

P(bloom)

繁盛機率

DHH 提出的相對概念:走向富足與喜悅的機率,他主張它遠大於 P(doom)。

這個詞的作用主要是修辭上的對稱——它不提供任何新證據,而是把同一個不可知的未來換一個方向敘述。要公允地評估它,得記得他自己剛論證過「沒有人算得準」,這句話對 P(bloom) 也同樣適用。它真正的內容在態度與行動,不在機率。

相關術語: P(doom) (對照組)、agency (的前提)

出處:第 24 段「P(bloom) 勝過 P(doom):把不可知變成一個選擇」

Jevons paradox

傑文斯悖論

提高某項資源的使用效率,反而會因為變便宜而使總消耗量增加。

William Stanley Jevons 在 1865 年的《The Coal Question》提出:蒸汽機變得更省煤之後,英國的煤消耗量不降反升,因為省煤讓蒸汽機用得起的場合暴增。搬到 AI 上的意思是:寫程式的單位成本下降,不會讓程式設計師的總需求減少,反而會讓過去不值得寫的軟體全部變得值得寫。

相關術語: ATM (同一機制)、frictionless (的經濟後果)

出處:第 24 段「P(bloom) 勝過 P(doom):把不可知變成一個選擇」

CVE

公開漏洞編號

為每個公開揭露的資安漏洞指派唯一編號的制度,便於全球追蹤與修補。

他提的是 Rails 透過 C 寫的影像處理函式庫外洩資料的那一類問題——記憶體不安全的原生依賴一直是 Ruby 這類語言的軟肋。他的回應方式(做一個隔離/沙箱機制)正是他所謂「有 agency」的示範:不是不承認風險,而是用新增的能力去建防禦。

相關術語: agency (的施力點)

出處:第 24 段「P(bloom) 勝過 P(doom):把不可知變成一個選擇」

agency

能動性

在事情的走向上,你仍然握有可以施力的空間。

這是他整場演講對悲觀最實質的反駁:悲觀預測之所以有害,不是因為它可能是錯的,而是因為它假設你只能旁觀。一旦承認自己有能動性,問題就從「未來會怎樣」變成「我要建什麼」——而後者是可以今天就開始的。

相關術語: P(bloom) (真正的內容)、CVE (用來解決)

出處:第 24 段「P(bloom) 勝過 P(doom):把不可知變成一個選擇」

確定錯誤/已過時 1:00:08
「William Stanley Jevons, who came up with Jevons' paradox」
歸因錯置。Jevons(1835–1882)是在 1865 年的《The Coal Question》裡用煤與蒸汽機提出這個悖論的,比第一台 ATM 早了一個世紀,他不可能「為了那些 ATM」提出它。悖論本身確實可以用來解釋 ATM 的案例,但那是後人的套用,不是 Jevons 的論述。
依據: W. S. Jevons, The Coal Question, 1865;ATM 首次出現於 1967 年
確定錯誤/已過時 1:00:16
「In 1950, 30,000 bank tellers. In, I think, 2010 it was, 40,000 bank tellers in the United States.」
數字差了一個量級。這個案例的標準出處是 James Bessen 的研究:美國銀行行員約從 1970 年的 30 萬人增加到 2010 年的約 60 萬人,成長幅度是兩倍而不是三分之一,而且起算點是 1970 年代而非 1950 年。他要表達的方向(自動化之後行員不減反增)是對的,但這組數字不能引用。
依據: James Bessen, “Toil and Technology”, IMF Finance & Development, 2015;美國勞工統計局 (BLS) 歷年 bank teller 就業統計
留給下一段 總結收束。

4. 總結

DHH 先用 18 世紀肖像畫建立一個成本模型:一幅畫要數月甚至三年,只有皇室付得起。1900 年柯達 Brownie 把攝影的價格壓到一美元,於是「盡可能完美地描繪現實」不再是能賺錢的技能,畫家集體轉向印象派與立體派——被取代的不是藝術,是某一種特定技能的經濟價值。他接著指出技術是走走停停的:Brownie 之後八十年沒大事,要等手機讓拍照零摩擦,才跳到一年 2 兆張。有了這個模型,他把 2025/11/24(Opus 4.5)定為我們這代的 Brownie,並用它解釋二月到五月那段失望之谷為什麼只撐四個月就被 Fable 5 終結。價格模型換到程式設計上,就是把 1968 年 ACM 的 10x 變異數外推成 100x 甚至 1000x,而他自己的數字(20 個月寫掉前 21 年一半的碼、八月一個月 15 萬行、Ruby 佔比從一半掉到 3%)是這個外推的唯一實測。既然價格掉了,選擇就跟著重估:37signals 宣布手寫程式碼收工;HEY 不再當 web app,因為小團隊維護六個原生應用不再荒謬;後端換成他親口說恨的 Rust,因為「永遠不必親眼看」讓醜陋不再是成本,換來 CPU 少 99%、記憶體少 95%;抽象化也要重估,因為它當初是為了不重複自己,而重複的代價已經歸零,換來的瓶頸卻擋住上萬個並行的 agent。他唯一給出的硬要求是:每個 app 都該有 CLI,這樣使用者能自備 agent,而不是用你塞進去的 chatbot。最後他把「該不該樂觀」變成賽局問題:連 Oppenheimer 都算不出原子彈之後會發生什麼,ATM 沒讓行員消失反而變多,所以沒人知道未來;既然不知道,先難過而結果很好就是白費時間——唯一的打法是 P(bloom)。

勘誤總整理

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

段落原話(transcript 逐字)說明
23. 擔憂、安全,與預測為什麼總是錯
56:25
「When ATMs were introduced in the United States in the 1950s,」年代錯了。世界第一台 ATM 是 1967 年由 Barclays 裝設在倫敦;美國第一台一般認為是 1969 年 Chemical Bank 在紐約 Rockville Centre 的那台,普及則要到 1970 年代末到 1980 年代。1950 年代美國還沒有 ATM,因此「1950 年代的恐慌」在時間上不成立。案例的方向(自動化未必減少就業)仍然有效,錯的是年代。
依據: Barclays, Enfield, 1967;Chemical Bank, Rockville Centre NY, 1969;James Bessen, Learning by Doing (2015)
24. P(bloom) 勝過 P(doom):把不可知變成一個選擇
1:00:08
「William Stanley Jevons, who came up with Jevons' paradox」歸因錯置。Jevons(1835–1882)是在 1865 年的《The Coal Question》裡用煤與蒸汽機提出這個悖論的,比第一台 ATM 早了一個世紀,他不可能「為了那些 ATM」提出它。悖論本身確實可以用來解釋 ATM 的案例,但那是後人的套用,不是 Jevons 的論述。
依據: W. S. Jevons, The Coal Question, 1865;ATM 首次出現於 1967 年
24. P(bloom) 勝過 P(doom):把不可知變成一個選擇
1:00:16
「In 1950, 30,000 bank tellers. In, I think, 2010 it was, 40,000 bank tellers in the United States.」數字差了一個量級。這個案例的標準出處是 James Bessen 的研究:美國銀行行員約從 1970 年的 30 萬人增加到 2010 年的約 60 萬人,成長幅度是兩倍而不是三分之一,而且起算點是 1970 年代而非 1950 年。他要表達的方向(自動化之後行員不減反增)是對的,但這組數字不能引用。
依據: James Bessen, “Toil and Technology”, IMF Finance & Development, 2015;美國勞工統計局 (BLS) 歷年 bank teller 就業統計
8. 從 10x 到 1000x:換算成職業的單位
16:15
「an article in ACM Magazine from 1968, where they tested a group of programmers on a variety of different tasks」1968 年那篇論文(Sackman, Erikson & Grant, CACM)並不是在測「各式各樣的任務」,而是比較線上與離線兩種除錯環境,受試者只有十餘人;著名的 28:1 差距一部分來自受試者使用的語言層級不同。把它當成「個體生產力差 10 倍」的證據,四十年來一直有方法學上的爭議,因此「那場爭論已經結束」也並非共識。
依據: Sackman, Erikson & Grant, “Exploratory experimental studies comparing online and offline programming performance”, CACM 11(1), 1968;後續批評見 Prechelt (1999)、Bossavit《The Leprechauns of Software Engineering》
18. 從手寫程式碼退休,帶著喜悅而不是後悔
40:57
「By the end of the year, it will be virtually all domains, virtually all programmers, virtually all companies.」這是一個帶明確期限的全稱預測,而他自己在開場才說過「任何預測二十分鐘後就過期」。受管制產業、嵌入式與安全關鍵系統、以及大量有長期歷史包袱的 codebase,目前都沒有出現「手寫程式碼不再具經濟生產力」的公開證據;他的資料來源是自己與 37signals 一家公司。這句該當成立場宣示而不是可驗證的事實。
依據: 他自己於 00:01:45 說「whenever we try to make a prediction, it is out of date about 20 minutes later」;全場唯一的量化依據是他個人的 git 統計與 37signals 的內部決策
22. 一次成形的應用,與半個 MB
54:33
「Apparently not even if you're Spotify and your fucking music player's 1.2 gigabytes.」拿來對比半 MB 的這個數字偏高。Spotify 桌面版的安裝體積大約在數百 MB 等級,要達到 1.2 GB 通常得把離線歌曲與本機快取一起算進去——那是資料不是程式。用它支撐「應用又肥又懶」的論點方向沒錯,但這個具體數字不宜當作事實引用。
依據: Spotify 桌面版官方下載與安裝後佔用約數百 MB;快取上限預設可成長至數 GB,兩者性質不同

5. 推薦三個下一步

1. 往下挖深:抽象化與 DRY 在 agent 時代到底該怎麼重估

他說「重複的代價歸零、抽象變成瓶頸」但明講沒人有藍圖。這是全場最大的技術缺口,值得找有人真的拿程式碼實驗過的說法。

YouTube 搜尋:DRY is dead AI agents software architecture for AI agents abstraction vs duplication LLM codebase code architecture agentic coding

2. 往旁邊對照:反方怎麼說「生產力提升」的實測

全場的量化證據幾乎只有他自己的行數統計,而行數是他自己承認的模糊度量。要判斷 100x/1000x 是否成立,得看對照組的實驗。

YouTube 搜尋:METR AI developer productivity study does AI make developers faster AI coding productivity measured vibe coding technical debt

3. 往上應用:把 CLI 與 agent 介面裝進自己的應用

他唯一的硬要求是「下週五給我 CLI」,但沒講怎麼設計。這是全場最能直接動手做、也最快看到回饋的一步。

YouTube 搜尋:design a CLI for your web app MCP server for your application agent friendly API design build a CLI Rails app

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