设计与研究

2003年1月

(本文改编自2002年秋季NEPLS会议的主题演讲。)

来到这个国家的人常常惊讶地发现,美国人喜欢以询问“你是做什么的?”来开始对话。我从来不喜欢这个问题。我很少能给出一个简洁的答案。但我认为我终于解决了这个问题。现在,当有人问我做什么时,我会直视他们的眼睛说:“我正在设计一种新的Lisp方言。”我向任何不喜欢被问及做什么的人推荐这个答案。对话会立即转向其他话题。

我不认为自己是在研究编程语言。我只是在设计一种编程语言,就像有人可能设计一座建筑物、一把椅子或一种新的字体一样。我不是想发现任何新的东西。我只是想创造一种易于编程的语言。在某些方面,这个假设让生活变得轻松了很多。

设计和研究之间的区别似乎是一个关于“新”与“好”的问题。设计不必是新的,但必须是好的。研究不必是好的,但必须是新的。我认为这两条道路在顶端会合:最好的设计通过使用新的想法超越其前辈,而最好的研究解决了不仅新颖,而且实际上值得解决的问题。因此,最终我们的目标是相同的目的地,只是从不同的方向接近它。

我今天要讲的是从后面看,你的目标是什么样的。当你把编程语言当作一个设计问题而不是一个研究课题来对待时,你会做哪些不同的事情?

最大的区别在于你更关注用户。设计始于询问,这是为谁设计的,他们需要什么?例如,一个好的建筑师不是从创建一个设计,然后将其强加给用户开始,而是通过研究目标用户并弄清楚他们需要什么开始。

请注意我说的是“他们需要什么”,而不是“他们想要什么”。我不想给人一种印象,即作为一名设计师工作意味着作为一种短期厨师工作,制作客户告诉你的任何东西。这在艺术领域因领域而异,但我认为没有任何领域是由那些只做客户告诉他们的事情的人完成最好的作品。

从某种意义上说,客户_总是_对的,因为衡量好的设计的标准是它对用户的效果如何。如果你写了一本让每个人都感到厌烦的小说,或者一把坐起来非常不舒服的椅子,那么你就做了一件糟糕的工作,仅此而已。说这本小说或这把椅子是根据最先进的理论原则设计的,这并不能作为辩护。

然而,制作对用户有效的东西并不意味着简单地制作用户告诉你的东西。用户不知道所有的选择,并且常常对他们真正想要的东西感到困惑。

我认为,解决这个悖论的方法是,你必须为用户设计,但你必须设计用户需要的东西,而不仅仅是他说他想要的东西。这很像当医生。你不能只治疗病人的症状。当病人告诉你他的症状时,你必须弄清楚他到底出了什么问题,然后治疗它。

这种对用户的关注是一种公理,从中可以推导出大多数良好设计的实践,并且大多数设计问题都围绕着它。

如果好的设计必须做用户需要的事情,那么谁是用户?当我说设计必须为用户服务时,我并不是暗示好的设计旨在达到某种最低共同标准。你可以选择任何你想要的用户群体。例如,如果你正在设计一个工具,你可以为从初学者到专家的任何人设计它,并且对一个群体来说是好的设计,对另一个群体来说可能是糟糕的设计。关键是,你必须选择一些用户群体。我认为,如果不参考某个目标用户,你甚至无法谈论好或坏的设计。

如果目标用户包括设计师自己,你最有可能获得好的设计。当你为一个不包括你的群体设计东西时,它往往是为你认为不如你复杂的人设计的,而不是更复杂的人。

这是一个问题,因为俯视用户,无论多么仁慈,似乎都不可避免地会腐蚀设计师。我怀疑美国很少有住房项目是由期望住在其中的建筑师设计的。你可以在编程语言中看到同样的事情。C、Lisp和Smalltalk是为他们自己的设计师使用的而创建的。Cobol、Ada和Java是为其他人使用的而创建的。

如果你认为你正在为白痴设计东西,那么即使对白痴来说,你设计的也不是好东西。

即使你正在为最复杂的用户设计东西,你仍然是在为人类设计。这在研究中是不同的。在数学中,你不会因为抽象概念容易让人理解而选择它们;你会选择任何能使证明更短的概念。我认为这对于科学来说通常是正确的。科学思想不应该是符合人体工程学的。

