Scott Rosenberg(Salon 网站的联合创始人)最近出版了一本引人入胜的新书《Dreaming in Code》,该书围绕一群工程师苦苦挣扎,试图开发一款名为 Chandler 的个人生产力软件。我在故事中露了一面,尽管我并没有参与这个项目。书名指的是我过去在密集编程后会遇到的一个问题:我记得醒来时发现自己竟然在用计算机代码做梦——而且是八位机语言。
如果 Chandler 轻松完成,每个人都高兴地回家,那就没什么值得一本书的故事了。事实上,《Dreaming in Code》是对软件神秘而充满压力的一个剖析。为什么有些软件项目能顺利完成,而许多其他项目却似乎命途多舛?为什么软件开发如此难以规划?
这些问题应该引起所有对科学感兴趣的人的关注,而不仅仅是程序员,因为计算机代码越来越成为我们用来描述和探索现实动态方面的一种语言,这些动态方面过于复杂,无法用方程解决。例如,对生物细胞进行全面建模,可能在生物学和药物设计方面带来重大的新见解。但是,如果我们连一个像个人生产力套件这样简单的东西的工程都让我们感到困扰,我们怎么才能做出这样的模型呢?
几十年来,我一直在追求另一种梦想,那就是最终有一种不那么黯淡的方式来思考软件,从而思考复杂性。我称这个梦想为“表型遗传学”(phenotropics),这个词大致翻译为“相互关联的表面”。
理解表型遗传学的一种方法是,首先注意到计算机科学已被一个根本性的分裂所区分。一方面是以精确定义的软件结构为特征。这是那种需要你为抽象事物(如硬盘上的文件)起无数个愚蠢名字的计算机方法。直到不久前,在速度缓慢的计算机上,这才是唯一可能的计算机科学。
虽然“高级”语言(使用专门的语法来执行大量较小、更繁琐的命令——例如 JavaScript)的进步使这种方法多年来变得更加人性化,但我们编程的核心几乎没有改变。它仍然呼应着约翰·冯·诺依曼和艾伦·图灵在半个多世纪前的数学构造。虽然这些数学思想是基础性的,但没有理由相信它们是创建视频游戏或模拟复杂科学现象等复杂程序的最佳框架。
这就引出了我们所说的分裂的另一方面。一种新兴的编程方式被各种各样的人所实践,比如机器人建造者、实验性用户界面设计师和机器视觉专家。这些人必须找到让计算机与物理世界交互的方法,而事实证明,这样做需要一种截然不同、更具适应性的方法。
早在 20 世纪 50 年代和 60 年代,计算机科学还很年轻的时候,尚不清楚这两种编程类型会如此不同。曾有过零星的、不切实际的尝试来弥合差距——例如,通过寻找一套简洁的规则来定义英语或人脑如何通过视觉识别物体。不幸的是,这样的规则并不存在(参见“歌唱演化之歌”)。相反,那些面对外部世界的计算机科学家不得不开发新的技术,对大量数据流进行统计分析。这些技术基于模糊性而非完美性。正是这种方法使得火星车能够在火星表面导航,而无需精确了解它在做什么。你不需要像给硬盘上的每个文件命名一样,去命名地面上每一道尘土的形状。
表型遗传学的核心思想是,有可能将统计技术不仅应用于机器人导航或机器视觉,而且还应用于计算机架构和通用编程。然而,目前计算机内部由大量的逻辑模块组成,通过传统的、明确定义的协议连接在一起,这是一种非常精确但僵化的方法。形式精确性的阴暗面是,微小的变化可能产生随机的、甚至灾难性的影响。程序中仅仅翻转一个比特就可能导致程序崩溃。
要形象地说明当前技术的局限性,可以浏览一下 MySpace。你会看到很多页面上有奇怪的损坏元素,比如丢失的图片或错位的文本和图像。发生这种情况是因为连接不同元素的协议并不完美。最初可能看起来没问题,但一些小细节发生了变化,错误却无法轻易纠正,以至于业余程序员无法处理。
表型遗传学的方法更接近于生物进化过程。如果生物遗传密码中的微小变化频繁导致巨大、不可预测的物理变化,进化就会停止。相反,生物体与其基因之间的关系存在一种本质上的平滑性:DNA 的微小变化会导致生物体发生微小的变化——并非总是如此,但足以使渐进式进化成为可能。难怪软件工程师如此困难。当他们通过改变一段代码来做实验时,得到的结果却出奇地随机。因此,他们通常不能将代码本身用作了解代码的工具。
另一个可以找到有益生物学比喻的地方是人脑。大脑由专门的部分组成,如视觉皮层、小脑和海马体。在胎儿发育过程中,许多部分相互找到,形成数量惊人的连接,神经元连接神经元。每个部分都形成自身,以便最大程度地利用大脑的其余部分。大脑区域之间的每个边界都可以被视为我所描述的计算机与外部世界之间连接的宏观版本,这种连接基于不断改进的近似,而不是对完美的危险依赖。
假设软件可以由能够通过模式识别来相互识别的模块组成。那么,也许你可以构建一个大型软件系统,而不会遭受无休止的不可预测的逻辑错误的困扰。
这些模块会是什么样的?一种想法是,每个模块都可以是一个用户界面,比如 Mac 或 Vista 桌面上的一个窗口的内容。这里有一个有趣的事实:Andy Hertzfeld,他是早期 Macintosh 操作系统的大部分作者,也是《Dreaming in Code》中因其在 Chandler 上的工作而成为重要人物,他曾帮助我在 1984 年尝试实现一个类似的早期实验。那时它叫做 Embrace,是在 Andy 离开苹果(Mac 发布后)不久之后完成的。
在 Embrace 系统中,用户界面可以相互操作——一个窗口就像人类用户一样操纵另一个窗口。这听起来可能很奇怪,事实也确实如此。一个隐藏的数字角色——就像视频游戏里一个没有动画显示在屏幕上的角色——被固定在每个窗口的背面。这个角色可以被训练来操作其他窗口,而每个窗口都具备做同样事情的能力。这样,整个软件环境就仅仅由可以相互操作的用户界面组成!例如,没有算术例程库,取而代之的是一个图形计算器小部件,无论是数字角色还是实际的人类都可以通过相同的界面使用它来加数字。
奇怪的是,互联网可能正在朝着类似于这个旧实验的方向发展。现有网页已经被勇敢的程序员用作新网页(称为 mashups)的原始材料。在我看来,当前 Web 开发浪潮中最大的错失机会是,mashups 是使用传统的抽象程序粘合在一起的。现在机器视觉和其他基于模式的技术已经变得可靠,Web 页面终于可以在用户界面层面相互使用,就像人类使用它们一样。这将是一个伟大的发展:那么 mashup 的构建就可以变得具有适应性,并摆脱随机逻辑错误的困扰。
也许像表型遗传学这样的想法会随着 Web 的发展而实现,或者也许它需要在实验室里先构建出来。无论“用户界面即构建块”的旧 Embrace 理念是否好用,模式识别似乎都将在数字架构中扮演更重要的角色。
我留给你一个困扰我的想法。在我早期经历“代码梦”的时候,我偶尔会有一个奇特而深刻的体验。我会有种直觉,觉得一个程序突然达到了没有 bug 的状态。当我有这种感觉时,我总是正确的——至少,就任何人所能判断的那样。(正如图灵证明的那样,没有通用的方法可以预测运行给定程序的输出;参见“机器之魂”。)这种感觉就像我理解一个数学证明时的感觉一样。那是一种鲜明的正确感,我希望每个人都能感受到。当然,当时无法知道这种感觉有多可靠。我可能只是碰巧运气好,或者因为忘记了感觉错误的时候而自欺欺人。
这段回忆不禁让人联想到罗杰·彭罗斯的观点,他认为“理解”数学证明的体验涉及非凡的神经机制——根据他的说法,是脑内发生的量子计算。我不接受这个论点。我反而认为,近似模式识别——在我编程顿悟过程中发生的那个过程——可以变得非常可靠地理解一个复杂系统。这也是我仍在追逐表型遗传学梦想的一个重要原因。















