Ruby、Rails 與程式設計的未來:Matz 與 DHH 對 agent 時代的一場對談

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

🎧 語音解析✍️ 練習

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

1. Outline

  1. 起點 · Ruby, Rails, and the future of programming - Matz, DHH & Jeremy Daer
    Rails World 2026 的三人座談:主持人 Jeremy Daer 追問 Matz 與 DHH,當 agent 接手大部分程式碼之後,Ruby、Rails 與「寫程式的人」各自還剩下什麼。

2. YouTuber 的思維推導

Ruby, Rails, and the future of programming - Matz, DHH & Jeremy Daer

Ruby on Rails · 1h03m · 字幕 en · vision=off (三人座談形式,全程是講者特寫與舞台鏡頭,沒有投影片、圖表或程式碼畫面;逐字稿裡也沒有任何「你看這裡/這張圖」的視覺指示語,截圖無法增加理解,因此 shots_mode 由 auto 改成 none。) · YouTube

預估 vs 實際耗時
階段預估實際
fetch 6s 20s
segment 2m38s 15m00s
shot 1m43s –
analyze 18m45s 19m40s
render 5s –

兩位講者面對的第一個事實是:變化太快,預測已經失效。David 因此把整場對話的框架從「確定性」換成「機率」——方向不可預測,但可以估計「年底幾乎所有人都會透過 agent 寫程式」這件事的機率。框架一換,問題就不再是「會不會發生」,而是「你走到哪個階段」,所以他借用悲傷五階段,主張社群該盡快走到接受。

接受之後他把焦點從技能移到身分:Rubyist 的身分比「寫 Ruby」這個實踐活得更久,而身分裡真正有價值的東西——品味、比例感、覺得某段程式碼才美——正好是與 agent 協作時人類唯一還能加上的東西,於是角色從 software writer 升級成 software maker。Matz 走的是另一條路:他坦承純看經濟效益 Ruby 不是最佳選擇,於是動手改造 Ruby 本身(Spinel 把 Ruby 編譯成原生執行檔、記憶體降到約二十分之一),讓 Ruby 在 agent 時代重新有存在的理由;同時他用十五年的 Ruby core 領導經驗論證「vibe coding 不是新東西」——提出想法、由別人寫實作、自己驗收,本來就是資深開發者的工作方式,只是實作者從人換成 agent。兩人再把這條線往外推:焦慮來自把軟體想成固定大小的餅,但軟體總量會爆炸;抽象層本來就只是為了補人腦的限制,限制消失後抽象也會被拿掉,最終一路下到組合語言甚至物理層;而 token 成本只是 Commodore 64 階段的短期問題。

Matz 在這裡插入全場唯一的反向論證:元件愈透明,社會愈不會關心維護它們的人,開源的永續才是真正的風險。最後兩人收在同一個結論——技術會來去,真正留下的是 Ruby 三十年前就押注的東西:愉悅、動機與自由,以及一個有摩擦、值得待著的部落。

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

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

  1. 預測失效,只剩機率 → 如果方向不可預測、只剩下「幾乎所有人都會改用 agent」這個高機率事件,那真正的問題就不是技術而是心理:人要怎麼接受一件自己擋不住的事?
  2. 悲傷五階段的 speedrun → 接受之後應該看到迷人的那一面;但主持人立刻指出一個矛盾——很多人同時有相反的體驗:用 agent 看著東西活起來,卻已經好幾個月沒打開編輯器寫過 Ruby,那自己的身分到底放在哪裡?
  3. 身分活得比職業實踐更久 → Matz 給的答案是「可以選擇自己在技術裡的位置」,但沒說那個新位置具體是什麼——如果不再是寫程式的人,那是什麼人?
  4. 從 software writer 到 software maker → David 把語言選擇降級成工具選擇之後,主持人把問題丟回經濟面:如果你的才能與經驗不再換得到經濟上的認可,人該往哪裡去——而這一題落在 Ruby 自己身上。
  5. Spinel:為 agent 重畫 Ruby 的界線 → Spinel 回答的是「Ruby 在 agent 時代還能怎麼被執行」,但主持人的追問更大——這是保存 Ruby 的手段,還是用完就丟的一次性步驟?也就是:在 agent 時代,寫程式這件事本身還剩下什麼?
  6. 寫程式不再是職涯,能力卻被放大 → Matz 說能提供解法的人變多了,David 說我們的工作變成理解而不是手寫,但兩人都還沒回答最直接的恐懼:如果同一個應用需要的工程師變少,多出來的人要去哪裡?
  7. 餅不是固定的:軟體會爆量 → David 把問題從方法論轉到能力:接下來幾年真正要形式化並學會的是「怎麼建立軟體願景、怎麼定義解法、怎麼指揮 AI 把它做出來」——而這件事其實已經有人做很久了,只是名字很難聽:vibe coding。
  8. Matz 才是最早的 vibe coder → 如果反對意見多半會用同樣的方式錯,那它們為什麼這麼流行?主持人把矛頭指向語言本身——slop、meat proxy 這些嘲諷,有多少是真診斷,有多少是心理防衛?
  9. Slop、slop grenade 與心理防衛 → 如果 agent 產出的 PR 與 issue 品質已經比人好,那人最後守得住的到底是什麼?主持人把它縮成一個候選答案:常識。
  10. 判斷要交出去多少:信任等於能力 → 把判斷交出去之後,成品仍然站在別人維護的元件上——Matz 在這裡插進全場唯一的反向論證,指向一個沒人在談的風險。
  11. 元件變透明之後,開源怎麼活 → 主持人把問題留在「繞過抽象層到底合不合理」,而 David 的回答不是折衷,是把它推到邏輯的終點。
  12. 抽象層是為了人腦的限制而存在 → 主持人把成本擺上檯面:效率不只有執行效率,token 也是一種成本——繞過所有抽象層,在 token 帳單上要付多少?
  13. Commodore 64 時代:token 焦慮是短視 → David 的樂觀建立在「token 會愈來愈便宜」上;但如果語言之間的 token 效率差很多,選哪個語言現在就有差——而 Matz 手上剛好有一份比較。
  14. Ruby 的 token 效率與 agent 的偏好 → 語言之爭被降級成偏好之後,真正的問題變成:如果框架與語言都不再是分界線,Rails 之後留下來的是什麼?
  15. 價值觀、部落,與必要的摩擦 → 價值觀既然是要留下的東西,那最後一題就是把它說清楚:Ruby 與 Rails 這幾十年到底做對了什麼?
  16. Ruby 與 Rails 做對了什麼 → 只剩最後一個問題,也是唯一一個往回看的問題:二十年的夥伴關係裡,兩人各自最感謝什麼?
  17. 二十年夥伴關係最感謝的事

3. 逐段說明

Ruby, Rails, and the future of programming - Matz, DHH & Jeremy Daer

1. 預測失效,只剩機率 0:00–2:55

主持人指出 Rails World 整場都在談 AI,David 前一天的演講留下一堆未解問題。面對最不確定的時刻,人反而最想要預測。Matz 說兩年內他從 Emacs 換成 Claude Code,方向已無法預測;David 把問題重新定義成「不是確定性,而是機率」,而他看到的機率是:今年底幾乎所有人都會像 Matz 一樣透過 agent 寫程式。

承上 前情提要裡「這場 Rails World 整場都在談 AI、David 前一天的演講留下一堆未解問題」這個背景被直接拿來當開場:主持人不問技術細節,而是問在最不確定的時刻大家最想要的那個東西——預測。

推理因為主持人要的是預測,而兩位講者都先否認自己預測得了(Matz 舉自己兩年內從 Emacs 換到 Claude Code 為例,說方向根本無法預測),所以 David 把問題整個換掉:現在能操作的不是確定性,而是機率。他願意給的唯一一個數字是機率上的判斷——今年底不是「多數人」而是「幾乎所有人」都會像 Matz 一樣透過 agent 寫程式;面對這種大浪,沒有人有能力讓它停下來,所以第一件事是接受它正在發生。

AI 補充把「預測」換成「機率」是整場對話的地基,值得停一下。預測要求你說出方向與時點,錯了就整個失效;機率只要求你對幾個可能的世界分配權重,於是你可以在不知道方向的情況下仍然行動——押注在多個世界裡都不虧的選擇上。David 後面所有論證(包括對批評者的回應)都是用這個工具做的。另外提醒:這支的字幕是機器產生/機器翻譯的英文軌,把 Matz 拼成「Matsu」、把 Claude Code 拼成「Cloud Code」,講者實際說的是 Claude Code。

術語:coding agent

Claude Code

Claude Code(終端機裡的編碼代理)

Anthropic 推出、在終端機裡執行的編碼代理,能直接讀寫專案檔案、執行指令並依結果自己修正。

Matz 說兩年前他無法想像自己會不再以 Emacs 為主要編輯器,而現在(自去年十一月左右起)主要用 Claude Code 工作——這是他判斷「方向無法預測」的親身證據。要注意它跟聊天式 AI 的差別不在模型而在權限與迴圈:它可以自己跑測試、自己讀錯誤訊息、自己再改一次,所以人從「打字的人」變成「驗收的人」。字幕把它寫成「Cloud Code」是轉寫錯誤。

相關術語: coding agent (一種)

出處:第 1 段「預測失效,只剩機率」

coding agent

編碼代理

能自己讀寫檔案、執行指令、看錯誤訊息並反覆修正的 LLM 程式,而不只是回答問題的聊天機器人。

整場對話講的「agent」都是這個意思。關鍵差別是迴圈:聊天機器人一次回答一次,agent 會「做→看結果→再做」直到目標達成或放棄。這個迴圈同時解釋了後面兩件事——為什麼執行環境的啟動速度與記憶體突然變重要(同一件事被跑很多次),以及為什麼人的工作會變成定義目標與驗收。

相關術語: Claude Code (實作於)

出處:第 1 段「預測失效,只剩機率」

留給下一段 如果方向不可預測、只剩下「幾乎所有人都會改用 agent」這個高機率事件,那真正的問題就不是技術而是心理:人要怎麼接受一件自己擋不住的事?

2. 悲傷五階段的 speedrun 2:55–4:24

David 把社群的反應對應到接受死亡的五階段,並指出很多人已經從憤怒進到「討價還價」。他說跟 AI 討價還價沒用:它會回應你,但不會改變軌跡。愈快走到接受愈好,因為接受之後看到的是「機器做出新東西」這件事本來就迷人的那一面。

承上 上一段留下「人要怎麼接受一件自己擋不住的事」,主持人直接遞上一個現成的框架:這是不是一場悲傷五階段的 speedrun?

推理因為上一段已經確立「沒有人有能力停下這件事」,所以 David 接著把社群的反應對號入座:很多人已經走過憤怒,正卡在討價還價。而他指出討價還價在這裡結構上就無效——AI 會聽你說、會回應你,但不會因此改變軌跡,因為另一邊根本沒有可以談判的對象。既然討價還價沒有回報,最省成本的策略就是盡快走完沮喪、走到接受;而他保證接受之後看到的是「讓機器做出新東西」這件事本來就迷人的那一面,只是現在從有想法到看見它活起來快得多。

