# 約翰·卡馬克：Doom、Quake、VR、AGI、程式設計、電子遊戲與火箭

> id Software 創始人回顧《Doom》《Quake》的開發歷程，聊程式設計、VR 頭顯、AGI 與火箭事業。

- 原標題：#309 – John Carmack: Doom, Quake, VR, AGI, Programming, Video Games, and Rockets
- 期數：第 309 期
- 釋出日期：2022-08-04
- 嘉賓 / 主題：約翰·卡馬克
- 網頁版：https://lex.qiaomu.ai/tw/ep/john-carmack/
- 官方頁面：https://lexfridman.com/john-carmack/
- 精讀字數：約 10474 字（閱讀約 23 分鐘）

> 本文為 lex.qiaomu.ai 基於原始訪談的 AI 改寫中文精讀，非官方翻譯；引用請註明出處並連結網頁版。

Wolfenstein 3D 開發到一半，負責畫圖的美術 Adrian 坐到機器前試玩。他慢慢往前挪，撿起一把鑰匙，走到一堵牆跟前。牆在一小段動畫裡消失了，一個怪物就站在那兒。

他差點從椅子上翻下去。

在這之前，電子遊戲都是上帝視角。你操作螢幕上的一個小人，事情發生的時候你可以高興或者難過，但你不在裡面。而那一刻，他腦子裡某個爬行動物級別的部位在尖叫：操，有東西過來了。約翰·卡馬克（John Carmack）說，那是他職業生涯中最早確認"這件事會改變世界"的瞬間之一。

## 同一套程式碼，換個視角就成了另一個世界

Wolfenstein 3D 裡的敵人 AI、開門、撿東西、走進下一個房間，這些邏輯全部照搬自一款更早的 2D 遊戲《Catacombs》。那是個俯視視角的作品，跟《Gauntlet》差不多，你在地圖裡跑來跑去。id Software 甚至用同一個地圖編輯器做《指揮官基恩》、Hover Tank、Catacombs 3D 和 Wolfenstein 3D。

改動小到不能再小，只是把鏡頭從頭頂挪進了眼睛裡。卡馬克說這是他見過最純粹的對照實驗：其它變數幾乎沒動，出來的東西卻完全不是一回事。

撐起這個視角轉換的技術有兩塊。第一塊叫光線投射（ray casting）。螢幕橫著 320 個畫素，每個畫素從你的位置朝某個角度扔一條射線出去，一直走到撞上牆為止，再算出撞在牆面的哪個位置。它在狹窄空間裡極其高效，穿三四個格子就碰到牆了；地圖上限是 64 乘 64 格，如果有人造一個巨大的空房間，射線要跨過幾十格才撞牆，幀率立刻塌下去。

第二塊叫 compiled scaler。怪物是 2D 圖片，遠近靠縮放，轉身靠八張不同角度的圖。用通用的縮放函式去畫，怪物越大畫得越慢，恰好在你最需要反應速度的時候卡頓。卡馬克寫了一個程式，生成上百個專用小程式，每一個只負責把某張圖渲染成固定高度，比如"畫成 12 畫素高""畫成 14 畫素高""每兩個畫素放大一次"。當怪物糊滿整個螢幕，擴張比例最高，一次讀取、三四次寫入，居然比普通複製還快。

這個思路來自 Apple II 時代。那時候一個位元組管八個畫素，想讓小飛船平滑移動，只能預先做好七張位移版本的圖。卡馬克說，他這輩子只做過兩次通宵程式設計，其中一次就是和 Tom Hall 一起，用剛寫好的滾動技術把《超級馬力歐兄弟》第一關抄了個遍，主角換成《危險戴夫》。第二天早上，他們把軟盤留在桌上，讓 Romero 和 Jay Wilbur 自己開啟看。結果就是一群人被拽進房間，決定辭職成立公司。

## Softdisk：一個月交一款遊戲是什麼體驗

