现在,几乎所有的学生都会在师长的引导下,学习一些编程技术。是的,不管是教育工作者还是技术专家,都告诉我们计算机编程就是未来。计算机操纵了周遭的一切,比如汽车和微波炉。专家们当然没有说错。不仅如此,编程还可以为你带来一种结构化的思维模式,以及提示你关注某种技术系统的实际功能。当我说起某个新的应用程序能够做某件事时,如果你参与了编程,哪怕只是一点点,你也会比一般人更清楚我的说法是否合理。
如果你以前写过代码,那么你应该清楚计算机程序是如何抵制简化工作的。随着计算机程序变得越来越庞大、越来越复杂,代码也变得越来越复杂,而且绝大部分代码的聚合方式都是令人费解的。为了确保大型程序仍可控,我们开发出了各种各样的技术方法,例如版本控制、错误跟踪,以及跨团队沟通工具等,但是这些方法通常都只是“战斗失败”后的亡羊补牢之术。不仅软件代码本身在不断吸积,每个组成部分也在越来越频繁地与其他组成部分进行交互。与存在于“真空”中的全新项目有所不同,任何一个计算机程序都是一个大规模的互联系统:不仅会作用于自身,还会与其他程序相互作用。我们在旧代码中一次又一次地加入新代码,并以出其不意的新方式去使用它们,以此将各个层次拼接在一起。
交互过程,包括许多意外交互在内,有时会因编程语言本身的原因而加剧。即使是刚入门的程序员也知道,GOTO语句会带来麻烦。在BASIC编程语言中,通过设置GOTO语句,可以让程序轻松地从某一行跳转到另一行。换句话说,如果代码中包含了GOTO语句,那么程序就可以轻松地从某一行指向另一行,从代码中的一个点跳转到另一个点。如此容易便能实现跳转,难怪有人会说,对于那些想要对自己的计算思维进行测试的文科生而言,GOTO语句无疑是“天赐良品”。 [31]
在一个小程序中,使用GOTO语句实现跳转,既容易又无伤大雅。但是,随着程序变得越来越大,GOTO语句最终会将代码绑定到某些庞杂的节点上,但即使是最熟练的程序员也无法解开这些庞杂的节点。最终,你得到的将是所谓的“意大利面条”式的代码,因为所有东西都纠缠在了一起,既难解开,又难理解。在这种情况下,要想搞清楚程序指令执行的次序几乎是不可能的,这也是为什么这样的计算机程序特别容易出现令人意想不到和无法理解的行为。
此类简化命令即使只是在独立的、较小的环境下发挥作用,也有可能通过某种方式脱离当初设定的目标。如果使用的频率和方式超出了预设范围,系统及其组成部分就会出现诸多问题,而这些问题比当初设想的要庞杂得多。GOTO语句就是一个突出的例子,它从一个美妙的超快捷工具变成了既不优雅,又实为“有害”的东西。 [32]
为了更好地理解并强化系统秩序,专家们想出了很多方法,包括使用更加复杂的计算机语言。 [33] 在大多数由专家构建的新系统中,意大利面条式的代码已成为过去式。然而,由于互联的易发性和各种层次上的不断吸积,交互作用正在持续增多。于是,高度互联的系统动态,即信息的流动和各部分之间的交互,也就变得异常复杂和不可预测。仍以丰田汽车软件为例,因为存在交互,丰田汽车软件中的大量代码已无法被测试了。 [34]
在我们构建的其他类型的技术系统中,互联性同样在不断升级。例如,在法律体系中,由于每项新的法律法规都与以前的法律法规相互关联,因此我们很难预测单项法律条文的效果。
菲利普·K.霍华德曾仔细分析过贝永大桥(Bayonne Bridge)这个案例。 [35] 贝永大桥是连接纽约州和新泽西州的主要通道之一。由于这座百年大桥的桥梁实在太低,以致那些前往纽瓦克港的现代集装箱船无法顺利通过。纽瓦克港是一个重要的商业中心。那么应该怎么办呢?在人们提出的各种解决方案中,有一个方案是这样的:对这座桥进行改造,适度提高桥梁高度。这应该是成本最低的方案了,也是在2009年脱颖而出的方案。但是,改造工程拖了很多年都未能启动,因为人们难以应对吸积和交互的综合作用。与大桥改造工程有关的规章制度总共涉及19个政府部门的47份许可文件,从环境影响评估报告到历史影响评估报告,不一而足。 [36] 其他地方也出现过诸多类似情况,一些公共项目需要10年左右的时间才会获得批准,因为相关的规则和流程冗长繁多。 [37] 正如霍华德所说,这种情况在很多时候甚至是致命的,比如,老化腐朽的基础设施如果未能得到及时修缮,就有可能夺走许多人的生命。
研究员迈克尔·曼德尔(Michael Mandel)和黛安娜·卡鲁(Diana Carew)就职于位于华盛顿特区的进步政策研究所(Progressive Policy Institute)总部。他们将规则体系的增长称为“监管积累”(regulatory accumulation),即随着时间的推移,规则会变得越来越多。 [38] 换句话说,每一条法律法规都是合理的,但当它们被放到一起时,就有可能会因为相互作用而变得异常“软弱”,甚至可能以令人惊讶和意想不到的方式产生冲突。
我们不仅越来越多地将某项技术的各个组成部分关联起来,而且还越来越多地将不同的软件和技术关联起来。后者是一种高阶互联模式,也就是互操作性(interoperability)。 [39]
让各项技术互通,也就是让不同系统进行交互,相互传递信息通常是一件好事。例如,因特网之所以拥有如此强大的功能,就是因为其连接的机器数量极其庞大,而且可以在无数机器之间传递信息。当你问Siri“世界总人口是多少”时,你的苹果手机会通过Wolfram Alpha服务获取到答案,然后回答你;当你使用谷歌地图时,它会告诉你利用“优步”去往目的地可能要花多少钱。这些都是互操作性的实例。但是不要忘记,让不同系统互通的同时,我们不得不去面对陷入复杂世界的巨大风险。我们现在不仅建成了互联网络,比如由不同计算机和设备组成的互联网,而且还建成了拥有众多子系统的大型互联系统。
除了互操作性之外,不同类型的技术之间还会产生相互依赖性,例如互联网与电网之间的相互依赖性。 [40] 研究者在研究了多种类型的系统,并了解了它们的优缺点后指出,某些系统在多种条件下均可能会出现故障或崩溃。例如,某个规模相当小的电网出现了故障,继而引发了无法收拾的级联效应。对于这种风险,有一种观点是:将技术系统之间的相互联系切断。然而,这种想法的可操作性几乎为零。互联系统的构建成本其实很低:在当今这个充满互操作性的时代,工程师和设计人员都在有意为各个系统创建接口,因此,不同的系统可以很容易被关联起来。
我们在构建新事物时,通常都会在故障成本和构建成本之间进行权衡。我们需要知道,如果出了故障,失败的成本会有多大。 [41] 如果Word崩溃了,那么尚未保存下来的东西将会丢失。尽管没有人希望看到这样的结果,但这个故障的成本的确是相对较低的。如果电网出了故障,并导致美国很多地区停电,那么故障的成本就极其高昂了。例如,在2003年,美国东北部的大停电对5 000万人的生活和工作造成了影响,并导致11人丧生,直接损失估计高达60亿美元。 [42]
每一项故障成本都应该拿来与系统的构建成本进行比较。纵观历史,我们所构建的系统越重要,构建成本就越高。例如,构建银行系统的基础设施所耗费的资源,比编写一个聊天程序多得多。因此,我们必须确保那些昂贵的系统不易发生故障,而这又意味着需要增加构建成本。换句话说,在极高的构建成本面前,通过大量检查和测试来降低故障成本的做法,变得至关重要。
在一个相当长的时期内,这种方法一直行之有效。因为对构建成本的重视程度超过了对故障成本的重视程度,所以我们所依赖的所有重要的社会保障系统,都是花费大量资源构建起来的。 [43] 然而,现在事情已经发生了变化。出于各种原因,例如,我们可以找到现成的工具和组件,同时“云”上面也存有很多可用资源,所以构建成本已大幅下降。创立技术公司已不再需要太多启动资金:你可以快速地设计和生产出复杂的工具,并通过市场进行测试,而你为此所付出的成本并不大。
与此同时,与互联有关的故障成本也已出现持续上升的趋势。尽管系统关联技术相当简单,而且成本很低,但是这种互联系统的故障成本却非常巨大。当我们把数字地图软件与出行指导软件关联到一起时,哪怕只是一个很小的错误也有可能导致一场灾难。例如,苹果地图在首次发布时就曾将超市错标为医院。
在当今时代,利用互联网信息人工合成微生物并不是一件不可思议的事情,但正因如此,爆发生物灾难的风险也比以往任何一个时代都高得多。例如,已经有实验室通过使用电子邮购的生物原料合成出了脊髓灰质炎病毒。现在,有不少初创公司正在努力实现生物学实验的远程操作。不难想象,在这个日益自动化的世界中,软件合成的生物因子 [45] 完全有可能会在不经意间被释放。当构建成本持续暴跌,而故障成本直线上升时,我们便进入了一个无比复杂的技术领域。是时候停下来想一想了。
一般来说,随着系统内部及系统之间的交互增多,包括拥有子系统的大型系统在内的所有系统的复杂性都会增加。有人认为,互联性的不断提高,体现了技术的基本要求。 [46] 技术终究会产生交互和聚合,并在这种情况出现时进一步推动我们走向复杂化。
尽管从开始构建大型技术系统的第一天起,这些趋势就一直存在,但是近年来,它们变得愈发强大了。正如我在本书导论中所提到的那样,计算机科学家艾兹格·迪科斯彻对当下的大型系统,特别是计算机系统的激进新颖性所进行的分析发人深省。早在1988年,迪科斯彻就已指出,计算机程序的设计需要克服大量规模上的差异,当然,在计算机问世之前,没有人需要去处理这样的事情。 [47] 以智能导航系统为例,迪科斯彻很好地解释了其跨度极大的层级结构。从程序中的1个比特,到机器存储空间里的几百兆字节,的确是从非常小到非常大的跨越。这种跨越涉及近10亿次的跳转,极端的规模变化不但超乎想象,而且史无前例。事实上,这一切已经,并将继续走向极端化,因为日常应用技术的普通用户,现在已经熟悉了千兆或万兆这样的前缀,而这些前缀又意味着,我们要对庞大的规模差异负责,而这种庞大系统的边界已近乎天文意义上的边界了。
在过去的短短几十年间,大型系统已变得异常庞大且错综复杂,用迪科斯彻的话来说即是“概念层级的深度,绝非人类心智曾需面对的任何事物可比”。
不仅如此,即使我们有能力阻止系统的吸积和交互,也还需面对另一个会使系统变得日益复杂的因素,而那将是更加难以解决的问题。