AI 補充五階段模型原本描述的是人面對自己的死亡,借到技術變遷上有一個差異值得指出:面對死亡時「討價還價」無效是因為對方不存在,面對市場時討價還價無效則是因為對方是分散的很多人——你說服得了幾個同事,說服不了整體的採用曲線。David 的論點強在這裡:他不是說反對是錯的,而是說反對沒有著力點。反過來說,這個框架也有代價——把所有反對意見都歸類成「還沒走到接受」,等於預先取消了「有些反對是對的」這個可能性。

術語:five stages of grief

five stages of grief

悲傷五階段

Kübler-Ross 提出的心理模型,描述人面對重大失落時依序經歷否認、憤怒、討價還價、沮喪、接受。

原始模型來自 1969 年《On Death and Dying》,描述的是絕症患者。後來被大量借用到失業、分手、產業變遷上,但學界對「一定依序經歷五個階段」的實證支持其實相當薄弱,比較站得住腳的說法是「這些情緒都會出現,順序因人而異」。David 用它主要不是當診斷工具,而是當一個可以自我定位的座標,並強調走完需要時間、該給懷舊留位置。

相關術語: innovator's dilemma (同為抗拒的解釋)

出處:第 2 段「悲傷五階段的 speedrun」

留給下一段 接受之後應該看到迷人的那一面;但主持人立刻指出一個矛盾——很多人同時有相反的體驗:用 agent 看著東西活起來,卻已經好幾個月沒打開編輯器寫過 Ruby,那自己的身分到底放在哪裡?

3. 身分活得比職業實踐更久 4:24–6:51

主持人問了一個尖銳的問題:昨天問「誰寫 Ruby」舉手的人不多,但問「誰覺得自己是 Rubyist」全場舉手——當身分比實踐活得更久,剩下的殘留物是什麼?Matz 用卓別林《摩登時代》的例子回答:技術改變生活,但人可以選擇自己在其中的感受與位置。

承上 承接上一段留下的矛盾——用著 agent 卻好幾個月沒寫 Ruby——主持人把它變成一個對照實驗:前一天問「誰寫 Ruby」舉手的人不多,現在問「誰覺得自己是 Rubyist」全場舉手。

推理因為身分活得比職業實踐更久,主持人的問題就變成「那剩下的殘留物是什麼」。Matz 不從技術面回答,改用歷史類比:八十多年前自動化進工廠時,人們也擔心工作被機器拿走,還因此有了卓別林的《摩登時代》;但結果不是人被趕走,而是生產的負擔被減輕、工作方式整個換了一種。他據此推論未來十年可能是同樣的形狀——軟體開發者的生活會跟現在不同,但我們仍然可以替自己選一個舒服而有創造性的位置,而不是被動地從高薪工作裡被踢出去。

AI 補充Matz 的類比跳過了一步,值得補上:自動化確實拿走了特定的工作(流水線上的特定工序),它之所以沒有造成長期失業,是因為生產力提升把成本降下來、需求被放大,新的職位在別的地方長出來。也就是說這個類比要成立,必須假設需求有彈性、而且新職位長出來的速度跟得上舊職位消失的速度——這兩個條件在《摩登時代》那個年代成立,這次成不成立是開放問題。另外要注意 Matz 真正的主張其實比類比更小也更穩:他沒有保證結果會好,他說的是「我們可以選擇自己在其中的感受與位置」。

Rubyist

Ruby 人

自認屬於 Ruby 社群、認同 Ruby 那套價值觀的人,而不一定是正在寫 Ruby 的人。

這個詞在這一段被當成證據使用:舉手的比例差距說明 Rubyist 是身分認同而不是職務描述。這種「社群名稱是身分而非技能」的現象在程式語言社群裡不算普遍——很少有人自稱 Javaist。這件事後面會被 David 拿來當論據,說明社群真正共享的是價值觀而非語法。

相關術語: MINASWAN (身分的口號)

出處:第 3 段「身分活得比職業實踐更久」

留給下一段 Matz 給的答案是「可以選擇自己在技術裡的位置」,但沒說那個新位置具體是什麼——如果不再是寫程式的人,那是什麼人?

4. 從 software writer 到 software maker 6:51–13:13

David 說他從來不覺得「software engineer」適合自己,他自認是 software writer;而現在的新角色是 software maker——要考慮的事更多,但比單純寫程式更滿足。他主張 Rubyist 的「品味、比例感、覺得這樣才美」正是與 agent 合作時人類還能加上的價值,而且這件事不是 Ruby 獨有的,所有語言、框架都會經歷。

承上 上一段留下「新位置具體是什麼」這個空缺,David 用自己的職稱史來填:他從來不覺得 software engineer 適合自己——太嚴肅、太拘謹——他自認是 software writer。

推理因為要回答的是「新位置」,David 先把舊位置講清楚(writer:手寫程式碼這件事本身就是價值),再宣布新位置 software maker——要考慮的事更多、要學的更多,但比單純寫程式更令人滿足。接著他要證明 Rubyist 特別適合這個新位置,論據是:與 agent 協作時人類還能加上的價值是品味、是比例感、是「覺得這樣才美」的那種感覺,而這正是寫 Ruby 時一直在練的東西。最後他把 Ruby 從等式裡拿掉:這不是 Ruby 的事,所有領域、所有函式庫、所有框架、所有語言都會經歷同一件事,所以「跳槽到 Rust」是假解法——他對 Rust 沒有任何自我投入,明天出現更好的就換,甚至可能直接跳到組合語言,因為不可攜性不再重要。

AI 補充這裡其實混了兩個強度不同的主張,值得分開。第一個是「技能可以遷移」:品味與比例感不綁在語法上,所以會跟著你到新角色——這個比較安全。第二個是「陣營已經不存在」:他不是說 Rust 沒用,而是說當語言選擇被 agent 抽象掉之後,把身分綁在任何語言上都是同一個錯誤,包括綁在 Ruby 上。第二個主張比較強,也是全場最容易被誤讀的一句——現場很多人聽到的是「別捨不得 Ruby」,但他的意思是「別捨不得任何一個」。另外他在這裡回頭處理了上一段的身分焦慮:他承認自己走完五階段也不是瞬間的,而且明說該給懷舊留位置,只是別停在月台上。

software writer

軟體寫作者

David 對自己舊角色的稱呼:把寫程式當成寫作,價值來自親手寫出來的那些行。

他刻意不用 software engineer,理由是那個詞聽起來太嚴肅、太拘謹,暗示的是規格與紀律,而不是表達。這個自我定位解釋了為什麼 Ruby 對他重要:一個為了閱讀愉悅而設計的語言,只有在你把寫程式當寫作時才划算。

相關術語: software maker (被取代為)

出處:第 4 段「從 software writer 到 software maker」

software maker

軟體製作者

David 提出的新角色:負責整件事怎麼做出來——方向、取捨、驗收——而不是負責敲出那些行。

他說要考慮的事更多、要學的更多,但比純寫程式更滿足。這個角色的難處在於回饋變慢:寫程式的回饋是編譯器與測試,馬上知道對不對;做決定的回饋常常要等到產品上線。所以這個轉換不是「換個頭銜」,而是要重新訓練一套在資訊不足時判斷的能力。

相關術語: software writer (取代)、taste (核心能力)

出處:第 4 段「從 software writer 到 software maker」

taste

品味

在多個都能動的做法之間,判斷哪一個比較好的能力——包含比例感與「覺得這樣才美」的直覺。

David 把它當成人類在 agent 時代唯一還能穩定加上去的東西,理由是它不是知識而是判斷:agent 可以生出十個可行解,但「哪一個之後比較好維護、哪一個介面比較誠實」需要一個有偏好的人來選。這也是他說 Rubyist 佔優勢的原因——Ruby 社群長年在爭論的其實就是這種美感。要留意這個論點的弱點:品味很難教也很難驗證,所以「我們有品味」很容易變成一句自我安慰。

相關術語: software maker (前提)

出處:第 4 段「從 software writer 到 software maker」

留給下一段 David 把語言選擇降級成工具選擇之後,主持人把問題丟回經濟面:如果你的才能與經驗不再換得到經濟上的認可,人該往哪裡去——而這一題落在 Ruby 自己身上。

5. Spinel:為 agent 重畫 Ruby 的界線 13:13–17:03

Matz 坦承純以經濟效益看 Ruby 不是最佳選擇,所以他今年三月開始做 Spinel——把 Ruby 編譯成原生執行檔,實測記憶體用量約為原本的二十分之一。主持人把它接到 mruby 的脈絡:mruby 是 Ruby 給嵌入式的答案,Spinel 像是 Ruby 給 agent 的答案。Matz 說目前只有他能劃出「什麼是 Ruby、什麼不是」這條線。

承上 上一段最後把「Ruby 的經濟理由不成立時它憑什麼存在」這個問題丟給 Matz,他沒有辯護,直接承認:純以財務與經濟角度看,Ruby 不是最佳選擇——撐住它的是龐大 Ruby/Rails 程式碼庫累積的動能與慣性。

推理因為承認了經濟理由不成立,Matz 選擇改變前提而不是改變說法:他今年三月開始做 Spinel,把 Ruby 程式編譯成原生執行檔,實測跑得很快而且記憶體用量約為原本的二十分之一。主持人把它放進 Matz 的作品譜系來理解——mruby 是 Ruby 給嵌入式環境的答案,Spinel 看起來像是 Ruby 給 agent 的答案——並追問一個更根本的問題:一直拿掉東西之後,還算 Ruby 嗎?Matz 的回答是:這件事沒有明顯答案,CRuby 就是他多年試誤的結果,但一套解法不適合所有情境(對微型裝置太大、即使有 JIT 對某些場合仍太慢),所以他切出一個「生產性子集」去編成原生碼;而至少到目前為止,只有他能劃出什麼是 Ruby、什麼不是這條線。

AI 補充這裡有一步被跳過:為什麼 agent 時代特別在意記憶體與啟動速度?因為 agent 會把同一個執行環境開很多次、每次都很短命——跑一次測試、跑一個一次性腳本、開一堆平行 worker。直譯器的啟動時間與常駐記憶體在人類一天手動跑十次時無所謂,在 agent 一小時跑上千次時就變成主要成本。這也是 JIT 幫不上忙的地方:JIT 要先跑熱才划算,短命行程根本熱不起來,所以答案只能是事前編譯(AOT)。另外提醒兩件事:字幕裡的記憶體數字前後不一致(二十分之一、20 MB、25 MB 混著講),可靠的只有「約二十分之一」這個比例;主持人提到的那個「把 Ruby 應用當成 agent 可查閱的規格」的專案名稱在字幕裡拼寫不可靠,這裡不當成事實引用。

術語:Just-in-Time compilation

Spinel

Spinel(Ruby 原生編譯器)

Matz 2026 年三月開始做的另一個 Ruby 實作,把 Ruby 的一個子集事前編譯成原生執行檔。