在成立 id Software 之前，卡馬克是堪薩斯城一個接外包活的獨立程式設計師，經常在付房租和買雜貨之間掙扎。給他活最多的是 Softdisk Publishing，這家公司的商業模式放在今天看很怪：按月訂閱軟體。網際網路還沒有普及的年代，你交一筆錢，他們每個月寄一張軟盤過來，裡面裝些隨機軟體。

他寫一款小遊戲能賣三百到五百美元。為了多賺點，他學會了一個程式移植到多個平臺，從 Apple II 到 2GS 再到 IBM PC。這件事引起了 Softdisk 編輯們的注意，Jay Wilbur 和 Tom Hall 反覆勸他去公司上班，他推了幾次，因為他太喜歡一個人待著寫程式碼的自由了。

真正讓他鬆口的是那裡的兩個程式設計師：John Romero 和 Lane Roth。

那是他第一次遇到懂的東西比他多的人。在那之前的堪薩斯城，他是"全校最聰明、老師教不了"的那種小孩，能學的只有圖書館裡幾本過期的計算機書，有些程式設計領域對他來說是黑魔法。而 Romero 在 Origin Systems 幹過，做過大量遊戲。

於是有了 Gamer's Edge 這個 PC 遊戲訂閱部門，也是 id Software 真正的訓練營。他們要每個月交出新遊戲，從頭到尾做完，沒有延期的餘地。Romero 早年的自我訓練方式是給字母表裡每個字母都做一款遊戲，二十六個，題材各不相同。

卡馬克用披頭士作類比。披頭士之所以成為披頭士，靠的是成名之前大量的酒吧演出。id Software 也一樣，那些沒人記得的小遊戲，把後來做 Doom 和 Quake 需要的手感、節奏、工程直覺，一點一點練了出來。陀思妥耶夫斯基寫《賭徒》是因為欠了債必須一個月交稿，逼出來的東西反而成了經典。資源和時間的限制會逼出創新，這件事在直覺上很反常識，因為你總覺得時間和錢越多，做出來的東西越好。

## 滾動螢幕的兩次頓悟

當年 PC 遊戲最想做卻做不到的事，是橫向卷軸。主機和街機上有《超級馬力歐》那種大世界，PC 上只有靜態畫面。道理很簡單：想滾動，重畫一遍整個螢幕就行。但重畫一遍，幀率掉到每秒五幀，根本沒法玩。所有人都知道想要什麼，問題是怎麼才能比直白的做法快上五到十倍。

卡馬克想出的第一招叫自適應瓦片重新整理（adaptive tile refresh）。螢幕是一個個 16 畫素的方塊拼成的，你把當前幀和下一幀疊在一起比對，大部分方塊是一樣的。馬力歐那關裡頭是成片的藍天、成排的同一款磚塊，通常只有 10% 左右的方塊真的變了。滾動時往回退一步，只改那 10%，就快了五倍。這個辦法有個代價：如果設計者畫一整屏棋盤格，滾一格全部方塊都得換，幀率還是會崩，所以關卡得畫得素一點。

第二招更簡單，也更漂亮。EGA 顯示卡的視訊記憶體是 256KB，分成四個位平面，每個 64KB。因為要 16 色，需要 4 個 bit，正好湊上 16 位定址的整數。你可以告訴顯示卡從這 64KB 裡的任意位置開始掃描輸出。過去大家以為最多做個 2 乘 2 螢幕的平移，因為一旦走出邊界就沒戲了。

卡馬克問了一個問題：如果我真的走出邊界，會發生什麼？他試著讓起點落在 64KB 的末尾，結果它自動迴繞到開頭。**整件事就這麼成立了，你可以在兩個螢幕之間無限滾動，每幀只需要畫新露出來的一條邊。**沒有效能問題，不需要設計者剋制自己的畫法。

代價在幾年後才浮現。市面上出現了 Super VGA 顯示卡，視訊記憶體有 512KB 甚至 1MB。在那些卡上滾出邊界不會迴繞，而是滾進一塊真實存在的、未初始化的記憶體裡。於是遊戲在某些機器上會出現週期性的卡頓。依賴一個別人根本沒打算支援的硬體行為，就得接受這種回報。

## Doom 跨過的那條線

Wolfenstein 3D 很快就摸到了自己的天花板。所有在世界各地的美術都做不出一款真正不同的作品，只能做更多 Wolfenstein。

卡馬克用了一個很精確的說法：Wolfenstein 的創作空間不夠大，Doom 跨過了那條線。Doom 有可變的地板和天花板高度、任意角度的牆、更多光照可能。這些增量加起來，讓設計空間變得近乎圖靈完備。直到今天還有人釋出新的 Doom 關卡，三十年過去，創意沒有被榨乾。

有意思的是，《Minecraft》用另一種方式證明了同一個結論：把方塊縮小到八分之一體積，也足以開啟無限可能。越過某個閾值才是關鍵，技術水平本身的高低反倒沒那麼要緊。

Doom 的核心技術是二叉空間分割樹（BSP tree）。它把空間裡的牆兩兩切開，生成一堆碎片，這樣從世界裡的任意一點出發，你都能得到一份確定的遠近順序。畫家演算法從最遠的畫起，一層層蓋上去；BSP 反過來，從最近的開始畫，畫到能遮住後面所有東西為止。卡馬克是從一本叫《Foley and Van Damme》的圖形學教材裡學到這個思路的，那本書他翻過很多遍，有些地方至今看不懂，但那一小段關於固定順序的描述，後來變成了 Doom 的骨架。

代價是浮點精度問題。Wolfenstein 的世界只有橫平豎直的線，切一刀，交點在哪是明擺著的。Doom 裡有任意角度，兩條斜線求交會得到有理數，計算機沒法精確表示，只能截斷到定點數。截斷意味著線會微微拐彎，切完之後接不上。卡馬克說他一度真想過去做精確的有理數運算，最後發現資料會指數級膨脹，走不通。Doom 裡留下了一些邊角情況，玩家社群給它起了個名字叫"鏡廳效應"（hall of mirrors）：你掃過某個角度，螢幕會出現沒畫乾淨的兩幀殘影。

還有一件事值得記住：Doom 的直接競爭對手，Ken Silverman 用 Build 引擎做的《毀滅公爵 3D》，完全沒有用 BSP 樹。

## Quake：一次吞下太多

Quake 把好幾件事一次性全押上了：真正的六自由度 3D 引擎、全新的表面快取光照系統、可以整體替換的遊戲邏輯語言 QuakeC、基於客戶端伺服器的網路對戰。

卡馬克後來說，如果他能回到過去給年輕的自己提一條建議，就是把這幾項創新拆成兩代產品。第一代保留 Doom 的渲染引擎，裝上 TCP/IP 和客戶端伺服器架構，重點是網路對戰和 QuakeC 那套可以被玩家改寫的遊戲邏輯，名字叫 DoomC 也無所謂。這樣一來，一款"看起來是 Doom、玩起來像 Quake"的遊戲會早八個月面世，而且不用逼所有人升級到 Pentium。486 上雖然能跑 Quake，體驗很差，一大批人被硬體門檻擋在了外面。

真實發生的是，整個團隊在 Quake 上被拖到極限，公司的關係也在那幾年嚴重承壓。Michael Abrash 被從微軟挖過來寫彙編核心迴圈，他是卡馬克年輕時在《Dr. Dobb's Journal》上崇拜的作者之一。兩個人配合的模式很有意思：卡馬克先粗寫出帶光柵化器，Abrash 花一個月把它最佳化成漂亮的彙編；然後卡馬克在更高的層面想明白可以在畫之前先做一次跨度緩衝，砍掉三四成的畫素，於是整個介面要重寫，Abrash 那一個月的活有一部分作廢。卡馬克說他知道這讓對方有點難受，但從全域性看這是對的。

