Featured image of post 设计与研究

设计与研究

探讨设计与研究的本质区别,以及如何将编程语言设计视为一门艺术

📚 返回 Paul Graham 文章目录

设计与研究

2003年1月

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

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

我并不认为自己是在做编程语言的研究。我只是在设计一种语言,就像有人设计建筑、椅子或新字体一样。我并不试图发现什么新东西。我只是想创造一种适合编程的语言。在某些方面,这种假设让生活变得简单多了。

设计与研究的区别似乎在于新与好的问题。设计不必是新的,但必须是好用的。研究不必是好用的,但必须是新的。我认为这两条路径在最高处是相通的:最好的设计通过运用新思想超越其前辈,而最好的研究则解决那些不仅新颖而且真正值得解决的问题。所以最终我们瞄准的是同一个目标,只是从不同的方向接近它。

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

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

注意我说的是"他们需要什么”,而不是"他们想要什么”。我不想给人留下这样的印象:作为设计师工作就意味着像快餐厨师一样,客户要什么就做什么。这在不同艺术领域有所不同,但我认为在任何领域,最好的作品都不是由那些完全按照客户要求去做的人完成的。

客户永远是对的,从这个意义上说,好的设计的衡量标准是它对用户来说有多好用。如果你写的小说让所有人都感到无聊,或者设计的椅子坐起来极其不舒服,那么你就是做得很糟糕,没有借口可说。说这部小说或这把椅子是按照最先进的理论原则设计的,这并不能成为辩护的理由。

然而,为用户做有用的东西并不意味着简单地做用户告诉你要做的东西。用户并不知道所有可能的选择,而且常常对他们真正想要的东西有误解。

我认为这个悖论的答案是:你必须为用户设计,但你必须设计用户需要的东西,而不是简单地设计用户说他们想要的东西。这很像做医生。你不能只是治疗病人的症状。当病人告诉你他的症状时,你必须弄清楚他真正的问题是什么,然后治疗那个问题。

这种对用户的关注是一种公理,从中可以推导出良好设计实践的大部分内容,也是大多数设计问题围绕的核心。

如果好的设计必须满足用户需求,那么用户是谁?当我说设计必须面向用户时,我并不暗示好的设计应该瞄准某种最低共同标准。你可以选择任何你想要的用户群体。例如,如果你在设计一个工具,你可以为从初学者到专家的任何人设计,对某个群体来说好的设计对另一个群体来说可能是糟糕的。关键是,你必须选择某个用户群体。我认为除非针对某个目标用户,否则你甚至无法谈论设计的好坏。

如果你把设计师自己包括在目标用户中,你最有可能得到好的设计。当你为不包括你在内的群体设计时,往往会为那些你认为不如你老练的人设计,而不是为更老练的人设计。

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

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

即使你是在为最老练的用户设计,你仍然是在为人类设计。在研究领域则不同。在数学中,你不会因为抽象概念对人类来说容易理解就选择它们;你会选择那些能让证明更简短的抽象概念。我认为这在整个科学领域都是如此。科学思想并不是为了符合人体工程学而设计的。

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

不管你喜不喜欢,编程语言也是为人类设计的,我怀疑人脑和人体一样都是不规则和独特的。有些概念对人类来说容易理解,有些则不然。例如,我们似乎对处理细节的能力非常有限。正是这个事实使得编程语言首先成为一个好主意;如果我们能处理细节,我们就可以直接用机器语言编程。

记住,语言主要不是完成程序的工具,而是程序必须在其间开发的东西。任何艺术领域的人都会告诉你,你可能需要不同的媒介来处理这两种情况。例如,大理石是完成想法的好媒介,但对于开发新想法来说却是一个完全缺乏灵活性的媒介。

