黑客与画家
Original2003 年 5 月
(这篇文章源于我在哈佛大学的客座演讲,其中包含了我在东北大学的一次早期演讲。)
当我完成计算机科学研究生学业后,我去了艺术学校学习绘画。许多人似乎对一个对计算机感兴趣的人也会对绘画感兴趣感到惊讶。他们似乎认为黑客和绘画是截然不同的工作——黑客是冷酷、精确和有条理的,而绘画则是某种原始冲动的狂热表达。
这两种看法都是错误的。黑客和绘画有很多共同点。事实上,在我认识的所有不同类型的人中,黑客和画家是最相似的。
黑客和画家共同的特点是他们都是创造者。与作曲家、建筑师和作家一样,黑客和画家试图做的是创造美好的事物。他们本身并不进行研究,但如果在创造美好事物的过程中他们发现了一些新的技术,那就更好了。
我一直不喜欢“计算机科学”这个词。我不喜欢它的主要原因是,根本不存在这种东西。计算机科学是一个由历史偶然事件拼凑起来的、关系松散的领域的集合,就像南斯拉夫一样。在一端,你有一些人实际上是数学家,但他们把他们所做的事情称为计算机科学,这样他们就可以获得 DARPA 的资助。在中间,你有一些人从事类似于计算机自然史的工作——例如,研究算法在网络中路由数据的行为。然后在另一端,你拥有黑客,他们试图编写有趣的软件,对他们来说,计算机只是一种表达媒介,就像建筑师的混凝土或画家的油漆一样。就好像数学家、物理学家和建筑师都必须在一个系里一样。
有时黑客所做的事情被称为“软件工程”,但这个词同样具有误导性。优秀的软件设计师与建筑师一样,都不是工程师。建筑和工程之间的界限并不清晰,但它确实存在。它落在了“什么”和“如何”之间:建筑师决定做什么,工程师弄清楚如何去做。
“什么”和“如何”不应该过于分离。如果你试图在不了解如何去做的情况下决定做什么,你就是在自找麻烦。但黑客当然可以不仅仅是决定如何实现某个规范。在最好的情况下,它是在创建规范——尽管事实证明,最好的方法是实现它。
也许有一天,“计算机科学”会像南斯拉夫一样,被分解成它的组成部分。这可能是一件好事。特别是如果这意味着我的祖国黑客获得独立。
将所有这些不同的工作类型捆绑在一个系里,在行政上可能很方便,但在智力上却令人困惑。这是我不喜欢“计算机科学”这个名字的另一个原因。可以说,中间的人正在做一些类似于实验科学的事情。但两端的人,黑客和数学家,实际上并没有做科学。
数学家似乎并不为此烦恼。他们愉快地开始证明定理,就像数学系的其他数学家一样,并且可能很快就不再注意到他们工作的建筑物外面写着“计算机科学”。但对于黑客来说,这个标签是一个问题。如果他们所做的事情被称为科学,这会让他们觉得他们应该表现得像科学家一样。因此,大学和研究实验室的黑客,而不是做他们真正想做的事情,即设计漂亮的软件,他们觉得他们应该写研究论文。
在最好的情况下,论文只是一个形式。黑客编写了很酷的软件,然后写了一篇关于它的论文,这篇论文成为软件所代表的成就的代理。但这种不匹配经常会导致问题。很容易从构建美丽的事物转向构建丑陋的事物,而丑陋的事物更适合作为研究论文的主题。
不幸的是,美丽的事物并不总是成为论文的最佳主题。首先,研究必须是原创的——正如任何写过博士论文的人都知道的那样,确保你在探索处女地的方式是,在没有人想要的地方圈出一块地。其次,研究必须是实质性的——而笨拙的系统会产生更丰满的论文,因为你可以写下为了完成工作而必须克服的障碍。没有什么比从错误的假设开始更能产生丰满的问题了。人工智能的大部分都是这个规则的例子;如果你假设知识可以表示为一组谓词逻辑表达式,其参数代表抽象概念,那么你将有很多论文要写,关于如何使它起作用。正如里奇·里卡多过去常说,“露西,你有很多解释要给出。”
创造美丽事物的途径通常是对已经存在的事物进行细微的调整,或者以一种略微新颖的方式将现有的想法结合起来。这种工作很难在研究论文中表达出来。
那么,为什么大学和研究实验室继续用出版物来评判黑客呢?原因与“学术能力”用简单化的标准化测试来衡量,或者程序员的生产力用代码行数来衡量是一样的。这些测试很容易应用,而且没有什么比一个有效的简单测试更诱人了。
衡量黑客真正试图做的事情,即设计漂亮的软件,会困难得多。你需要有良好的设计感来判断好的设计。而且,人们识别出好设计的的能力与他们认为自己能够识别好设计的信心之间没有相关性,除了可能存在负相关之外。
唯一的外部测试是时间。随着时间的推移,美丽的事物往往会蓬勃发展,而丑陋的事物往往会被丢弃。不幸的是,所涉及的时间可能比人类的寿命还要长。塞缪尔·约翰逊说,一个作家的声誉需要一百年才能收敛。你必须等到作家的有影响力的朋友去世,然后等到他们所有的追随者都去世。
我认为黑客只能认命,他们的声誉中存在很大的随机成分。在这方面,他们与其他创造者没有什么不同。事实上,与他们相比,黑客很幸运。时尚的影响在黑客领域远不如在绘画领域那么大。
比人们误解你的作品更糟糕的事情是,你自己会误解自己的作品。相关领域是你寻找想法的地方。如果你发现自己身处计算机科学系,就会有一种自然的诱惑,让你相信,例如,黑客是理论计算机科学的理论的应用版本。在我读研究生期间,我一直有一种不舒服的感觉,潜藏在我的脑海深处,我觉得我应该了解更多理论,而且我忘记了考试结束后的三周内所有这些东西,这真是我的失误。
现在我意识到我错了。黑客需要了解计算理论的程度,就像画家需要了解油漆化学的程度一样。你需要知道如何计算时间和空间复杂度,以及关于图灵完备性的知识。你可能还想记住至少状态机的概念,以防你必须编写解析器或正则表达式库。事实上,画家必须记住关于油漆化学的知识比这多得多。
我发现,最好的想法来源不是那些名字中包含“计算机”的其他领域,而是那些其他由创造者居住的领域。绘画比计算理论提供了更多丰富的想法来源。
例如,我在大学里被教导,应该在接触计算机之前,先在纸上完全弄清楚一个程序。我发现我并没有以这种方式编程。我发现我喜欢坐在电脑前编程,而不是坐在一张纸前。更糟糕的是,我没有耐心地写出一个完整的程序并确保它是正确的,而是倾向于只是喷出完全错误的代码,然后逐渐把它打造成型。我被教导说调试是一种最终的步骤,你可以在其中捕捉到打字错误和疏忽。我工作的方式,似乎编程就是调试。
很长一段时间,我对此感到很糟糕,就像我曾经因为没有按照小学老师教我的方式握笔而感到糟糕一样。如果我当时只是看看其他创造者,画家或建筑师,我就会意识到我正在做的事情有一个名字:素描。据我所知,他们在大学里教我的编程方式都是错误的。你应该在编写程序时弄清楚程序,就像作家、画家和建筑师一样。
意识到这一点对软件设计有真正的影响。这意味着,首先,编程语言应该是可塑的。编程语言是为了思考程序,而不是为了表达你已经想到的程序。它应该是一支铅笔,而不是一支钢笔。如果人们真的按照大学里教我的方式编写程序,那么静态类型将是一个好主意。但我知道的任何黑客都不是这样编写程序的。我们需要一种语言,让我们可以涂鸦、弄脏和涂抹,而不是一种语言,你必须坐在膝盖上放着一杯类型茶,并与一位严格的老编译器阿姨进行礼貌的交谈。
既然我们谈到了静态类型,那么与创造者认同将使我们免受困扰科学的另一个问题的困扰:数学嫉妒。科学界的所有人暗地里都认为数学家比他们聪明。我认为数学家也相信这一点。无论如何,结果是科学家倾向于使他们的工作看起来尽可能地数学化。在物理学这样的领域,这可能不会造成太大伤害,但你离自然科学越远,这个问题就越严重。
一页公式看起来非常令人印象深刻。(提示:为了更令人印象深刻,请使用希腊字母变量。)因此,人们非常渴望研究可以用形式化方法处理的问题,而不是那些例如重要的问题。
如果黑客认同其他创造者,比如作家和画家,他们就不会感到有这种诱惑。作家和画家不会受到数学嫉妒的困扰。他们觉得他们在做一些完全无关的事情。我认为黑客也是如此。
如果大学和研究实验室阻止黑客做他们想做的事情,那么也许他们应该去公司。不幸的是,大多数公司也不会让黑客做他们想做的事情。大学和研究实验室强迫黑客成为科学家,而公司强迫他们成为工程师。
我直到最近才发现这一点。当雅虎收购 Viaweb 时,他们问我想要做什么。我一直不太喜欢商业方面的事情,并说我只想黑客。当我来到雅虎时,我发现他们对黑客的理解是实现软件,而不是设计软件。程序员被视为技术人员,他们将产品经理的愿景(如果这个词合适的话)转化为代码。
这似乎是大公司的默认计划。他们这样做是因为它降低了结果的标准差。只有很少一部分黑客能够真正设计软件,而且公司管理人员很难挑选出这些人。因此,大多数公司不是将软件的未来托付给一位天才黑客,而是将事情安排得由委员会设计,而黑客只是实现设计。
如果你想在某个时候赚钱,请记住这一点,因为这是初创公司获胜的原因之一。大公司希望降低设计结果的标准差,因为他们希望避免灾难。但是,当你抑制振荡时,你会失去高点和低点。这对大公司来说不是问题,因为他们不是通过制造伟大的产品来获胜的。大公司通过比其他大公司更少地吸取教训来获胜。
因此,如果你能想出一个方法,与一家足够大的公司进行设计战,以至于它的软件是由产品经理设计的,那么他们将永远无法赶上你。不过,这些机会并不容易找到。与一家大公司进行设计战很难,就像在城堡内部与对手进行肉搏战一样。例如,编写一个比微软 Word 更好的文字处理器会很容易,但微软,在他们操作系统垄断的城堡内,可能甚至不会注意到你做了什么。
进行设计战的地方是在新市场,在那里还没有人设法建立任何防御工事。在那里,你可以通过大胆的设计方法,以及让同一个人既设计又实现产品,来赢得大胜。微软自己在一开始就做到了这一点。苹果也是如此。还有惠普。我怀疑几乎所有成功的初创公司都这样做过。
因此,构建优秀软件的一种方法是创办自己的初创公司。不过,这有两个问题。一个是,在初创公司中,你必须做很多除了编写软件之外的事情。在 Viaweb,如果我能有四分之一的时间黑客,我会认为自己很幸运。而我必须在另外四分之三的时间里做的事情,从乏味到可怕。我有一个衡量标准,因为我曾经不得不离开董事会会议去补牙。我记得坐在牙医的椅子上,等待钻头,感觉自己好像在度假。
初创公司的另一个问题是,赚钱的软件类型与有趣的软件类型之间没有太多重叠。编程语言很有趣,事实上,微软的第一款产品就是一种编程语言,但现在没有人会为编程语言付费。如果你想赚钱,你往往被迫处理那些太难,以至于没有人愿意免费解决的问题。
所有创造者都面临着这个问题。价格由供求决定,而人们对有趣的工作的需求并不像对解决个人客户日常问题的需求那样多。在非百老汇戏剧中表演,不如在贸易展上穿着大猩猩服装在某人的展位上表演赚钱。写小说不如为垃圾处理器写广告文案赚钱。而黑客编程语言不如弄清楚如何将某家公司的遗留数据库连接到他们的 Web 服务器赚钱。
我认为,在软件的情况下,这个问题的答案是几乎所有创造者都知道的一个概念:日常工作。这个短语最初是由音乐家使用的,他们晚上表演。更一般地说,这意味着你有一种工作是为了赚钱,而另一种工作是为了爱情。
几乎所有创造者在职业生涯的早期都有日常工作。画家和作家尤其如此。如果你幸运的话,你可以找到一份与你的真正工作密切相关的日常工作。音乐家通常似乎在唱片店工作。一个正在开发某种编程语言或操作系统的黑客,同样可以找到一份使用它的日常工作。[1]
当我说明黑客应该有日常工作,并在业余时间开发漂亮的软件时,我并不是提出一个新想法。这就是开源黑客的全部意义。我的意思是,开源可能是正确的模式,因为它已经被所有其他创造者独立地证实了。
在我看来,任何雇主都不愿意让黑客参与开源项目,这令人惊讶。在 Viaweb,我们本来不愿意雇用任何不参与开源项目的人。当我们面试程序员时,我们最关心的是他们在业余时间编写了什么样的软件。除非你热爱某件事,否则你不可能把它做得很好,如果你热爱黑客,你不可避免地会参与自己的项目。[2]
因为黑客是创造者而不是科学家,所以寻找隐喻的正确地方不是科学,而是其他类型的创造者。绘画还能教会我们关于黑客的什么?
我们可以从绘画的例子中学到,或者至少可以确认,如何学习黑客。你主要通过实践来学习绘画。黑客也是如此。大多数黑客不是通过上大学的编程课程来学习黑客的。他们是在 13 岁时通过编写自己的程序来学习黑客的。即使是在大学课程中,你主要也是通过黑客来学习黑客的。[3]
因为画家会留下作品的痕迹,所以你可以观察他们通过实践来学习。如果你按时间顺序查看画家的作品,你会发现每一幅画都建立在之前作品中所学到的东西之上。当一幅画中有一些东西非常有效时,你通常可以在更早的画作中找到它的小版本。
我认为大多数创造者都是这样工作的。作家和建筑师似乎也是如此。也许对黑客来说,更像画家一样,定期从头开始,而不是在一个项目上工作多年,并试图将他们后来的所有想法都作为修改来纳入,这将是一件好事。
黑客通过实践来学习黑客这一事实,是黑客与科学不同的另一个迹象。科学家不是通过实践来学习科学的,而是通过做实验和习题来学习的。科学家从做完美的工作开始,从某种意义上说,他们只是试图复制其他人已经为他们做过的工作。最终,他们会达到能够做原创工作的程度。而黑客从一开始就在做原创工作;只是非常糟糕。所以黑客从原创开始,变得越来越好,而科学家从优秀开始,变得越来越原创。
创造者学习的另一种方式是通过例子。对于画家来说,博物馆是一个技术参考库。几百年来,复制大师的作品一直是画家传统教育的一部分,因为复制迫使你仔细观察一幅画的制作方式。
作家也是如此。本杰明·富兰克林通过总结艾迪生和斯蒂尔的散文中的要点,然后试图复制它们来学习写作。雷蒙德·钱德勒对侦探小说做了同样的事情。
同样,黑客可以通过查看好的程序来学习编程——不仅仅是查看它们的功能,还要查看源代码。开源运动鲜为人知的益处之一是,它使学习编程变得更容易。当我学习编程时,我们主要依靠书中的例子。当时唯一可用的代码块是 Unix,但它甚至不是开源的。大多数阅读源代码的人都是通过阅读约翰·莱昂斯书籍的非法影印本来阅读的,这本书虽然写于 1977 年,但直到 1996 年才被允许出版。
我们可以从绘画中借鉴的另一个例子是,绘画是如何通过逐渐细化来创作的。绘画通常从素描开始。细节逐渐被填充。但这不仅仅是一个填充的过程。有时,最初的计划被证明是错误的。无数的绘画,当你用 X 光照射它们时,你会发现它们的手臂被移动了,或者面部特征被重新调整了。
这是一个我们可以从绘画中学习的地方。我认为黑客也应该以这种方式工作。期望一个程序的规范是完美的,是不现实的。如果你一开始就承认这一点,并以一种允许规范动态变化的方式编写程序,你会做得更好。
(大型公司的结构使他们很难做到这一点,所以这是初创公司具有优势的另一个地方。)
现在每个人都应该知道过早优化的危险。我认为我们应该同样担心过早设计——过早地决定一个程序应该做什么。
正确的工具可以帮助我们避免这种危险。一个好的编程语言应该像油画一样,使你很容易改变主意。动态类型在这里是一个优势,因为你不需要一开始就承诺特定的数据表示。但我认为,灵活性的关键是使语言非常抽象。最容易改变的程序是长度非常短的程序。
这听起来像一个悖论,但一幅伟大的绘画必须比它必须的更好。例如,当莱昂纳多在国家美术馆为吉内夫拉·本奇画肖像时,他在她头后面放了一棵杜松树。他仔细地画下了每一片叶子。许多画家可能会想,这只是为了给她的头部构图而放在背景中的东西。没有人会仔细看它。
莱昂纳多不是这样。他对一幅画的某个部分付出了多少努力,与他期望任何人看它有多仔细完全无关。他就像迈克尔·乔丹。毫不留情。
毫不留情会取得胜利,因为总的来说,看不见的细节会变得可见。当人们走过吉内夫拉·本奇的肖像时,他们的注意力往往会立即被它吸引,甚至在他们看标签并注意到上面写着莱昂纳多·达·芬奇之前。所有这些看不见的细节结合在一起,产生了令人惊叹的东西,就像一千个几乎听不见的声音一起合奏一样。
同样,伟大的软件需要对美有着狂热的追求。如果你查看好的软件内部,你会发现那些没有人应该看到的部分也很美。我并不是说我编写了伟大的软件,但我确实知道,在代码方面,我的行为方式会让我有资格获得处方药,如果我以同样的方式对待日常生活的话。看到代码缩进不好,或者使用难看的变量名,会让我发疯。
如果黑客只是一个实现者,将规范转化为代码,那么他就可以像挖沟一样,从头到尾地完成工作。但如果黑客是一个创造者,我们必须考虑灵感。
在黑客领域,就像绘画一样,工作是循环进行的。有时你会对某个新项目感到兴奋,你想每天工作 16 个小时。有时什么都提不起兴趣。
为了做好工作,你必须考虑到这些循环,因为它们会受到你对它们的反应的影响。当你驾驶一辆手动挡汽车在山坡上行驶时,你必须有时松开离合器,以避免熄火。同样,松开离合器也可以防止雄心壮志熄火。在绘画和黑客领域,都有一些任务令人恐惧地雄心勃勃,而另一些任务则令人欣慰地例行公事。在你会熄火的时候,保存一些简单的任务是个好主意。
在黑客领域,这实际上意味着保存一些错误。我喜欢调试:这是黑客与人们认为的那样直接的唯一时刻。你有一个完全受约束的问题,你所要做的就是解决它。你的程序应该做 x。但它却做了 y。它在哪里出错?你知道你最终会赢。这就像粉刷墙壁一样轻松。
绘画的例子不仅可以教会我们如何管理自己的工作,还可以教会我们如何一起工作。过去许多伟大的艺术作品都是由多双手完成的,尽管博物馆墙边可能只有一张名字。莱昂纳多是维罗基奥工作室的学徒,他在维罗基奥的基督受洗中画了一位天使。这种事情是常态,而不是例外。米开朗基罗坚持自己绘制西斯廷教堂天花板上的所有人物,被认为是特别敬业的。
据我所知,当画家一起创作一幅画时,他们从不共同创作同一部分。大师通常会绘制主要人物,而助手则绘制其他人物和背景。但你永远不会看到一个人在另一个人的作品上绘画。
我认为这是软件协作的正确模式。不要把它推得太远。当一段代码由三四个不同的人黑客,而没有人真正拥有它时,它最终会变成一个公共房间。它会让人感觉阴郁而荒凉,并积累垃圾。我认为,正确的协作方式是将项目划分为明确定义的模块,每个模块都有一个明确的拥有者,并且它们之间的接口设计得尽可能仔细,并且如果可能的话,像编程语言一样清晰。
像绘画一样,大多数软件都是针对人类受众的。因此,黑客,就像画家一样,必须具有同理心才能做出真正伟大的作品。你必须能够从用户的角度看待事物。
当我还是个孩子的时候,我总是被告知要从别人的角度看待事物。在实践中,这总是意味着做别人想做的事情,而不是做我想做的事情。这当然让同理心声名狼藉,我刻意不去培养它。
天哪,我错了。事实证明,从别人的角度看待事物几乎是成功的秘诀。这并不一定意味着要自我牺牲。远非如此。理解别人如何看待事物并不意味着你会按照他的利益行事;在某些情况下——例如在战争中——你想要做的恰恰相反。[4]
大多数创造者都是为人类受众创作东西的。为了吸引受众,你必须了解他们的需求。例如,几乎所有最伟大的绘画都是人物画,因为人们对人们感兴趣。
同理心可能是优秀黑客与伟大黑客之间最显著的区别。有些黑客非常聪明,但在同理心方面几乎是唯我独尊的。对于这样的人来说,设计出伟大的软件[5]很难,因为他们无法从用户的角度看待事物。
判断人们同理心水平的一种方法是观察他们向没有技术背景的人解释技术问题的方式。我们可能都认识这样的人,尽管他们很聪明,但在这一点上却非常糟糕。如果有人在晚宴上问他们什么是编程语言,他们会说类似于“哦,高级语言是编译器用来生成目标代码的输入。”高级语言?编译器?目标代码?一个不知道什么是编程语言的人显然也不知道这些东西是什么。
软件的一部分工作是解释自己。因此,要编写好的软件,你必须了解用户对软件的了解程度。他们将毫无准备地走到软件面前,它最好按照他们的猜测去做,因为他们不会阅读手册。我在这方面见过的最好的系统是 1985 年的原始 Macintosh。它做到了软件几乎从未做到的事情:它只是工作。[6]
源代码也应该解释自己。如果我能让人们记住关于编程的一句话,那就是《计算机程序的结构与解释》开头的这句话。
程序应该写给人看,而只是偶然地让机器执行。
你需要对你的用户和你的读者都有同理心。这符合你的利益,因为你也会成为其中一员。许多黑客编写了一个程序,结果发现六个月后回到它时,他不知道它是如何工作的。我知道有几个人在经历过这样的事情后就发誓不再使用 Perl 了。[7]
缺乏同理心与智力有关,以至于在某些地方甚至有一种时尚。但我认为两者之间没有相关性。你可以在数学和自然科学领域取得成功,而无需学习同理心,而且这些领域的人往往很聪明,因此这两个品质已经联系在一起。但也有很多愚蠢的人在同理心方面也很差。只要听听那些打电话到脱口秀节目中提问的人。他们以一种如此迂回的方式提出问题,以至于主持人经常不得不为他们重新措辞问题。
那么,如果黑客像绘画和写作一样,它是否同样酷?毕竟,你只有一次生命。你最好把它花在做一些伟大的事情上。
不幸的是,这个问题很难回答。声望总是存在很大的时间滞后。就像来自遥远恒星的光一样。绘画现在之所以有声望,是因为人们在五百年前做出了伟大的作品。当时,没有人认为这些画像我们今天认为的那样重要。当时的人们会觉得费德里科·达·蒙特费尔特罗,乌尔比诺公爵,有一天会以皮耶罗·德拉·弗朗切斯卡的一幅画中那个鼻子奇怪的人而闻名,这会让人觉得很奇怪。
因此,虽然我承认黑客现在看起来不像绘画那样酷,但我们应该记住,绘画在它辉煌的日子里,看起来也不像现在这样酷。
我们可以有把握地说,这是黑客的辉煌时代。在大多数领域,伟大的工作都是在早期完成的。1430 年到 1500 年之间创作的绘画至今仍无与伦比。莎士比亚出现在职业戏剧诞生的同时,
并将这种媒介推向了如此之远,以至于此后的每一位剧作家都不得不生活在他的阴影之下。阿尔布雷希特·丢勒对版画做了同样的事情,简·奥斯汀对小说做了同样的事情。
我们一次又一次地看到相同的模式。一种新的媒介出现了,人们对它如此兴奋,以至于他们在最初的几代人中探索了它的大部分可能性。黑客似乎现在正处于这个阶段。
在莱昂纳多的时代,绘画不像他的作品所帮助它变得那样酷。黑客最终会变得多么酷,将取决于我们能用这种新媒介做什么。
注释
[1] 摄影对绘画造成的最大损害可能是它扼杀了最好的日常工作。历史上大多数伟大的画家都是靠画肖像来维持生计的。
[2] 我听说微软阻止员工参与开源项目,即使是在业余时间。但现在有如此多的优秀黑客参与开源项目,这项政策的主要影响可能是确保他们无法雇用任何一流的程序员。
[3] 你在大学里学到的关于编程的知识,就像你学到的关于书籍、衣服或约会的知识一样:你在高中时有多糟糕的品味。
[4] 这是一个应用同理心的例子。在 Viaweb,如果我们无法在两种选择之间做出决定,我们会问,我们的竞争对手最讨厌什么?有一次,一个竞争对手在他们的软件中添加了一个功能,这个功能基本上是无用的,但由于它是他们拥有的为数不多的我们没有的功能之一,因此他们在贸易媒体上大肆宣传。我们可以尝试解释这个功能是无用的,但我们决定,如果我们自己实现它,会让我们的竞争对手更恼火,所以我们当天下午就拼凑出了我们自己的版本。
[5] 除了文本编辑器和编译器。黑客不需要同理心来设计这些,因为他们本身就是典型的用户。
[6] 好吧,几乎。他们有点超过了可用的内存,导致了很多不方便的磁盘交换,但这可以通过在几个月内购买一个额外的磁盘驱动器来解决。
[7] 使程序易于阅读的方法不是在其中塞满注释。我会将艾布尔森和苏斯曼的引言更进一步。编程语言应该被设计用来表达算法,而只是偶然地告诉计算机如何执行它们。一个好的编程语言应该比英语更适合解释软件。你只应该
在需要警告读者某种 kludge 时才需要注释,就像在道路上,只有在意外的急转弯处才会有箭头。
感谢特雷弗·布莱克韦尔、罗伯特·莫里斯、丹·吉芬和丽莎·兰德尔阅读了这篇文章的草稿,感谢亨利·莱特纳和拉里·芬克尔斯坦邀请我演讲。