在艺术领域,情况截然不同。设计完全是关于人的。人体是一个奇怪的东西,但是当你设计一把椅子时,这就是你设计的对象,而且没有办法绕过它。所有的艺术都必须迎合人类的兴趣和局限性。例如,在绘画中,在所有其他条件相同的情况下,一幅有人的画会比一幅没有人的画更有趣。文艺复兴时期伟大的画作都充满了人,这绝不仅仅是历史的偶然。如果它们不是这样,绘画作为一种媒介就不会有它现在的声望。

不管你喜不喜欢,编程语言也是为人服务的,我怀疑人脑就像人体一样笨拙和古怪。有些想法人们很容易掌握,有些则不然。例如,我们似乎处理细节的能力非常有限。正是这个事实首先使编程语言成为一个好主意;如果我们能够处理细节,我们就可以直接用机器语言编程。

还要记住,语言主要不是完成程序的格式,而是程序必须在其中开发的格式。任何艺术领域的人都可以告诉你,你可能想要为这两种情况使用不同的媒介。例如,大理石是一种很好的、耐用的完成想法的媒介,但对于开发新想法来说,它是一种非常不灵活的媒介。

一个程序,就像一个证明一样,是一棵树的修剪版本,这棵树过去曾有过从各个方向分叉的错误开始。因此,衡量一种语言的标准不仅仅是完成的程序在其中看起来有多干净,而是通往完成程序的路径有多干净。一个给你优雅的完成程序的设计选择可能不会给你一个优雅的设计过程。例如,我写了一些充满嵌套反引号的宏定义宏,现在看起来像小宝石,但编写它们花费了数小时最丑陋的试错,坦率地说,我仍然不能完全确定它们是正确的。

我们常常表现得好像衡量一种语言的标准是完成的程序在其中看起来有多好。当你看到同一个程序用两种语言编写时,其中一个版本要短得多,这似乎很有说服力。当你从艺术的方向来解决这个问题时,你就不太可能依赖这种测试。你不想最终得到一种像大理石一样的编程语言。

例如,在软件开发中,拥有一个交互式的顶层(在Lisp中称为read-eval-print循环)是一个巨大的胜利。当你拥有一个交互式的顶层时,这对语言的设计有实际的影响。例如,对于一种在使用变量之前必须声明变量的语言来说,它就不能很好地工作。当你只是在顶层输入表达式时,你希望能够将x设置为某个值,然后开始对x进行操作。你不想首先声明x的类型。你可能会对这两个前提中的任何一个提出异议,但是如果一种语言必须有一个顶层才能方便,并且强制类型声明与顶层不兼容,那么任何强制类型声明的语言都不可能方便编程。

在实践中,要获得好的设计,你必须接近你的用户,并与他们保持密切联系。你必须不断地根据实际用户来校准你的想法,尤其是在开始的时候。简·奥斯汀的小说如此出色的原因之一是她把它们大声朗读给她的家人听。这就是为什么她从不沉溺于自我放纵的艺术性风景描写,或自命不凡的哲学思考。(哲学就在那里,但它被编织到故事中,而不是像标签一样贴在上面。)如果你打开一本普通的“文学”小说,想象着把它大声朗读给你的朋友听,作为你写的东西,你就会非常敏锐地感受到这种东西对读者的强加。

在软件世界中,这个想法被称为“更糟即更好”。实际上,“更糟即更好”的概念中混合了几个想法,这就是为什么人们仍在争论更糟是否真的更好。但这种混合中的一个主要思想是,如果你正在构建新的东西,你应该尽快让用户看到原型。

另一种方法可以称为“孤注一掷”策略。你不是快速推出原型并逐步改进它,而是试图在一个漫长的达阵传球中创建完整的、完成的产品。据我所知,这是灾难的根源。在互联网泡沫期间,无数的初创公司以这种方式摧毁了自己。我从未听说过它奏效的案例。

软件世界之外的人可能没有意识到的是,“更糟即更好”在整个艺术领域都很常见。例如,在绘画中,这个想法是在文艺复兴时期被发现的。现在几乎所有的绘画老师都会告诉你,获得准确绘画的正确方法不是慢慢地沿着物体的轮廓进行绘画,因为错误会积累,你会发现在最后线条不相交。相反,你应该在大致正确的位置画几条快速的线条,然后逐渐完善这个初始草图。

在大多数领域,原型传统上是用不同的材料制成的。要用金属切割的字体最初是用刷子在纸上设计的。要用青铜铸造的雕像是在蜡中建模的。要绣在挂毯上的图案是用墨水在纸上绘制的。要用石头建造的建筑物是在木头上以较小的比例进行测试的。

当油画在十五世纪首次流行时,让它如此令人兴奋的是,你可以实际上_从_原型中制作出完成的作品。如果你愿意,你可以做一个初步的绘画,但你不会被它束缚;你可以在完成绘画时解决所有的细节,甚至做出重大的改变。

你也可以在软件中做到这一点。原型不必只是一个模型;你可以将它改进为完成的产品。我认为你应该总是这样做,如果可以的话。它可以让你利用你在此过程中获得的新见解。但也许更重要的是,它对士气有好处。

士气是设计的关键。我很惊讶人们没有更多地谈论它。我的一位绘画老师告诉我:如果你在画东西时感到无聊,那么这幅画看起来会很无聊。例如,假设你必须画一栋建筑物,并且你决定单独画每一块砖。如果你愿意,你可以这样做,但是如果你画到一半感到无聊,并且开始机械地制作砖块而不是观察每一块砖块,那么这幅画看起来会比你仅仅暗示砖块更糟糕。

通过逐步完善原型来构建东西对士气有好处,因为它让你保持参与。在软件中,我的规则是:始终拥有可工作的代码。如果你正在编写一些你可以在一个小时内测试的东西,那么你就有了一个立即获得奖励的前景来激励你。这在艺术领域也是如此,尤其是在油画中。大多数画家从模糊的草图开始,然后逐渐完善它。如果你以这种方式工作,那么原则上你永远不必以实际上看起来未完成的东西来结束一天。事实上,画家甚至有一句谚语:“一幅画永远不会完成,你只是停止在它上面工作。”任何从事软件工作的人都会熟悉这个想法。

士气是很难为不成熟的用户设计东西的另一个原因。很难对你不喜欢的东西保持兴趣。要创造出好的东西,你必须想着,“哇,这真是太棒了”,而不是“这真是狗屎;那些傻瓜会喜欢的”。

设计意味着为人类创造东西。但不仅仅是用户是人类。设计师也是人类。

请注意,这段时间我一直在谈论“设计师”。设计通常必须由一个人控制才能做好。然而,似乎几个人有可能在一个研究项目上进行合作。在我看来,这是研究和设计之间最有趣的差异之一。

在艺术领域有著名的合作例子,但它们中的大多数似乎都是分子结合而不是核聚变的情况。在歌剧中,通常由一个人来写剧本,另一个人来写音乐。在文艺复兴时期,来自北欧的工匠经常被雇用来做意大利绘画背景中的风景。但这些不是真正的合作。它们更像是罗伯特·弗罗斯特的“好篱笆造就好邻居”的例子。你可以将好的设计的实例粘合在一起,但在每个单独的项目中,必须由一个人来控制。

我并不是说好的设计要求一个人想到一切。没有什么比你信任的人的判断更有价值的建议了。但是在谈话结束后,关于做什么的决定必须由一个人来决定。

为什么研究可以由合作者完成,而设计不能?这是一个有趣的问题。我不知道答案。也许,如果设计和研究趋于一致,那么最好的研究也是好的设计,并且实际上不能由合作者完成。许多最著名的科学家似乎都是独自工作。但我没有足够的知识来说明这里是否存在某种模式。可能仅仅是许多著名的科学家在合作不太普遍的时候工作。

无论科学领域的情况如何,真正的合作在艺术领域似乎都非常罕见。委员会设计是糟糕设计的同义词。为什么会这样?有没有办法克服这个限制?

我倾向于认为没有——好的设计需要一个独裁者。原因之一是好的设计必须是完整的。设计不仅仅是为人类服务的,而是为个体人类服务的。如果一个设计代表一个适合一个人头脑的想法,那么这个想法也会适合用户的头脑。

相关: