在 LLM 時代學程式(Mark Seemann)

ploeh blog|Mark Seemann|2026-09-16|〈On learning programming in an age of LLMs〉 形式是公開回信:一位讀者寄來長信問「在 AI 時代該怎麼學程式」,作者取得同意後大段引用並逐題回答。 作者自己開場就聲明:「我的回答都不特別嚴謹,情況太不確定了,我只能盡力而答,不主張其中有任何不變的真理。」

統整

讀者的處境:蓋出一個高於自己理解程度的系統

寫信的人沒有 CS 背景,一年前迷上 AI 輔助開發,靠 LLM 蓋出一套相當大的 TypeScript/JavaScript 系統——API、PostgreSQL、LLM pipeline、研究自動化、多模型工作流。一開始感覺近乎魔法:AI 似乎把「有想法」和「能做出來」之間的距離壓縮掉了。

但要把它變成真正的產品時卡住了:修好一個錯誤,冒出另一個,然後某個部分的行為是他不完全理解的。重構數月之後,他得到一個不舒服的體悟:

我可能蓋出了一個高於我自己理解程度的系統。 當一切正常運作時,這個落差幾乎是隱形的;當它出問題,落差就變得非常真實。

他的自問:我這一年是蓋出了一個產品,還是部分蓋出了「產品的外觀」——精緻到能動,但我理解得不夠深,無法真正擁有它?

他強調自己完全不反 AI,也想以此為業,只是不確定和它的正確關係該是什麼。

作者先攤牌自己的立場

我還沒對 AI 下定論,但我傾向不喜歡它——同時很清楚它可能擋不住。

他會用、會實驗,常被驚艷,也常被激怒。而且:

通常是它最讓我驚艷的時候,我對它的怨恨最深。

表現差的時候至少還能「在『我花三十多年學的東西仍然有用』這個幻覺裡取暖」;表現最好的時候,他會想「Butlerian jihad 在哪裡報名」。

他為什麼悲觀(經濟學角度)

作者本科是經濟學,這裡特別把它搬出來:

  • 他自己年紀夠大、夠成功,失業還活得下去;但他不確定任何知識型社會活不活得下去。
  • LLM 可能會比其他白領工作更早拿走程式設計師的工作——因為程式設計可能是一個驗證比較容易的領域(相較於保險理賠審核之類)。
  • 作為經濟學家,他無法想像 30–40% 的大規模失業不會對經濟造成重大衝擊。
  • 對「歷史上都這樣,舊工作消失但會出現想像不到的新工作」(織襪機、蒸汽機、內燃機、電腦)這個論證,他的反駁是:只對了一半——新工作確實被創造出來,但往往不是給那些失去工作的人。「煤礦工人不會一夕之間變成程式設計師。」 同樣的論證也用在中國加入 WTO 的時候:新工作確實大量出現,只是不在西方。

他說他真心希望自己是錯的:他熱愛寫程式,還想再做十年;更要緊的是他有已成年的孩子,希望那裡還有一個屬於他們的世界。

問題一:慶幸自己在 LLM 之前學會程式嗎?現在開始還要學基礎嗎?

慶幸嗎?當然。那些技能支撐了他三十年。

但如果是現在才開始,他說他會認真考慮去學木工、金工、槍械維修,或其他需要手眼協調的東西——他知道機器人也在進步,但取代體力勞動看起來還比較遠。

(他自己目前確實在大學課程裡學資料結構、語言語意學等等,但明說是出於好奇,不是因為預期會有什麼金錢回報。)

AI 會不會讓人「蓋得比懂得快」?

他的回答是「有待觀察」,理由是這件事並不新:

軟體開發者已經在自己不理解的抽象層之上工作了數十年。 你是 web 開發者,就不太懂編譯器;你是編譯器工程師,就不太懂積體電路設計;你做 IC 設計,也不會懂你上面那幾層。

他給出整篇最具操作性的一條經驗法則:

理解你工作所在那一層的「下一層」,以及「上一層」。這樣你就能排除大部分問題。

問題二:該退回去補基礎,還是邊蓋邊學,還是兩者兼具?