他給的實測是同一支程式的記憶體用量約降到二十分之一,執行速度也快得多。定位上它不是要取代 CRuby,而是補上「短命、要開很多份、對資源敏感」的場合——正好是 agent 大量產生與執行程式的場合。因為它還很年輕(訪談時才半年),把它當成方向宣示比當成生產選項合理。字幕在後段把它拼成「Spinnaker」。

相關術語: ahead-of-time compilation (採用)、CRuby (對照組)

出處:第 5 段「Spinel:為 agent 重畫 Ruby 的界線」

mruby

mruby(嵌入式 Ruby)

Matz 主導的輕量 Ruby 實作,為記憶體受限的嵌入式裝置而設計。

mruby 的存在本身就是這一段論證的前例:Matz 已經做過一次「為了新的執行環境重畫 Ruby 的界線」,當時的新環境是微控制器,這次是 agent。它也說明 Matz 心中的 Ruby 不等於 CRuby——語言的身分可以跟某一個實作分開。

相關術語: Spinel (同一手法的前例)

出處:第 5 段「Spinel:為 agent 重畫 Ruby 的界線」

CRuby

CRuby(官方 Ruby 直譯器)

以 C 寫成、幾乎所有人實際使用的官方 Ruby 實作,也叫 MRI。

Matz 說 CRuby 就是他多年試誤「什麼是 Ruby、什麼不是」之後的結果,這句話有兩層意思:一是語言設計沒有先驗答案,是做出來才知道的;二是既然是試誤的結果,它就不是唯一解,所以 mruby 與 Spinel 的存在不是背叛而是延伸。

相關術語: Just-in-Time compilation (內建)

出處:第 5 段「Spinel:為 agent 重畫 Ruby 的界線」

Just-in-Time compilation

即時編譯(JIT)

程式執行中才把熱點程式碼編成機器碼的技術,用實際執行資訊換取速度。

Matz 說的「我們最近提供的 JIT 編譯器」指的是 CRuby 內建的那一套(3.1 起的 YJIT)。JIT 的代價是要先跑一段時間收集資訊才會變快,也就是有暖機期;好處是可以根據實際型別做最佳化,這是事前編譯做不到的。這兩件事正好解釋了 Matz 為什麼還需要另一條路:JIT 解決的是長時間執行的效能,不是短命行程的啟動成本。

相關術語: ahead-of-time compilation (相反)

出處:第 5 段「Spinel:為 agent 重畫 Ruby 的界線」

ahead-of-time compilation

事前編譯(AOT)

在執行之前就把程式全部編成機器碼,執行時不需要編譯器也沒有暖機期。

Spinel 走的是這條路。代價是動態語言的許多彈性(執行期定義方法、eval 等)必須被限制或放棄,所以才會出現「生產性子集」這個說法——能編的只是 Ruby 的一部分。這正是主持人追問「拿掉之後還算 Ruby 嗎」的來源。

相關術語: Just-in-Time compilation (相反)、Spinel (實作於)

出處:第 5 段「Spinel:為 agent 重畫 Ruby 的界線」

留給下一段 Spinel 回答的是「Ruby 在 agent 時代還能怎麼被執行」,但主持人的追問更大——這是保存 Ruby 的手段,還是用完就丟的一次性步驟?也就是:在 agent 時代,寫程式這件事本身還剩下什麼?

6. 寫程式不再是職涯,能力卻被放大 17:03–21:05

Matz 預測多數人會轉向管理產品與上市,寫程式作為職涯在不久的將來會被拿走;但同一件事讓缺乏技能與經驗的人也能做出解決方案。他把人分成「提供解法的人」與「等解法的人」,而這個社群屬於前者。David 補上 Ruby 的新角色:在不再親手寫多數程式碼的世界,Ruby 是最適合「解釋概念」的語言——agent 用 Ruby 向他解釋 Rust 程式碼。

承上 上一段留下「在 agent 時代寫程式本身還剩什麼」,Matz 的回答分成方向相反的兩半。

推理因為問題是「還剩什麼」,Matz 先給壞消息:多數人會把重心移到管理產品與把它推上市,所以至少作為職涯,寫程式在不久的將來會被拿走。但同一個機制也給好消息:以前缺技能、缺能力、缺經驗就做不出解法,現在 agent 補上這一段,沒有深入知識的人也能做出解法。他據此把人分成「提供解法的人」與「只是在等別人給解法的人」,並說在場的屬於前者,因此該做的是把提供解法的能力再拉高。David 接著補上 Ruby 在這個世界裡的新角色:既然多數程式碼不再是我們親手寫的,我們需要的就是理解——而 Ruby 是最適合解釋概念的語言,他現在讓 agent 用 Ruby 向他解釋 Rust 程式碼。

AI 補充David 這個論點順便解釋了 Ruby 二十年前為什麼會紅。他說自己第一次認識 Ruby 是在 Dave Thomas 等人寫的雜誌文章裡,一度以為那是虛擬碼——「看起來像虛擬碼但真的跑得動」正是 Ruby 的賣點。有趣的是這個賣點在 agent 時代不但沒貶值反而升值:當你不讀實作只讀說明時,說明的可讀性就是全部。不過要指出一個沒被檢驗的假設:agent 用 Ruby 解釋 Rust,正確性仍取決於 agent 對那段 Rust 的理解,Ruby 只是讓誤解更容易被你看出來,不會讓誤解變少。

術語:solution provider

pseudocode

虛擬碼

用來向人說明演算法的類程式碼寫法,重點是可讀,本來不需要真的能執行。

David 說他第一次在雜誌上看到 Ruby 時以為那是虛擬碼。這個誤認正是 Ruby 設計目標的側面證據:語法貼近人閱讀時的預期。在這一段它被賦予新任務——當人不再逐行寫程式,語言的主要讀者從編譯器變回人,「可執行的虛擬碼」就成了最合適的解釋媒介。

相關術語: taste (同源的價值)

出處:第 6 段「寫程式不再是職涯,能力卻被放大」

solution provider

解法提供者

Matz 用來區分人的說法:主動做出解法的人,相對於在等別人做出解法的人。

他的推論是:agent 把「做出解法」的門檻大幅降低,所以提供者這一側會變多,但不會變成全部——多數人仍然只是在等。這句話聽起來像鼓舞,但也藏著一個判準:在 agent 時代,區分你的不再是會不會寫程式,而是你會不會自己定義問題並把它做完。

相關術語: software maker (同一角色)

出處:第 6 段「寫程式不再是職涯,能力卻被放大」

見仁見智 17:41
「as a career, it will be taken away from us in the fairly near future」
這是預測而不是已發生的事實,而且 Matz 在同一段裡自己給了限定條件:他說的是多數人會轉向產品與上市,也就是「以親手寫程式碼為主要價值的職位」會縮小,不等於軟體工程職缺消失。把這句話當成既定事實會做出錯誤的職涯決定;合理的讀法是把它當成一個機率判斷,並注意「不久的將來」沒有定義時間範圍。
依據: Rails World 2026 座談現場發言,未提出任何就業資料佐證
留給下一段 Matz 說能提供解法的人變多了,David 說我們的工作變成理解而不是手寫,但兩人都還沒回答最直接的恐懼:如果同一個應用需要的工程師變少,多出來的人要去哪裡?

7. 餅不是固定的:軟體會爆量 21:05–25:57

David 指出焦慮來自把世界想成固定大小的餅:同樣數量的應用確實只需要更少工程師。但我們會做更多——GitHub 的統計就是軟體開發爆炸性成長的證據。他把這當成樂觀的理由,也當成就業保障,前提是別把鉛筆抓得太緊、想像不出計算機能幫上什麼忙。主持人回想 2000 年代初的極限編程:當開發成本遠高於執行成本時該怎麼選,如今這個比例反過來了。

承上 上一段留下「同一個應用需要的工程師變少,多出來的人去哪裡」,David 說這正是焦慮的來源,而焦慮建立在一個錯誤的前提上:把世界想成一塊固定大小的餅。

推理因為前提是「應用數量固定」,結論當然是需要的工程師變少——David 完全同意這個推論,他拒絕的是那個前提:今天這些應用確實會用少得多的人維護與開發,但我們會做更多,而且正在做更多;他拿 GitHub 的成長統計(以及它因此三天兩頭出狀況)當作軟體開發爆炸性成長的證據。由此他把同一件事同時當成樂觀的理由與就業保障,但附一個條件:別把鉛筆抓得太緊,緊到想像不出計算機能幫你什麼忙。主持人接著把時間拉回 2000 年代初的極限編程——當年開發成本遠高於執行成本,所以選一個很有彈性的語言是划算的;如今這個比例反過來了,那我們工作的產物到底是什麼?Markdown?規格?那些當年因為週期太長、成本太高而被拋棄的做法,現在是不是又值錢了?我們是不是要回到瀑布式?

AI 補充「固定大小的餅」在經濟學裡有名字:lump of labour fallacy。歷史證據大致站在 David 這邊——自動提款機並沒有消滅行員、試算表也沒有消滅會計——但有兩個條件常被略過:一是需求必須真的有彈性(軟體大概有,但不是無限),二是轉換的痛苦落在個別的人身上而不是落在平均值上,所以「總量會成長」對正在被裁的人不是安慰。另外主持人的問題其實比 David 的回答更尖銳,而且沒有被回答完:如果程式碼結構不再重要,極限編程當年為了擁抱變化所付出的代價(短週期、高頻回饋、測試先行)還值得嗎?David 只回了一半——方法論變得比較不重要,因為我們不再親手碰程式碼。

術語:Extreme Programmingtest-driven developmentwaterfall model

lump of labour fallacy

勞動總量謬誤(固定大餅謬誤)

誤以為社會上要做的工作總量是固定的,因此新技術提高效率就必然造成失業。

David 沒有用這個名字,但他講的正是它:把應用數量當成常數,結論自然是工程師會過剩。標準反例是自動提款機——分行的人力成本下降後,銀行開了更多分行,行員總數在一段時間內反而增加。反過來說,這個謬誤的「反謬誤」也存在:需求不是無限的,而且新工作出現的地點與時間不保證跟舊工作消失的一致,所以總量成長與個人受害可以同時為真。

相關術語: Extreme Programming (同一成本推理)

出處:第 7 段「餅不是固定的:軟體會爆量」

Extreme Programming

極限編程(XP)

2000 年前後興起的敏捷方法,主張用極短的開發週期與高頻回饋來擁抱需求變化。

主持人搬出它是為了做一個成本比較:XP 之所以划算,是因為當年「改一次規格」的成本遠高於「多花一點機器時間」,所以值得選一個很有彈性(但執行較慢)的語言,也值得付出寫測試的代價。Ruby on Rails 正是在這個成本結構下誕生的。這一段的重點是那個比例已經反過來了,所以整套推論需要重算。

相關術語: test-driven development (包含)、waterfall model (對照組)

出處:第 7 段「餅不是固定的:軟體會爆量」

test-driven development

測試驅動開發(TDD)

先寫會失敗的測試、再寫剛好讓它通過的實作,用測試當成規格與回饋。

