原文

Software: Art, Engineering, Mathematics, or Science? by Alan Kay

译文

建造一座 500 英尺高的埃及金字塔,花了几十万工人几十年的时间。他们将材料一块块胡乱堆在一起,然后用石灰岩做外墙,使其外表光鲜。相比之下,1000 英尺高的帝国大厦由不到 3000 名工人在不到 11 个月的时间里从头建造完成。今天相当多的软件及其建造过程类似于埃及金字塔,我敢说,目前没有谁知道如何组织 3000 名程序员,花不到 11 个月的时间, 从头开始制作一个重要的软件。

我对这一点的解释是,“软件工程"仍然是一个矛盾的说法(像航空食品、大学停车场,甚至是 “计算机科学”)。不过,我们今天所做的事情颇像建筑学诞生之前, 建筑物的设计和建造(建筑学,从字面上看是"拱门"的 “技术化”)。我们偶尔可以做出一些有某些功能的东西,尽管它像一堆材料的胡乱堆放。这是一种古老的工程,是一本临时编写的食谱,在过去多少有些用处。

今天,科学(对现实(real)事物的关注)与数学(对真实(true)事物的关注)混合在一起,与工程(对如何制造某种东西的关注)混合在一起。这些领域中的每个工作者也部分地在其他两个领域工作。每个领域都有与之相关的不同气质:数学家往往是理想主义者,科学家是现实主义者,而工程师是实用主义者。而当他们利用其他领域知识来帮助他们最喜爱的领域取得进展时,每个人都发现自己临时采用了一种借用的气质。

如今,什么是计算(computing)?它似乎是一种数学–因为机器是一种推理引擎,可以计算出各种关系的结果 – 外加一种工程 – 因为通常必须构建相当大的语言表述,才能表达任何真正有趣的东西。

但科学在哪儿?在我们对这一术语的正常使用中,我们认为眼前是一个与我们的任何希望或信仰都无关的宇宙,而科学是了解这个宇宙如何运作的一种特殊方式。在现代,我们特别喜欢用数学模型来表达我们所认为宇宙的运作方式,这些数学模型似乎与现实世界有足够的对应关系,可以讨论和预测现实。我们倾向于认为科学是分析性的(analytic)。

相比之下,计算似乎是更多带有人造的(synthetic)味道,因为我们从规则开始,计算出一种 “现实”(reality)。会不会存在一门 “计算机科学” 呢?

我认为答案是肯定的,与物理世界的构建相类似。从历史上看,不可能从基本粒子的第一原理出发,来计算一幢大型建筑或桥梁是会倒塌还是会保持上升。我们的方法是尽可能地制造大型结构,并把它们当作宇宙的一部分来研究,以便于我们理解。这导致了一种新的科学工程,这不是一个矛盾的说法,它导致了巨大的改进,用于建造大型可靠结构的技术。

我认为这便是最终创造软件工程所需要做的。我们需要对重要的软件结构进行更多的建设,而且我们需要以一种允许分析、学习的形式来做,并根据刚刚学到的东西重新设计和制造。

这儿似乎有一个鸡和蛋的问题。如果我们没有一门真正的工程学科,那么要制造出足以让人理解的大型建筑不就太困难了吗?而我们所做的乱七八糟的东西会不会太难重新表述,以至于我们无法了解我们的新发现是否真的有价值?

我相信,在这里可以用来取得进展的秘密武器是极端的晚绑定(late binding)。对什么进行晚绑定?对系统中尽可能多的东西。

人们可以提出一个很好的论点,即硬件和软件设计中的大多数进步, 都是通过引入新的晚绑定机制来促进的。追溯到硬件方面,我们可以想到、内存管理单元等。在软件中,我们从绝对指令位置和格式,到符号汇编器,到子程序,到可重定位代码,到独立于硬件的数据索引和重定位寄存器结构格式,到垃圾收集,到对象的许多晚绑定优势,包括类和实例、消息发送、封装、多态性和元编程。

在 Squeak 中,你有一个有史以来最晚绑定但又最实用的编程系统。它也是一个兼具广度和深度的人工制品,足以允许进行真正的科学研究、创造新的理论、新的数学和新的工程结构。事实上,Squeak 已经准备好成为它自己的替代品。由于 Squeak 在自己的结构中使用的每一个机制都是显而易见的,并且可以被任何程序员改变,所以它可以被理解和摆弄。“极端的玩法” 很容易导致创造出一个比 Squeak 更好的系统,与 Squeak 非常不同,或者两者都有。

我们不仅允许你这样做,我们还强烈建议你去尝试! 为什么?因为我们的领域离合理的状态还有很长的路要走,我们不能让糟糕的事实标准(主要由供应商控制)来阻碍进步。你习惯于把编程系统作为一种具有某些功能的语言来学习,目的是利用这些功能来制造东西。Squeak 在这方面做得很好,而且有很多功能(实际上太多了!),可以用来制作东西。但是,对待你将要进行的学习的最好方式,是把 Squeak 看作是一种可以构建语言的元语言(metalanguage)。除了学习如何用现有的功能来制造东西,还要试着学习这些功能本身是如何被发明和制造的。所有的代码都是可见的,而且很多代码都有关于它们如何工作的解释。在这里,系统就是课程。即使是本书的在线版本也很难跟踪一个不断变化和改进的系统,所以最好是学习如何从系统本身找出它的作用。然后尝试添加你自己新的深度功能。最终,你会形成自己的观点,了解更好的编程方式。Squeak 将允许你添加这些功能,甚至用你发明的新功能来取代它目前所有的功能。其中一些想法将足以推动编程的艺术、工程、科学和数学的发展。

然后你就会以我们所期望的方式使用 Squeak。在某些时候,一个比 Squeak 更好的系统将被创造出来,没有什么能让我们更高兴的了 – 特别是如果你能在我们还在享受新想法的时候完成它的话。