戴夫·普拉默:编程、自闭症与老微软往事
Dave Plummer: Programming, Autism, and Old-School Microsoft Stories
前微软工程师回忆开发任务管理器与 Windows 的年代,也谈编程这门手艺与自闭症带来的视角。
Windows 任务管理器每个月被大约 20 亿人打开。它的第一版是 87KB。
戴夫·普拉默(Dave Plummer)写它的时候,是在自己家里写的。那时候他刚进微软不久,白天在 Shell 团队改 bug,晚上回家打开编辑器,从注册表的 HKey Performance 里读性能计数器,因为他没有内部 API 的权限,而他又不愿意在家里调用内部接口。
后来这个程序被收编进 Windows NT 4.0,成了几代人的肌肉记忆:电脑卡了,Ctrl+Shift+Esc,看看谁在吃 CPU,把它杀掉。这个动作太自然了,自然到没人会想它是谁写的。
他想给那台机器下英文命令
1979 年,十一岁的普拉默骑着自行车去当地的 RadioShack。柜台边堆着一摞箱子,标签上写着“computer”。店员说刚进货,还没装。他说那我帮你们装。
“我完全不知道自己在干什么。它不比一台组合音响复杂。问题在于 Tandy 公司用同一种五针 DIN 接口做电源、视频和磁带机,插错了就炸。”(戴夫·普拉默)
他照着标签接好线,机器亮了。接下来他做了一件很有代表性的事:往 BASIC 解释器里敲英文句子。PRINT 2+2 能用,别的就不行了。他不理解为什么更“正常”的英文反而不行。
那台机器是 TRS-80 Model 1,Level 1,4K 内存。同一个时期,Commodore PET 2001 和 Apple II 相继问世。普拉默今天把“史上最伟大的电脑”这一票投给 Commodore 64,理由是销量,跟设计无关。他的判断标准很朴素:一台机器影响了多少人。
他用十六进制手写了一个 Galaga
他的第一台 Commodore 64 是被他烧坏的,准确说是软驱。机器不是从大零售商买的,没有保修,得寄回德国修。于是他只剩一台磁带机,和一个从磁带加载的机器码监视器。那个监视器带反汇编功能,但没有汇编器。
所以他直接在十六进制里敲 6502 指令码。
他做的第一个东西是 Galaga 的克隆。敌人会随时间推进,逻辑完整,纯手工机器码。6502 的代码没法重定位,想往中间插一段,只能跳到别处执行完再跳回来,代码结构惨不忍睹。但它跑起来了。
然后他做备份。
他把空白盘复制到了数据盘上。几周的工作,一张盘,一个方向搞反的操作,没了。
“我当时有很强的负罪感。你毁掉了几周的工作,而且你知道这是因为你着急了,或者做了个蠢决定。”(戴夫·普拉默)
这是他的第一次数据管理课。他今天还记得那种感觉,说明这堂课上得够狠。
辍学是一个过程,由一百个小决定累积而成
他高中辍学了。他自己强调,辍学没有“那一刻”。
“没有哪一刻你决定辍学。你只是去得越来越少,少到有一天你意识到,现在出现会很尴尬,因为我已经很久没去了。然后很快你就彻底不去了。”(戴夫·普拉默)
他说的这个机制值得每个人警惕。你每天做的是一个小决定:“今天不去上课。”但这个决定重复足够多次,就变成了一个大决定,而这个大决定你从来没在清醒的时候做过。
然后他在 7-Eleven 上夜班,也在油漆仓库干过。7-Eleven 的夜班要做账、做行政,店长倾向于安排脑子够用的人,但这个人得有个人理由必须留在 7-Eleven。他没有高中毕业证,正好符合。
他形容那份工作里最难受的部分是量油,被持刀抢劫反倒排不上号。
一根十五到二十英尺长的木杆,刻度是英寸和英尺,没有电子传感器,你得把它捅进地下油罐再拔出来,看油面停在哪个刻度。第一次他滑手了,重新抓了一把,零下四十度,一手木刺。
“我意识到我不想一辈子干这个。然后我想到‘下次我要换个方式拿’,三秒之后我又意识到这想法多荒唐。”(戴夫·普拉默)
二十一岁,他去找本地高中的校长,问能不能回来。校长说不行,你年龄超了,也没位置。他说,从现在到开学之间,总会有人辍学,位置就有了,那我们假设位置有了,我能回来吗。校长让他回来了。他补了三到四门课。
进了大学,第一学期他仍然没当回事。几何 90 是给没修过十二年级几何的人开的补修课,他以 1% 的差距被教授放行。因为补修课成绩不计入成绩单,他等于白捡了一个新起点。第二个学期开始,他为自己学,结果完全不同。
他翻遍注册卡,找微软的邮箱
大三暑假,他在电话公司做 UNet 到 TCP/IP 的迁移。听起来宏大,实际工作是换卡,然后搞清楚为什么客户的 config.sys 改完之后 Lotus 跑不起来了,因为可用内存少了 10K。他形容那是做计算机工作最糟糕的年代。
午休时他在美食广场读一本讲微软怎么诞生的书。他读得入迷,觉得那就是他想去的地方。但他在萨斯喀彻温省,能做什么?
他大学是靠一款叫 HyperCache 的软件读完的。那是 Amiga 平台的文件系统缓存,机器出厂不带,他自己写,用 C 加 68000 汇编,卖了两千多份,单价二十到四十美元。那时候买软件要寄回四乘六英寸的注册卡,上面写名字、地址、邮箱。
他把整摞注册卡翻了一遍,找微软后缀的邮箱地址。找到三四个,挨个冷邮件发过去。
其中一个人叫阿拉斯代尔·班克斯(Alasdair Banks),回信说有个人可以介绍给他。那个人叫本·斯利夫卡(Ben Slifka),电话面试之后,决定招他去做 MS-DOS 的暑期实习。
这套路径今天几乎无法复制。一个没有文凭、在加拿大中部、靠卖 shareware 为生的年轻人,通过翻注册卡找到了进入微软的门。但它背后的逻辑是通用的:先做出可以展示的东西,再拿着这个东西去找人。
他眼中微软最可怕的地方,是人
“那是我参与过的最强的一群聪明人的集合。你在普通计算机公司上班,那个真正懂行的人,他那个更聪明的朋友,多半在微软上班。”(戴夫·普拉默)
他在访谈里讲这个感受的方式很实在。你从小地方来,是当地的大拿,觉得自己懂很多。到了那儿,第一个反应是不敢说话,怕显得蠢。
关于比尔·盖茨,他给的评价没什么神话色彩:盖茨对“每家每户桌上一台电脑”这一个念头 relentless 追逐,雇比他更聪明或至少一样聪明的人来执行,搭出一台几乎停不下来的智力机器,然后去卖非常简单的产品。
MS-DOS 按他的说法,一点都不复杂。它就是命令行启动器:你输入命令名,它去当前目录和 PATH 里找,找到就加载进内存执行。加一点环境变量,一点脚本语言,能访问硬盘和 CPU,不能多任务,没有图形界面。90% 的 DOS 就是这回事。
但这恰好是那个市场需要的。微软跟 IBM 谈成了每台 PC 都预装 DOS,收费不高,却拿到了一个用了几十年的标准位。这里面的运气成分和眼光成分,普拉默都承认。
640K 是一个责任,不是一句名言
“没人会需要超过 640K 内存”这句话不是盖茨说的。普拉默直接否掉了这个流传几十年的梗。
但 640K 这件事本身,他讲出了开发者视角的重量。x86 实模式的内存上限摆在那儿,你作为操作系统开发者,用掉的每一 K,用户就拿不到。你无谓地用掉 10K,全世界每一台机器就少 10K。这是一种很具体的责任感,跟今天动辄几十 G 的运行时环境不在一个尺度上。
他在实习期做的第一件正事,是给 SmartDrive(磁盘缓存)加上 CD-ROM 缓存。光盘刚出来,微软 Bookshelf 是少数能跑的产品,缓存做得好,速度能快几十倍。更麻烦的活是把 SmartDrive 和后来的 DoubleSpace 压缩引擎搬进高位内存。
x86 上有个 A20 地址线,控制内存指针在 1MB 处回绕还是继续往上。你可以把段寄存器和偏移组合成超过 1MB 的地址,从而多拿到 64K,把代码放在那里,低端内存只留跳转桩。他们靠这招给几个产品多榨出 64K。他当时完全不懂 HIMEM 是什么,因为他是 Amiga 程序员,来微软之前没写过一行 x86 代码。
移植代码像闯进别人家翻抽屉
“这就像闯进别人家,翻他们所有东西,看到他们不想让你看的抽屉里的玩意儿。你会发现墙上的好画,也会在床头柜里发现一些让人不适的东西。”(戴夫·普拉默)
他参与把整个 Windows 95 的用户界面移植到 NT 上。核心工作之一是全部转成 Unicode,每个 8 位字符变成 16 位。他形容代码切换完之后是一片混乱。
他看到了宽度 200 字符的行,里面夹着脏话。这些东西后来几年里被清理干净了,但当时的代码水平说不上多专业。
这件事的另一面是:你写的每一行代码,都有人要一行一行读过去。包括五年后的你自己。普拉默说,这就是程序员的宿命,你写的时候以为没人会看,实际上会被非常多的人看到,而且是最挑剔的看法,因为他们正在找 bug。
NT 是另一套故事。微软从 DEC 挖来了戴夫·卡特勒(Dave Cutler),他在那边做过 VMS 和 RSX-11。DEC 西海岸的 Prism 和 MICA 项目被取消,整个团队一起过来了。所以 NT 是一个全新设计,起点是 OS/2,但 OS/2 是汇编写的,NT 要用 C 写,具体借鉴了多少,普拉默说他也不清楚。
他给卡特勒的定位很干脆:内核的架构师。Linux 世界里是林纳斯,Windows 世界里是戴夫·C。
“这人聪明得可怕,但他也像个农场主。他会跟在你后面,确保活儿干完了,而且干对了,确保你没往他的操作系统里塞垃圾。他不容忍这个。”(戴夫·普拉默)
他今年八十五岁,还是微软 Fellow,据说每天仍然写代码,仍然去上班。
他输过一场架,至今不服
移植时他们在 MIPS 机器上干活,RISC 架构不允许非对齐地址访问。而 Windows 的 ID 列表是把 C:\、Windows、System32 这些组件拼起来的字符串表,字符数一变成奇数,后面所有数据的地址就错位了。
从非对齐地址读字符串,要么开异常处理器逐字节复制,要么付出极大代价。他在邮件列表里主张:干脆保证 ID 列表永远是偶数长度,或者用个 hack 强制对齐,这样所有引用它的代码就能全速跑。
争论升级成人身攻击级别的对吵。他输了。
“我今天仍然知道,Windows 里那段代码比它本该有的速度慢几千倍。没人在乎,因为已经够快了。但它本可以快得多。”(戴夫·普拉默)
他讲这件事的语气里没有怨恨,更多是那种工程师特有的、对某个技术判断长期不服气的执拗。二十多年过去,他还记得。
这类争论他也见得多。两个聪明人吵到最后,技术优劣变成次要的,赢过对方变成主要目标,这时候讨论就不再产出任何东西。
他们那时候调试,全程看汇编
半天时间在调试,而调试的大部分时间花在纯汇编的调用栈上。没有源码级调试,你可以在旁边看源码,但屏幕上永远是机器吐出来的汇编转储。
更麻烦的是同时支持四套指令集:Intel、MIPS、Alpha、PowerPC。机器在哪套平台上崩,你面对的就是完全不同的寄存器和指令。他在 MIPS 上经验多,所以 MIPS 的活儿会流到他这儿。
这活儿在今天是难以想象的耐力消耗。他说自己职业生涯里 20% 在创造,80% 在调试和修东西。他有点修理工的名声,所以他总能接到这类活。
他讲了一个和任务管理器有关的 bug。程序偶尔会显示 CPU 总占用超过 100%,这对一个任务管理器来说非常难堪。他加了一堆断言,确保加起来之前每一项都不超 100,最后总和也不超 100,结果断言一次都没触发,用户那边照样能看到。
最后他把自己的电话号码写进了断言消息里:如果你看到这条消息,打 425-836 找 DavePL。
后来压力测试的调试器真的抓到了,问题出在内核的计数逻辑,不在任务管理器。内核那边改了。电话本该删掉,他们只是注释掉了。
“所以它就这么发布了,现在网上泄露的 NT 源码里到处都是。我找任务管理器代码的办法,就是在谷歌搜我的电话号码。”(戴夫·普拉默)
他对断言有一套近乎宗教的态度:
“我不去断言我希望不成立的事。我断言我知道不可能成立的事。这才是断言的本意。一旦它触发,那就是 bug,绝不能当成一条可以忽略的提醒。”(戴夫·普拉默)
他也知道很多人不敢加断言,怕它真的响。他的比喻是:你在路口转弯,觉得可能有车来,但你不往左看,因为你不希望有车。不敢断言,本质是不想知道真相。
他强调断言要长在代码里,不是事后补上去。写到某个函数,你知道这个指针不可能为空,那就断言它;你知道计数永远小于两倍字节宽度,那就断言它。
那个 87K 的程序,是从家里长出来的
任务管理器的起点是他自己想要一个东西:看清哪些程序在吃资源,哪些卡死了,然后能杀掉。他在家写了基本功能,用的注册表性能键,因为在家不能调内部 API。
收编进公司之后,他才能调 NtQuerySystemInformation 和 NtQueryProcessInformation,直接拿到真实数据,这让程序变得极快、极灵敏。
他从来没把功能多当目标。功能就是那一套,他想要的都有了。他要的是绝对的健壮,和绝对的小。第一版 87K。
做到这个体积的手法今天看有点硬核:完全不链接 C 运行时。他确保自己不调用任何运行时函数,也不链接它们,省下大约 96K,那几乎是程序本身的大小。代价是他得手动从分派表里调用所有对象构造函数,因为没有运行时会替他做。
不卡死的关键是不做假设。你调 Shell 去启动一个程序,那个路径可能在某台 TCP/IP 共享上,超时要等 90 秒。所以任何可能耗时的 API 调用,都得放到单独的线程里。程序因此变得多线程,复杂度上去了。
他还顺手发明了一遍汉明码。任务管理器的每一行每一列都有脏位,他通过行列两个方向的脏位反查哪些单元格需要重绘,配合 ListView 控件做到只重画变化的那一格。所以它能画得极快,缩放极其顺滑。缩放是他个人给这个程序定的最大目标:拖到任何尺寸都不崩,即使有 32 个 CPU(那个年代不可能),它会画八张图然后循环,今天还能跑。
这些代码今天大部分还在。上面叠了深色模式、XML 配置、GPU 和温度监控,体积从 87K 变成四兆。
“这就是我们生活的世界。”(戴夫·普拉默)
扫雷和纸牌是鼠标教程
这两款内置游戏放进操作系统,充当的是教学工具。纸牌教你拖拽,扫雷大概率是右键,每一个都在教你一个操作。普拉默说得很直白,这是给新用户熟悉鼠标用的教具。
结果一整代人在这上面耗掉了无法统计的时间。
太空军校生弹球(Space Cadet Pinball)是他另一段经历。有人走进他办公室问他接下来三个月想干什么,他说不知道,对方问要不要移植弹球。当时 NT 需要一个视觉展示,证明它能跑高速图形或者至少是响应灵敏的图形。
麻烦在于原版大量代码是汇编。他在 MIPS 机器上,只能先全部改写成 C,才能往各平台移。游戏核心是一个巨大的状态机,他记得大概是五十个分支的巨型 switch。里面还有彩蛋。他把这块当黑盒处理,自己的代码在上面做绘制和声音。
有个细节他一直被问到:为什么移植版的物理跟 Windows 95 原版略有不同。答案是 bug。他按每秒能画多少帧就画多少帧,在现代机器上弹球能跑到五千帧,于是物理被插值了五千次,而原来只有三十次。结果物理反而变“好”了,或者说至少不一样了。后来这个问题被修掉了。
他把一栋房子的照片贴在显示器上
1993 年,他和妻子开车在附近看房。有一栋三层卧室的房子,车道上停着一辆 93 年款红色科尔维特敞篷,售价三十万美元。他拿不出三十万,连首付都拿不出。
他拿了传单,剪下房子的照片,贴在显示器上。
晚上回家他做两件事:一是释放白天修 bug 时无处安放的创造力,二是挣点外快。他照着一份 MSDN 的示例写 Shell 扩展,做出一个能在资源管理器里打开文件夹的东西,然后往里加 ZIP 支持。每一步都是增量。
他把它当 shareware 卖,19.95 或 29.95 美元,卖了几百到几千份。
某天早上他准备上班,接到一个电话。对方问,你是戴夫·普拉默吗,你是写 Visual ZIP 的那个人吗。他说是。对方说,我是微软的贝琪,我们想收购它,你能来谈谈吗。
他问,你在哪栋楼。
对方愣了。他说我过来一趟就行。对方说不行,得先联系差旅,联系法务,要走流程。来回几句之后两个人才反应过来:贝琪不知道他就在微软上班。他们是照着作者信息冷电话打过来的。
他接受了报价。理由很实际:不接受的话,要么继续卖自己的版本然后辞职,要么停卖然后继续上班,两个都不好。
然后他买了一辆二手的 93 年红色科尔维特。
收编进 Windows 之后功能砍了不少。加密去掉了,因为那个年代加密算法算军需品,不能随便往操作系统里塞。多卷支持也去掉了,为了简化。
ZIP 本身的来历他也讲了。BBS 时代,人们用调制解调器拨号下试用软件,需要压缩。可执行文件大概能压到一半。一个叫菲尔·卡茨(Phil Katz)的人做了 MS-DOS 上的命令行工具 PKZIP,从此在整个 PC 行业无处不在。Windows 出来的时候,市面上已经积累了十年的 ZIP 文件,系统却打不开,这就是内置支持的动力。
这套代码今天还在用。他补了一句:它是单核时代写的,完全没有多线程。你有一块 96 核的 7995,解压时它只用其中一个核。
激活是他做的,他知道这东西招人烦
Windows XP 快发布时,原本负责把 Office 的激活机制移植到 Windows 的人一再延期,做不完了。普拉默有“能快速修好东西”的名声,于是被找上门。
他带着做 DRM 的团队和做产品密钥数学的研究人员,赶在 XP 发布前做出来了。
他也承认这东西烦人,尤其是电话激活。你得把硬件参数(内存、硬盘、绑定的各种硬件特征)和产品密钥一起编码成字母数字,让人在电话里念出来。
“你要是觉得电话激活很痛苦,想想在电话另一头干活的人是什么感受。连着八小时听产品密钥,那是份能把脑子磨平的工作。”(戴夫·普拉默)
操作系统不该成为对手
话题转到 Windows 11 的任务栏。他做过一期讲“为什么任务栏不能移动了”的视频,反响极大,愤怒是实打实的。
他给的解释不站在用户这边,也不站在微软这边。可以移动意味着渲染、布局、标签页排布的所有代码复杂度上升,bug 面变大,代码量变大,可能需要多一个开发者或者某个开发者的一部分时间。问题是,为了满足一小撮用户的小众需求,到什么程度还值得。
莱克斯·弗里德曼(Lex Fridman)的反驳是:VS Code 什么都能配,为什么开始菜单不行。这种对小众需求的照顾会形成声誉,会形成一种“这里每个细节都被认真对待”的气场,对招人也有好处。
普拉默的猜测是排期决策。重写开始菜单的时候,砍掉左右上下、双行标签这些特性,能提前四个月交付。他不认为这是对的决策,但很可能是真实的动因。
他提了一个更根本的问题:你希望操作系统是你的对手吗。Windows 有时候给人的感觉就是这样,它不站在你的利益这一边。
莱克斯举的例子很具体:登录时不想用微软账户,系统把这个过程设计得像在骗你,你得反复点“跳过”,还要确认“你确定吗”,一个界面的意图变成了让你做不到你想做的事。
普拉默补了另一个:升级时的“使用推荐设置”。听起来像该选的,实际上会把你重置回 Edge 和一堆别的东西。推荐是给他们推荐的,跟你没什么关系。
“我宁愿每年付 199 美元用 Windows Pro,或者一个月 20 块,别再往上推销,别把我的数据变现。”(戴夫·普拉默)
老虎机的真相
他玩老虎机,明知整体是亏的,但那些强对比色和灯光对他是实打实的多巴胺盛宴。
机制他也讲清楚了:机器内部有个黑盒,只干一件事,生成下一个随机数和对应的赔付结果。然后游戏说,我得编一段电影来配合这个结果。三个 7 还是别的什么,跟结果没有因果关系。转轮停下、看落在哪儿、再判断你赢没赢,这个顺序是颠倒的。
至于跑什么代码,他不知道。他试过接触,很难。都是基础 Windows PC,架在某种他不知道细节的安全飞地里。
他还讲了七十或八十年代拉斯维加斯的一个技术员,自己烧 ROM,把后门写进去,借着维修的机会换上自己的 ROM,半年后回来触发。
他给一台 PDP-11 装了四个兆内存
这几年他的特殊兴趣是老硬件。他修 1960 年代的肌肉车和卡车,也修 PDP-11。
他攒了多年零件,决定装一台他能装出来的最好的 PDP-11,就像给 PC 超频那样把一台小型机拉满。四个兆内存,那个年代是天文数字。上面是 PDP-11/70 的控制面板,下面两个机箱,旋钮控制 LED 显示哪条总线,你可以暂停机器,用开关改地址,往内存里塞数据。
灯的驱动不是现成的。他得重写 BSD 内核才能让灯按他想的方式闪。加一块新磁盘控制器,就得重新编译内核,就得去翻源码找设备驱动的位置。
他现在对 BSD 内核已经相当熟了。
GitHub Primes:用一百种语言写同一个算法
他有个项目叫 GitHub Primes,同一个素数筛算法,用大约一百种语言实现,规则统一,每晚跑一次基准测试,看谁快。
规则很硬:必须是素数筛,每个整数最多用一位,不能用一字节,因为那样更便宜也更容易。内存分配必须在计时循环内。每个实现装进单独的 Docker 容器跑,多核全开,五秒内尽可能多次筛到一亿。
有些语言做不到,比如 6502 只有 64K,筛不了一亿,那些就当表演项目跑。
他最初只写了 Python、C#、C++ 三个,发了期视频,然后别人往里扔实现,扔到失控,现在由欧洲的两个人接手维护。
目前的榜首是 Zig。C++ 那边优化一下能领先一阵,然后 Zig 的人不服气,回来再改快一点。这是一场没有终点的接力。
他用 Lua 加 Python 教 AI 打 Tempest
Tempest 是 1980 年的 3D 矢量街机游戏,360 度移动,屏幕上最多八发子弹,十一种敌人,还有尖刺。普拉默在这个游戏上持有世界纪录。
他先把 ROM 从机器里取出来逆向,搞清楚代码在内存里怎么分布、零页变量在哪、哪些位置有意义。然后写一个 Lua 程序,在游戏运行时把这些内存位置读出来当特征,通过 socket 送给 Python 那边,Python 做强化学习,用的是 dueling Deep-Q,两个网络互相追逐。
现在 AI 能打到第 36 关,比大多数人强,但那游戏一共 96 关,路还长。
他说得很实在:目标是想打赢他自己。
他的大脑一次只做一件事,但做得极深
自闭症的核心理论叫单otropism,普拉默的解释是:他的大脑做一件事,做得非常投入,做完了再换下一件。他不是多任务处理器,是彻底的串行单任务者。
好处是可以在一个任务上投入惊人的专注和坚持。前提是这件事他得喜欢,得有回报,得能看见进展。他说这感觉跟小孩玩火车是一样的。
坏处是他同时有相当程度的 ADHD。获取专注本身是难点,他极容易被分散,睡觉要戴降噪耳机,或者干脆睡不着。但一旦进入状态,很难被打断。这两件事同时存在,听起来矛盾,实际上是一个门槛极高、进去之后极难出来的房间。
更大的困难是:他不知道别人在想什么。
“我知道如果我是你,在这个位置,我会怎么想。这是我所能做到的全部。大多数神经典型的人会有一种感觉,莱克斯大概是这么想的或者那么想的,因为他的举止是这样,反应是这样,表情是这样。这些对我来说全都丢失了。所以我给每个打交道的人跑一个代理 NPC 小游戏。”(戴夫·普拉默)
电话对他格外难,因为只剩声音。FaceTime 好得多,因为对方讲完笑话可能会笑一下。在电话里他分不清你是讽刺还是认真。
字面理解也是一部分。他小时候爷爷给妈妈在厨房做花架,用了很大的角铁,五岁的他问这够不够结实能托住花盆。爷爷说,够托住一匹马。他当时非常困惑:为什么要把马弄进厨房,为什么要把马放在花架上。
他和妻子结婚三十一年,在一起三十七年。他们最早意识到彼此不同,是一天晚上坐在车里,看着对面那栋房子,砖柱之间用锚链连成围栏。他盯着那些两英尺见方的柱子想,这是空心的还是回填了混凝土。妻子看着他,说,你脑子里为什么会有地方关心这个。
他在比尔·盖茨面前纠正了“三个月”
第一个暑期实习,盖茨把所有实习生请到家里吃汉堡喝啤酒。他的导师本带他去介绍。
本说,这是戴夫,我们从加拿大来的实习生,四个月里他做了这些功能,还写了 SmartDrive 的副本,然后开始列他做过的事。
他打断了。
他说,其实是三个月。
两个人都愣了,对视了一眼。他当场意识到,这个时机不对。
“小地方的不准确会把我逼疯。”(戴夫·普拉默)
他现在的说法是,自己比过去好多了。以前他不知道,也不知道在对话里毫无意义地插一句纠正会影响对方、让对方有什么感受。现在他有更好的判断力了。
十秒测试,和十把椅子
他设计过一个粗糙的自测。第一个问题:对一个社会整体而言,合作和创造力哪个更重要?多数神经典型的人倾向合作,谱系上的人倾向创造力,倾向个体解决问题的价值。
想提高精度可以加第二题:一个房间里有十把椅子,六个人进来坐下,还剩几把椅子。
多数人会说四。他说十,因为椅子还在那儿。
“我并没有在抬杠。我也不想把事情搞复杂。但我的脑子就是这么运作的。”(戴夫·普拉默)
他回家后会重放每一个做选择的瞬间
这套方法他叫情绪后处理。见完人,尤其是新认识的人,回家之后他会把当天所有需要做选择的时刻重放一遍,先挑最不舒服的那些。刚才那一瞬我做错了什么,我漏掉了什么,对方当时在想什么,下次这种情况怎么处理,要不要去补救一下。
他讲了一个例子。他父亲 1969 年买的新车,他留着,开了五十年。二十多年前他把车送去翻新,三个工匠做了三年,几千小时。他去提车,检查,很满意,说这个好那个好,然后飞回家,写支票,车送到。
十年之后他才意识到:一群工匠围着他的车干了三年,他当时应该说点让他们高兴的话,夸夸他们干得多好。他没说,因为那一刻他不需要那些话,也没想到别人需要。
他给那家店的老板发了封邮件:不知道你还记不记得,十年前我来提车,可能看起来并不满意,但我想让你知道,我对整台车的工艺和水准非常佩服。
“他回信说,那个场面我想过很多次。”(戴夫·普拉默)
这十年的时间差,是理解自闭症的一把钥匙。他并非不感激,只是感激的信号在当下没有生成,十年后才被后处理机制捞出来。
也正因为这套机制存在,他要澄清一个流传很广的说法。
“社区里有一种看法,认为自闭症的人缺乏共情。我认为完全不是这样。我只能代表我自己说,我共情能力相当强。问题出在沟通上,而且是双向的。我不知道你此刻感觉如何,所以在你说出来之前,我很难对你共情。可一旦我知道了,一旦我理解了你脑子里在发生什么,我可以非常为你难过。”(戴夫·普拉默)
在没有信息的情况下,他的默认设定是:你会像我一样处理这件事,用我所知道的方式。
所以他对神经典型的人的建议只有一条:说具体。别指望他能接住暗示、微妙和言外之意。如果你想把他推向某个行为,最好的说法是“戴夫,你需要做这个”。
莱克斯在访谈里当场问:我今天有哪里做得不对吗?没有。那打分呢,一到十分?7.5 分。浮点数打分,很符合这个人。
假装正常是一份全职工作
所谓 masking,用他自己的话讲,就是表演正常。
“你在社交互动里做的每一件事,挥手、表情、语调、姿态,全都是刻意构造的,全是工作量。对多数人来说这是自然的,他们就是这么做的,有些人还做得特别好。但对谱系上的人来说,你得把这一切都假装出来。”(戴夫·普拉默)
他提到 Rush 乐队那首《Limelight》,尼尔·皮尔特(Neil Peart)写的词,大意是世界是个舞台,我们只是演员、表演者和描绘者,互为彼此的观众。歌里反复讲无法把陌生人当朋友、必须伪造情感。普拉默只对已故的人做推测,但他觉得写词的人大概也在处理同样的问题。
这首歌之所以能击中那么多人,可能正因为这份疲惫有普遍性,只是在他们身上被放大到了一个必须每天面对的强度。
崩溃是一个开关,不是一段情绪
他描述 meltdown 的方式很像在讲一个系统故障。情绪过载到某个点,你不再能管理自己的行为。他举《雨人》里机场那场戏,或者某些影视剧里那个被禁止做手术的外科医生。
“开关一翻,你就掉进原始大脑。额叶皮层在某种程度上关闭了,你不再拥有决策和过滤的能力。那种状态下你是一条爬行动物。这本质上是恐慌,是面对无法忍受的当下现实的战斗或逃跑反应。”(戴夫·普拉默)
莱克斯顺口把它比作大脑的蓝屏。普拉默说,差不多。
触发它的一般是一连串事情的累积:糟糕的出差、工作上的争吵、被随机打乱的一天,堆到临界点,任何一件小事都可能成为最后一根稻草。
“你还好吗”需要两个步骤
他和妻子最近几年养成了一套明确的检查机制。她会问,你还好吗。他答,还好。
“这里面有两步。第一步是‘你还好吗’,第二步是我的回答。因为如果我只是说‘好’,她就知道有事。”(戴夫·普拉默)
这套机制存在的原因很朴素:他没法通过看一个人就知道对方状态如何。所以必须显式地互相 ping。
他对感情这件事的自我评价很低。“我从来就不擅长跟人打交道。有人喜欢我,我大概也接收不到。”他给儿子买过一件 T 恤,上面印着:如果你在追我,请明确告诉我,因为我毫无察觉。
“我得在一个人身边待很久,慢慢长进去,因为我没有任何技巧,那种社交舞蹈需要的能力我一点都没有。我唯一的选择就是做我自己,而这对某些人是行得通的。”(戴夫·普拉默)
被这些问题吸引的人,大概有一两成
他写过一本书叫《自闭症百万富翁的秘密》(Secrets of the Autistic Millionaire)。书里提到一个概念:很多人会觉得自己“有一点点自闭”。
他的估计是,可能 10% 到 20% 的人处在谱系的某个位置,但影响程度没有高到构成障碍。这些人仍然带有许多源自自闭症的特征。如果能识别并优化地管理这些行为,既可以借力,也可以缓解它带来的缺陷。
这本书主要是写给他孩子的。据他所知,几个孩子都没到 ASD 的诊断标准,但身上都有他某些跟这个相关的行为特征。他想给他们写一本手册。
至于为什么程序员里这样的人格外多,他的答案很直接:那种单向的专注,把问题不断化简的能力,以及对“里面到底是什么”的终极好奇。他一辈子都在拆东西,拆妈妈的烤箱,就为了搞明白翻页钟怎么工作。他认为这是程序员的好习惯。
他刚好赶上了需要懂所有层的年代
关于 AI 写代码,他的用法非常务实。Python 他不熟,几乎是新学的,所以这个项目里大量用生成式工具。他觉得很有用,因为看不懂的地方可以看它生成什么,从中学到东西。他自己从零写 Python,长度大概是 AI 产出的四倍,因为 Python 写得好的话可以非常简洁。
他承认自己是在 vibe coding 这个项目。
莱克斯追问了一个关键点:这必须建立在你已经会编程的基础上。普拉默同意。他说你不可能在自己完全不会编程的情况下靠 vibe coding 做出一个东西,但如果已经是个好程序员,AI 能让你变得极其强大。因为你能读懂它生成的东西,能判断下一步该让它做什么。
关于二三十年后的编程,他给的类比是桥梁工程。曾经有一批人在下面焊钢梁,现在人们在 AutoCAD 里拖拽预制件。编程大概也会变成那样:你不再逐行扔代码,你搬动组件和接口,向 AI 描述它们之间该怎么交互,让它把组件造出来。但我们离“凭空生成一个兼容 Linux 的内核”还差得很远。
莱克斯问他会不会觉得遗憾,从机器码、汇编、C、C++ 一路走到用自然语言写代码,抽象层爬得这么快。
“我出道的时机其实很幸运。技术是在三四十年里一层层长出来的,所以我理解 TTL 逻辑,也能用 AI 写代码,中间那些零件我大概都知道。我的知识当然有洞,但要把这张图拼得这么完整,恐怕只有亲身活过那段时间才行。现在起步的人,很难复制这个。”(戴夫·普拉默)
这句话点出了一件事:他这一代人的知识结构是历史给的礼物。硬件、编译器、驱动、界面、网络,每一层都在他职业生涯的不同阶段被推到台前,他被迫全部学一遍。今天入行的人,一上来就站在十层抽象的顶端,底下九层是黑箱。这不是能力问题,是时代问题。
意义这件事,他答得很干脆
莱克斯最后问的是那个大问题:这一切的意义是什么。
“做出很酷的东西。归根到底,我在乎的是能做出对别人有用的复杂东西,这件事能调动我的能力,让我有创造性,让别人用得上。如果把我限制在绘画、雕塑那些传统艺术里,我毫无希望。对我来说这就是意义所在。然后再养出几个好孩子,把接力棒交出去。”(戴夫·普拉默)
访谈的结尾,莱克斯引用了本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)的一句话:世界上只有两种语言,人们抱怨的,和没人用的。
这句话放在普拉默身上挺合适。他写的东西被几十亿人用过,也被人抱怨过,任务管理器被人抱怨,Windows 激活被人抱怨,ZIP 文件夹被人抱怨。他本人对这些的态度是一致的:先把东西做出来,做小,做稳,然后接受它被使用的方式。
这期对话里最值得带走的,可能不是那些微软往事。是一个人在明确知道自己大脑如何运作之后,围绕这个事实重新设计了生活和工作的方式:用作品代替自我介绍去争取机会,把社交规则显式化成检查机制,把每次失误放回家之后重放一遍,把 640K 当成对全世界每一台机器的责任。
还有他那句关于专注的坦白。他能对一件事投入极强的注意力和坚持,但前提是这件事他得喜欢、得有回报、得看得见进展。这三条其实也是所有人能进入心流的条件,只是大多数人可以在状态不佳时硬撑过去,而他的大脑不提供这个选项。
最后是他自己给出的那份清单。
- 如果你正走在“今天先不去”的路上,注意那个决定正在变大。想走非标准的路,就明确地做大决定,别让一百个小决定替你做。
- 找工作的时候,卖你能做的东西,不要卖你自己。GitHub 记录、你写过的算法、你做出来的成品,比性格展示有效得多,尤其是在你不擅长社交表演的时候。
- 断言要写在你确信不可能成立的事情上,而且要长在写代码的过程里,不要留到事后补。它响了是在帮你。
- 写任何要给别人用的工具,先假设所有 API 调用都可能卡住九十秒,把所有可能耗时的操作放到独立线程。程序的可靠性和体积可以同时追求,87K 的任务管理器就是证据。
- 不要在代码里留自己的电话号码,除非你已经准备好它会在二十年后被谷歌索引到。
- 如果你身边有人在谱系上,把话说具体。不要说“你觉得那样行吗”,直接说“你需要做这个”。不要指望对方接住暗示,那不是不愿意,是收不到。
- 如果你是那个收不到信号的人,建立显式的检查机制。跟亲近的人约定一个固定的问法和答法,把“读空气”换成“直接问”。
- 每隔一段时间,回头重放那些你当时没反应过来的社交时刻。十年后才想起来夸一句工匠的手艺,也比永远不说好。
- 想学一门新语言,最快的路径是带着一个真实项目去学,让 AI 生成,你负责读懂和判断下一步。前提是你已经会编程。
- 如果某件事让你痴迷到想拆开看里面到底怎么运作,别压着它。这种好奇是能吃饭的本事。
本集资源与出处
- 视频在 YouTube 收看
- 音频官方 MP3 直链来自 lexfridman.com 官方播客 RSS
- 官网Lex Fridman 官网本集页面
- 文稿官方 Transcript(lexfridman.com)