Loading...

设计与研究

Original

2003年1月

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

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

我不认为自己在对编程语言进行研究。我只是在设计一种,就像有人可能设计一座建筑、一把椅子或一种新字体一样。我并不是想发现什么新东西。我只是想创造一种适合编程的语言。在某种程度上,这种假设让生活变得简单得多。

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

我今天要谈的是你的目标从后面看起来是什么样子。当你把编程语言视为设计问题而不是研究主题时,你会有什么不同的做法?

最大的区别在于你更关注用户。设计开始时要问,这个是为谁准备的,他们需要什么?例如,一个好的建筑师并不是通过创建一个他强加给用户的设计来开始,而是通过研究预期用户并弄清楚他们需要什么。

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

客户在某种意义上总是对的,因为好的设计的衡量标准是它对用户的有效性。如果你写了一本让所有人都感到无聊的小说,或者设计了一把坐着非常不舒服的椅子,那么你就做得很糟糕,没什么好辩解的。说这本小说或这把椅子是根据最先进的理论原则设计的并不能为你辩护。

然而,为用户制作有效的东西并不意味着仅仅制作用户告诉你的东西。用户并不知道所有的选择是什么,往往对他们真正想要的东西有误解。

我认为这个悖论的答案是,你必须为用户设计,但你必须设计用户需要的东西,而不仅仅是他所说的想要的东西。这就像当医生一样。你不能仅仅治疗病人的症状。当病人告诉你他的症状时,你必须弄清楚他实际上有什么问题,并治疗那个问题。

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

如果好的设计必须满足用户的需求,那么用户是谁?当我说设计必须为用户服务时,我并不是想暗示好的设计旨在某种最低公分母。你可以选择任何你想要的用户群体。例如,如果你在设计一个工具,你可以为从初学者到专家的任何人设计,而对一个群体来说好的设计可能对另一个群体来说是坏的。关键是,你必须选择某个用户群体。我认为你甚至不能谈论好的或坏的设计,除非是参考某个预期的用户。

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

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

如果你认为你在为傻瓜设计东西,那么你很可能并没有设计出好的东西,即使是为傻瓜设计的。

即使你是在为最复杂的用户设计东西,你仍然是在为人类设计。这在研究中是不同的。在数学中,你不会选择对人类易于理解的抽象;你选择的是使证明更简短的抽象。我认为这在科学领域普遍适用。科学思想并不是为了符合人类的使用。

在艺术领域,情况则大相径庭。设计完全是关于人。人体是一个奇怪的东西,但当你设计一把椅子时,这就是你要设计的对象,别无选择。所有艺术都必须迎合人类的兴趣和局限性。例如,在绘画中,其他条件相同的情况下,包含人物的画作通常会比没有人物的画作更有趣。文艺复兴时期的伟大画作中充满了人物,这并不是历史的偶然。如果没有这些人物,绘画作为一种媒介就不会有现在的声望。

不管你喜欢与否,编程语言也是为人类服务的,我怀疑人脑和人体一样复杂和特立独行。有些想法人们容易理解,有些则不然。例如,我们似乎对处理细节的能力非常有限。正是这个事实使得编程语言成为一个好主意;如果我们能够处理细节,我们就可以直接用机器语言编程。

还要记住,语言并不是完成程序的主要形式,而是程序必须在其中开发的东西。任何艺术领域的人都可以告诉你,在这两种情况下你可能希望使用不同的媒介。例如,大理石是一种适合完成想法的良好耐用媒介,但对于开发新想法来说却是无比僵化的。

程序就像一个证明,是一棵过去有许多错误分支的树的修剪版本。因此,语言的测试不仅仅是完成的程序在其中看起来有多干净,而是通往完成程序的路径有多干净。一个能让你得到优雅完成程序的设计选择,可能并不会给你一个优雅的设计过程。例如,我写过一些充满嵌套反引号的宏定义宏,现在看起来像小宝石,但写它们花了我几个小时的丑陋试错,坦率地说,我仍然不完全确定它们是正确的。

我们常常表现得好像语言的测试是完成程序在其中看起来有多好。当你看到同一个程序用两种语言编写时,其中一个版本要短得多,这似乎是如此令人信服。当你从艺术的角度接近问题时,你就不太可能依赖这种测试。你不想最终得到一种像大理石一样的编程语言。

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

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

在软件界,这个想法被称为“更糟更好”。实际上,“更糟更好”这个概念中混合了几个想法,这就是人们仍在争论更糟是否真的更好的原因。但其中一个主要想法是,如果你正在构建一些新东西,你应该尽快将原型展示给用户。

另一种方法可以称为“绝望一击”策略。与其快速推出原型并逐步完善它,不如试图在一次长传球中创造出完整的、最终的产品。据我所知,这是一种灾难的食谱。在互联网泡沫期间,无数初创公司就是这样自我毁灭的。我从未听说过这种方法成功的案例。

外界可能没有意识到的是,“更糟更好”在艺术中普遍存在。例如,在绘画中,这个想法是在文艺复兴时期发现的。现在几乎每个绘画老师都会告诉你,获得准确绘画的正确方法不是慢慢沿着物体的轮廓工作,因为错误会积累,最后你会发现线条不相交。相反,你应该在大致正确的位置画几条快速的线,然后逐渐完善这个初步草图。

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

油画在十五世纪首次流行时之所以令人兴奋,是因为你实际上可以从原型制作完成的作品。你可以根据需要制作初步草图,但你不必拘泥于此;你可以在完成绘画时处理所有细节,甚至进行重大更改。

在软件中你也可以这样做。原型不必仅仅是一个模型;你可以将其完善为最终产品。我认为你应该在可以的时候总是这样做。这让你能够利用沿途获得的新见解。但也许更重要的是,这对士气有好处。

士气在设计中至关重要。我很惊讶人们不更多地谈论它。我的一位绘画老师告诉我:如果你在画某样东西时感到无聊,画作就会看起来无聊。例如,假设你必须画一座建筑,而你决定逐个画每一块砖。如果你愿意,可以这样做,但如果你在过程中感到无聊,开始机械地画砖而不是观察每一块,画作的效果会比你仅仅暗示砖块时更糟。

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

士气是另一个原因,为什么为不复杂的用户设计东西很难。对你自己不喜欢的东西保持兴趣是很困难的。要做出好的东西,你必须在想:“哇,这真棒”,而不是“这真是一堆废物;那些傻瓜会喜欢它。”

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

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

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

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

为什么研究可以由合作者完成,而设计却不行?这是一个有趣的问题。我不知道答案。也许,如果设计和研究汇聚,最好的研究也是好的设计,实际上无法由合作者完成。许多最著名的科学家似乎都是独自工作的。但我不知道是否存在某种模式。可能只是许多著名科学家在合作不那么普遍的时候工作。

无论科学界的故事是什么,真正的合作在艺术中似乎是极其罕见的。委员会设计是糟糕设计的同义词。为什么会这样?有没有办法打破这个限制?

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