1977 年春天,高德纳(Donald Knuth)收到《计算机程序设计艺术》新版的校样,觉得难看。 出版社把热铸金属排版换成了照相排版,原本像刻出来的数学公式,如今像复印出来的。他没有 写信抗议。他估计半年能解决,放下手头的研究,动手造一套自己的排版系统。这一造,将近十 年。今天我们敲的 LaTeX,是 Leslie Lamport 后来的好意——在高德纳那台名为 TeX 的机器 之上,包了一层更好用的宏。
这个故事是我的导师 David Turnbull 在一次 Zoom catch-up 里讲给我的。他推荐我去读高德 纳的书;同一次谈话里,他还给我看了两个他欣赏的编 辑器:Typst,把书写与渲染折叠进同一块实时的界面;LiquidText,让你把想法钉在触发它的 那一处页面上。那个下午我没意识到,他一口气递给我的,是一份书单,也是一份设计任务书。
高德纳的故事里,留在我心里的不是那英雄式的十年,而是开头的那一次拒绝。页面错了,而他 没有任何办法伸手进去把它改对,于是他把「伸手进去」造了出来。他不接受自己无法检查、无 法控制的输出。
五十年后,我和一个 AI agent 一起写论文,同一个问题换了身衣服,悄悄回来了。
Agent 写 LaTeX 比我好,这从来不是问题。让 Claude 把一段话改紧凑,你就会得到更紧凑的 一段话。它给不了你的是两样东西:位置与证据。位置——哪一句、哪一页、哪个文件: agent 是盲改的,它看不见你正在读的那页渲染结果。证据——改完之后,究竟动了什么?你可 以问,它也会答,但那答案是证词。模型对自己所做修改的叙述,是对一个意图的回忆,不是一 份 diff。
高德纳对坏输出的回答,是一套页面上每个墨点都能回溯到他亲手写下的命令的系统。做 MagicTeX 时,我们的回答是它的镜像:agent 留下的每一笔,都必须向前 落进一份归人类所有的记录。
所以这个编辑器是这样工作的。你像导师读打印稿一样读渲染后的 PDF,直接在页面上批注:选
中一段,写下「和什么相比大?」agent 收到的不是一句气氛,而是一条带定位的指令——页码、
引文、源码的文件与行号、你的要求。它就改在那里。论文一重新编译,新状态立刻快照进一个
隐藏的 git ref:不在你的分支里,不进你的 git log,是工作区替你记的一本平行账。每次
编译是一个存档点,每个存档点有 diff,任何文件都能退回原样。Typst 教会了窗口,
LiquidText 教会了页边,git 在一旁安静记账。
正因为有这本账,我们才敢在自治上慷慨。MagicTeX 有个模式叫 /ultra-agents:一个评审
agent 批评论文、自己接受自己的建议、动手修改,一轮接一轮,中间不经过人。这么描述听起
来鲁莽。它站得住脚只有一个原因:它永远跑不出这本账。每一轮都落成一个普通的、可撤销的
存档点;尘埃落定后,你像裁判一样读历史,而不是像人质。你可以把笔交给比你快得多的东西
——前提是页面、页边和历史都还在你手里。
高德纳从另一头就懂这份社会契约。他有个著名的习惯:谁在他书里找到一处错误,他就寄去一 张 2.56 美元的支票——十六进制的一美元。大多数收到支票的人把它裱起来而不是兑现,这恰 恰说明:钱从来不是奖励。奖励是身处这样一个系统:错误在这里找得到,找到它的人受尊敬。 审计痕迹就是干这个用的。不是猜忌,是对纠正的好客。
我不认为 1977 年的教训是「别信任你的工具」。高德纳没有退回打字机,他造了台更好的机 器,还把悬赏勘误写进了它的文化。教训是:委托与控制不是反义词——你可以拥抱你所遇到的 最快的合作者,同时仍然礼貌地坚持要证据。
这就是 MagicTeX 的全部想法——它始于 Zoom 里的那个故事。你在页面上批注,agent 去改源 码,git 记住真正发生过的一切——无论打字的是谁,或是什么。