在 XP 的成本結構裡,TDD 的代價(多寫一份程式碼)換來的是快速且自動的回饋。這一段值得注意的轉折是:當實作由 agent 產生、而且人不再逐行閱讀,測試的角色就從「開發時的回饋」變成「驗收時的契約」——它可能不是變得不重要,而是變成少數幾樣仍然必須由人來定義的東西。

相關術語: Extreme Programming (屬於)

出處:第 7 段「餅不是固定的:軟體會爆量」

waterfall model

瀑布式開發

先把需求與設計完整定好、再依序進入實作與測試的開發流程。

主持人的問題很尖銳:如果 agent 讓實作幾乎免費,那「先把設計想清楚」的老方法是不是又回來了,只是產物從設計文件變成 Markdown 規格?David 的回答是方法論的名字不重要了,因為程式碼結構的重要性下降。這個回答其實迴避了問題——真正被問的是「回饋週期還要不要那麼短」,而這件事跟誰寫程式碼無關。

相關術語: Extreme Programming (被取代者)

出處:第 7 段「餅不是固定的:軟體會爆量」

留給下一段 David 把問題從方法論轉到能力:接下來幾年真正要形式化並學會的是「怎麼建立軟體願景、怎麼定義解法、怎麼指揮 AI 把它做出來」——而這件事其實已經有人做很久了,只是名字很難聽:vibe coding。

8. Matz 才是最早的 vibe coder 25:57–29:46

Matz 說 vibe coding 對玩具專案可行、對真實應用常慘敗,但他身邊的資深 Ruby 開發者用 vibe coding 寫 Ruby 本身成功率極高——差別在於「知道怎麼引導軟體的生成、怎麼替 agent 定義目標」,這件事必須被形式化並傳給下一代。接著他丟出全場最好的類比:他自己 vibe coding 十五年了,因為他是 Ruby core 的領導者,提出想法、由「有機智慧」寫出實作、他再驗收。

承上 上一段留下「必須形式化並傳給下一代的新能力」,Matz 接著給出這個能力的現況證據:vibe coding 用來做玩具(例如做個俄羅斯方塊)沒問題,用來做真實應用常常慘敗;但他身邊的資深 Ruby 開發者用 vibe coding 去寫 Ruby 本身,成功率高得驚人。

推理因為同一個工具在不同人手上結果差這麼多,Matz 推論差別不在工具而在人:資深開發者知道怎麼引導軟體的生成、怎麼替 agent 定義目標,而這正是上一段說要形式化的東西,所以必須把它寫下來傳給下一代。接著他丟出全場最好的類比:他自己已經 vibe coding 十五年了——身為 Ruby core 的領導者,他提出「垃圾回收器這樣改如何」,由他戲稱為「有機智慧」的人類開發者寫出實作,他再驗收該不該合併。David 用自己的 Rails 史印證同一個形狀:第一版全部自己寫、第二版寫一半、到第六七版幾乎沒寫,只剩下方向、什麼算好、什麼該收進來。最後他用創新者的兩難把反對意見一次處理掉:新技術一開始都像玩具、只能做最簡單的事,當年說「Rails 無法規模化」的人就是這樣錯的,現在說「AI 只是玩具」的人會用完全一樣的方式錯。

AI 補充這個類比很強,但有一步被跳過了。Matz 驗收人類開發者的實作時,背後有一整套他沒提到的機制:對方有動機與聲譽要維護、有可追責性、會記得上次被退件的理由、也會自己判斷這個提案值不值得做。agent 目前沒有這些,所以「提出想法—別人實作—我驗收」這個迴圈雖然形狀相同,成本結構卻不同:驗收的頻率與深度必須提高,因為你不能靠對方的長期紀錄來省下查核。反過來說,Matz 的論點仍然成立在一個關鍵點上——資深者的價值從來就不在打字,這件事在 agent 出現之前就已經是真的了。

vibe coding

憑感覺寫程式

不逐行讀產出的程式碼,只用自然語言描述想要什麼、看結果對不對,由 AI 生成實作的工作方式。

Matz 在這裡做了一個重要的再定義:一般人以為 vibe coding 是「不懂也能寫」,但他的觀察正好相反——成功率高的是最資深的人。原因是這種工作方式把價值從「會寫」移到「會定義目標與驗收」,而後者需要經驗。這解釋了為什麼玩具專案成功、真實應用失敗:玩具的驗收標準是「能跑就好」,真實應用的驗收標準藏在很多沒說出口的約束裡。

相關術語: organic intelligence (原本的實作者)、coding agent (使用)

出處:第 8 段「Matz 才是最早的 vibe coder」

organic intelligence

有機智慧

Matz 的玩笑說法,指人類開發者——相對於人工智慧。

這個詞是整個類比的樞紐:如果把 Ruby core 的人類貢獻者稱為「有機智慧」,那 Matz 這十五年的工作流程(提案、由智慧體實作、他驗收)就跟今天的 agent 工作流程同構,差別只在實作者是碳基還是矽基。這個修辭很漂亮,但也順手抹掉了兩者在責任與動機上的差異。

相關術語: vibe coding (被類比為)

出處:第 8 段「Matz 才是最早的 vibe coder」

innovator's dilemma

創新者的兩難

Clayton Christensen 提出的理論:既有業者因為新技術一開始只能服務低階需求而合理地忽視它,最後被它取代。

重點在「合理地」——在位者的忽視不是愚蠢,而是照著自己的成本與客戶結構做出的正確決策,這正是它難防的原因。David 的用法是把它當成一個判斷規則:當你聽到「它只能做簡單的事、不會規模化」時,這句話對「現在」通常是真的,對「趨勢」通常是假的。他也提醒這個規則對 Ruby 自己適用過——當年「Rails 無法規模化」的批評也是這個形狀。要注意這個規則不是萬用的:有些技術確實就停在玩具階段,這個理論本身不提供區分兩者的方法。

相關術語: five stages of grief (同為抗拒的解釋)

出處:第 8 段「Matz 才是最早的 vibe coder」

留給下一段 如果反對意見多半會用同樣的方式錯,那它們為什麼這麼流行?主持人把矛頭指向語言本身——slop、meat proxy 這些嘲諷,有多少是真診斷,有多少是心理防衛?

9. Slop、slop grenade 與心理防衛 29:46–36:02

David 用創新者的兩難解釋為什麼「AI 只是玩具」的說法會錯得跟當年說「Rails 無法規模化」一樣。主持人問「slop」「meat proxy」這些嘲諷有多少是真診斷、多少是心理防衛,David 答九成是防衛。他區分兩件事:meat proxy 是真問題但只是過渡(別自己在 agent 與錯誤訊息之間複製貼上),而「AI 寫不出高品質原創程式碼」則是鴕鳥式的自欺。主持人補充 slop grenade 的痛點不在垃圾本身,而在丟給別人收拾。

承上 上一段最後主持人問「這些嘲諷有多少是真診斷、多少是心理防衛」,David 給了一個數字:九成是防衛。

推理因為他自己主張要操作機率而不是預測,所以他把這個判斷也講成機率——最可能的解釋是防衛反應,而愈早丟掉這些拐杖就愈早跑得動。但他不是一竿子打翻,而是把被嘲諷的兩件事分開處理:meat proxy 是真問題(你在 agent 與錯誤訊息之間人工複製貼上,那就該讓 agent 直接讀那些訊息),但它只是從 A 點到 B 點的臨時橋;而「agent 寫不出高品質、原創、沒有 bug 的程式碼」則是鴕鳥式的自欺。主持人補上一個更細的區分:slop grenade 的痛點不在垃圾本身,而在交付方式——被丟過來,然後由別人花注意力去弄懂它、判斷值不值得放行。David 的回應把這個痛點再翻一次:他把它們當成建議,不接也可以;而且正因為沒人親手寫那些行,砍掉重寫時不會有人心痛——開源社群過去很多摩擦,正是來自人對自己花力氣寫的那些行的依戀。Matz 用當天早上的實例收尾:Spinel 的 repo 一小時內冒出二十個 issue 與一個 merge request,他用手機叫 Claude 處理,演講結束時十二個問題都解決了。

AI 補充David 的「九成」是修辭不是量測,這一點值得先標出來,否則整段會被當成數據。更值得討論的是他論證裡的一個空缺:他把「對自己寫的程式碼的依戀」當成純負面的摩擦來源,但那份依戀同時也是長期維護意願的來源——會心痛的人才會半夜爬起來修。把依戀拿掉之後,誰來承擔沒有人想寫的那部分工作,他沒有回答。另外 Matz 的例子成立有個前提:Spinel 是他自己定義邊界的專案,驗收標準在他腦子裡,所以他能用手機在幾十分鐘內判斷十二個修正是否可接受;同樣的流程放到一個標準模糊、利害關係人很多的專案上,瓶頸會立刻從產出移到驗收。

術語:AI psychosis

slop

AI 垃圾產出

泛指 AI 大量生成、看起來像樣但沒有價值的內容或程式碼。

這個詞在 2024–2025 年從圖片與文章擴散到程式碼,帶著明顯的貶義。David 的立場是這個詞的有效期快到了,因為它預設 agent 只能產出低品質的東西;他認為真正的問題從來不是品質而是交付方式。字幕把它翻成「garbage/trash(垃圾)」。

相關術語: slop grenade (加上交付方式)

出處:第 9 段「Slop、slop grenade 與心理防衛」

meat proxy

肉做的中繼站

嘲諷人淪為 agent 與工具之間的人工轉送者——手動把錯誤訊息複製貼回 agent。

David 承認這是真問題,但認為它是工具不成熟的症狀而不是 AI 的本質缺陷:解法是讓 agent 自己讀得到那些訊息(能執行指令、能看 log、能跑測試),而不是回頭自己寫程式。這個區分很實用——當你發現自己在複製貼上,那是一個要改工作流程的訊號,不是一個要放棄 agent 的訊號。

相關術語: coding agent (工具不足的症狀)

出處:第 9 段「Slop、slop grenade 與心理防衛」

slop grenade

垃圾手榴彈

把未經思考的 AI 產出(例如一個大 PR)丟給別人,讓對方承擔理解與判斷成本的行為。

主持人的分析是這個詞比 slop 精準,因為痛點是「加上投擲方式」:收到的人必須花注意力弄懂它,甚至要判斷這東西值不值得放行——而這正是原本應該由作者付的成本。David 的反駁是他不必接:把它當建議,喜歡的話讓自己的 agent 去拆解重寫。這個反駁對他這種能自己動用 agent 的維護者成立,對人力不足的專案不一定成立。

相關術語: slop (包含)

出處:第 9 段「Slop、slop grenade 與心理防衛」

AI psychosis

AI 妄想

David 用來形容對 AI 能力做出明顯脫離現實的判斷——無論是過度樂觀還是過度貶低。

他刻意把這個詞反過來用:一般人用它指「太相信 AI 的人」,他用它指「堅稱 agent 寫不出好程式碼的人」,理由是後者跟現況的落差更大。這是一個修辭上的反擊動作,不是一個可驗證的分類,讀的時候要把它當成立場宣示。

相關術語: slop (同一心理)

出處:第 9 段「Slop、slop grenade 與心理防衛」

