Loading...

设计与研究

Original

2003年1月

(这篇文章源自2002年秋季NEPLS会议上的主题演讲。)

来到这个国家的访客常常会惊讶地发现,美国人喜欢以"你做什么工作?"作为开场白。我从来不喜欢这个问题。我很少有一个简单的答复。但我想我终于解决了这个问题。现在,当有人问我做什么工作时,我直视他们的眼睛说:"我正在设计一种新的Lisp方言。"我建议任何不喜欢被问到工作的人都可以使用这个答复。对话会立即转向其他话题。

我不认为自己在做编程语言研究。我只是在设计一种语言,就像有人设计一栋建筑、一把椅子或一种新的字体一样。我不是在试图发现什么新东西。我只是想创造一种编程起来很好的语言。在某些方面,这个假设使生活变得轻松多了。

设计和研究之间的区别似乎在于新颖性与优秀性。设计不必是新的,但必须很好。研究不必很好,但必须是新的。我认为这两条道路在顶端会汇合:最好的设计通过使用新思想超越了前辈,而最好的研究解决了不仅新颖,而且实际上值得解决的问题。所以最终我们都在朝着同一个目标前进,只是从不同的方向接近它。

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

最大的区别是你更关注用户。设计从问"这是为谁设计的,他们需要什么"开始。一个优秀的建筑师,例如,不是先创造一个设计然后强加给用户,而是研究预期用户,弄清楚他们需要什么。

我说的是"他们需要什么",而不是"他们想要什么"。我并不是想给人一种印象,作为设计师意味着像短订餐师一样,做客户告诉你做的任何事情。这在艺术领域有所不同,但我认为没有任何领域的最佳作品是由那些只做客户告诉他们做的事情的人创造的。

客户总是对的,因为好的设计的衡量标准是它为用户工作得有多好。如果你创作一部让所有人都感到无聊的小说,或一把坐起来非常不舒服的椅子,那么你就做得很糟糕,没有任何借口说这个小说或椅子是根据最先进的理论原则设计的。

然而,为用户创造有用的东西并不意味着简单地做用户告诉你做的事情。用户不知道所有的选择,并且常常对自己真正想要什么产生误解。

我认为这个矛盾的答案是,你必须为用户设计,但你必须设计用户需要的东西,而不仅仅是他们说他们想要的东西。这很像做医生。你不能只治疗病人的症状。当病人告诉你他的症状时,你必须弄清楚他实际上出了什么问题,并治疗那个问题。

这种关注用户的做法是一种公理,从中可以推导出大部分优秀设计的实践,并且围绕它的大部分设计问题都集中在这一点上。

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

如果设计的预期用户包括设计者自己,你最有可能得到好的设计。当你为不包括你自己的群体设计时,往往是为你认为比你低级的人设计,而不是更高级的人。

这是个问题,因为不管是出于善意,看不起用户似乎都会腐蚀设计者。我怀疑在美国,很少有住房项目是由预计自己会住在里面的建筑师设计的。你可以在编程语言中看到同样的情况。C、Lisp和Smalltalk是为它们的设计者自己使用而创造的。Cobol、Ada和Java则是为其他人使用而创造的。

如果你认为你在为白痴设计,很可能你设计的东西连白痴都不好,更不用说其他人了。

即使你是为最高级的用户设计,你也仍然是在为人类设计。这与研究是不同的。在数学中,你选择抽象概念不是因为人类容易理解,而是因为它们能使证明更简短。我认为这在科学领域普遍如此。科学思想并不是为了人体工程学设计的。

在艺术领域,情况完全不同。设计全都是关于人的。人体是一个奇怪的东西,但当你设计一把椅子时,这就是你设计的对象,没有办法逃避。所有的艺术都必须迎合人类的兴趣和局限性。例如,在绘画中,其他条件相同的情况下,有人物的画作会比没有人物的更有趣。文艺复兴时期伟大的绘画作品都充满了人物,这并非偶然,如果没有人物,绘画这种媒体也不会有今天的地位。

不管喜欢与否,编程语言也是为人而设计的,我怀疑人大脑的怪癖和人体一样奇怪。有些想法对人来说很容易掌握,有些则不然。例如,我们似乎对处理细节有很大的局限性。正是这个事实使编程语言成为一个好主意;如果我们能处理细节,我们就可以直接用机器语言编程了。

请记住,语言并不是成品程序的形式,而是程序必须在其中开发的东西。任何从事艺术工作的人都会告诉你,你可能需要不同的媒介来处理这两种情况。例如,大理石是成品思想的一种很好、耐用的媒介,但对于开发新思想来说却是一种毫无弹性的媒介。

程序就像证明一样,是过去满布错误尝试的树枝被修剪过的版本。因此,一种语言的测试不仅仅是它的成品程序看起来有多干净,还在于达到成品程序的过程有多干净。一个给你优雅成品程序的设计选择,未必会给你一个优雅的设计过程。例如,我写过一些充满嵌套反引号的宏定义宏,现在看起来像小宝石,但写它们花了数小时最丑陋的试错,说实话,我还不完全确定它们是否正确。

我们常常认为,一种语言的测试就是它的成品程序在其中看起来有多好。当你看到同一个程序用两种语言写成,一个版本明显更短时,这似乎很有说服力。但从艺术的角度来看问题,你就不太可能依赖这种测试。你不想最终得到一种像大理石一样的编程语言。