作者先指出這其實是兩個截然不同的問題,因為他自己早已不缺基礎——就算丟給他最陌生的環境(他舉例:一個完全用 RISC-V 組合語言寫的應用),他也能靠既有知識爬上去。(他順帶提到自己真的寫過小的 RISC-V 練習程式,還寫過一個編譯到 RISC-V 的練習用編譯器。)

但如果幾乎沒有軟體背景呢?他說:我曾經就在那個位置。

  • 職涯剛開始時,他在「把事情做完」和「邊做邊學」之間走鋼索。
  • 1999 年開始寫 C++ 的 COM 元件,「並不太理解自己在做什麼」,但還是讓它動起來了,甚至做到沒有明顯的記憶體洩漏。
  • 他從來不甘於「東拼西湊但不懂原理」,所以他確實退回去有系統地補了基礎。

關鍵的轉折在下一句:

這在 1990 年代中期起步的職涯裡行得通。今天還行得通嗎?我不太確定。

理由是時間:

要達到「足以回頭認出自己過去的自信正處在 Dunning-Kruger 曲線上『無知到不自知』那一段」的程度,花了我數十年。你今天有那麼多時間嗎?

學習能不能被加速

他給了兩面:

  • 能:有了 LLM,你可以問更有針對性的問題,所以學得比較快。三十年前他只能買書,期待書裡有用得上的材料,仍要硬啃大量當下用不到的內容。
  • 但:

我懷疑人類的學習速度能被顯著加速。瓶頸幾乎不是老師、也不是教材,而是人腦吸收新知識的速度。

問題三:他自己是怎麼學的?今天要學一個全新語言會怎麼做?

短答:慢慢學,靠大量試錯,偶爾用一本書撐著。

階段怎麼學
最早COMAL 80 的失敗起步
第一個專案為經濟學碩士論文重算分岔圖與勞侖次吸子,用 QBasic 寫,學習材料是它內建的範例,偶爾問朋友
1990s–2000s主要靠範例和文件。買過一本 C++ 的書但沒讀完;各種 Basic 方言和 C# 完全是從文件與範例程式學會的
例外F# 和 Haskell 是靠書學的,書在這兩者上具決定性
今天看過太多語言了,遇到新的通常讀現有程式碼 + 查少數不清楚的地方就能上手——前提是那個語言「正常」。要是回頭碰 APL,他至少得找份教學

他對「用 LLM 學習」的態度

你可能注意到我不太用 LLM 學習。LLM 不是在幻覺,它們是在唬爛(bullshit),我對它們講的任何東西都深度不信任。

但他確實在用 LLM——只問能得到可驗證答案的問題:

✅ 「這段 Haskell 表達式能不能更簡潔?」
     → 任何有用的回答都是一段程式碼建議
     → 它要嘛會動、要嘛不會;要嘛更短、要嘛沒有。很容易驗證

❌ 「我接下來該學什麼?」
     → 不會產生可驗證的答案 → 他不問 LLM 這種問題

全文的結語就是這一句:

總結來說,你可以說我偏好問 LLM「可證偽(falsifiable)」的問題。

反覆出現的關鍵字

  • verifiable / falsifiable(可驗證/可證偽):全文的收束點,而且是唯一一條真正可操作的判準。它還在另一處出現過——作者猜 LLM 會先拿走程式設計師的工作,正是因為程式設計「驗證比較容易」。(推論)同一個性質在文章裡同時是威脅的來源和自保的方法,這個對稱作者沒有點破。
  • understanding(理解)與 owning(擁有):讀者信裡的核心焦慮不是「不會寫」,是「不能真正擁有」。文章從頭到尾繞著「能動」和「懂了」之間的落差。
  • 抽象層(levels of abstraction):作者用來安撫也用來設限的概念——不懂下層一直都是常態,但「下一層+上一層」是底線。
  • 時間 / 慢:「Slowly」「花了數十年」「你今天有那麼多時間嗎」「瓶頸是人腦吸收的速度」。文章真正的悲觀不在 AI 多強,而在人學得多慢。
  • 不確定(I’m not sure / remains to be seen):開場聲明、對 AI 的立場、對自己方法還管不管用、對社會能不能撐住——作者反覆拒絕給出確定答案。這是這篇的體例,不是修辭。
  • bullshit 而非 hallucinate:刻意的用詞替換,而且他沒有展開解釋這個區分。

矛盾點