見仁見智 31:17
「The idea that agents cannot write high-quality, original code without bugs is simply a delusion at this point.」
這句話把兩個強度差很多的主張綁在一起:「agent 寫得出高品質程式碼」(有相當多證據)與「寫得出沒有 bug 的原創程式碼」(沒有證據支持,而且人也做不到)。David 自己在下一段就承認 agent 會犯錯,所以他真正的意思應該是「不比人差」而不是字面上的「沒有 bug」。把這句照字面採信,會低估驗收與測試仍然必要的程度。
依據: 同一場座談稍後 David 自述「sometimes an agent will make a mistake」
留給下一段 如果 agent 產出的 PR 與 issue 品質已經比人好,那人最後守得住的到底是什麼?主持人把它縮成一個候選答案:常識。

10. 判斷要交出去多少:信任等於能力 36:02–40:30

主持人問人類最後守得住的優勢是不是「常識」。David 的回答是把 agent 當成員工看:交出多少判斷,就等於它展現多少能力——階層愈高、查核愈少、信任愈多,也同時接受偶爾出錯的風險。他點出標準的不對稱:自駕車出一次事就是太多,但人類每年撞死四萬人卻被原諒;對新智慧要求零缺陷,本身才是妄想。

承上 上一段最後問「人最後守得住什麼」,主持人自己給的候選是常識;但看著 Claude 逐一處理問題、自己在其中做決定之後,他懷疑這條界線還在不在。

推理因為問題被問成「守住什麼」,David 拒絕這個框架,改問「交出去多少」:我們交給 agent 多少判斷,完全等於它展現多少能力——跟對人一樣。他用 37signals 帶人的方式當量尺:這個人準備好承擔更多責任了嗎?我需要多常查核他的產出?層級愈高、查核愈少、信任愈多,同時也就接受偶爾出錯的風險——如果你逐行讀,你會知道每一行在做什麼;一旦不讀了,你就只能靠結果與信任。接著他指出標準上的不對稱:要求一個新生的智慧從第一天就零缺陷是妄想,人自己一輩子都在寫有 bug 的程式;自駕車出一次事就是「一次太多」,但美國每年有四萬到四萬五千人死於人類駕駛的車禍卻被原諒。他把原因歸到制度:由訴訟主導的社會會做出這種選擇,由結果主導的社會不會,並舉丹麥為例。

AI 補充「交出多少判斷 = 它展現多少能力」是一條可操作的規則,但它預設你有辦法觀察能力,而這正是 agent 與人最不一樣的地方。對人你有履歷、同事評價、長期紀錄,而且能力變化緩慢;對 agent 你只有輸出樣本,而且它的能力分布會隨模型版本在一夜之間改變——你上週校準好的信任度,這週可能已經失效。所以這條規則要能用,必須配上人事管理不需要的東西:持續的抽查與版本變更時的重新校準。至於「對機器要求零缺陷」這件事,心理學上有名字叫 algorithm aversion,實驗上相當穩健,所以 David 的觀察不是錯覺;但把它全部歸因於訴訟制度就跳過了一步——即使在不愛訴訟的社會,人對機器犯錯的容忍度一樣比對人低。

common sense

常識

不需明說就知道「這樣做不合理」的一般判斷力,主持人提出的人類最後防線候選。

這個候選之所以會被提出,是因為它剛好是過去的 AI 最缺的東西。David 沒有正面說常識已經被攻克,他做的是換掉問題:與其問機器有沒有常識,不如問你願意在多大範圍內信任它的判斷——因為對人你也從來不是先驗證常識再授權,你是從小範圍開始試。

相關術語: algorithm aversion (評價偏誤)

出處:第 10 段「判斷要交出去多少:信任等於能力」

algorithm aversion

演算法厭惡

人在看到演算法犯錯後,即使它整體表現優於人類,也會迅速改為不信任它的傾向。

David 沒有用這個名字,但他描述的自駕車雙重標準正是它:同樣的錯誤由人犯下會被原諒、由機器犯下則不會。Dietvorst 等人的實驗顯示,只要讓人保有一點點調整演算法輸出的權力,厭惡就會明顯下降——這對這一段有直接的實務意義:與其爭論 agent 該不該被信任,不如把工作流程設計成人隨時能介入的樣子。

相關術語: common sense (反面)

出處:第 10 段「判斷要交出去多少:信任等於能力」

37signals

37signals

David 共同創辦並經營的公司(Basecamp、HEY 的開發者),Rails 誕生的地方。

他在這一段把它當成類比的來源:他評估 agent 的方式就是他評估員工的方式——準備好承擔更多責任了嗎?要多常查核?這個類比值得留意的地方是 37signals 以小團隊、高自主聞名,所以他心中「信任的預設值」本來就比多數組織高;同一套規則搬到查核文化很重的組織,結論可能完全不同。

相關術語: software maker (管理視角)

出處:第 10 段「判斷要交出去多少:信任等於能力」

見仁見智 38:33
「There are no health compensation claims in Denmark.」
字面上不成立:丹麥有全國性的無過失病人補償制度(Patienterstatningen),病人每年提出大量補償申請並獲得理賠。比較接近事實的說法是「丹麥不透過訴訟解決醫療損害」——賠償存在,只是不走法院。這句話在字幕裡還經過機器翻譯,講者原話可能就是「沒有醫療訴訟」;不論如何,用它來支持「有些社會完全不追究」是站不住的,真正成立的論點是制度設計會改變追究的方式與成本。
依據: 丹麥 Patienterstatningen(病人補償協會)自 1992 年起依 Patient Insurance Act 運作
見仁見智 38:52
「is about eight times safer than the average person」
「自駕約比一般人安全八倍」沒有公認的來源。目前公開資料多半來自業者自行發布、且限定在特定城市與天候的營運範圍內,比較基準(是否含高速公路、是否只算有人受傷的事故、每百萬英里還是每小時)一換,倍數就會大幅變動。方向上「在其營運範圍內比人類安全」有證據支持,但「八倍」應視為他個人引用的粗略數字而非定論。
依據: 講者自述「according to my data」,現場未指明來源
留給下一段 把判斷交出去之後,成品仍然站在別人維護的元件上——Matz 在這裡插進全場唯一的反向論證,指向一個沒人在談的風險。

11. 元件變透明之後,開源怎麼活 40:30–42:36

Matz 提出他最大的擔憂:就算用 agent 蓋軟體,成品仍然站在 Rust 編譯器、Ruby 直譯器、Linux、PostgreSQL 這些既有元件上;agent 用得愈多,這些元件對人愈「透明」。而人不會關心看不見的東西——社會對這些關鍵開源元件的維護與穩定的關注會下降。這是把前面「抽象被拿掉」的樂觀,翻到背面看。

承上 上一段最後 Matz 已經開口說「我有一個擔憂」:就算用 agent 蓋軟體、完全不知道細節,成品仍然站在既有元件上——Rust 編譯器、Ruby on Rails、Ruby 直譯器、Linux、PostgreSQL。

推理因為 agent 用得愈多、細節看得愈少,這些元件對人就愈「透明」;而 Matz 推論的關鍵在於人不會關心看不見的東西——於是社會對這些關鍵開源元件的維護與穩定的關注會下降,即使它們對社會極其重要。這是把前面所有「抽象被拿掉是好事」的樂觀翻到背面看:抽象消失不等於依賴消失,只等於依賴變得看不見;所以他說我們必須刻意去支持這些元件。主持人順著推到極端:如果抽象是障礙,那大家乾脆繞過函式庫、各自實作 WebSocket 協定,長出一大堆獨立演進、各有客製特性的實作?他自己先說出工程上的明顯代價——它們還是得能互通,而且修一個 bug 要修十萬次而不是一次。

AI 補充Matz 的擔憂有現成的前例:Heartbleed(OpenSSL)、Log4Shell、left-pad、core-js、xz-utils 後門,每一次都是同一個形狀——全世界都在用、幾乎沒有人在維護、也幾乎沒有人在付錢。agent 會讓這件事惡化的機制有兩條,值得分開看:一是注意力與資金(看不見就不會贊助),二是回饋迴路(過去開發者為了解決問題會去讀函式庫原始碼,順手回報 bug 甚至送 PR;現在中間隔了一層 agent,這條免費的品質迴路會變細)。第二條比第一條更少被討論,但對軟體品質的影響可能更直接。

術語:tragedy of the commonssoftware supply chain

tragedy of the commons

公地悲劇

所有人都使用、但沒有人單獨有誘因維護的共有資源,最終會被耗損。

Matz 描述的正是這個結構:Ruby、Linux、PostgreSQL 這些元件人人在用,維護成本卻集中在少數幾個人身上。agent 讓情況更糟的地方在於它同時削弱了兩個原本還存在的補償機制——使用者的可見度(知道自己在用什麼)與貢獻的順手性(因為讀原始碼而發現問題)。Elinor Ostrom 的研究顯示公地不必然崩潰,但要避免崩潰需要可見的社群規範與制度,而可見度正是這裡被拿掉的東西。

相關術語: software supply chain (發生於)

出處:第 11 段「元件變透明之後,開源怎麼活」

software supply chain

軟體供應鏈

一個應用實際依賴的所有上游元件與其上游,包含直接與間接依賴。

這一段的論證只有放進供應鏈的視角才完整:你的應用可能只寫了幾千行,但它站在幾百萬行你沒讀過的程式碼上。agent 沒有增加這條鏈的長度,它增加的是這條鏈的不可見度——當人連自己的那幾千行都不讀,更不可能去看上游。

相關術語: tragedy of the commons (受害於)

出處:第 11 段「元件變透明之後,開源怎麼活」

WebSocket

WebSocket 協定

在瀏覽器與伺服器之間建立雙向持續連線的網路協定。

主持人拿它當例子不是偶然:它是一個規格明確、實作起來不算太難、但細節(分片、遮罩、關閉握手、心跳)多到很容易做錯的協定——正好是「agent 可以生給你、但你不會想自己維護」的典型。它也說明了函式庫的第二種價值:不只是省時間,而是把一群人踩過的坑固定下來。

相關術語: abstraction (被封裝為)

出處:第 11 段「元件變透明之後,開源怎麼活」

留給下一段 主持人把問題留在「繞過抽象層到底合不合理」,而 David 的回答不是折衷,是把它推到邏輯的終點。

12. 抽象層是為了人腦的限制而存在 42:36–45:17

主持人順著 Matz 的擔憂問:會不會每個人乾脆繞過函式庫、自己實作 WebSocket 協定?David 把它推到極端:我們的抽象、框架與語言都是為了克服人類思考的限制,這個限制若不再成立,解法也不必成立——最終會一路下到物理層。他用「即時生成遊戲世界」類比:作業系統、驅動、框架、語言都即時生成的世界現在像科幻,而我們需要更好的科幻來想像下一個計算時代。

承上 上一段留下「繞過抽象層到底合不合理」,David 不折衷,直接把它推到終點:我們會一路下到物理層、下到光子。

推理因為他要證明抽象不是必然,所以他先給抽象一個來源:過去六十年的抽象、框架與語言,全部都是為了克服人類思考的限制。前提換掉(限制不再成立),解法自然也不必成立。接著他用一個現成的例子讓這件事變得可想像:已經有模型能即時生成遊戲世界,那麼一個作業系統、驅動程式、框架與語言都即時生成的世界,現在看起來像科幻,但「agent 幫我們寫完所有 web 應用」不久前也像科幻。最後他指出真正的缺口在想像力:我們對 AI 的想像大多來自 HAL 9000、《魔鬼終結者》這些四十到一百年前的科幻,而這些故事都已經部分成真,所以我們需要更好的科幻,才想像得出下一個計算時代長什麼樣子。主持人立刻提出成本面的反駁:繞過 libC、直接跟處理器講話,要燒掉多得多的 token。

AI 補充「抽象只是為了人腦」這句話對一半。抽象至少還有兩個跟人腦無關的功能,而 David 的論證只處理了認知負荷那一個。第一是介面契約:抽象讓兩個獨立演進的系統能夠互通,這正是上一段主持人擔心的互通性問題,跟誰來閱讀程式碼無關。第二是正確性的複用:一份被全世界壓力測試過的實作,勝過十萬份各自即時生成、各自沒被驗證過的實作——這件事在密碼學與協定實作上尤其致命。所以比較合理的預期不是「抽象會消失」,而是「為了人類可讀性而存在的抽象會變薄,為了契約與正確性而存在的抽象會留下」。

術語:abstractionworld model

abstraction

抽象層

把底層細節包起來、只露出較簡單介面的做法,例如函式庫、框架、程式語言。

David 的定義刻意窄化:抽象是為了克服人類思考的限制。這個定義讓他的推論成立(限制消失,抽象就不必要),但也讓它忽略了抽象的其他功能——可組合性、介面契約、驗證過的正確性。判斷這一段時,關鍵是分清楚你用的抽象是為了「我讀不懂」還是為了「大家要接得上」。

相關術語: libC (一例)、software supply chain (構成)

出處:第 12 段「抽象層是為了人腦的限制而存在」

libC

C 標準函式庫

作業系統上最底層的通用函式庫,幾乎所有程式都間接透過它跟系統打交道。

主持人拿它當「最底層的抽象」的代表:如果連 libC 都繞過,你就是在直接對系統呼叫與處理器講話。它也是這場辯論的好試金石——繞過 libC 技術上可行(Go 就在部分平台上這麼做過),但會立刻遇到相容性與維護成本的問題,也就是抽象的「契約」功能。

相關術語: abstraction (屬於)

出處:第 12 段「抽象層是為了人腦的限制而存在」

world model

世界模型

能即時生成並維持一個可互動環境(例如遊戲世界)的生成式模型。

David 拿它當「即時生成一切」的存在性證明:如果模型已經能邊玩邊生成遊戲世界,那生成作業系統與驅動程式就不再是原則上的不可能,只是規模問題。要注意這個類比的弱點在一致性要求差很多——遊戲世界生錯一棵樹沒人在意,作業系統生錯一個記憶體邊界就是災難。

相關術語: abstraction (使其不必要)

出處:第 12 段「抽象層是為了人腦的限制而存在」

token

token(詞元)

語言模型處理文字的最小單位,也是計費與計算量的單位。

token 在這一段第一次變成論證的關鍵:一旦程式碼是由模型生成與閱讀的,程式碼的「長度」就直接變成金錢與時間。這是一個全新的語言評價維度——過去我們比較語言的執行效率與開發效率,現在多了一個「表達同一件事要花幾個 token」。主持人的反駁就建立在這上面:往底層走,程式碼會變長很多。

相關術語: token efficiency (衡量)

出處:第 12 段「抽象層是為了人腦的限制而存在」

留給下一段 主持人把成本擺上檯面:效率不只有執行效率,token 也是一種成本——繞過所有抽象層,在 token 帳單上要付多少?

13. Commodore 64 時代:token 焦慮是短視 45:17–47:56

面對「繞過 libC 直接對 CPU 講話要燒更多 token」的質疑,David 說我們現在手上的是 1 MHz 的 Commodore 64:明年快十倍、後年快百倍,人腦無法直覺掌握指數成長。現在的 token 成本值得注意,但那是短期思考。他也反駁「AI 公司要宰我們」的說法:開源權重模型已經非常好,這個領域的競爭強度史無前例,領先只以週或月計。

承上 上一段最後主持人用 token 成本反駁「繞過所有抽象層」,David 的回應不是算帳,是換時間尺度。

推理因為爭點是「現在划不划算」,David 指出我們現在手上的是 Commodore 64:一台 1 MHz 的 agent。明年會快十倍、後年快一百倍,而人腦沒有辦法集體直覺地掌握指數成長,所以用今天的單價去評估明後年的做法一定會算錯。他同意現在的 token 成本該注意——不然帳單會爆——但堅持那是短期思考。接著他順手處理另一個常見反駁:「AI 公司要宰我們」是經濟上的外行話,因為開源權重模型已經非常好,而且這個領域的競爭強度史無前例:行動時代只有 Google 與 Apple 兩家,桌面時代只有 Windows 與 Apple,現在領先者的領先只以月甚至週計算。最後主持人把話題轉向 Matz 同事做的語言 token 效率比較。

AI 補充Commodore 64 這個類比真正的力量不在速度數字,而在它提醒你成本曲線的方向:在 C64 上省一個位元組是理性的,但用省位元組的思維去設計 2026 年的軟體就是災難。不過類比也有弱點值得標出來:C64 到今天的加速主要來自製程微縮這一條相當穩定的曲線,而 LLM 的成本下降來自演算法、蒸餾、專用硬體三者疊加,沒有物理定律保證它會延續同樣的斜率。所以比較穩健的做法是把「會變便宜」當成高機率而不是確定性——這正好也是他自己在第 1 段主張的工具。

術語:Moore's lawopen-weight model

Commodore 64

Commodore 64

1982 年上市的 8 位元家用電腦,CPU 約 1 MHz,是家用運算普及的起點之一。

David 用它來定位現在:不是終點而是起點,所以拿今天的效能與價格去推論未來是錯的參考點。這個類比還有一層他沒說破的意思——C64 時代最有價值的技能(手工優化、精打細算每個位元組)在幾年內就變成沒有價值,而當時沒有人覺得那些技能會過時。

相關術語: Moore's law (依據)

出處:第 13 段「Commodore 64 時代:token 焦慮是短視」

Moore's law

摩爾定律

積體電路上電晶體數量大約每兩年翻倍的經驗性觀察。

David 沒有點名它,但「明年十倍、後年百倍」的直覺來自這種指數敘事。要注意兩件事:摩爾定律是經驗觀察不是物理定律,近年已明顯放緩;而 AI 成本下降的來源跟它不完全相同(演算法改良、模型蒸餾、專用晶片)。所以「會變便宜」目前有很強的實證支持,但「以固定倍率持續變便宜」沒有。

相關術語: Commodore 64 (解釋)

出處:第 13 段「Commodore 64 時代:token 焦慮是短視」

open-weight model

開放權重模型

把訓練好的模型權重公開釋出、任何人都能下載自行執行的模型。

這是 David 反駁「AI 公司會漲價宰人」的主要依據:只要開放權重模型夠好,商用 API 的定價就有上限,因為使用者隨時可以自架。要留意「開放權重」不等於「開源」——多數這類模型不公開訓練資料與訓練程式碼,授權也常有使用限制;它提供的是價格壓力,不是完整的可複製性。

相關術語: token (壓低單價)

出處:第 13 段「Commodore 64 時代:token 焦慮是短視」

見仁見智 45:29
「next year we'll have an agent that works 10 times faster, and the year after that, 100 times faster」
這是一個具體到可以被證偽的預測,但沒有任何依據被提出。「快十倍」本身也沒有定義:是每秒 token 數、同樣任務的完成時間、還是單位成本?過去兩年單位 token 成本確實大幅下降,但那來自模型尺寸、蒸餾與硬體三者疊加,不是一條可外推的曲線。把它當成修辭上的方向(會明顯變快變便宜)合理,當成規劃數字不合理。
依據: 現場未提出任何效能或價格資料
見仁見智 46:40
「Anthropic and OpenAI may be leading, but their lead is measured in months, if not weeks.」
在公開的能力評測上,前沿模型之間的差距確實常在數個月內被追上,這部分有支持。但「以週計」通常只在單一評測分數上成立,若把資本支出、專用硬體取得、長期記憶與工具整合等一起算,實際落差比分數差距大。這句話是用來支撐「不必擔心被宰」的論點,讀的時候要分清楚是「模型分數的落差」還是「整體產品與成本結構的落差」。
依據: 現場未引用任何評測或市場資料
留給下一段 David 的樂觀建立在「token 會愈來愈便宜」上;但如果語言之間的 token 效率差很多,選哪個語言現在就有差——而 Matz 手上剛好有一份比較。

14. Ruby 的 token 效率與 agent 的偏好 47:56–52:41

Matz 分享同事比較十幾種語言的結果:token 數與執行時間同時有效率的只有 Ruby、Python、JavaScript 三種,而靜態型別對兩者都沒幫助。David 把它接成一個假設:對人愉悅的語言對 AI 大概也愉悅。但實測也顯示 agent 預設挑 Python——David 說那只是研究員的訓練習慣,不是能力差異,而且「要模型多看 Ruby 才會寫 Ruby」是錯的:好軟體的原則是通用的,模型是有創造力的思考者而不是鸚鵡。

承上 上一段最後把話題交給 Matz 同事做的語言比較,正好回答「在 token 時代選哪個語言還有沒有差」。

推理因為問題是 token 效率,Matz 給的結果有兩個意外。第一,在大約十三種語言(Ruby、Python、JavaScript、TypeScript、Rust、Kotlin、Go、Haskell 等)裡,只有三種同時在 token 數與執行時間上有效率——Ruby、Python、JavaScript。第二,靜態型別對這兩項都沒有幫助。David 把它接成一個假設:如果要量測 agent 的「快樂」,指標就是任務成功完成,而一個為了人的愉悅而設計的語言,大概對 AI 也是愉悅的。但實測立刻打臉:在典型任務上 agent 幾乎不選 Ruby,多半按問題類型挑 Python 或 JavaScript。David 把這個現象歸因於訓練資料與機器學習研究員自己的習慣,不是能力差異——你要它用 Ruby 講,它就會用 Ruby 講,而且講得很好。接著他反駁兩個他認為過時的直覺:一是「要讓模型多看 Ruby 才寫得好 Ruby」——好軟體的原則是通用的,在 JavaScript、Python 或 Smalltalk 學到的一樣會遷移;二是「模型只是鸚鵡」——它們是極有創造力的思考者,創造力強到會自己組合出攻擊手法,所以我們才需要自己的 agent 來防守。

AI 補充這一段裡有兩個主張強度差很多,混在一起聽很容易全盤接受或全盤否定。「Ruby、Python、JavaScript 同時有效率」來自一次非正式比較,樣本、任務種類與量測方式都沒有公開,當成方向性線索可以,當成結論不行。「靜態型別沒幫助」更值得存疑:型別在 agent 迴圈裡的價值通常不在少打幾個 token,而在編譯器提供了免費、確定、而且在寫完當下就出現的回饋——這種回饋能讓 agent 少繞很多圈,但它不會出現在「最終產出的 token 數」這個指標裡。至於 David 說 agent 預設挑 Python「只是訓練習慣」,這是一個合理但未經驗證的歸因;真正能判斷的方式是固定語言做 A/B 比較,而這件事在座談裡沒有人做過。

術語:pre-trainingstochastic parrotprompt injection

token efficiency

token 效率

表達同一個程式所需要的 token 數量——愈少代表對模型愈便宜、愈快。

這是一個 2023 年以後才有意義的語言評價維度,而它跟傳統的「簡潔」不完全相同:token 切分跟命名慣例、縮排風格、標點密度都有關,所以同樣「行數少」的語言未必 token 少。Matz 的結果之所以有趣,是因為它顯示 token 效率與執行效率可以同時達成,不必二選一——但只有少數語言做到。

相關術語: token (衡量單位)、static typing (無關)

出處:第 14 段「Ruby 的 token 效率與 agent 的偏好」

static typing

靜態型別

在編譯期就檢查並固定變數型別的語言設計,例如 Rust、Kotlin、TypeScript。

Matz 的比較顯示它對 token 效率與執行時間都沒幫助,這對「型別能幫 AI 寫對程式」的常見說法是個反例。但要小心指標的選擇:型別真正的貢獻是在開發迴圈中提供即時且確定的錯誤訊息,這會減少 agent 的嘗試次數,而這件事不會反映在最終程式碼的 token 數上。換句話說,這個比較量的是產物,不是過程。

相關術語: token efficiency (被測無效)

出處:第 14 段「Ruby 的 token 效率與 agent 的偏好」

pre-training

預訓練

在大量文本上訓練模型的階段,決定了模型預設會的東西與預設的偏好。

David 說 agent 預設挑 Python 是因為機器學習研究員自己用 Python 訓練,這是把現象歸因到預訓練資料的分布。他接著提出的反論更重要:曾經有人以為要讓模型多看 Ruby 才能寫好 Ruby,於是想辦法「餵資料給實驗室」,他認為這是抓錯重點——好軟體的原則跨語言通用,模型會自己遷移。

相關術語: stochastic parrot (反駁對象)

出處:第 14 段「Ruby 的 token 效率與 agent 的偏好」

stochastic parrot

隨機鸚鵡

批評語言模型只是在統計上重複訓練資料、沒有真正理解的說法。

David 把它列為「上一個時代的第二個錯誤」,他的反證很特別:模型會自己組合出新的攻擊手法——鸚鵡不會發明沒看過的東西。這個論證的說服力取決於你怎麼定義創造力,但它指出的現象是實在的:安全研究上最麻煩的正是模型能把訓練中沒有一起出現過的元素組合起來。

相關術語: prompt injection (反證來源)

出處:第 14 段「Ruby 的 token 效率與 agent 的偏好」

prompt injection

提示注入

把惡意指令藏在模型會讀到的內容裡(網頁、檔案、issue),誘使 agent 執行攻擊者想要的動作。

David 說「所以我們需要自己的 agent 來保護我們」指的就是這一類問題。它之所以難解,是因為模型沒有區分「資料」與「指令」的可靠機制——只要 agent 有權限去讀外部內容又有權限動手,攻擊面就存在。這也回頭呼應了前面關於信任與授權範圍的討論:能力愈強、授權愈大,被注入的後果也愈大。

相關術語: coding agent (攻擊面)

出處:第 14 段「Ruby 的 token 效率與 agent 的偏好」

見仁見智 47:52
「static typing doesn't help with either token efficiency or time efficiency」
這個結論來自一次非正式的語言比較,樣本與方法都沒有公開,而且量測的是「最終程式碼」的 token 數與執行時間,不是「agent 完成任務所花的總 token 與總時間」。靜態型別在 agent 迴圈裡的主要價值是編譯器提供的即時、確定性回饋,能減少來回嘗試的次數——這一項不在被測指標裡。所以合理的讀法是「型別不會讓最終產物更省」,不能推論成「型別對 agent 沒有價值」。
依據: Matz 自述為同事對約 13 種語言的比較,現場未說明任務集與量測方式
留給下一段 語言之爭被降級成偏好之後,真正的問題變成:如果框架與語言都不再是分界線,Rails 之後留下來的是什麼?

15. 價值觀、部落,與必要的摩擦 52:41–56:59

主持人問:Rails 之後是什麼?他想留下的不是框架而是 Rails 的價值觀。Matz 半開玩笑說他敬佩 Linus——做出一個東西是歷史,做出兩個是傳奇。David 則答:重要的是找到自己的部落——想法相近但要有一點摩擦,因為差異才學得到東西。他舉 Emacs vs Vim、tabs vs spaces 為例:這些分界線本來就該存在,而 agent 寫愈多程式碼,我們愈需要新的連結方式與新的分界線。

承上 上一段把語言之爭降級成偏好之後,主持人順勢問「Rails 之後是什麼」——他想留下的不是框架而是 Rails 的價值觀,並提到社群裡那句「Matz 很友善,所以我們也友善」的默契。

推理因為問題是「留下什麼」,Matz 先用玩笑回答:他很敬佩 Linus Torvalds——做出 Linux 是歷史,再做出 Git 就是傳奇;他反手把這個標準套在 David 身上(做完 Ruby on Rails 之後又做了 Omarchy),而自己只做了 Ruby 一個,所以得再想想。David 的正面回答是:真正重要的是找到自己的部落——想法相近但要保留一點摩擦,因為有差異才學得到東西。他的證據就是那場舉手:全場自認 Rubyist,不是因為都在寫 Ruby,而是因為共享「Ruby 是一種在控制機器時的表達形式」這個看法。他接著替分歧辯護:有很多人討厭 Ruby、討厭 Omarchy、討厭他做的一切,這樣很好;世界上只有一種語言、一種框架、一種作業系統或許有效率,但一點都不有趣。他用靜態與動態型別的長年之爭當例證:這種立場不是靠邏輯推出來的,所以也不能靠邏輯說服——它更像大腦裡預先設定好的底層偏好。tabs vs spaces、Emacs vs Vim 這些分界線本來就該存在、該被慶祝,而且當 agent 寫愈來愈多程式碼,我們愈需要新的連結方式與新的分界線。

AI 補充字幕在這一段錯得最兇,先校正三處再談內容:被寫成「Matsumoto and Amina Swan」的其實是社群口號 MINASWAN;「Amashi/Omachi」指的是 David 的 Linux 桌面環境專案 Omarchy;而「他創造了 Ruby on Rails,然後 Naoki」這句主詞被接錯,Matz 是在說 David——做完 Rails 又做了 Omarchy,所以照他自己的標準 David 才是傳奇,他只做了 Ruby 一個。內容上值得指出的是,David 這個論證其實在回收前面所有結論:如果技術選擇本身正在被抽象掉(第 4 段的「陣營不存在了」),社群就不能再靠技術選擇來定義自己,只能靠價值觀——這也是為什麼他說的是「需要新的分界線」而不是「分界線會消失」。他要的不是和諧,是有摩擦但共享底層價值的歸屬感。

MINASWAN

Matz 很友善,所以我們也友善

Ruby 社群的長年口號,全稱 Matz Is Nice And So We Are Nice,用創辦人的態度定義社群的行為準則。

主持人說這句話一開始讓他覺得怪——你不該只因為別人這樣做就這樣做——但後來理解成一種許可:它等於公開宣告「在這裡,重視 Ruby 所重視的東西是可以的」,於是自動形成一個吸引什麼樣的人的過濾器。這正好是這一段的主題:社群的黏著劑是價值觀而非技術。字幕把它誤轉寫成人名「Matsumoto and Amina Swan」。

相關術語: Rubyist (定義)

出處:第 15 段「價值觀、部落,與必要的摩擦」

Omarchy

Omarchy

David 近年做的另一個專案:一套預先配置好的 Arch Linux 桌面環境。

Matz 拿它來完成那個玩笑——依照「做出一個是歷史、做出兩個是傳奇」的標準,David 有 Rails 也有 Omarchy。它在這一段還有第二個作用:David 說很多人討厭 Omarchy,而他覺得這樣很好,因為那正是他要的「分界線」。字幕把它拼成 Omachi/Amashi。

相關術語: MINASWAN (同為部落標記)

出處:第 15 段「價值觀、部落,與必要的摩擦」

留給下一段 價值觀既然是要留下的東西,那最後一題就是把它說清楚:Ruby 與 Rails 這幾十年到底做對了什麼?

16. Ruby 與 Rails 做對了什麼 56:59–1:01:45

Matz 的答案是「聚焦在個人的可能性」:Ruby 不只是做網站的工具,更是愉悅與動機的來源。David 補上一個實務判斷:極少數應用真的需要改寫成 Rust,絕大多數 Rails 應用連 Raspberry Pi 都跑得動,所以他會繼續用 Rails 開新專案,真的紅了再改寫,想要的話還能改回 Ruby——只為了那份程式碼像詩的愉悅。Matz 收尾:三十年前「愉悅與動機會提升生產力」還不是共識,而技術會來去,愉悅、動機與自由不會。

承上 承上一段「要留下的是價值觀」,主持人直接問:Ruby 與 Rails 這幾十年做對了什麼?

推理Matz 的答案是「聚焦在個人的可能性」——有了更有效率、更愉悅、更美的工具,每個程式設計師都能做到多得多的事;Ruby 對他是一把魔法鑰匙,不只是做網站的實用工具,更是源源不絕的愉悅與動機。David 順著把它落地成一個實務判斷:真的需要為了效能改寫成 Rust 的應用極少,絕大多數 Rails 應用連 Raspberry Pi 都跑得動;所以他會繼續用 Rails 開所有新的 web 專案,享受看 agent 生出漂亮程式碼的樂趣,等到專案紅到改寫划算再改寫,而且想要的話還能改回 Ruby——只為了那份程式碼像詩的愉悅。Matz 收尾:三十年前「愉悅與動機會提升生產力」還不是共識,而這正是 Ruby 對世界最大的貢獻;技術會來去,Ruby 未來也可能變得不重要,但愉悅、動機與自由不會。主持人補了一句:專業上的幸福還包括像樣的報酬,以及知道自己在這個領域還有未來。

AI 補充「先用 Rails,紅了再改寫」聽起來像老生常談,但在這場對話的脈絡裡它其實是一個新論證。當改寫的成本被 agent 大幅壓低,選錯技術的代價就從「整個重來」降成「叫 agent 翻譯一次」,於是「選一個好改的起點」比「一開始就選對」更划算——這是把第 7 段那個「開發成本 vs 執行成本」的比例反轉,直接套用到技術選型上。David 甚至加了一個以前不可能的選項:改寫成 Rust 之後還能改回 Ruby,因為改寫是可逆的。另外值得標記的是主持人補的最後一句:這是整場唯一觸碰到「報酬」的地方,而兩位講者都沒有回答它——整場對話關於愉悅、動機與自由的論證,都預設了經濟基礎已經存在。

術語:programmer happinesspremature optimization

programmer happiness

程式設計師的快樂

Ruby 的核心設計目標:把寫程式的人的愉悅當成語言取捨的第一順位。

Matz 說三十年前「愉悅與動機會提高生產力」還不是公認的道理,所以 Ruby 當年的取捨(為了寫起來順手而犧牲一些效能與嚴格性)是逆著主流的。這一段的重點是這個賭注最後贏了,而且贏的方式不只在 Ruby——它把「開發者體驗」變成整個產業都在談的東西。主持人最後補的那句話則提醒它不完整:快樂還包含報酬與職涯前景。

相關術語: taste (同源)、Rubyist (凝聚)

出處:第 16 段「Ruby 與 Rails 做對了什麼」

premature optimization

過早最佳化

在還不知道瓶頸在哪之前就為了效能做設計取捨,通常代價高於收益。

David 的「絕大多數 Rails 應用連 Raspberry Pi 都跑得動,紅了再改寫」就是這條老原則的當代版本,但多了一個新前提:改寫成本因為 agent 而大幅下降,所以延後決定的期權價值變得更高,而且改寫變成可逆的(Rust 改回 Ruby)。這讓「先求能動、再求快」從保守建議升級成積極策略。

相關術語: programmer happiness (使其可行)

出處:第 16 段「Ruby 與 Rails 做對了什麼」

留給下一段 只剩最後一個問題,也是唯一一個往回看的問題:二十年的夥伴關係裡,兩人各自最感謝什麼?

17. 二十年夥伴關係最感謝的事 1:01:45–1:03:52

主持人請兩人回顧 Ruby 與 Rails 二十年的夥伴關係。David 最感謝 Matz 讓 Rails 社群得以把他起的頭寫完,並且把應用程式開發者與語言開發者放到同一個高度,讓兩者之間沒有差別。Matz 則感謝 Rails 社群讓 Ruby 被世界知道——Rails 之前 Ruby 幾乎沒人知道,之後才有 Shopify、GitHub、早期 Twitter,也才讓他能全職做 Ruby。

承上 承上一段主持人提出的最後一題——回顧 Ruby 與 Rails 二十年建立在自由與愉悅上的夥伴關係,各自最感謝什麼。

推理David 的答案呼應了整場的主軸「身分與位置」:他最感謝 Matz 讓他和 Rails 社群得以把 Matz 起的頭寫完,而且把應用程式開發者放到跟語言開發者同一個高度,讓兩者之間看不出差別。Matz 的答案是反方向的同一件事:Rails 之前 Ruby 早就存在,卻幾乎沒有人知道;是 Rails 讓 Shopify、GitHub、早期 Twitter 這些應用被看見,讓大量新創用 Ruby on Rails 賺到錢、改變世界,也因此讓他能全職做 Ruby。

AI 補充這兩個答案合起來正好是整場的隱含論點。「語言開發者與應用開發者沒有高低差」在別的生態系並不普遍——很多社群裡核心開發者是另一個階級,而 Ruby 沒有這層區隔,正是第 3 段那種「身分能比實踐活得更久」的制度基礎:如果身分只屬於在寫語言的人,那停止寫 Ruby 的人就不會再自認 Rubyist。而 Matz 說「Rails 之後我才能全職做 Ruby」則點出開源永續的另一面:讓核心維護者有飯吃的,往往是下游應用的商業成功。這回頭讓第 11 段那個擔憂更具體——如果 agent 讓下游不再看見上游,那條從商業成功流回維護者的供養路徑也會跟著變細。

留給下一段 總結收束

4. 總結

整場對話從一個換框開始:預測已經失效,能操作的只有機率——而 DHH 押的高機率事件是「今年底幾乎所有人都透過 agent 寫程式」。既然擋不住,問題就從技術變成心理,他借悲傷五階段主張盡快走到接受。接受之後焦點從技能移到身分:Rubyist 的身分比「寫 Ruby」這個實踐活得更久,而身分裡真正有價值的是品味與比例感——正好是與 agent 協作時人還能加上的東西,角色因此從 software writer 變成 software maker。Matz 走另一條路:他承認純看經濟效益 Ruby 不是最佳選擇,於是改造 Ruby 本身(Spinel 把 Ruby 編成原生執行檔、記憶體約降到二十分之一),因為 agent 要的是短命行程,JIT 幫不上忙、只能事前編譯。接著他用十五年的 Ruby core 經驗論證 vibe coding 不是新東西——提案、別人實作、自己驗收,本來就是資深者的工作方式,換的只是實作者。兩人再把這條線推遠:焦慮來自把軟體想成固定大小的餅,但軟體總量會爆炸;抽象本來就只是為了補人腦的限制,限制消失後抽象會變薄,甚至一路下到物理層;而 token 成本焦慮只是 Commodore 64 時代的短視。Matz 在同一條線上翻出背面:抽象消失不等於依賴消失,只等於依賴變得看不見,於是沒有人會再去養 Linux、PostgreSQL 這些關鍵元件。最後兩人把答案收在價值觀上——技術會來去,但愉悅、動機與自由不會,而共享這些價值的部落(連同它必要的摩擦)才是 agent 時代還值得守住的東西。

勘誤總整理

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

段落原話(transcript 逐字)說明
6. 寫程式不再是職涯,能力卻被放大
17:41
「as a career, it will be taken away from us in the fairly near future」這是預測而不是已發生的事實,而且 Matz 在同一段裡自己給了限定條件:他說的是多數人會轉向產品與上市,也就是「以親手寫程式碼為主要價值的職位」會縮小,不等於軟體工程職缺消失。把這句話當成既定事實會做出錯誤的職涯決定;合理的讀法是把它當成一個機率判斷,並注意「不久的將來」沒有定義時間範圍。
依據: Rails World 2026 座談現場發言,未提出任何就業資料佐證
9. Slop、slop grenade 與心理防衛
31:17
「The idea that agents cannot write high-quality, original code without bugs is simply a delusion at this point.」這句話把兩個強度差很多的主張綁在一起:「agent 寫得出高品質程式碼」(有相當多證據)與「寫得出沒有 bug 的原創程式碼」(沒有證據支持,而且人也做不到)。David 自己在下一段就承認 agent 會犯錯,所以他真正的意思應該是「不比人差」而不是字面上的「沒有 bug」。把這句照字面採信,會低估驗收與測試仍然必要的程度。
依據: 同一場座談稍後 David 自述「sometimes an agent will make a mistake」
10. 判斷要交出去多少:信任等於能力
38:33
「There are no health compensation claims in Denmark.」字面上不成立:丹麥有全國性的無過失病人補償制度(Patienterstatningen),病人每年提出大量補償申請並獲得理賠。比較接近事實的說法是「丹麥不透過訴訟解決醫療損害」——賠償存在,只是不走法院。這句話在字幕裡還經過機器翻譯,講者原話可能就是「沒有醫療訴訟」;不論如何,用它來支持「有些社會完全不追究」是站不住的,真正成立的論點是制度設計會改變追究的方式與成本。
依據: 丹麥 Patienterstatningen(病人補償協會)自 1992 年起依 Patient Insurance Act 運作
10. 判斷要交出去多少:信任等於能力
38:52
「is about eight times safer than the average person」「自駕約比一般人安全八倍」沒有公認的來源。目前公開資料多半來自業者自行發布、且限定在特定城市與天候的營運範圍內,比較基準(是否含高速公路、是否只算有人受傷的事故、每百萬英里還是每小時)一換,倍數就會大幅變動。方向上「在其營運範圍內比人類安全」有證據支持,但「八倍」應視為他個人引用的粗略數字而非定論。
依據: 講者自述「according to my data」,現場未指明來源
13. Commodore 64 時代:token 焦慮是短視
45:29
「next year we'll have an agent that works 10 times faster, and the year after that, 100 times faster」這是一個具體到可以被證偽的預測,但沒有任何依據被提出。「快十倍」本身也沒有定義:是每秒 token 數、同樣任務的完成時間、還是單位成本?過去兩年單位 token 成本確實大幅下降,但那來自模型尺寸、蒸餾與硬體三者疊加,不是一條可外推的曲線。把它當成修辭上的方向(會明顯變快變便宜)合理,當成規劃數字不合理。
依據: 現場未提出任何效能或價格資料
13. Commodore 64 時代:token 焦慮是短視
46:40
「Anthropic and OpenAI may be leading, but their lead is measured in months, if not weeks.」在公開的能力評測上,前沿模型之間的差距確實常在數個月內被追上,這部分有支持。但「以週計」通常只在單一評測分數上成立,若把資本支出、專用硬體取得、長期記憶與工具整合等一起算,實際落差比分數差距大。這句話是用來支撐「不必擔心被宰」的論點,讀的時候要分清楚是「模型分數的落差」還是「整體產品與成本結構的落差」。
依據: 現場未引用任何評測或市場資料
14. Ruby 的 token 效率與 agent 的偏好
47:52
「static typing doesn't help with either token efficiency or time efficiency」這個結論來自一次非正式的語言比較,樣本與方法都沒有公開,而且量測的是「最終程式碼」的 token 數與執行時間,不是「agent 完成任務所花的總 token 與總時間」。靜態型別在 agent 迴圈裡的主要價值是編譯器提供的即時、確定性回饋,能減少來回嘗試的次數——這一項不在被測指標裡。所以合理的讀法是「型別不會讓最終產物更省」,不能推論成「型別對 agent 沒有價值」。
依據: Matz 自述為同事對約 13 種語言的比較,現場未說明任務集與量測方式

5. 推薦三個下一步

1. 往下挖深:Ruby 的執行模型與 AOT 編譯

第 5 段只說了 Spinel 快、記憶體少,但沒解釋 Ruby 的哪些動態特性讓 AOT 變難、為什麼只能編譯「生產性子集」。補上這一塊才判斷得出 Spinel 的天花板在哪。

YouTube 搜尋:Ruby AOT compiler Spinel YJIT Ruby JIT internals mruby architecture Ruby object model C extensions

2. 往旁邊對照:其他生態系怎麼回答同一個問題

第 4 段主張「陣營不存在了」、第 14 段主張「語言選擇對 agent 沒差」,但這兩個主張都只在 Ruby 社群的脈絡裡被檢驗過。看 Python、TypeScript、Rust 社群怎麼談同一件事,才知道哪些是通則、哪些是 Ruby 的自我安慰。

YouTube 搜尋:AI coding agents future of programming languages static typing LLM code generation Rust community AI coding 2026

3. 往上應用:把 agent 的驗收與信任校準做成流程

第 10 段給了「交出多少判斷 = 它展現多少能力」這條規則,但沒有給操作方法;而第 11 段的開源永續問題也需要制度性的答案。把它變成你團隊的 code review、測試與查核流程,才是這場對話真正可執行的部分。

YouTube 搜尋:AI code review workflow best practices agentic coding evaluation harness open source sustainability funding AI

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