黑客与画家

2003年5月

(本文改编自哈佛大学的一次客座讲座,其中融入了在东北大学的一次早期演讲。)

当我完成计算机科学的研究生学业后,我去了艺术学校学习绘画。很多人似乎很惊讶,一个对计算机感兴趣的人也会对绘画感兴趣。他们似乎认为黑客和画家是非常不同的工作——黑客是冷酷、精确和有条不紊的,而绘画是某种原始冲动的疯狂表达。

这两种印象都是错误的。黑客和绘画有很多共同之处。事实上,在我认识的所有不同类型的人中,黑客和画家是最相似的。

黑客和画家的共同之处在于他们都是创造者。与作曲家、建筑师和作家一样,黑客和画家都在努力创造美好的事物。他们本身并不是在做研究,尽管如果在努力创造美好事物的过程中,他们发现了一些新技术,那就更好了。

我从来不喜欢“计算机科学”这个词。我不喜欢它的主要原因是根本没有这回事。计算机科学就像南斯拉夫一样,是由于历史的偶然性而拼凑在一起的,由一些关联松散的领域组成的大杂烩。一端是真正意义上的数学家,但他们称自己所做的事情为计算机科学,这样他们才能获得 DARPA 的资助。中间是一些研究计算机自然历史的人——例如,研究通过网络路由数据的算法的行为。然后在另一个极端,是那些试图编写有趣的软件的黑客,对他们来说,计算机只是一种表达媒介,就像混凝土对建筑师或颜料对画家一样。这就像数学家、物理学家和建筑师都必须在同一个系里一样。

有时黑客所做的事情被称为“软件工程”,但这个术语同样具有误导性。优秀的软件设计师并不比建筑师更像工程师。建筑和工程之间的界限并不明确,但它确实存在。它介于“是什么”和“如何做”之间:建筑师决定做什么,工程师弄清楚如何做。

“是什么”和“如何做”不应该过于分离。如果你不了解如何做就试图决定做什么,那就会惹麻烦。但黑客行为当然不仅仅是决定如何实现某个规范。在最好的情况下,它是在创建规范——尽管事实证明,做到这一点的最佳方法是实现它。

也许有一天,“计算机科学”会像南斯拉夫一样,被分解成它的组成部分。这可能是一件好事。特别是如果这意味着我的故乡——黑客——能够独立。

将所有这些不同类型的工作捆绑在一个部门中,在行政上可能很方便,但在智力上却令人困惑。这是我不喜欢“计算机科学”这个名称的另一个原因。可以说,中间的人正在做一些类似于实验科学的事情。但两端的人,黑客和数学家,实际上并没有做科学。

数学家们似乎并不为此感到困扰。他们愉快地开始证明定理,就像数学系的其他数学家一样,可能很快就不会注意到他们工作的建筑物外面写着“计算机科学”。但对于黑客来说,这个标签是一个问题。如果他们所做的事情被称为科学,这会让他们觉得他们应该表现得像科学家一样。因此,大学和研究实验室的黑客们没有做他们真正想做的事情——设计漂亮的软件,而是觉得他们应该撰写研究论文。

在最好的情况下,论文只是一种形式。黑客编写很酷的软件,然后撰写一篇关于它的论文,该论文成为软件所代表的成就的代表。但通常这种不匹配会导致问题。很容易偏离构建美丽的事物,而转向构建丑陋的事物,这些事物更适合作为研究论文的主题。

不幸的是,美丽的事物并不总是能成为论文的最佳主题。首先,研究必须是原创的——正如任何撰写过博士论文的人都知道的那样,确保你正在探索处女地的方法是划出一块没人想要的土地。其次,研究必须是实质性的——而笨拙的系统会产生更充实的论文,因为你可以写下你为了完成工作而必须克服的障碍。没有什么比从错误的假设开始更能产生充实的问题了。大多数人工智能都是这个规则的一个例子;如果你假设知识可以表示为谓词逻辑表达式的列表,其参数表示抽象概念,那么你将有很多论文可以写关于如何使这项工作有效。

创造美丽事物的方法通常是对已经存在的事物进行细微的调整,或者以稍微新的方式组合现有的想法。这种工作很难在研究论文中表达。

那么,为什么大学和研究实验室继续通过出版物来评判黑客呢?原因与“学术能力”通过简单化的标准化测试来衡量,或者程序员的生产力以代码行数来衡量的原因相同。这些测试很容易应用,没有什么比一种有点有效的简单测试更诱人的了。

衡量黑客们真正想要做的事情——设计漂亮的软件——会困难得多。你需要良好的设计感才能判断好的设计。而且,人们识别良好设计的能力与他们认为自己可以做到这一点的信心之间没有相关性,甚至可能是负相关

唯一的外部测试是时间。随着时间的推移,美丽的事物往往会蓬勃发展,而丑陋的事物往往会被丢弃。不幸的是,所涉及的时间可能比人类的寿命还要长。Samuel Johnson 说,一位作家的声誉需要一百年才能趋于稳定。你必须等待这位作家有影响力的朋友去世,然后等待他们所有的追随者去世。

我认为黑客们只需要接受他们的声誉中存在很大的随机成分。在这方面,他们与其他创造者没有什么不同。事实上,相比之下,他们是幸运的。时尚的影响在黑客领域远不如在绘画领域那么大。

比被人误解你的作品更糟糕的事情是,你自己误解你的作品。相关领域是你寻找灵感的地方。如果你发现自己身处计算机科学系,那么很自然地会相信,例如,黑客行为是理论计算机科学理论的应用版本。在我读研究生的所有时间里,我的脑海中一直有一种不舒服的感觉,那就是我应该了解更多的理论,而且我在期末考试后的三个星期内忘记了所有这些东西是非常疏忽的。

现在我意识到我错了。黑客需要了解计算理论的程度,就像画家需要了解油漆化学的程度一样。你需要知道如何计算时间和空间复杂度以及图灵完备性。你可能还想记住至少状态机的概念,以防你必须编写解析器或正则表达式库。事实上,画家必须记住比这更多的关于油漆化学的知识。

我发现,最好的灵感来源不是其他名称中带有“计算机”一词的领域,而是其他创造者居住的领域。绘画一直是比计算理论更丰富的灵感来源。

例如,我在大学里被教导说,在甚至接近计算机之前,应该在纸上完全弄清楚一个程序。我发现我不是这样编程的。我发现我喜欢坐在电脑前编程,而不是一张纸。更糟糕的是,我没有耐心地写出一个完整的程序并确保它是正确的,而是倾向于只是吐出一些毫无希望的破损代码,然后逐渐将其塑造成形。我被教导说,调试是一种最后的检查,你可以在其中发现错别字和疏忽。按照我的工作方式,编程似乎就是由调试组成的。

很长一段时间,我对此感到难过,就像我曾经对没有像小学时教我的那样握笔而感到难过一样。如果我只看过其他的创造者,画家或建筑师,我就会意识到我所做的事情有一个名称:素描。据我所知,他们在大学里教我编程的方式完全是错误的。你应该在编写程序时弄清楚程序,就像作家、画家和建筑师一样。

意识到这一点对软件设计具有实际意义。这意味着编程语言首先应该是可塑的。编程语言是用来思考程序的,而不是用来表达你已经想到的程序的。它应该是一支铅笔,而不是一支钢笔。如果人们真的像他们在大学里教我那样编写程序,那么静态类型将是一个好主意。但这不是我认识的任何黑客编写程序的方式。我们需要一种可以让我们涂鸦、涂抹和弄脏的语言,而不是一种你必须膝盖上平衡着一杯类型,并与严格的老阿姨编译器进行礼貌交谈的语言。

当我们谈论静态类型时,认同创造者将使我们免于困扰科学的另一个问题:数学嫉妒。科学领域的每个人都暗自认为数学家比他们更聪明。我认为数学家也相信这一点。无论如何,结果是科学家倾向于使他们的工作看起来尽可能地数学化。在像物理学这样的领域,这可能不会造成太大的危害,但是你离自然科学越远,它就越成为一个问题。

一页公式看起来非常令人印象深刻。(提示:为了增加印象,请使用希腊变量。)因此,人们很容易致力于可以正式处理的问题,而不是那些重要的问题。

如果黑客认同其他创造者,如作家和画家,他们就不会感到有这样做的诱惑。作家和画家不会遭受数学嫉妒。他们觉得他们正在做一些完全不相关的事情。我认为黑客也是如此。

如果大学和研究实验室阻止黑客做他们想做的那种工作,那么他们的地方可能在公司里。不幸的是,大多数公司也不会让黑客做他们想做的事情。大学和研究实验室强迫黑客成为科学家,而公司强迫他们成为工程师。

我只是最近才发现这一点。当 Yahoo 收购 Viaweb 时,他们问我想做什么。我从来都不太喜欢商业方面,并说我只是想做黑客。当我到达 Yahoo 时,我发现对他们来说,黑客意味着实现软件,而不是设计软件。程序员被视为将产品经理的愿景(如果那是合适的词)转化为代码的技术人员。

这似乎是大型公司的默认计划。他们这样做是因为它可以降低结果的标准差。只有一小部分黑客实际上可以设计软件,而且公司管理者很难挑选出这些人。因此,大多数公司没有将软件的未来委托给一位杰出的黑客,而是将事情安排成由委员会来设计,而黑客只是实现设计。

如果你想在某个时候赚钱,请记住这一点,因为这是创业公司获胜的原因之一。大公司希望降低设计结果的标准差,因为他们想避免灾难。但是当你抑制振荡时,你也会失去高点和低点。这对大公司来说不是问题,因为他们不是通过制造伟大的产品来获胜的。大公司通过比其他大公司做得更差来获胜。

因此,如果你能找到一种方法与一家足够大的公司进行设计战,以至于他们的软件是由产品经理设计的,那么他们将永远无法跟上你的步伐。但是,这些机会并不容易找到。很难让一家大公司参与设计战,就像很难让城堡内的对手进行肉搏战一样。例如,编写一个比 Microsoft Word 更好的文字处理器很容易,但是 Microsoft 在他们的操作系统垄断城堡内,可能甚至不会注意到你这样做。

进行设计战的地方是新市场,在那里还没有人设法建立任何防御工事。在那里,你可以通过采取大胆的设计方法,并让同一个人设计和实现产品来赢得大奖。Microsoft 自己在开始时就是这样做的。Apple 也是如此。Hewlett-Packard 也是如此。我怀疑几乎每个成功的创业公司都是如此。

因此,构建伟大软件的一种方法是创办自己的创业公司。但是,这有两个问题。一个是,在创业公司中,你必须做很多除了编写软件之外的事情。在 Viaweb,如果我能有四分之一的时间做黑客,我就觉得自己很幸运了。而我在其他四分之三的时间里必须做的事情,从乏味到可怕不等。我有一个基准,因为我曾经不得不离开一次董事会会议去补一些蛀牙。我记得坐在牙医的椅子上,等待着电钻,感觉就像在度假。

创业公司的另一个问题是,赚钱的软件类型和编写起来有趣的软件类型之间没有太多的重叠。编程语言编写起来很有趣,事实上,Microsoft 的第一个产品就是一种编程语言,但是现在没有人会为编程语言付费。如果你想赚钱,你往往会被迫处理那些太糟糕以至于没有人免费解决的问题。

所有创造者都面临这个问题。价格由供求关系决定,而对那些有趣的工作的需求,远不如对那些解决个人客户的平凡问题的需求那么大。在非百老汇戏剧中表演的报酬,不如在某个人的贸易展览摊位上穿着大猩猩服装那么高。写小说不如为垃圾处理器写广告文案那么赚钱。而编写编程语言的报酬,不如弄清楚如何将某个公司的遗留数据库连接到他们的 Web 服务器那么高。

我认为,在软件的情况下,这个问题的答案是一个几乎所有创造者都知道的概念:白天的工作。这个短语起源于音乐家,他们在晚上表演。更一般地说,这意味着你有一种为了钱而做的工作,另一种是为了爱而做的工作。

几乎所有的创造者在职业生涯的早期都有白天的工作。画家和作家尤其如此。如果你幸运的话,你可以找到一份与你的实际工作密切相关的白天工作。音乐家似乎经常在唱片店工作。同样,一个从事某种编程语言或操作系统的黑客,也许能够找到一份使用它的白天工作。[1]

当我说黑客的答案是拥有白天的工作,并在业余时间从事美丽的软件时,我并不是提出一个新想法。这就是开源黑客的全部意义所在。我要说的是,开源可能是正确的模型,因为它已经得到了所有其他创造者的独立证实。

令我惊讶的是,任何雇主都会不愿意让黑客从事开源项目。在 Viaweb,我们不愿意雇用任何不这样做的人。当我们面试程序员时,我们最关心的是他们在业余时间编写什么样的软件。[2]

因为黑客是创造者而不是科学家,所以寻找隐喻的正确地方不是在科学领域,而是在其他类型的创造者中。绘画还能教给我们关于黑客的什么?

我们可以从绘画的例子中学到的一件事,或者至少可以确认的一件事是,如何学习黑客。你主要通过做来学习绘画。黑客也是如此。大多数黑客不是通过参加大学编程课程来学习黑客的。他们通过在十三岁时编写自己的程序来学习黑客。即使在大学课程中,你也主要通过黑客来学习黑客。[3]

因为画家们留下了一系列作品,你可以通过观看他们来学习。如果你按时间顺序查看一位画家的作品,你会发现每幅画都建立在以前的画中学到的东西之上。当一幅画中的某些东西效果很好时,你通常可以在早期绘画中以较小的形式找到它的版本 1。

我认为大多数创造者都是这样工作的。作家和建筑师似乎也是如此。也许黑客们应该更像画家一样,定期从头开始,而不是继续在一个项目上工作多年,并试图将他们后来的所有想法作为修订纳入其中。

黑客们通过做来学习黑客这一事实,是黑客与科学不同的另一个标志。科学家不是通过做来学习科学的,而是通过做实验室和问题集来学习的。科学家们一开始做的工作是完美的,因为他们只是试图重现别人已经为他们做过的工作。最终,他们达到了可以做原创工作的地步。而黑客们从一开始就在做原创工作;只是非常糟糕。因此,黑客们开始是原创的,然后变得优秀,而科学家们开始是优秀的,然后变得原创。

创造者学习的另一种方式是从例子中学习。对于画家来说,博物馆是技术的参考图书馆。数百年来,复制伟大艺术家的作品一直是画家传统教育的一部分,因为复制迫使你仔细观察绘画的制作方式。

作家们也这样做。Benjamin Franklin 通过总结 Addison 和 Steele 的文章中的要点,然后尝试重现它们来学习写作。Raymond Chandler 用侦探小说做了同样的事情。

同样,黑客们可以通过查看好的程序来学习编程——不仅仅是它们做什么,还有源代码。开源运动的一个不太为人所知的好处是,它使学习编程变得更容易。当我学习编程时,我们主要依靠书籍中的例子。当时唯一可用的代码大块是 Unix,但即使这样也不是开源的。大多数阅读源代码的人都是在 John Lions 的书的非法复印件中阅读的,尽管该书写于 1977 年,但直到 1996 年才被允许出版。

我们可以从绘画中汲取的另一个例子是,绘画是通过逐渐改进来创作的。绘画通常从草图开始。细节逐渐被填补。但这不仅仅是一个填补的过程。有时最初的计划被证明是错误的。无数的绘画,当你用 X 光观察它们时,会发现肢体被移动过,或者面部特征被重新调整过。

这是一个我们可以从绘画中学习的案例。我认为黑客也应该这样工作。期望程序的规范是完美的是不现实的。如果你预先承认这一点,并以允许规范随时更改的方式编写程序,你会更好。

(大型公司的结构使他们很难做到这一点,因此这是创业公司具有优势的另一个地方。)

现在每个人大概都知道过早优化的危险。我认为我们应该同样担心过早设计——过早地决定程序应该做什么。

正确的工具可以帮助我们避免这种危险。一种好的编程语言应该像油画颜料一样,让你很容易改变主意。动态类型在这里是一个胜利,因为你不必预先确定特定的数据表示。但我认为灵活性的关键是使语言非常抽象。最容易更改的程序是非常短的程序。

这听起来像是一个悖论,但一幅伟大的绘画必须比它必须的更好。例如,当 Leonardo 在国家美术馆画 Ginevra de Benci 的肖像时,他在她的头后放了一棵杜松树。他在其中仔细地画了每一片叶子。许多画家可能会认为,这只是放在背景中以衬托她的头的东西。没有人会那么仔细地看它。

Leonardo 不是。他对绘画的一部分的努力程度完全不取决于他期望任何人多么仔细地看它。他就像 Michael Jordan。毫不留情。

毫不留情会获胜,因为总的来说,看不见的细节会变得可见。当人们走过 Ginevra de Benci 的肖像时,他们的注意力通常会立即被它吸引,甚至在他们看标签并注意到上面写着 Leonardo da Vinci 之前。所有这些看不见的细节结合在一起,产生了一些令人惊叹的东西,就像一千个几乎听不见的声音都在和谐地歌唱。

同样,伟大的软件需要对美学的狂热奉献。如果你查看好的软件内部,你会发现没有人应该看到的部分也很漂亮。我并不是说我编写伟大的软件,但我知道,当涉及到代码时,我的行为方式会让我有资格获得处方药,如果我以同样的方式对待日常生活的话。看到缩进不正确的代码,或者使用丑陋的变量名,会让我发疯。

如果一个黑客仅仅是一个实现者,将规范转化为代码,那么他就可以像挖沟一样,从一端到另一端完成它。但如果黑客是一个创造者,我们就必须考虑到灵感。

在黑客中,就像在绘画中一样,工作是周期性的。有时你会对某个新项目感到兴奋,并且想每天工作十六个小时。其他时候,似乎没有什么有趣的事情。

要做好工作,你必须考虑到这些周期,因为它们受到你对它们的反应的影响。当你在山上驾驶带有手动变速箱的汽车时,你有时必须松开离合器以避免熄火。同样,松开离合器可以防止雄心壮志熄火。在绘画和黑客中,有些任务是令人恐惧的雄心勃勃,而另一些任务则是令人感到舒适的例行公事。最好为那些你可能会熄火的时刻保留一些简单的任务。

在黑客中,这实际上意味着积攒错误。我喜欢调试:这是黑客唯一一次像人们认为的那样简单的时候。你有一个完全受约束的问题,而你所要做的就是解决它。你的程序应该做 x。但它却做了 y。它在哪里出错?你知道你最终会获胜。这就像粉刷墙壁一样令人放松。

绘画的例子不仅可以教我们如何管理自己的工作,还可以教我们如何一起工作。过去许多伟大的艺术作品都是多人合作完成的,尽管在博物馆里,它旁边的墙上可能只有一个名字。Leonardo 是 Verrocchio 工作室的学徒,并在他的基督的洗礼中画了一个天使。这种事情是常态,而不是例外。Michelangelo 因为坚持自己画西斯廷教堂天花板上的所有人物而被认为是特别敬业的。

据我所知,当画家们一起创作一幅画时,他们从不在同一部分工作。大师通常会画主要人物,而助手会画其他人和其他背景。但你永远不会让一个人在另一个人的作品上绘画。

我认为这也是软件协作的正确模型。不要把它推得太远。当一段代码被三到四个人黑客攻击时,没有人真正拥有它,它最终会像一个公共休息室一样。它会倾向于感到荒凉和被遗弃,并积累垃圾。我认为,正确的协作方式是将项目划分为明确定义的模块,每个模块都有一个明确的所有者,并且它们之间的接口经过精心设计,如果可能的话,像编程语言一样清晰。

像绘画一样,大多数软件都是为人类观众设计的。因此,黑客们,就像画家们一样,必须具有同理心才能做出真正伟大的作品。你必须能够从用户的角度看待事物。

当我还是个孩子的时候,我总是被告知要从别人的角度看问题。这在实践中总是意味着做别人想做的事情,而不是我想做的事情。这当然使同理心名声扫地,我特意不培养它。

天啊,我错了。事实证明,从别人的角度看问题实际上是成功的秘诀。这并不一定意味着自我牺牲。远非如此。理解别人如何看待事物并不意味着你会按照他的利益行事;在某些情况下——例如在战争中——你想要做的恰恰相反。[4]

大多数创造者为人类观众创造事物。而要吸引观众,你必须了解他们需要什么。例如,几乎所有最伟大的绘画都是人物画,因为人们对人感兴趣。

同理心可能是优秀黑客和伟大黑客之间最重要的区别。有些黑客非常聪明,但在同理心方面实际上是唯我论者。这样的人很难设计出伟大的软件[5],因为他们无法从用户的角度看待事物。

判断人们是否擅长同理心的一种方法是观察他们如何向没有技术背景的人解释技术问题。我们可能都认识一些人,尽管他们很聪明,但在这方面却非常糟糕。如果有人在晚宴上问他们什么是编程语言,他们会说“哦,高级语言是编译器用来生成目标代码的输入。”高级语言?编译器?目标代码?一个不知道什么是编程语言的人显然也不知道这些东西是什么。

软件必须做的一部分是解释自己。因此,要编写好的软件,你必须了解用户了解的很少。他们会在没有任何准备的情况下走近软件,它最好能按照他们猜测的方式运行,因为他们不会阅读手册。我见过的这方面最好的系统是 1985 年的原始 Macintosh。它做了软件几乎从不做的事情:它只是工作。[6]

源代码也应该解释自己。如果我能让人们记住一句关于编程的名言,那就是 _计算机程序的构造和解释 _ 开头的那句:

程序应该为人们阅读而编写,而只是顺便为机器执行。

你不仅需要对你的用户有同理心,还需要对你的读者有同理心。这符合你的利益,因为你将成为他们中的一员。许多黑客编写了一个程序,却在六个月后返回时发现他们不知道它是如何工作的。我认识几个人在经历过这样的经历后发誓不再使用 Perl。[7]

缺乏同理心与智力有关,以至于在某些地方甚至成为一种时尚。但我不认为两者之间有任何关联。你可以在数学和自然科学领域做得很好,而无需学习同理心,而这些领域的人往往很聪明,因此这两种品质已经联系在一起。但是也有很多愚蠢的人也不擅长同理心。只要听听那些在脱口秀节目中打电话提问的人。他们以一种如此迂回的方式提出他们所提出的问题,以至于主持人经常不得不为他们重新措辞。

那么,如果黑客像绘画和写作一样工作,它是否也一样酷?毕竟,你只有一次生命。你最好花在做一些伟大的事情上。

不幸的是,这个问题很难回答。声望总是存在很大的时间滞后。这就像来自遥远恒星的光。绘画现在之所以有声望,是因为人们在五百年前所做的伟大工作。当时,没有人认为这些画作像我们今天这样重要。当时的人们会觉得 Federico da Montefeltro,乌尔比诺公爵,有一天主要被称为 Piero della Francesca 的绘画中鼻子奇怪的人,这似乎很奇怪。

因此,虽然我承认黑客现在看起来不像绘画那么酷,但我们应该记住,绘画本身在其辉煌时期看起来并不像现在那么酷。

我们可以有一定把握地说,现在是黑客的辉煌时期。在大多数领域,伟大的工作都是在早期完成的。1430 年至 1500 年间创作的绘画仍然是无与伦比的。莎士比亚出现在专业戏剧诞生之际,并将这种媒介推到了如此遥远的地步,以至于此后的每一位剧作家都不得不生活在他的阴影之下。Albrecht Durer 在雕刻方面做了同样的事情,Jane Austen 在小说方面也是如此。

我们一次又一次地看到同样的模式。一种新的媒介出现,人们对它如此兴奋,以至于他们在最初的几代人中探索了它的大部分可能性。黑客似乎正处于这个阶段。

在 Leonardo 的时代,绘画并不像他的作品所帮助的那样酷。黑客最终会变得多么酷,将取决于我们如何利用这种新媒介。

注释

[1] 摄影对绘画造成的最大损害可能是它扼杀了最好的白天工作。历史上大多数伟大的画家都是通过画肖像来养活自己的。

[2] 我被告知 Microsoft 不鼓励员工为开源项目做出贡献,即使在业余时间也是如此。但是现在有这么多最好的黑客从事开源项目,以至于这项政策的主要影响可能是确保他们无法雇用任何一流的程序员。

[3] 你在大学里学到的关于编程的知识很像你学到的关于书籍、衣服或约会的知识:你在高中时有什么样的坏品味。

[4] 这是一个应用同理心的例子。在 Viaweb,如果我们无法在两种选择之间做出决定,我们会问,我们的竞争对手最讨厌什么?有一次,一个竞争对手在他们的软件中添加了一个基本上没用的功能,但由于这是他们拥有的少数几个我们没有的功能之一,他们在行业媒体上大肆宣传。我们可以尝试解释该功能没用,但我们认为,如果我们自己实现它,会更惹恼我们的竞争对手,因此我们在那天下午拼凑出了我们自己的版本。

[5] 除了文本编辑器和编译器。黑客不需要同理心来设计这些,因为他们自己就是典型的用户。

[6] 嗯,几乎。他们有点超出了可用的 RAM,导致了许多不方便的磁盘交换,但这可以在几个月内通过购买额外的磁盘驱动器来解决。

[7] 使程序易于阅读的方法不是用注释填充它们。我想更进一步地引用 Abelson 和 Sussman 的话。编程语言应该被设计用来表达算法,而只是顺便告诉计算机如何执行它们。一种好的编程语言应该比英语更适合解释软件。只有当有一些你需要警告读者的 kludge 时,你才需要注释,就像在道路上只有在有意外的急弯时才有箭头一样。

感谢 Trevor Blackwell、Robert Morris、Dan Giffin 和 Lisa Randall 阅读了本文的草稿,并感谢 Henry Leitner 和 Larry Finkelstein 邀请我发言。