QuakeC 後來教會了一代遊戲程式設計師寫程式碼。卡馬克自己評價不高，說它沒什麼可吹的，但一個人走進程式設計這行，圖的是這門語言能讓你做出在意的的東西，文法優雅與否從來都排不上號。你開啟 Quake 的程式碼，把霰彈槍的傷害從預設值改成 200，然後滿地圖炸怪物，臉上帶著傻笑。這就夠了。

## 關於語言、偵錯程式和斷言

被問到最好的程式語言，卡馬克沒有給答案，他給了一套判斷標準。

他現在會寫不少 Python，尤其是 AI 和機器學習方向的活，但他不是原生 Python 程式設計師。他的原話是，在 Python 裡寫一個三層巢狀迴圈，可能比一次正經的 GPU 張量運算慢幾千倍甚至上百萬倍。所以第一反應永遠是：怎麼把這段東西重新組織成一個大向量操作。

真正認真寫程式碼的時候，他用 C++，而且是 C 味道很重的 C++，對現代模板超程式設計保持距離，認為過度抽象會帶來大量的事故現場。他花過幾年深挖 Lisp 和 Haskell，收穫很大，主要收穫是學會避免到處亂放的、隨時會被改動的可變狀態。真正難的地方在別處：**它能不能隨著環境變化彎折、適應，能不能在一茬又一茬接手維護的工程師之間順利交接。寫它的那幾天，跟它之後要活的十幾年比，短得可以忽略。**

從這個角度看，C 有一個被嚴重低估的優點：它太簡單了，誰都能直接跳進去。你在 BSD 核心裡漫遊，能看懂正在發生的一切，不需要先學一套別人搭起來的抽象體系。Go 走的是同一個路子，剛出來時被語言圈的人看不起，說它粗糙、不時髦，但它流行起來恰恰因為不需要重塑大腦才能寫出好程式碼。

他有一句總結：**最好的語言，就是你眼下正在用的那門語言。**他幾乎沒見過混合語言的專案不翻車的，那意味著每個人只能在自己那一小塊裡幹活，跨不過邊界。

另一件他很在意的事是偵錯程式。寫 C 和 C++ 的時候，他永遠從偵錯程式裡跑程式，寫完第一件事就是打斷點、單步走一遍，看看它是不是真的按他以為的方式在跑。很多人的說法是"這些我在腦子裡過一遍就行了"，但腦子是個有缺陷的直譯器。

> 你沒法讀遍一個大系統的所有程式碼，你只能對系統做實驗。靠加日誌、重新編譯、重新執行來做這件事，效率低到離譜。（約翰·卡馬克）

他還講了一件讓他自己都很意外的經歷。id Software 的程式碼庫有幾百萬行，外界評價一直是"極其健壯"，微軟那邊反饋 Xbox 上的崩潰記錄少到他們懷疑是硬體錯誤。後來他用能找到的所有靜態分析工具把整個程式碼庫篩了一遍，結果被狠狠打臉：複製貼上沒改型別的地方、printf 格式串對不上型別的地方、漏掉的空指標檢查，到處都是。有些是他自己寫的，看了一眼就知道肯定寫錯了，已經帶著這個隱患跑了一年多。

他由此得出一個結論：**凡是語法上允許寫出來的東西，在一個足夠大的程式碼庫裡遲早都會出現，光靠自覺是攔不住的，必須有自動化工具兜底。**

他的私人程式碼裡有 10% 到 20% 是斷言。斷言在理論上對程式沒有任何作用，只要一切按預期執行，它永遠不會觸發。但它的價值在於給你一份"世界變了"的通知。他偏愛固定大小的陣列，不太喜歡無限增長的容器，道理是同一個：如果某天用量漲到你以為永遠不可能出現的十倍，你希望有人告訴你，而不是讓它無聲地膨脹、悄悄拖垮效能。

## .plan 檔案：部落格出現之前的部落格

早期 id Software 用的是 NeXT 工作站。那是喬布斯離開蘋果之後做的機器，基於 Unix，帶圖形介面，用 Objective-C，穩定到不需要一天重啟幾十次。Unix 世界裡有一個傳統：家目錄裡可以放一個 .plan 檔案，別人用 finger 命令查你，伺服器就把這個檔案的內容吐到對方終端上。

卡馬克開始在上面記每天在做什麼，用一套自創的小符號：寫一條正在做的事，做完加個星號。一開始就是待辦清單，比如"修了碰撞檢測的 bug""改了下火球的行為"。後來越寫越多，開始塞進零碎的思考和觀察，再後來直接在裡面發小論文，和工作日誌混在一起。

大部分玩 Doom 的人沒有 Unix 工作站，於是有人做了網站，定時抓取這些檔案，用瀏覽器就能看。當時達拉斯做遊戲的那一圈人，有幾十個這樣的計劃檔案在更新，比部落格這個東西正式出現早了好幾年。**它在部落格誕生之前好幾年，就預演了同一件事：把工作過程攤開，讓對它感興趣的人跟著你一起往前走。**

回頭看這些文字，卡馬克說他能看出所有的問題。Wolfenstein、Doom、Quake 裡的每一個部分，放到今天他都能做得更好，不管是渲染引擎、怪物行為，還是資源管理。他還提到另一位程式設計師 Graham Devine 的一句感慨，說自己翻舊筆記時覺得"我當年真聰明"。卡馬克沒有這種感覺。

他也承認，早期在商業、組織、團隊結構上的認知非常原始。很長一段時間他信奉的是"你們別擋著我寫程式碼就行"。多年之後他才明白，如果當初在處理人和團隊的方式上換個做法，有些產品能做得更成功。Activision 證明了一件事：同一款遊戲每年出一次，把它做得更好一點，人們不但不反感，還非常買賬。有人管這叫沒創意，可只要每一年的版本都讓買的人有得玩，錢就流向了真正創造價值的地方。

## Beat Saber 打了所有人的臉

2012 年卡馬克把 Doom 3 移植到 Rift 原型上，在 E3 上演示。當時所有人的共識是：第一人稱射擊和 VR 是天作之合。

結果完全不是。第一人稱射擊在 VR 裡的暈動症問題最嚴重。真正成為 VR 最流行應用的是《Beat Saber》，一個拿光劍砍方塊的音遊，當時沒有人預測到這一點。

事後分析，邏輯非常清楚。卡馬克承認自己嚴重低估了手柄的重要性，他原本以為拿著遊戲手柄、能自由轉頭看，就已經很震撼了。但手柄一旦要做複雜操作就開始出戏：比如去撿一副眼鏡，系統提示你靠近之後按下 grip 鍵，眼鏡就吸到手上來了。這類不自然的動作會持續提醒你"這是虛擬的"。

《Beat Saber》把所有弱點都藏起來了。**你手裡始終握著一個實體手柄，全程不鬆手；你揮劍砍東西，本來就不該有碰撞反饋，手不會穿模到桌子底下；音樂和節奏本身就是 VR 的強項，因為它把外部世界隔絕掉，用聲音重新構築了一個空間。**它還能跑在效能很低的移動晶片上，一局只要三四分鐘。VR 頭顯戴久了會不舒服，移動版有電池限制，站著不動沒有暈動症，一局短得可以隨時開始隨時結束。所有約束它都順著走，最後還附贈了一個沒人預料到的功能：健身。

卡馬克給 VR 定過一句聽過的人很多的話：應該讓頭顯裡的世界比外面更好。這句話被不少人當成反烏托邦宣言。他的反問是：如果頭顯裡的世界比外面好，那這個戴上頭顯的人的生活就是被改善了的。理查德·布蘭森的私人島嶼不可能每個人都有一座，但虛擬世界裡的私人島嶼可以。現實裡很多資源是競爭性的，用掉就沒有了，虛擬世界不是。

他真正的關注點是遠端會議。Quest 上的 Workrooms 打影片電話，語音延遲比 Zoom 好不少，你能感受到一點點"在一起"的存在感，但整個流程的粗糙程度還差得遠。Zoom 之所以成功，是因為他們把易用性打磨到極致。VR 現在的狀態是，你想邀請朋友進房間，得點五倍的次數。他要的是"點一下，一切就位"。

> 要真正取代 Zoom，你得讓所有人都有這個東西。所以它必須便宜。貴和功能多會帶來重量，這是個惡性迴圈。（約翰·卡馬克）

他一直是移動端 VR 路線的支持者，對高階 PC 頭顯一直不太感冒，因為輕和便宜會形成正向迴圈。

## 大公司的效率問題

被問到為什麼大公司做不出好用的介面，卡馬克說他之前對"資源浪費"的基準線是軍工專案。他見過一個空軍專案燒掉五千萬美元，一件東西都沒造出來，只有一堆檔案和倉庫裡的零件。到 Meta 之後，他得徹底重新校準這個感覺。

Reality Labs 每年燒掉一百億美元，這個數字本身讓他胃裡發緊。他也承認 VR 這些年做成了想做的事：一臺獨立的、內向外追蹤的、4K 解析度、還能插到 PC 上跑高階的頭顯，就是 Quest 2。但同樣的成績，很多外部小團隊用十分之一的人就做出來了。

大公司有它必須承擔的東西：內部 SDK 的複用、跨職能會議、隱私、安全、家長控制、多元和公平。小團隊可以撒野。但卡馬克說他不能相信大公司已經把效率做到了極限的四分之一。**他最欣賞的是那種敢到處跳的人，敢跑去重寫核心、改發行版、刷韌體，只為了把一件事做對。幾千個工程師裡，這種人只有一小撮。**

## 核裂變，還是通用人工智慧

離開 Oculus 的日常崗位後，卡馬克在兩個方向之間做選擇：便宜的核裂變，或者通用人工智慧。

他說核能現在的處境，像極了 SpaceX 出現之前的航天。物理規律沒變，所有讓核電站變貴的原因都不是根本性的。核燃料本身便宜到只佔電價的百分之幾。**於是你可以做一個效率只有現有系統五分之一、但整個電站便宜十倍的方案，依然是巨大的突破。**他甚至設想過直接裂變能量轉換、裂變碎片轉換，繞開蒸汽輪機那一整套複雜昂貴的東西。

但那條路要跟監管打交道，要建一定規模的團隊，有一堆他不喜歡的跨部門事務。

AGI 那邊是另一個畫面。卡馬克說他不是瘋子才講這句話：通用人工智慧的程式碼很可能只有幾萬行，離幾百萬行差得遠。這種東西一個人有可能寫出來，而寫一個新的瀏覽器或作業系統，一個人基本做不到。

他的賭注更具體：剩下沒被解決的關鍵洞察，他估計不到六個，每一個都能寫在信封背面。它們是什麼沒人知道，但一旦湊齊，配上現在這個規模的 GPU 和海量資料，就能造出行為像人的東西。

2022 年他說的是 2030 年之前有 50% 機率出現"生命跡象"，現在他把這個數字提到了 55% 到 60%。

## 為什麼不會有快速起飛

卡馬克不相信"智慧爆炸"式的快速接管，理由非常具體。

起點大概需要幾千張 GPU。你去雲上訂一千張 GPU 的例項試試，那不是隨手能開出來的量，背後是資料中心，資料中心要幾年才能蓋起來。他聽過有人抱怨機房網線全接錯了，花了一個月才拆掉重接。

至於"逃逸到網際網路上接管一切"，他認為這個想法本身就不成立：**不管你多聰明，TCP 連線速率就擺在那裡。而且這類系統會是圍繞特定晶片和互聯架構專門設計的，不可能原樣搬到別的地方跑。**

真正的實現可能小到能塞進一個 U 盤，這點確實像間諜片。但你偷走了程式碼，還得建起配套的資料中心，還得為它準備一整套成長課程，它才有價值。

他對"生命跡象"的定義也很清楚：一個學習障礙的幼兒。它能跟最喜歡的電視節目互動，能玩遊戲，能用明顯像人的方式學習。到這一步之後，就可以放一整支工程師、認知科學家、教育專家進去，做回滾、做 A/B 測試、給不同課程做黃金路徑。**到了那一步，這件事就基本是註定的。**

他不認同給機器裝上身體是必經之路。他的整個職業生涯都在做虛擬世界，他相信模擬環境能提供真實環境的大部分價值，而把自己綁在真實物理世界裡，等於往腳踝上拴一塊大石頭。航天工作給他的教訓之一就是：現實這東西很不講理，機械部件什麼都可能壞，第五次做的東西還是會跟你預想的不一樣。

他給自己設了一條約束：系統必須能實時執行，最好能在一個 Zoom 會議裡跟人對話。不只是你來我往地敲字，而是有狀態、有記憶的對話。他說這比機器人身體更快地說服人，雖然他自己其實不太在意能不能說服人。

## 孤獨是一片海

主持人提了一個和卡馬克的技術判斷相反的可能：價值可能先長在陪伴上，智力是後面的事。世界上有一片望不到邊的孤獨。一個好的朋友不需要多聰明，它需要的是共情能力、情緒理解、記住你說過什麼、以及真的在聽。

卡馬克沒有反對。他說很難找到什麼東西不能被拆成某種窄人工智慧去解決，這裡面能挖出萬億美元級別的價值，而且很多用"障眼法"就能做到，不必等到真正的通用智慧。

關於意識，他認為大部分爭論沒有意義。他傾向於"群魔亂舞"式的解釋：大腦裡大量聯想記憶的片段在隨機漂移，噪聲疊加在訊號之上，某個時刻達成共識，浮上來就成了一個意識到的念頭。那點隨機性正是想象力和創造力的來源。意識只是大腦運轉時的感覺，沒有獨立於基質之外的神秘。

至於死亡和期限，他承認這是個有意思的角度，但不認為它是關鍵。獎勵訊號最終會由我們自己定義。沒準那一小撮待解決的關鍵問題裡，真的有一條是關於"總獎勵必須是什麼"。

## 六十小時、Diet Coke 和四英里

卡馬克的工作方式裡沒有通宵這一項。他說自己的腦子大概十二個小時之後就開始變成漿糊。但他每週工作六十小時，一天十小時，一週六天，這種節奏持續了幾十年，而且一直要保持有效率。

年輕沒孩子的時候，他用的是每天往後推一小時的作息，可能下午兩三點才開始工作，一直幹到後半夜。後來要送孩子上學，作息才被強行拉正。他至今還在拿自己做實驗，最近發現的問題是把四英里的跑步或走路安排在傍晚，洗澡、收拾，在一天中間挖出一個洞，洞裡那兩小時效率不高。他剛把運動挪到了早上。

有意思的是他對睡眠的態度。他從來堅持睡夠八小時，理由是睡不夠的時候自己乾的活更差。他不認同那種"逼自己更狠、起得更早"的信條。

關於工作時長這件事他在網上吵過很多架。他的論證方式很具體：假設有顆小行星要撞地球，你希望 Elon Musk 和 SpaceX 那批造攔截器的人下午五點準時下班嗎？新冠期間那些連軸轉的醫護和疫苗研究者，是不是因為多幹了幾個小時反而把事搞砸了？

> 他們一般會誤讀資料。你第八小時之後的邊際產出確實低於巔峰時段，但那不等於你少幹了活。真正開始幫倒忙的點，不在八小時，也不在十小時或十二小時。（約翰·卡馬克）

他覺得更長的工作時間不只是堆時長，還會反過來塑造你。**當你連續幾個月把注意力壓在同一件事上，這件事會滲進你這個人裡面，你在巔峰時段的能力本身就被抬高了。**

說到吃，他是徹底的實用主義。年輕時在 id Software，他每天叫一份披薩，外賣員認得他的名字，多年後才知道對方一直沒給他漲價，用的還是六年前的選單價格。飲料是 Diet Coke，到現在每天八九罐。他的說法是：把罐子拿起來，啪一聲拉開，好了，現在開始幹活。

## 關於工作這件事

他回到大學做畢業演講時說過一句話：他走的那條路未必適合所有人。他的路徑是關於深度的，是真的把一個東西從裡到外搞懂，從而具備系統層面的判斷力，能看出哪些低效可以被繞開。

但世界上大部分人不需要這麼做。他們需要的是把分到自己手上的那小塊做好、可靠、讓人能依靠。這本身完全成立。

真正想說的是另一件事：**你不可能什麼都懂，但你得說服自己，任何一件具體的事你都能懂。因為每一件事都是人做出來的、人發現的，所以你可以學會它，而且可以學得很深。**

他把這種能力叫"把好奇心武器化"。就算一件事乍一看完全不吸引你，它也一定有層次和複雜度，裡面藏著機會。他說自己做遊戲是因為熱愛遊戲，但他覺得自己去做作業系統或者資料庫，同樣能一頭扎進去。

關於墓誌銘式的問題，他的回答很乾脆：他不太想這些。他說自己是個異常值，衰老、死亡、留給孩子什麼遺產，這些東西很少真正進入他的思考。唯一受影響的，是他選問題的尺度。核裂變和 AGI 都是能影響世界上相當大一部分人的事，他隱約覺得自己還能以滿狀態全力揮棒幾次，之後認知能力會自然衰退，那時大概會去做些懷舊的復古程式設計，像在程式碼世界裡種花的老頭。

至於生命的意義，他也不怎麼操心。人類是進化碰巧造出來的生物，帶著進化刻進去的求生和繁衍驅動力。他說他不明白為什麼那麼多人在這件事上反覆煎熬。

他更相信梯度下降式的活法。**最聰明的那些人裡，有很多會頑固地抗拒一個事實：真正通向最好答案的，往往是一小步一小步跟著區域性資訊往前挪，宏大的全域性視野反倒幫不上什麼忙。**

## 要怎麼開始

- 給自己寫一個 .plan 檔案。每天記下今天在做什麼，做完的畫個記號，隔一陣往裡塞一點零碎的思考。幾個月後你會在裡面看到自己的軌跡，別人也會看到。
- 用偵錯程式跑你的程式碼。寫完第一件事是打斷點單步走一遍，別指望腦子能在推演裡復現整套執行時狀態。工具越順手，你越會真的去用它。
- 在程式碼裡堆斷言。凡是"到這裡必須成立"的地方就寫一條。它不是給今天的你寫的，是給半年後世界變了、而你忘了當初假設的時候寫的。
- 能固定上限的結構就別做成無限增長。讓程式在世界超出你預期的時候主動報警，別讓它悄無聲息地慢成另一個樣子。
- 別混語言，除非有極其明確的理由。一個專案一種語言，讓所有人都能跨過邊界去做任何一部分。
- 把"這件事賣給了誰、他為什麼願意用"放在技術自豪感之前。對自己手上一段精妙的程式碼有成就感沒問題，但判斷標準應該是它給別人創造了多少價值。
- 別發明虛構使用者。你手上已經有真實使用者了，哪怕是很小的一個群體，去跟他們說話，看他們的行為資料，別在會議室裡編 Alice 和 Bob。
- 想清楚你做的事裡，哪個約束其實可以放棄。卡馬克所有的大招，幾乎都來自找到一個"你以為需要、其實不需要"的取捨，用一處的讓步換來另一處的巨大空間。
- 挑一件你能連著做幾年的事。八年時間足夠把一個領域從陌生讀到能上手做實驗，這一點對寫程式碼的人、對做運動的人、對任何一門手藝都成立。
