设计与研究
2003年1月
(本文源自2002年秋季NEPLS会议上的主题演讲。)
来美国的外国人常会惊讶地发现,美国人喜欢以“你是做什么的?”来开启对话。我从来不喜欢这个问题,因为我一直很难给出一个干脆利落的答案。但我想我终于解决了这个难题。现在,当有人问我是做什么的时候,我会直视他们的眼睛说:“我正在设计一种新的Lisp方言。”我向所有不喜欢被问及职业的人推荐这个答案——对话会立刻转向其他话题。
我不认为自己在做编程语言研究。我只是在设计一门语言,就像有人设计一栋建筑、一把椅子或一种新字体一样。我并不是要发现什么新东西,只是想创造一门用起来舒适的语言。从某些方面来说,这种定位让事情变得简单得多。
设计与研究的区别,似乎在于“新”与“好”之分。设计不必是新的,但必须是好的;研究不必是好的,但必须是新的。我认为这两条路径在顶端交汇:最好的设计通过运用新想法超越前人,而最好的研究解决的不仅是新问题,而且是真正值得解决的问题。所以归根结底,我们朝着同一个目标前进,只是从不同的方向接近它。
我今天要谈的是,从背面看这个目标是什么样的。当你把编程语言当作设计问题而非研究课题时,你的做法会有什么不同?
最大的区别在于,你会更加关注用户。设计始于追问:这是为谁做的?他们需要什么?例如,一位优秀的建筑师不会先入为主地拿出一份设计强加给用户,而是先研究预期用户,弄清楚他们的需求。
注意,我说的是“他们需要什么”,而不是“他们想要什么”。我不想给人留下这样的印象:设计师的工作就像是快餐店里的厨师,客户点什么就做什么。这在艺术领域各不相同,但我认为任何一个领域中,最好的作品都不是那些完全按客户要求照做的人创造出来的。
客户总是对的,因为在某种意义上,好设计的衡量标准是它对用户的效果如何。如果你写了一本让所有人都觉得无聊的小说,或者做了一把坐着极不舒服的椅子,那你的工作就是失败了,没有辩解的余地。不能说这本小说或这把椅子是根据最先进的理论原则设计的。
然而,做出对用户有效的东西,并不意味着简单地按用户说的去做。用户并不清楚有哪些选择,而且常常对自己的真实需求有误判。
我认为,这个悖论的答案在于:你必须为用户而设计,但你要设计的是用户需要的东西,而不仅仅是他嘴上说想要的。这很像当医生——你不能只治疗病人的症状。当病人告诉你他的症状时,你必须弄清楚他到底得了什么病,然后对症下药。
这种对用户的关注,是一种公理,好的设计实践大多可以从这个公理推导出来,而且大多数设计问题也都围绕它展开。
如果好的设计必须满足用户的需求,那么谁是用户?当我说设计必须面向用户时,我并不是说好的设计旨在迎合某种“最大公约数”。你可以选择任何用户群体。比如,如果你在设计一个工具,你可以为从初学者到专家的任何人设计,而为一个群体设计的好东西,对另一个群体可能是糟糕的。关键在于,你必须选定某个用户群体。我认为,不参考预期的用户,你甚至无法谈论设计的好坏。
如果预期用户包括设计者本人,你最有可能会得到好设计。当你为一个不包括你自己的群体设计时,那个群体往往被你视为不如你懂行的人,而不是比你更懂行的人。
这是个问题,因为居高临下地看待用户——无论多么善意——都不可避免地会腐蚀设计师。我怀疑美国很少有住宅项目是由那些期望自己住进去的建筑师设计的。编程语言中也有同样的现象。C、Lisp和Smalltalk是创造者为自己使用的;Cobol、Ada和Java则是为别人创造的。
如果你觉得自己在为傻瓜设计东西,那你很可能不是在设计好东西——即使是对于傻瓜来说也是如此。
然而,即使你是在为最老练的用户设计,你仍然是在为人设计。研究领域则不同。在数学中,你选择某种抽象不是因为它对人类来说容易理解,而是因为它能让证明更简短。我认为这在整个科学领域都是如此。科学思想并不追求“人体工学化”。
但在艺术领域,情况截然不同。设计全在于人。人体是一种奇特的构造,但当你设计椅子时,你就是在为它设计的,绕不开这个事实。所有艺术都必须迎合人类的兴趣和局限。例如在绘画中,在其他条件相同的情况下,有人物的画会比没有人物更有趣。文艺复兴时期的伟大画作全都充满人物,这并非仅仅是历史的偶然。如果不是这样,绘画作为一种媒介就不会有今天这样的声望。
不管你喜欢与否,编程语言也是为人类设计的。我怀疑人脑和人体一样,充满了凹凸不平和独特性。有些想法容易被人掌握,有些则不然。比如,我们处理细节的能力似乎非常有限。正是这个事实,才使得编程语言的存在有了意义——如果我们能处理那么多细节,直接用机器语言编程就行了。
还要记住,语言主要不是用来承载已完成程序的载体,而是程序在其中开发的环境。任何搞艺术的人都会告诉你,这两种情境可能需要不同的媒介。大理石就是一个例子:它是精美持久的成品媒介,但作为开发新想法的媒介则僵化得令人绝望。
一个程序,就像一份证明,是一棵树的修剪版——这棵树在过去曾到处长出错误的开端。因此,检验一门语言的标准,不仅是成品程序在其中的样子有多干净,更重要的是通往成品程序的路径有多干净。一个能让你得到优雅成品程序的设计选择,未必能带来优雅的设计过程。例如,我写过几个宏定义宏,里面嵌套着反引号,现在看起来像小宝石一样精巧,但写它们的时候花了数小时最丑陋的反复试错,坦白说,我现在仍然不完全确定它们是正确的。
我们常常表现得好像检验一门语言的标准就是成品程序在其中的美观程度。当你看到同一个程序用两种语言写出,其中一个版本短得多时,这个标准显得非常有说服力。但当你从艺术的角度来思考这个问题时,就不太会依赖这种检验方式。你不会想最终得到一种像大理石一样的编程语言。
例如,在软件开发中,拥有一个交互式顶层——也就是Lisp中所谓的“读取-求值-打印循环”——是一个巨大的优势。而当你拥有这样一个顶层时,它会对语言设计产生实际影响。比如,它就不适合那种要求先声明变量再使用的语言。当你只是往顶层里敲表达式时,你希望能让x等于某个值,然后开始对x进行操作,而不想先声明x的类型。你可以对这两个前提中的任何一个提出异议,但如果说一门语言必须有一个顶层才能方便使用,而强制类型声明与顶层不兼容,那么任何强制类型声明的语言都不可能编程起来方便。
在实践中,要获得好的设计,你必须接近用户并保持这种近距离。你必须不断地在实际用户身上校准你的想法,尤其是在最初阶段。简·奥斯汀的小说之所以如此出色,原因之一是她把作品朗读给家人听。这就是为什么她从不沉溺于矫揉造作的风景描写或装腔作势的哲思。(哲学思想当然在,但它被编织进故事里,而不是像标签一样贴上去。)如果你翻开一本普通的“文学”小说,想象这是你写的,要朗读给朋友听,你会痛切地感受到那种东西对读者是多么大的负担。
在软件界,这个理念被称为“更糟却更好”。实际上,“更糟却更好”这个概念混合了好几种想法,这也是为什么人们至今仍在争论更糟到底是不是更好。但这个混合体中的核心理念之一是:如果你在构建新东西,应该尽快把原型放到用户面前。
另一种方法或许可以称为“孤注一掷”策略。不是快速做出原型再逐步完善,而是试图在一次漫长的达阵传球中创造出完整、成品化的产品。据我所知,这是一条通往灾难的道路。互联网泡沫期间,无数创业公司就是这样毁掉自己的。我从没听说过有哪个案例是靠这种方式成功的。
软件界之外的人可能没有意识到的是,艺术界到处都是“更糟却更好”的理念。比如在绘画中,这个想法在文艺复兴时期就被发现了。如今几乎每个绘画老师都会告诉你,画一幅准确的作品,正确方法不是沿着物体轮廓慢慢描——因为错误会累积,最后你会发现线条合不上。相反,你应该在大概正确的位置快速画几笔,然后逐步细化这幅初始草图。
在大多数领域,传统上原型都是用不同材料制作的。要铸成金属的字体最初是在纸上用毛笔设计的;要铸成青铜的雕像先用蜡做模型;要在挂毯上刺绣的图案先在纸上用墨色渲染出来;要用石头建造的建筑先在较小尺度上用木头测试。
油画颜料在十五世纪刚流行时之所以令人兴奋,是因为你实际上可以从原型直接做出成品。如果你愿意,可以先画一张预备草图,但你不必受它束缚;你可以在完成绘画的过程中解决所有细节,甚至做重大修改。
在软件中你也可以这样做。原型不一定只是模型;你可以把它逐步精炼成最终产品。我认为只要可以,你就应该这样做。这让你能利用沿途产生的新见解。但也许更重要的是,这对士气有好处。
士气是设计中的关键。我很惊讶人们不怎么谈论它。我最早的一位绘画老师告诉我:如果你画某样东西时感到无聊,画出来的画就会看起来很无聊。比如,假设你要画一栋建筑,你决定把每一块砖都单独画出来。如果你愿意,你可以这么做,但如果你画到一半觉得无聊了,开始机械地画砖而不是一块块观察着画,那这幅画就会比仅仅暗示砖块的效果更糟。
通过逐步完善原型来构建东西对士气有好处,因为它能让你保持投入。在软件领域,我的原则是:始终有可运行的代码。如果你正在写的东西一小时后就能测试,那么你就有即时回报的前景来激励自己。艺术领域也是如此,尤其是油画。大多数画家从模糊的草图开始,然后逐步完善。
如果你以这种方式工作,那么原则上你永远不会在一天结束时留下看起来确实未完成的东西。事实上,画家之间甚至有一句谚语:“一幅画永远不会完成,你只是停止画它。”任何做过软件的人都会对这句话感到熟悉。
士气也是为不成熟的用户设计东西很难的另一个原因。很难对自己不喜欢的东西保持兴趣。要做出好东西,你必须想着“哇,这真是太棒了”,而不是“什么破玩意儿;那些傻瓜会喜欢的。”
设计意味着为人类制造东西。但不仅仅是用户是人。设计师也是人。
注意我一直都在谈论“设计师”。设计通常必须由一个人掌控才能做好。然而,似乎几个人可以合作进行一个研究项目。在我看来,这是研究领域与设计领域之间最有趣的差异之一。
艺术领域存在著名的合作实例,但大多数似乎都是分子结合而非核聚变。在歌剧中,常见的情况是一个人写剧本,另一个人作曲。而在文艺复兴时期,北欧的学徒常常被雇来绘制意大利绘画背景中的风景。但这些并不是真正的合作。它们更像是罗伯特·弗罗斯特所说的“好篱笆造就好邻居”的例子。你可以把优秀设计的实例拼凑在一起,但在每个具体项目中,必须由一个人来掌控。
我并不是说好的设计只需要一个人想到所有事情。没有什么比你信任其判断力的人的建议更有价值了。但在讨论结束之后,决定做什么必须由一个人来定夺。
为什么研究可以由合作者完成,而设计却不能?这是一个有趣的问题。我不知道答案。也许,如果设计与研究趋同,最好的研究同时也是好的设计,而事实上它无法由合作者完成。许多最著名的科学家似乎是独立工作的。但我了解得不够多,无法判断这里是否存在某种模式。也可能仅仅是因为许多著名科学家活跃的年代,合作还不太普遍。
无论科学领域的情况如何,真正的合作在艺术领域似乎极其罕见。委员会设计是糟糕设计的同义词。为什么会这样?有没有办法打破这种局限?
我倾向于认为没有——好的设计需要一位独裁者。原因之一是好的设计必须浑然一体。设计不仅仅是面向人类,而是面向个体的人。如果一个设计所代表的理念能装进一个人的头脑中,那么这个理念也能装进用户的头脑中。
相关: