设计与研究
OriginalJanuary 2003
(本文摘自 2002 年秋季 NEPLS 会议的主题演讲。)
来到这个国家的人们常常惊讶地发现,美国人喜欢在开始谈话时问“你做什么?” 我一直不喜欢这个问题。我很少能对它给出简洁的答案。但我认为我终于解决了这个问题。 现在,当有人问我做什么时,我会直视他们的眼睛,说“我正在设计一种 新的 Lisp 方言。” 我建议任何不喜欢被问到做什么的人使用这个答案。谈话会立即转向其他话题。
我不认为自己是在进行编程语言的研究。 我只是在设计一种语言,就像有人设计 一座建筑、一把椅子或一种新的字体一样。 我并没有试图发现任何新事物。我只是想 创造一种编程起来很舒服的语言。在某些方面, 这种假设让生活变得容易很多。
设计和研究之间的区别似乎是新与好的问题。设计不必是新的,但必须是好的。研究不必是好的,但必须是新的。 我认为这两条路径在顶端汇聚:最好的设计 通过使用新想法超越其前辈,而最好的研究 解决的问题不仅是新的,而且实际上值得解决。 所以最终我们都朝着同一个目的地前进,只是从不同的方向接近它。
我今天要谈的是你的目标从后面看起来是什么样子。当你把 编程语言视为设计问题而不是研究课题时,你会有什么不同?
最大的区别在于你更关注用户。 设计从询问开始,这是为谁设计的,他们需要什么?例如,一位优秀的建筑师, 不会从创造一个他然后强加给用户的方案开始,而是从研究目标用户和弄清楚 他们需要什么开始。
请注意我说的是“他们需要什么”,而不是“他们想要什么”。我并不想 给人一种这样的印象,即作为一名设计师意味着像 一种快餐厨师一样工作,按照客户的要求做任何事情。这在艺术领域的各个领域都有所不同,但我 认为在任何领域,最好的作品都不是由 那些只做客户要求他们做的事情的人完成的。
客户总是对的, 从好的设计的衡量标准是它对用户的有效性来看。如果你写了一本让所有人都感到无聊的小说,或者一把 坐起来非常不舒服的椅子,那么你就做了一件糟糕的 事,就这么简单。说小说或椅子 是根据最先进的理论原则设计的,这并不能作为辩解。
然而,制作对用户有效的东西并不意味着仅仅制作 用户告诉你的东西。用户不知道所有的选择 是什么,而且经常会误解他们真正想要什么。
我认为,解决这个悖论的答案是,你必须为用户设计,但你必须设计用户需要的东西,而不仅仅是 他所说的他想要的东西。 这很像当医生。你不能只治疗病人的 症状。当病人告诉你他的症状时,你必须弄清楚 他到底怎么了,然后治疗他。
这种对用户的关注是一种公理,大多数 好的设计实践都可以从它推导出来,大多数设计 问题都围绕它展开。
如果好的设计必须做用户需要的事情,那么用户是谁?当 我说设计必须是为用户设计的时,我并不想暗示好的 设计旨在达到某种 最低共同点。你可以选择任何你想要的用户群体。例如,如果你正在设计一个工具,你可以为 从初学者到专家任何人设计它,而对 一个群体来说好的设计可能对另一个群体来说是坏的。重点 是,你必须选择一些用户群体。我认为你不能 谈论好坏设计,除非 参考一些目标用户。
如果你想让设计变得更好,那么目标用户中最好 包括设计师本人。当你为一个不包括你的群体设计东西时,它往往是为那些 你认为比你不太成熟的人设计的,而不是更成熟的人。
这是一个问题,因为轻视用户,无论多么仁慈, 似乎不可避免地会腐蚀设计师。 我怀疑在美国,很少有住房 项目是由期望住在里面的建筑师设计的。你可以在 编程语言中看到同样的情况。C、Lisp 和 Smalltalk 是为 它们自己的设计师使用的而创建的。Cobol、Ada 和 Java 是为 其他人使用的而创建的。
如果你认为你在为白痴设计东西,那么很有可能 你没有设计出好的东西,即使是为白痴设计的。
即使你正在为最成熟的 用户设计东西,但你仍然是在为人类设计。在研究中情况有所不同。在数学中,你 不会因为抽象易于人类理解而选择它们;你选择任何能使 证明更短的抽象。我认为这在一般科学领域也是如此。 科学思想不是为了符合人体工程学。
在艺术领域,情况大不相同。设计是 完全关于人的。人体是一个奇怪的 东西,但当你设计一把椅子时, 那就是你为之设计的,而且没有办法绕过它。 所有艺术形式都必须迎合人类的兴趣和局限性。例如,在绘画中,在其他条件相同的情况下,一幅有人的画比 没有人的画更有趣。文艺复兴时期伟大的绘画作品中都充满了人物,这绝非偶然。 如果它们不是这样,绘画作为一种媒介就不会拥有它所拥有的声望。
无论你是否喜欢,编程语言也是为人类设计的, 我怀疑人脑和人体一样笨拙和特立独行。有些想法很容易让人理解,有些则不容易。例如,我们似乎对处理细节的能力非常有限。正是这个事实让 编程语言成为一个好主意;如果我们 能够处理细节,我们就可以直接用机器语言编程。
还要记住,语言不是 主要用于完成的程序的形式,而是程序必须在其中开发的东西。任何从事艺术的人都可以 告诉你,你可能希望在 这两种情况下使用不同的媒介。例如,大理石是一种很好、耐用的 用于完成的想法的媒介,但对于开发新想法来说,它却是一种非常不灵活的媒介。
一个程序,就像一个证明一样, 是一个树的修剪版本,在过去,它有 错误的开始在各处分支。所以对 一种语言的测试不仅仅是它在其中完成的程序看起来有多干净,而是通往完成的程序的路径有多干净。 一个让你得到优雅的完成程序的设计选择 可能不会给你一个优雅的设计过程。例如, 我写过一些宏定义宏,里面充满了嵌套的 反引号,现在看起来像小宝石,但写它们 花了几个小时最难看的试错,坦率地说,我仍然 不完全确定它们是否正确。
我们经常表现得好像对一种语言的测试是它在其中完成的程序看起来有多好。 当你看到同一个程序用两种语言编写,其中一个版本要短得多时,这似乎很有说服力。 当你从艺术的角度来解决这个问题时,你就不太可能依赖这种 测试。你不想最终得到一种像大理石一样的编程 语言。
例如,在开发软件时,拥有一个交互式顶层是一个巨大的胜利,在 Lisp 中被称为 读-求值-打印循环。当你拥有一个这样的循环时,它会对 语言的设计产生真正的影响。对于一种必须在使用变量之前声明变量的语言来说,它不会 很好地工作,例如。当你只是在顶层输入表达式时,你希望能够 将 x 设置为某个值,然后开始对 x 做一些事情。你不想 必须先声明 x 的类型。你可能会对任何一个前提提出异议,但如果 一种语言必须有一个顶层才能方便使用,并且 强制类型声明与顶层不兼容,那么任何强制类型声明的语言 都不可能方便编程。
在实践中,为了获得好的设计,你必须靠近,并保持 靠近你的用户。你必须不断地根据实际用户校准你的想法,尤其是在开始的时候。简·奥斯汀的小说之所以如此出色,其中一个原因是她在 家人面前大声朗读它们。这就是为什么她从不沉溺于自命不凡的艺术化 对风景的描述, 或矫揉造作的哲学思考。(哲学是存在的,但它 是编织在故事中的,而不是像标签一样贴在上面。) 如果你打开一本普通的“文学”小说,想象一下大声朗读它 给你的朋友听,就像你写的一样,你会强烈地感受到 这种东西对读者来说是一种多么大的负担。
在软件世界中,这个想法被称为“更糟者胜”。 实际上,在“更糟者胜”的概念中混合了几个想法,这就是为什么人们仍在争论 “更糟者”是否真的更好。但这个 混合中的一个主要想法是,如果你正在构建一些新的东西,你应该尽快 让用户看到原型。
另一种方法可以被称为“Hail Mary”策略。 与其快速地推出原型并逐渐改进它,不如尝试在一次长长的 触地得分中创造出完整、完成的产品。据我所知,这是一个 灾难的秘诀。在互联网泡沫期间,无数的初创公司因此而毁掉了自己。我从未听说过 它奏效的案例。
软件世界之外的人可能没有意识到的是, “更糟者胜”在整个艺术领域都有体现。 例如,在绘画中,这个想法是在 文艺复兴时期被发现的。现在几乎每个绘画老师都会告诉你, 获得准确绘画的正确方法不是 慢慢地沿着物体的轮廓工作,因为错误会 累积起来,你会发现最后线条无法连接。 相反,你应该在大致正确的位置画几条快速线条, 然后逐渐改进这个初始草图。
在大多数领域,原型 传统上是用不同的材料制作的。 要切割成金属的字体最初是用纸上的刷子设计的。要铸成青铜的雕像 是用蜡制作的模型。要绣在挂毯上的图案 是用墨水洗在纸上绘制的。要建造的建筑 用石头建造,在木头上以更小的比例进行测试。
油画之所以如此令人兴奋,当它 在 15 世纪首次流行起来时,是因为你可以 从原型中制作出完成的作品。 如果你想的话,你可以做一个初步的草图,但你 并不受它的约束;你可以完成所有的细节,甚至 做出重大改变,当你完成绘画时。
你也可以在软件中做到这一点。原型不必 只是一个模型;你可以把它改进成最终产品。 我认为你应该在可以的时候总是这样做。它让你 利用你沿途获得的新见解。但 也许更重要的是,这对士气有好处。
士气是设计的关键。我很惊讶人们 没有更多地谈论它。我的第一个 绘画老师告诉我:如果你在画画的时候感到无聊,画出来的东西就会看起来很无聊。 例如,假设你必须画一座建筑,并且你 决定单独画每一块砖。如果你想这样做,你可以这样做,但如果你在中途感到无聊,开始 机械地画砖,而不是观察每一块砖, 画出来的东西会比你只是暗示 砖块的效果更差。
通过逐渐改进原型来构建东西对 士气有好处,因为它让你保持参与。在软件中,我的 规则是:始终拥有可运行的代码。如果你正在编写 一个你可以在一个小时内测试的东西,那么你 就有可能获得即时的奖励来激励你。 艺术领域也是如此,尤其是在油画中。 大多数画家从模糊的草图开始,然后逐渐 改进它。 如果你以这种方式工作,那么原则上 你永远不必以看起来实际上 没有完成的东西结束一天。事实上,画家之间甚至有一句谚语:“一幅画永远不会完成,你只是停止 在上面工作。”这个想法对于任何 从事过软件工作的人来说都很熟悉。
士气是另一个难以设计出 适合不成熟用户的作品的原因。很难对 自己不喜欢的东西保持兴趣。为了做出好的东西,你必须在想,“哇,这真是太棒了”, 而不是“这真是个垃圾;那些傻瓜会喜欢的。”
设计意味着为人类制作东西。但这不仅仅是 用户是人类。设计师也是人类。
请注意,我一直都在谈论“设计师”。 设计通常必须由一个人控制才能 变得更好。然而,似乎几个人 可以合作进行一个研究项目。这似乎 是我认为研究和 设计之间最有趣的区别之一。
在艺术领域,曾经有过著名的合作案例, 但大多数似乎都是分子键合而不是 核聚变的案例。在歌剧中,通常由一个人 写剧本,另一个人写音乐。在文艺复兴时期, 来自北欧的工匠经常被雇佣来完成意大利绘画作品中 背景的风景。但这些不是真正的合作。 它们更像是罗伯特·弗罗斯特的 “好的篱笆造就好的邻居”的例子。你可以把好的设计的实例 粘在一起,但在每个单独的项目中, 一个人必须控制。
我并不是说好的设计要求一个人想到 所有的事情。没有什么比你信任的人的建议 更有价值了。但在谈话结束后,关于做什么的决定必须由一个人做出。
为什么研究可以由合作者完成,而 设计却不能?这是一个有趣的问题。我并 不知道答案。也许, 如果设计和研究融合在一起,最好的研究也是 好的设计,实际上不能由合作者完成。 许多最著名的科学家似乎都是独自工作的。 但我不知道是否 这里存在某种模式。这可能仅仅是因为许多著名的科学家 在合作不那么普遍的时候工作的。
无论科学界的故事是什么,真正的合作 在艺术领域似乎是极其罕见的。委员会设计是 糟糕设计的代名词。为什么是这样?有没有什么方法可以 克服这种限制?
我倾向于认为没有——好的设计需要 一个独裁者。其中一个原因是好的设计必须 是一个整体。设计不仅仅是为人类设计的,而是 为个体人类设计的。如果一个设计代表一个 适合一个人头脑中的想法,那么这个想法也会适合用户的 头脑。