我很高兴这本书被翻译成中文,并有机会与读者分享我的想法,这不仅是因为中国软件行业的快速发展,还因为中国的研究人员在塑造软件未来方面发挥着越来越重要的作用。
自从这本书的英文版发行(2021年12月)以来,已经过去了两年多。我现在对这本书中的观点有了新的看法。这本书获得的热烈反响让我感到振奋,但我也意识到,我本可以更直接地指出概念设计是如何提供了一种新的、非常不同的软件设计和构建方式。
我想在这里概述一下这本书的一些关键创新内容,使读者提前了解它们。所有这些(除了最后一个)都在书中有详细讨论。
概念模型是软件核心的想法可以追溯到20世纪80年代以用户为中心的计算模型的出现。在那个年代,特别有影响力的还有唐纳德·诺曼(Donald Norman)的著作《日常事物的设计》( The Design of Everyday Things ),其中心思想是机器(无论是不是软件)用户的心智模型必须与设计师的心智模型一致,因为后者的心智模型代表了机器的实际运作方式。根据诺曼的说法,设计师的任务是在用户界面中“投射”这个底层的模型。诺曼在他的书中举了一个例子,一个典型的美国冰箱有两个控制装置,一个标有“新鲜食品室”,一个标有“冷冻室”,这给人的印象是两个控制装置分别控制其对应冰箱室的温度。但实际上,正如诺曼解释的那样,一个控制装置负责调整两个冰箱室共用的压缩机,另一个控制装置负责调整一个阀门,该阀门决定了流向每个冰箱室的冷空气比例。诺曼指出,这种冰箱的设置使得成功操作冰箱几近不可能,比如,关闭标有“冷冻室”的控制装置会启动压缩机并使冷冻室和新鲜食品室都变得更冷。
多年前,当我第一次读到《日常事物的设计》这本书时,我以为这是对底层设计模型的批判。但仔细阅读后,我意识到这里的重点不在于该模型,而在于模型在用户界面中的“投射”或呈现方式。诺曼承认,即使用户有正确的心智模型,冰箱仍然难以使用。但这不是分析的重点,也不是概念模型思想的实质。诺曼在书中的分析主要关于心理学(这本书的第一版书名就叫《日常事物的心理学》),这本书与其说是关于底层机制的设计,不如说是关于用户界面的设计。
而我这本书中的概念思想非常不同。《软件设计的要素》的重点不在于底层概念模型的投射,而在于概念模型的设计,即塑造概念使其满足用户的需求。概念与其说是心理上的,不如说是计算上的。这本书表明,如果基本概念不正确,就没有办法在用户界面中解决这个问题。此外,对于冰箱这种物理实体来说,很难改变其底层的概念模型(例如,因为每个冰箱室拥有单独的恒温器和压缩机太昂贵了);而对于软件来说,底层概念的设计没有这样的限制。如果说概念有任何成本,那么这种成本恰恰是由于概念与用户需求之间的不匹配以及由此产生的复杂性带来的。
概念在理解软件中起着重要作用,这个想法也许并不新鲜。但这些概念究竟是什么?在本书之前,概念是模糊的,这使得很难在软件中识别概念。更糟糕的是,即使我们能够在许多不同的软件中识别出同一些概念,我们也没有办法分解这些概念并一次描述一个。在我的书中,我提出了一个简单而灵活的概念定义:概念是一种独立的服务,由状态和操作组成,它能实现用户的目的。我将展示如何一次定义一个概念,并将它们组合在一起(但不会使它们相互依赖)。
创新和创业专家经常争辩说,成功来自于一个简单而精确的想法。概念设计提供了一种将这一专家建议付诸实践的方法。创新设计通常依赖于一两个关键概念,这些概念将其与现有设计或竞争对手的设计区分开来。这些关键概念抓住了创新的本质,其成功(或失败)将取决于它们给用户带来了多少价值。例如,图层概念是Adobe Photoshop成功的原因,它完全改变了这个软件的轨迹。
不过,关键概念不需要都像图层概念那样微妙。Zoom因其会议概念主导了视频会议市场,它允许一个人提前创建会议,然后将链接发送给其他人,其他人甚至没有Zoom账号也可以选择加入会议。相比之下,以前的视频会议软件使用呼叫概念,该概念源于电话,参与者由发起者手动添加到会议中,并要求每个参与者在会议开始时就在场。一旦用户体验过会议概念,就知道呼叫概念完全不切实际!
概念可以使软件实现更广泛的模块化。当我在麻省理工学院教学生如何进行概念设计以及如何实现他们的设计时,我开始意识到概念设计与传统的面向对象的设计有多么不同。面向对象的设计通常将与对象类型关联的所有状态和功能归为一个类别,这往往会将完全不相关的模块状态和功能组合在一起,更糟糕的是,会将功能分散到多个类别中。
例如,假设设计一个拼车软件,该软件将可能一起乘车的用户联系在一起,并规划他们的路线。在传统的面向对象的设计中,该软件可能有一个具有用户属性(例如用户名和密码、家庭和工作地址、首选出发时间等)的用户类别,也可能有一个包含用户和路线等的拼车类别。
这种设计的问题在于用户类别包含属于用户身份验证的功能以及属于拼车类别的功能;本该属于拼车类别的功能却被分散在两个类别中。在概念设计中,只需要定义一个用于用户身份验证的概念和一个用于拼车的概念,每个概念仅包含相关的功能和状态。
虽然这本书没有讨论实现,但通过将每个概念都变成一个模块来编写概念设计是很简单的。在Web软件中,概念之间的同步成为调用概念操作的控制器的功能。
在我的书出版时,GPT还没有问世。毫无疑问,像GPT这样的大语言模型(LLM)将极大地改变软件开发实践。我对概念设计与LLM的契合方式感到非常兴奋。例如,LLM非常擅长生成少量代码,但不能构建整个软件。概念似乎恰好提供了基于LLM的代码生成所需的模块化。软件设计师可以使用LLM为每个概念生成代码,然后通过概念组合来构建整个软件。这是我的研究小组正在研究的一种方法。
我的书出版后,一家大型美国软件公司已将概念设计作为其软件开发过程的核心。引入概念直接赋予了设计师权力;特别是产品经理,他们被赋予了更大的责任,确保所有的概念在公司生产的不同产品中以一致的方式运行。更令人惊讶的是,概念似乎有助于使不同的工作保持一致,例如将营销、销售和工程结合在一起,以便每位工作人员都对公司产品的本质有着相同的理解。
不管你在软件设计中担任什么角色,我都希望你会喜欢这本书,并且希望这本书让你以新的方式思考软件及其设计。