例如,在开发软件中,拥有一个交互式顶层,也就是Lisp中所谓的读取-求值-打印循环,这是一个巨大的胜利。当你有了这个,它会对语言的设计产生真正的影响。对于一种必须先声明变量才能使用它们的语言,这种做法就不太合适。当你只是在顶层键入表达式时,你想能够将x设置为某个值,然后开始对x做一些事情。你不想先声明x的类型。你可能会对这两个前提有争议,但如果一种语言必须有一个顶层才能方便使用,而强制类型声明与顶层不兼容,那么任何强制类型声明的语言都不可能方便编程。

实践中,要获得良好的设计,你必须贴近并保持贴近你的用户。你必须不断根据实际用户校准你的想法,特别是在开始的时候。简·奥斯汀小说如此出色的一个原因是,她会把它们大声朗读给家人听。这就是为什么她从不陷入自我沉溺的艺术性景观描述或虚浮的哲学思考。(哲学思想确实存在,但它们被编织进故事中,而不是像标签一样贴在上面。)如果你打开一本平庸的"文学"小说,并想象着把它大声朗读给你的朋友,你会非常清楚地感受到这种做法给读者带来的负担。

在软件世界中,这个想法被称为"更差就是更好"。实际上,"更差就是更好"这个概念中混合了几个不同的想法,这就是为什么人们仍在争论"更差"是否真的"更好"。但其中一个主要想法是,如果你正在构建一些新事物,你应该尽快将原型呈现给用户。

相反的方法可能被称为"海尔玛"策略。与其快速推出原型并逐步完善它,不如试图一次性创造出完整的成品。据我所知,这是一个灾难性的做法。在互联网泡沫期间,无数初创公司就是这样毁掉自己的。我从未听说过这种做法成功的案例。

软件世界以外的人可能不知道,"更差就是更好"这一理念在整个艺术领域都有体现。在绘画中,这个想法是在文艺复兴时期被发现的。现在,几乎每个绘画老师都会告诉你,获得准确绘画的正确方法不是缓慢地沿着物体轮廓工作,因为错误会累积,最终你会发现线条无法相交。相反,你应该快速画下几条大致正确的线条,然后逐步完善这个初始草图。

在大多数领域,原型通常是用不同的材料制作的。要在金属上雕刻的字体最初是用毛笔在纸上设计的。要铸造成青铜的雕塑最初是用蜡制作的模型。要在挂毯上绣制的图案最初是用墨水在纸上绘制的。要用石头建造的建筑最初是用木头制作的小型模型进行测试的。

当油画在15世纪变得流行时,它之所以如此令人兴奋,是因为你可以直接从原型制作出成品作品。你可以先画一个初步草图,但并不一定要严格遵守;你可以在完成绘画的过程中解决所有细节,甚至做出重大改变。

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

士气在设计中至关重要。我很惊讶人们没有更多地谈论这个问题。我的一位绘画老师曾告诉我:如果你在绘画时感到无聊,那么绘画看起来也会很无聊。例如,假设你必须绘制一栋建筑,并决定逐个绘制每一块砖。你可以这样做,但如果你中途感到厌烦,开始机械地绘制砖块而不是仔细观察每一块,那么绘画的效果将比你仅仅暗示砖块要差。

通过逐步完善原型来构建某物对士气很好,因为它能保持你的参与。在软件中,我的原则是:始终保持可工作的代码。如果你正在编写一个一小时内就能测试的东西,那么你就有立即获得回报的前景来激励自己。在艺术领域,尤其是在油画中,也是如此。大多数画家都是从一个模糊的草图开始,然后逐步完善它。如果你这样工作,原则上你每天都不必以一些看起来未完成的东西结束。事实上,画家中有一句话:"一幅画从来都不算完成,你只是停止了继续作画。"任何从事软件工作的人都会对这个想法很熟悉。

士气是设计面向不太精通用户的东西时的另一个困难所在。如果自己都不喜欢某件事,要保持兴趣是很难的。要做出好的东西,你必须想"哇,这真的很棒",而不是"这是个垃圾,那些傻瓜会喜欢它"。

设计意味着为人类制作东西。但不仅使用者是人类,设计师自己也是人类。

注意,我一直在谈论"设计师"。要做出好的设计,通常需要由一个人来掌控。然而,似乎有可能让几个人合作完成一个研究项目。这似乎是研究和设计之间最有趣的差异之一。

艺术领域也有著名的合作案例,但大多数似乎只是分子键合而非核聚变。在歌剧中,通常一个人负责写剧本,另一个人负责作曲。在文艺复兴时期,来自北欧的工匠常被雇佣在意大利画作的背景中绘制风景。但这些并非真正的合作,更像是罗伯特·弗罗斯特所说的"良好的篱笆造就良好的邻居"。你可以将优秀的设计拼凑在一起,但在每个单独的项目中,必须由一个人掌控。

我并不是说优秀的设计要求一个人想出所有的东西。得到你信任的人的建议是无价的。但在讨论结束后,最终的决定权必须归一人所有。

为什么研究可以由合作者完成,而设计不行?这是一个有趣的问题。我不知道答案。也许,如果设计和研究趋于收敛,最好的研究也是优秀的设计,事实上也不能由合作者完成。许多最著名的科学家似乎都是独自工作的。但我不了解足够的情况,无法判断是否存在这种模式。也许只是因为许多著名的科学家在合作还不太普遍的时代工作。

无论科学界的情况如何,在艺术领域,真正的合作似乎是极其罕见的。委员会设计等同于糟糕的设计。为什么会这样?是否有办法克服这一限制?

我倾向于认为没有 - 优秀的设计需要一个独裁者。一个原因是,优秀的设计必须是整体统一的。设计不仅仅是为了人类,而是为了特定的个人。如果一个设计代表了一个能装进一个人头脑的想法,那么这个想法也会适合用户的头脑。

[1]