约翰·卡马克:Doom、Quake、VR、AGI、编程、电子游戏与火箭
John Carmack: Doom, Quake, VR, AGI, Programming, Video Games, and Rockets
id Software 创始人回顾《Doom》《Quake》的开发历程,聊编程、VR 头显、AGI 与火箭事业。
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。
- 想清楚你做的事里,哪个约束其实可以放弃。卡马克所有的大招,几乎都来自找到一个"你以为需要、其实不需要"的取舍,用一处的让步换来另一处的巨大空间。
- 挑一件你能连着做几年的事。八年时间足够把一个领域从陌生读到能上手做实验,这一点对写代码的人、对做运动的人、对任何一门手艺都成立。
本集资源与出处
- 视频在 YouTube 收看
- 音频官方 MP3 直链来自 lexfridman.com 官方播客 RSS
- 官网Lex Fridman 官网本集页面