消失之梦

计算机系统的终极问题

计算机科学的许多分支,都有自己的圣杯问题。AI 的圣杯,大约是 AGI:这份野心与领域的开山文献同龄——1956 年的达特茅斯提案已经断言,”学习的每一个方面,或智能的任何其他特征”,原则上都能被描述得足够精确,让机器去模拟。问复杂性理论家,答案多半是 P 与 NP——那道悬着百万美元赏金的题。问做验证的人,他会指给你 Tony Hoare 的宏伟挑战:验证编译器——一个能证明其编译的每个程序都正确的编译器。领域不同,梦想各异。但只要解掉其中一个,那个领域里相当一部分人便可以庆功、收工,从此心满意足。

现在去问一个做系统的人。我就是——所以我熟悉那阵沉默。我们有著名的问题,有著名的争论,却似乎没有一个公认的终极梦想。我认为它有一个,而且比谁的都奇怪。计算机系统的梦想,是消失。

一个没有系统的世界

要明白为什么,先做一个听起来荒唐的思想实验:把系统全部删掉。可计算性并不要求操作系统、数据库或网络栈的存在。任何任务都可以是一个直接对硬件说话的独立二进制——把一切熔成一大块,跑起来就是。这甚至算不上假设:五十年代初的计算,本来就是这样。

这个实验会失败,而失败的方式值得说清楚。它不败于逻辑,而败于经济。在那个世界里,每个想要持久存储的程序,都要重新实现一遍文件系统;每个想同时做两件事的程序,都要重新实现一遍调度;所有人在为同一份工作反复付全价,一遍又一遍。我们今天所认得的第一个操作系统——1956 年为 IBM 704 建造的 GM-NAA I/O——存在的目的正是止血:作业成批跑,I/O 例程共享,吞吐量应声涨了约十倍。系统这个领域不是建立在某条定理之上的。它建立在一个拒绝之上:拒绝为同一份工作付两次钱。

于是,这个领域的岗位说明书,第一稿:找出人人都在重复造的那些轮子,造一次,造好。

系统是承诺,不是代码库

不过”造一次”这个说法有误导性,因为一个普通的库也做得到。差别很要紧。库交给你的是代码;世界一旦捣乱,细节仍然是你的麻烦。系统交给你的是一个承诺——并把世界捣乱时兑现承诺的义务,揽在自己身上。文件系统提供的不只是读写例程;它承诺崩溃之后你的字节还在。虚拟内存承诺每个程序都拥有一台自己的机器。事务承诺在并发与故障之中,要么全有,要么全无。这件造物最难的部分,恰恰是用户永远看不见的部分:在崩溃、竞态与恶意之中,把承诺守住。

这种承诺的正式名字,叫抽象:功能留下,细节藏起。而好的抽象绝不是一团舒服的模糊。Dijkstra 在图灵奖演讲里说:”抽象的目的不是含糊,而是创造一个新的语义层次,让人可以在其中做到绝对精确。”文件、地址、进程、数据包、事务——每一个都是一个新的语义层次,精确到足以在其上搭建下一层。

心智本来就靠抽象运转

如果这只是工程上的便利,故事到此为止。但它更深一层:抽象不是我们为计算机发明的技巧,而是理解本身的原生动作。心理学自 Miller 的《神奇的数字七》起就明白这一点(这篇论文几乎人人引错,我也一样):心智的工作容量小而固定,我们的对策是重新编码——把许多细节折进一个组块,只携带组块。没有人一块肌肉一块肌肉地记住开车;你记住的是会开车,一个把手抵着一千个细节。你的心智并不保存经验的原始磁带。它为自己搭建接口。

如怀特海所言,文明的进步,靠的是”不断增加那些我们无需思考就能执行的重要操作的数目”——系统做的正是同一件事。我们交付的每一个抽象,都是又一个重要操作,让计算的其余部分——最终让文明的其余部分——不假思索地执行。

消失的计算

现在绕回计算机系统的圣杯问题。每个好抽象,都把一件人们必须操心的事,变成一件不必操心的事。那么,当一切都被抽象掉之后,顶端坐着什么?

这个梦想有一个流传甚广的版本,可以追溯到上世纪六十年代:让计算成为像电话、像自来水一样的公共设施——无处不在,唾手可得。六十年过去,这个梦圆了一半。我们管它叫云:计算从插座里来,用多少付多少。

只圆了一半——因为这座设施仍然会露出马脚。它会宕,会漏,需要供给、打补丁,需要一支支揣着寻呼机的运维大军盯着:凌晨三点,仍有人被叫起来替你操心系统。这个”有人”,标记着未竟的那一半。无处不在,原来是容易的一半;无需任何人,才是难的一半。所以把梦想完整地说出来:计算成为一种无界的公共设施——正确、安全、永远在线、自我管理、无人值守——没有任何人需要为它费一点心。消失的计算。

一个梦想着消失的领域

把我们的梦想与别家的并排摆放,奇怪之处便凸显出来。AGI 是一座纪念碑。P 与 NP 问题的证明是一座纪念碑——事成之后立在那里,刻着建造者的名字。系统的梦想是一座反纪念碑:完全实现之时,那里无物可看。别的领域梦想因解决了自己的问题而被铭记。我们的问题解得完美,就是被遗忘。

而且它注定永远做不完——这是结构使然。有一句 Butler Lampson 转述 David Wheeler 的俏皮话:计算机科学里的任何问题,都可以靠再加一层间接来解决。Wheeler 不常被引用的后半句是:但这通常会制造一个新问题。每一层消失的抽象,都会成为下一层尚未消失之物的地板。物理机消失进了虚拟机;虚拟机消失进了云;而云,正忙着消失进某种由智能体打理的东西。机器消失了,又在高一层重新现身。梦想以我们逼近它的速度同步后退——这不是梦想的缺陷,这正是这个领域保持生机的机制。

所以,系统没有自己的百万美元问题,也永远不会有。它的梦想在宏观上是渐近的,在微观上却每天都在实现:就在刚才的某处,你的程序写下了一个文件,而你一次都没有想起它。别的科学梦想一座刻着自己名字的纪念碑。我们的梦想终于寂静——一个系统所能挣得的最高荣誉,是被彻底地视为理所当然。

参考文献