文章內部

  1. 「LLM 讓你學得比較快」和「我懷疑人類學習速度能被顯著加速」貼在一起。 兩句其實可以調和——LLM 加速的是「找到相關材料」,不是「吸收」,而作者自己就點名瓶頸在人腦——但他沒有把這層講開,並排讀起來像自相矛盾。(推論)調和後的版本反而更有用:省掉的是搜尋成本,不是理解成本。
  2. 那條「懂下一層和上一層」的法則,沒有回答讀者的處境。 讀者的問題不是不懂下層,是不懂自己正在工作的那一層。(推論)法則預設你已經站穩了某一層;用 LLM 蓋出東西的人,可能一層都沒站穩。
  3. 讀者問的那題(退回去補/邊做邊學/兩者兼具)其實沒有被回答。 作者講了自己的路(退回去系統性補基礎),然後說「這在 1990 年代行得通,今天我不太確定」——然後就沒有然後了,沒有給替代方案。(推論)這是全文最大的空缺,而且作者可能是誠實地不知道。
  4. 「我不太用 LLM 學習」和「有了 LLM 你可以學得更快」之間有張力。 他承認那個能力,自己卻不用。(推論)合理的解釋是他的不信任等級高到讓那個加速不划算——但對一個沒有能力判斷輸出對錯的新手,這個成本效益算式完全不同,而文章沒有分開談。
  5. 他建議考慮木工金工,自己卻正在大學裡學資料結構。(推論)他用「出於好奇、不為金錢回報」化解了,但這等於承認他給的建議和他自己的行為是分開的兩套標準。

與 vault 既有筆記

  1. AI 時代該學古老且經過驗證的底層 在這裡被同時佐證和動搖。 佐證:作者的木工/金工建議就是「學古老經過驗證的東西」推到極致——手眼協調是最不會變的那一層。動搖:那篇的假設是底層的回報更持久,但作者明說自己學資料結構不預期金錢回報。(推論)兩篇合起來的修正版是:學底層的理由從「回報更持久」要改成「那是你唯一能真正擁有的東西」——回報的部分,作者自己也不敢保證了。
  2. 監督 AI 產出的檢查成本可能比自己寫還高 的極端端點就是這封讀者來信。 那篇說審查成本有時比自己寫還高;讀者的狀態是根本沒有能力審查——不是成本高,是成本無限。(推論)值得補進那篇的一句:檢查成本會隨著「我懂不懂這一層」而階躍,不是連續上升。
  3. AI 時代的學習與刷題策略 的「AI 當特助」被這篇的判準切成兩半。 那篇建議讓 AI 扮演面試官、教你解題各階段能問什麼、評估優化空間。用 Seemann 的標準過濾:「這段能不能更簡潔/這個複雜度對不對」是可驗證的;「扮演面試官給我回饋」「我接下來該學什麼」不是。(推論)這是那篇可以直接加上的一道篩子。
  4. 並行多個 AI agent 的 context switch 會偷走專注 的「待解」在這篇找到一個方向。 那篇還不確定怎麼改善;本文的判準給了一個切入角度(推論):把任務按「輸出可不可驗證」分類,可驗證的才適合丟出去並行,不可驗證的丟出去只會製造更多需要你回來判斷的東西。

待確認

  • 「LLM 不是幻覺,是唬爛」這個區分,作者沒有定義。(推論:這應該是借哲學家 Harry Frankfurt 的 On Bullshit——說謊的人知道真相而故意說反的,唬爛的人則是根本不在乎真假。若是這個意思,那它比「幻覺」更準,因為幻覺暗示模型「以為自己是對的」。文章沒有點名出處。)
  • Dunning-Kruger 那段講的到底是「知識學不快」還是「判斷力需要靠時間與經驗累積」?這兩者的處方完全不同,文章沒有分開。
  • 「程式設計是驗證比較容易的領域,所以會先被取代」——如果成立,那驗證容易同時是威脅來源與自保方法。這個對稱該怎麼用?
  • 作者沒回答的那題仍然開著:基礎薄弱但已經有一個 AI 蓋出來的大系統,到底該退回去補、邊做邊學,還是兩者兼具?

抽出的原子筆記

〈矛盾點〉裡沒有被抽走的部分(經濟學那段、作者自己沒回答讀者的那一題)仍然只在這篇裡。