程序,就像证明一样,是一棵树的修剪版本,在过去,这棵树上到处都是错误的分支。所以对语言的测试不仅仅是完成的程序在其中的样子有多整洁,而是通向完成程序的路径有多整洁。一个能给你优雅的完成程序的设计选择,可能不会给你一个优雅的设计过程。例如,我写过一些宏定义的宏,里面充满了嵌套的反引号,现在看起来像小宝石,但写它们花了我几个小时最丑陋的试错,说实话,我仍然不能完全确定它们是正确的。

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

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

在实践中,要获得好的设计,你必须接近并保持接近你的用户。你必须不断根据实际用户校准你的想法,尤其是在开始阶段。简·奥斯汀的小说如此出色的原因之一是她会大声朗读给家人听。这就是为什么她从未陷入自我放纵的艺术性风景描写,或故作高深的哲学思考。(哲学确实存在,但它是编织在故事中,而不是像标签一样贴在故事上。)如果你打开一本普通的"文学"小说,想象大声朗读给你朋友听,你会强烈感受到这种东西对读者来说是多么的强加。

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

另一种方法可以称为"万福玛丽亚"策略。与其快速推出原型并逐步改进,不如试图在一次长传中创造完整、完成的产品。据我所知,这是一个灾难的配方。在互联网泡沫期间,无数创业公司以这种方式毁掉了自己。我从未听说过有成功的案例。

软件世界之外的人可能没有意识到,“更差就是更好"在整个艺术领域都能找到。例如,在绘画中,这个想法是在文艺复兴时期发现的。现在几乎每个绘画老师都会告诉你,获得准确绘画的正确方法不是慢慢地沿着物体的轮廓工作,因为错误会累积,到最后你会发现线条没有相遇。相反,你应该先画几条大致在正确位置的快速线条,然后逐步改进这个初始草图。

在大多数领域,原型传统上是用不同的材料制作的。要刻在金属上的字体最初是用毛笔在纸上设计的。要铸成青铜的雕像最初是用蜡模制的。要绣在挂毯上的图案最初是用墨水在纸上画的。要用石头建造的建筑物最初是用木头按较小比例测试的。

当油画在15世纪首次流行时,它之所以如此令人兴奋,是因为你可以直接用原型制作完成的作品。如果你想的话,你可以先画一个初步草图,但你并不受其约束;你可以在完成绘画时处理所有细节,甚至做出重大改变。

在软件中你也可以这样做。原型不必只是一个模型;你可以将其改进为完成的产品。我认为只要可能,你就应该这样做。它让你能够利用一路上获得的新见解。但也许更重要的是,这对士气有好处。

士气在设计中是关键。我很惊讶人们不经常谈论它。我的第一个绘画老师告诉我:如果你在画某样东西时感到无聊,这幅画就会显得无聊。例如,假设你必须画一座建筑,你决定一块一块地画砖。如果你想的话可以这样做,但如果你画到一半感到无聊,开始机械地画砖而不是观察每一块,这幅画会比仅仅暗示砖块的样子更糟糕。

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

士气是为什么为不成熟的用户设计东西很困难的另一个原因。很难对你自己不喜欢的东西保持兴趣。要做出好东西,你必须想着"哇,这真的很棒”,而不是"什么垃圾;那些傻瓜会喜欢的。”

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

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

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

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

为什么研究可以由合作者完成而设计不能?这是一个有趣的问题。我不知道答案。也许,如果设计和研究是相通的,那么最好的研究也是好的设计,实际上不能由合作者完成。很多最著名的科学家似乎都是独自工作的。但我不确定是否有这种模式。这可能只是因为许多著名科学家工作的时代合作不那么常见。

不管在科学领域的故事是什么,在艺术领域真正的合作似乎极其罕见。委员会设计是糟糕设计的同义词。为什么会这样?有什么方法可以克服这个限制吗?

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

相关链接:

英文版:paulgraham.com/desres.html|中文版:HiJiangChuan.com/paulgraham/019-design-and-research

📚 返回 Paul Graham 文章目录

更新记录: