► 概念是单个软件、一类软件以及各类软件的特征。概念可以让你比较软件,注意其必要的功能以及知道如何有效地使用这些功能。
► 概念通常是软件差异化的因素,关注概念会让你更关注市场的需求,并揭示软件成功或失败的原因。
► 概念可以帮助从事数字化转型的公司规划前进的道路。数字化转型不仅要扩展客户获取服务的手段或采用热门的技术,而且要识别、整合和扩展核心的概念,让客户拥有丰富、一致的体验,并提供真正的价值。
► 概念提供一种新的粒度,让软件设计师可以更有效地分离软件的功能点、探索概念的重用方式,并更合理地规划软件工程工作。
► 概念是安全设计的本质,选择正确的概念并理解其含义至关重要。
► 概念为评论设计提供了可用的原则,从而避免花很长时间才能发现问题;掌握这些原则的软件设计师会做出更好的设计,即使他们还没有明确的想法。
在传统的设计学科中,设计是从概念这个核心出发的。这一核心因领域而异。建筑师称之为parti pris,即一种用图表、注释或印象派式的草图来展示设计思路的工作方式。图形设计师称之为“标识”,它通常包含一些能够体现项目或工程核心的元素。作曲家围绕着由一系列音符构成的“主题”创作,这些音符可以被改变、重复、分层,然后组合在一起形成更大的结构。书籍设计师则是从书的版式开始,包括版心大小、页边距,以及字体和字号等。
当选择好核心概念后,后续的设计决策也是不可避免的。设计作为一个整体,需要使作品呈现出一致性,使它看起来像是一个人的作品,哪怕它是由一个大型团队共同完成的。用户能够感知到作品的完整性和统一性,而设计中潜在的复杂性要让位于简单的作品形象。
对于一个软件来说,概念核心毫无疑问由一系列关键概念组成。在本章中,我们将探讨概念发挥的作用:例如可以表示单个软件、一类软件甚至各类软件,揭示软件的复杂性和可用性方面存在的问题,确保软件的安全性,以及工作人员的分工和再利用。
如果你试图解释一个软件,那么列出其中的关键概念会非常有帮助。想象一下,如果你遇到一个从20世纪60年代穿越而来的人,他想要知道Facebook是什么以及如何使用(见图2-1)。那么你可以从帖子(post)概念开始介绍:帖子是用户写的可以供其他人浏览的短文。在Facebook上发布帖子被称为状态更新(status updates),帖子在Twitter上被称为推文(tweets)。接下来你可以介绍评论(comment)概念,即其他用户对帖子进行回应;介绍点赞(like)概念,即其他用户对帖子表示支持,据说这样能够提高帖子的排名;当然,还有介绍好友(friend)概念,这个概念允许用户过滤不想看见的内容,也能提供访问限制。
图2-1 Facebook页面截图
注:Facebook页面截图中有三个明显的概念:帖子、点赞和评论。
通过比较概念,我们还可以解释提供相似功能的软件间的差异。例如,短信和电子邮件的主要区别是,短信是用会话概念组织起来的,所有发送给同一个人的消息都会显示在同一个界面中;相比之下,电子邮件通常使用“邮箱”、“文件夹”或“标签”等概念来组织。这在一定程度上是由于短信的发送者和接收者仅由电话号码标识身份,而电子邮件用户往往拥有多个通信地址,这使得根据地址对电子邮件进行分组并不可靠。这也反映了不同的交互模式:短信依赖会话的场景,而电子邮件信息往往是孤立的,因此经常需要明确地引用以前的某封邮件。
有时,我们需要一些经验和专业知识才能识别软件中的关键概念。例如,Word的新手可能会惊讶地了解到,Word的核心概念是“段落”。每个文档都是按照段落序列进行构建的,并且即使是与行有关的格式属性,例如行间距和对齐,也都是与“段落”相关联,而不是与“行”相关联。如果你想用Word写一本书,你将找不到与书的层次结构相对应的任何概念,例如,没有“章”或“节”,并且“标题”也一样被视为段落。Word正是通过段落概念,并通过段落概念与其他概念的有力结合,才实现了它的灵活性和强大功能。
概念不仅可以表示单个软件,而且能表示一类软件。例如,程序员通常使用文本编辑器,如Atom、Sublime、BBEdit和Emacs来编辑程序代码;使用文字处理软件,如Word、OpenOffice和WordPerfect来创建各种文档;专业设计师使用桌面出版软件,如Adobe InDesign、QuarkXPress、Scribus和Microsoft Publisher将文档组织成书籍和杂志的最终版式。
文本编辑器的关键概念是“行”和“字符”。行概念包含了强大的功能,例如比较和合并,这些对程序员管理代码来说是必不可少的。但行概念也有一些限制,例如分行和分段没有区别。为了解决这个问题,一些需要以文本编辑器来输入的排版工具(如LaTeX)采用了一些约定,例如将插入空行视为分段。
文字处理软件的概念不仅包括“段落”,还包括“格式”,格式概念允许用户为文本指定排版属性,如“粗体”和“12磅”。文字处理软件的样式概念,允许用户设置样式并将其与段落进行关联,例如可以定义一个“正文”样式,设置其字号大小、字体等。对于其他的常规段落也可以这样设置(见图2-2)。
图2-2 样式概念
注:在Adobe InDesign中,有一种名为“正文”(body)的样式菜单,图中是一种常规的段落样式。
桌面出版软件包括文字处理软件的基本概念,但增加了最重要的文本流概念,这一概念允许用户在文档的不同位置插入链接在一起的文本框,以便文本可以从一个文本框流入另一个文本框。这是杂志排版需要用到的概念。在杂志中,一篇文章会被分到不同的页面,用户希望在一个页面上调整文本框的尺寸时,另一个页面的文本可以自动随之调整(见图2-3)。
图2-3 文本流概念
注:Adobe InDesign软件中某个展开的页面及其文本流。图中的斜线表示一个文本流涉及的文本框间的链接关系。
也许比较奇怪的是,在这三种软件中,只有一种包含了页面概念。在文字处理软件中,页面概念对应的功能很狭窄,即允许用户设置页边距、页眉和页脚;只有在桌面出版软件中,用户才能独立地重新排列、添加和删除文本流涉及的页面。
当一个软件已经主导或希望主导市场时,其成功的根源,或者说有望获得成功的根源,往往是拥有一个或多个新概念。图像处理软件Photoshop因其图层(Layer)概念,占据了图像编辑软件的主导地位,这个概念使得非破坏性图像编辑成为可能;图层概念结合蒙版概念,就可以允许用户对图像进行局部编辑(见图2-4)。
图2-4 Photoshop中的图层概念和蒙版概念
苹果电脑的废纸篓概念对于苹果台式机有着非常重要的意义,以至于丽萨(Lisa)电脑 的早期广告都宣称:“只要你能找到废纸篓,就能运行电脑。”其实,废纸篓只是施乐帕克研究中心(Xerox PARC)首创的WIMP 界面理念中最时尚和有趣的设计之一。当然它还在1988年苹果公司起诉微软和惠普抄袭麦金塔界面的诉讼中发挥了作用。
虽然大家的注意力都集中在废纸篓吸引人的图标上,但废纸篓概念可不止于此。与常见的误解相反,废纸篓的目的不是删除文件,而是恢复已删除文件。也正因为这样,废纸篓概念被视为深层思想的一个典范:操作系统应当在更大程度上容忍用户的错误。在如今的用户界面设计中,这一思想已被认为是基本的原则(更多关于废纸篓概念的内容见第3章)。
由丹·布里克林(Dan Bricklin)在1979年发明的电子表格,是计算领域最成功的创新之一,他在会计分类账薄的启发下发明了一种新的计算模型。但它关键的新颖之处并不是其中的会计功能,而是一个著名的新概念——公式。利用公式,用户可以用其他单元格的值来定义一个新的单元格。事实上,布里克林的产品VisiCalc根本就不是一款会计软件,而且其他以会计为目标的软件都失败了。公式概念非常强大,因为它允许用户对各种类型的计算建模。公式概念有一个巧妙、强大的伙伴概念“参考”,参考概念可以区分绝对位置和相对位置,使用户可以将公式从一个单元格复制到另一个单元格。
另一个例子是日程管理软件Calendly。它的与众不同之处在于一个被称为“事件类型”的概念。简单地说,用户可以定义一系列的事件类型,例如15分钟的电话、1小时的面对面会议等,每种事件都有自己的特性,包括时间长度、取消方式、通知类型等。你可以设置每种事件的可用时间,其他用户就可以根据你的时间表和事件类型预约你的时间。
在一个熟悉的软件或系统中识别出关键概念,是一个有趣且有意义的游戏。以万维网为例,你或许认为“超文本标记语言”或“链接”是其关键概念,但是标记语言概念和超文本概念已经存在很久了。其实万维网的核心概念是统一资源定位符(URL),即为文档提供全网唯一和永久的名称。如果没有这一概念,万维网将仅仅是一个专有网络的集合,每个网络都只能在自己的孤岛中运行。
很多概念都很简单,很容易被理解,但也有一些概念很复杂。当然,有些复杂的概念其实是不必要的,或者只是糟糕设计的体现(下文会详细说明);但有的时候,概念的复杂性是合理的。
Photoshop软件的图层和蒙版就属于复杂的概念。当我刚开始使用Photoshop时,我尝试边用边学,同时观看一些教学视频,比如“如何消除红眼”等。但最终我意识到需要更深入地理解其中的核心概念,于是我找了一本从概念角度解释图层和蒙版,以及通道、曲线、颜色空间、直方图等概念的书。从这之后,我就能够用Photoshop完成想做的任何事了。
有一些复杂的概念出现在大众广泛使用的软件中。比如,浏览器使用了证书概念,用于检查用户连接的服务器属于用户期望的公司(如用户的银行),还是属于一个试图窃取用户信息的入侵者。浏览器还有无痕浏览概念,防止用户浏览的信息在退出后被他人使用。尽管这些概念对安全至关重要,但人们对它们了解甚少。大多数用户不知道证书概念是如何工作的,也不知道它们的用途是什么,他们经常认为无痕浏览能够让他们在不被跟踪的情况下浏览网页。
更糟糕的是,浏览器的一些最基本的运行方式,依赖于大多数用户不知道的复杂概念。例如,网站开发人员使用页面缓存概念,即利用之前下载的内容来加快页面的加载速度。但是,旧页面中缓存的内容什么时候进行更新,以及更新规则是什么,一些开发人员甚至都不清楚,因此用户和开发人员可能都无法确定网站中呈现的内容是不是最新的。
如果软件能给用户更多关于复杂概念的提醒,也许会有所帮助,因为这样可以引起用户的注意。它能告诉用户需要了解的内容。不过如果你想成为一个高级用户,请忽略软件界面的所有细节,而要掌握一些关键的概念,因为细节在之后的使用中很容易学会。了解概念也能帮助计算机专业的老师关注软件的本质。例如,当他们在教授网页开发时,可以更多地解释重要的概念,如会话、证书、缓存、异步服务等,而不只是解释软件特定框架的特性。同时,了解概念也为软件设计师提供了创新的机会。例如,一个更好的服务器身份验证概念可能会有效地防止大量的网络诈骗。
“数字化转型”是一个宏大的词语,但它代表着一个简单的想法:抓住业务的核心,并将其数字化,这样客户就可以通过自己的电子设备获取服务。以我作为一名顾问的经验,我有时会发现,一些高管在寻求业务的更新和扩展时,总是去寻找很酷的技术,而不是去理解业务的核心。他们希望通过使用云技术、整合机器学习或区块链等技术来获得市场份额,但往往对要解决的问题没有清晰的认识。
虽然投资核心概念这件事听起来没有那么花哨,但可能更有效。 第一,只需确定业务的核心概念,就可以帮助公司专注于正在提供的服务,以及将来可能会提供的服务。第二,分析这些核心概念可以帮助公司发现其中的冲突和机会,从而简化业务。第三,对概念清单进行排序,可以反映每个概念对于客户和公司的价值,以及实施和维护这些概念的成本,从而为公司的服务战略提供依据。第四,通过整合一系列核心概念,公司可以确保客户在技术平台和公司各部门之间拥有一致的体验,并可以降低因拥有多个概念变体导致的成本。因为如果每个概念变体都有自己的实现方式,随之而来的麻烦就是,当需要在公司各个部门之间传输数据时,如何解决不同模式之间的差异。
最好的服务应当仅仅围绕几个精心设计的概念,从而让客户易于理解和使用,其中的创新往往是既简单又让人信服的新概念。例如,在苹果公司的歌曲概念中,史蒂夫·乔布斯看到了创新的机会,把选择、购买、下载和播放音乐的每一步操作体验都放在了统一的歌曲概念之下。
相比之下,我们可以想想航空公司提供的服务。毫无疑问,航空服务的关键概念是座位,但很少有概念会如此难以理解和使用。为了使利润最大化,大多数航空公司隐藏了座位的定价策略,所以只有专家才知道当前的座位价格与这架飞机上其他座位相比,或者与过去的座位价格相比,是贵了还是便宜了。航空公司也很少透露关于座位的细节,比如座位的空间大小,以及同一架飞机上不同座位的差异,甚至乘客无法提前选择座位。常旅客概念也通常只是为了吸引乘客并提高公司的竞争力。航空公司经常使用一些误导和不诚实的策略,让顾客获得尽可能少的价值。
在计划开发一个软件时,你可以使用候选概念列表来确定软件需要有哪些功能,并在成本和收益之间进行权衡。当然,软件开发人员几十年来也一直在做这样的事情,只不过使用的是关于软件功能或特性的非正式概念。 概念能将功能更清晰地划分为独立的单元,每个功能单元都有自己的价值和成本。
换句话说,在设计中引入任何概念之前,你需要考虑以下因素:(1)概念的目的,以及对用户的价值;(2)概念的复杂性,即开发这个概念的成本,以及用户混淆的成本;(3)概念的新颖性,以及由此带来的风险。
根据二八法则 ,我们知道20%的概念将带来80%的收益。但这并不意味着那些不常用的概念就不重要。通常,对某个用户无用的概念也许对另一个用户却是必要的。但也有些软件到最后也没有用到其设计中至关重要的概念。
例如在Gmail中,标签概念是其邮件管理机制最重要的核心,也是为什么Gmail开发起来很复杂。但正如我们将在本书后面看到的,标签概念使Gmail陷入了复杂性的泥潭,并且几乎成为用户困惑的根源(见图2-5)。因为这个概念使Gmail的用户总是无法区分哪些邮件是他们发送的,哪些邮件是他们接收的。因为“发送”标签与其他自定义标签一样,Gmail用它来标记整个会话,而不是单独用于标记每封邮件。并且,大约只有不到1/3的Gmail用户会使用自定义标签。
图2-5 Gmail中的标签概念
注:我对自己的Gmail邮箱进行了搜索,要求显示没有自定义标签的邮件,但搜索结果中的第一封邮件却带有自定义标签“黑客(hacking)”和“聚会(meetups)”。Gmail解释说,搜索结果含有满足条件的所有邮件,以及邮件的所有标签。因此,搜索结果显示了两封邮件,其中一封没有自定义标签,而另一封却有自定义标签。
我认为在软件设计中,解决问题最重要的策略是分离关注点,即分开处理关注点的不同方面,即使有些关注点并不是完全独立的。
概念为软件设计提供了一种分离关注点的新方法。假设你正在设计一个论坛,论坛成员可以在其中发布消息并分享各种资源,如图像。一开始,你可能会需要一个“组”的概念,并用这个概念定义所有的组行为,比如加入组、发布信息、阅读其他人的帖子等。但随着设计的深入,你会将组概念的功能再分成几个更小的概念。比如,保留一个更简单的组概念,只用它来描述组员间的关系,以及与组有关的消息和帖子等内容;设计一个帖子概念,用于编辑信息和确定信息格式;设计一个邀请概念,用于邀请成员加入组;设计一个请求概念,以便用户可以申请加入组;设计一个通知概念,管理组员收到的信息,当组员的状态发生变化或有其他组员回复信息时,及时发出通知;设计一个用于控制信息的审核概念,等等。
分离关注点是有效的,因为这样能使设计师一次只专注于一个方面,而无须在设计审核功能的同时考虑是否可以撤销邀请。每个概念都可以设计得很丰富,甚至可以单独成为一个小系统。如果设计师认为某个概念的成本与收益不匹配,也可以完全忽略这个概念。
同时,这种关注点的分离有利于将单个设计师的设计扩展至整个团队。将概念分配给不同的团队成员或子团队,可以让团队间并行开展工作。由于每个概念都有不同的目标,团队成员的工作一般不会发生冲突,概念间的不兼容问题可以在组合概念时再加以解决。
将设计分解为最基本的概念带来了概念重用的机会。例如,在设计论坛时,设计师在确定了审核概念之后,应该聪明地想到审核概念在其他场景中的实现方式。不过在最初设计时可以不考虑这一点,即论坛中接受审核的主体是帖子,而不是报纸上的文章评论。当考虑过审核的各种选项后,设计师就需要想想这种审核概念相对于另一种而言是否更适合审核场景。甚至更理想的情况是,设计师可能会发现可以完全使用现有的解决方案,这样不仅重用了概念,还重用了概念的实现方式。
许多概念都是以同样的形式在各种软件中重复使用的。想象有一本概念设计手册,设计师与其“重蹈覆辙”,还不如在概念设计手册中查找一个相关的概念,并了解与这个概念有关的设计难点以及传统的解决方案。
例如,几乎所有的社交媒体软件都引入了某种形式的投票概念,这个概念允许用户记录对某个项目的喜恶,这很重要,因为它会影响到用户的搜索结果和反馈。如果你第一次设计投票概念,你可能会想到防止重复投票的必要性,这就需要软件能够在用户投票时识别出用户身份。
但是你可能不了解识别用户身份的各种方法及其相对的优缺点。是否需要用户先登录,然后通过他们的用户名识别他们的身份,或者用IP地址识别,或者为此专门设置一个用户身份缓存程序等。而且你可能也想不到,可以通过禁止对已存档项目投票,来降低存储用户身份的成本。你还可能没有考虑过投票的权重问题,某些用户的投票是否应该更有影响力,新近的投票是否应该比老早以前的投票更重要。而如果有一本概念设计手册,里面会有一个投票的条目,这一条目会列出所有这些设计的考虑以及它们的优缺点,这样你就不用再走一遍之前很多人已经走过的设计之路。
有时,软件会变得非常难用,这让一些用户非常沮丧以至于拒绝使用这种软件。这种情况的发生有时就是因为某个概念的设计有问题。
苹果公司为笔记本电脑、手机等用户设备上的数据提供了云存储服务。云存储服务有两个不同的目的。一是使设备间数据同步。例如,无论你使用的是哪个设备,都可以轻松地在浏览器中保存相同的书签。二是提供备份,如果设备丢失或存储损坏,用户可以从云端的副本中恢复数据。
苹果公司的设计风格总是偏向于简单和自动化,尽量避免用户手动控制,即使在应该给用户更多控制权时,苹果公司依然保持了这种设计风格。它的同步概念就是一个典型的自动化的例子,结果却是这个概念使很多用户感到困惑。
有时,苹果公司的设计就像《第二十二条军规》中的情况,让用户没有任何可行的选项。假设你的苹果手机存储空间不足,这时你会收到一条存储空间即将用完的警告消息,它建议你“在设置中管理你的存储空间”。
这时候,你会发现没有任何满意的选项。假设你发现照片占用了大部分存储空间,你可以删除整个照片软件及其关联的所有数据和状态,你可以使用“优化储存空间”功能,将照片转换为较低质量的版本,同时将较高质量版本的照片上传至云端,但是,你不能只是简单地删除手机中的一些照片,并希望这些被删的照片仍然保留在其他设备中。因为,当你删除手机上的照片时,云端的照片也被删除了,然后云端会把删除的操作传递给所有其他设备,并同时从这些设备中删除照片。
苹果公司的同步概念缺少了“选择性同步”——指定某些文件无须同步。有了这个设计,你就可以从手机中删除旧照片,同时将副本保留在云端。相比之下,Dropbox的同步概念提供了这个功能,所以不会出现这种问题。
如今,安全是所有软件都关注的问题。“安全设计”的流行,反映了人们逐步对软件安全达成了一种共识,即确保安全最好的方式不是没有安全漏洞(这几乎是不可能的),而是通过设计保证即使存在安全漏洞,系统仍然是安全的。
系统范围的安全设计依赖几个关键的概念,如身份验证概念,确保正确识别出请求的发出者,也就是安全领域中的“委托人”;授权概念,确保这些请求者只能访问某些资源;审计概念,确保每次访问都有真实的记录,并且可以据此惩罚不良行为等。
这其中的每个概念都有许多变体,理解系统的安全性就需要深入理解这些概念的变体。如果没有仔细分析一个概念的目的和前提就随意使用这个概念,一个看似被正确保护的系统就可能变得很脆弱。
以双因素身份验证为例。它的工作原理是这样的:用户登录服务端,然后系统通过另一个渠道,通常是手机短信,向用户发送一个密钥;然后用户在服务端输入密钥,这时用户会收到一个访问权限的凭据,通常是cookie或某种形式的指令。这时用户就被确认为手机的所有者,也被认为是账户的合法持有人。
然而,这种设计是复杂的。首先,能够使用手机号不一定拥有该手机号所在的手机。Twitter前首席执行官杰克·多尔西(Jack Dorsey)在2019年就成为SIM卡交换攻击的受害者,当时黑客已经控制了他的手机号。其次,这个设计还涉及一个能力概念,即系统提供了一个指令,任何持有该指令的人都能拥有访问权。在这两个概念的交互中存在巨大的安全漏洞。
假设你收到一封网络钓鱼邮件,要求你确认领英(LinkedIn)网站的链接,但其中包含的URL不是指向真正的领英网站,而是指向黑客的服务器。黑客的服务器会模仿领英服务器,让你以为正在与领英本身互动。当你输入双因素身份验证密钥时,黑客的服务器会将这个密钥传递给真正的领英网站,领英网站向你发送访问指令。你以为一切正常,但你不知道黑客也得到了访问指令,现在他也可以用你的身份访问你的账户。
很多关键的安全概念都存在这样的问题。概念设计必须考虑概念间的交互,当然也要考虑正确实现这些概念的代码,但设计问题才是其中的根本性问题。因此,系统的安全性通常取决于对其安全概念及已知漏洞的理解,如果分析表明系统需要更强的安全保障,设计人员就需要替换或扩充已有的安全概念。简而言之,安全设计在很大程度上是对适当概念的设计和使用。
概念是所有系统设计的核心。安全(safety)领域不同于安保(security)领域,前者很少有标准的概念。然而,如果一个事故反复发生,就意味着应该有一个新的概念发挥类似安保概念的作用,并采用传统的方法实现关键功能。例如,医疗设备经常发生剂量计算错误,那么就应该设计一个剂量概念,用来处理各种单位、浓度和流速,从而消除很多导致患者受伤或死亡的悲剧性事故,这些事故本是可以预防的。
在任何设计领域,设计师都会对彼此的作品进行分析和评论,这对设计有重要的作用。评论并不是一种经过系统性思考的正式评价,但正是它的非正式性能够带来新的视角与灵感。并且评论不可避免是主观的,因为不同的参与者都有自己的偏见和兴趣。但有效的评论总是源于经验和专业,这种评论者用其熟悉的原则和模式语言表达评论。
这些原则和模式都围绕着设计的物理层次和语言层次展开,很少涉及概念层次的内容。即使大家都认为一个系统应该具有清晰的概念模型,但概念模型也经常被解释为语言层次的原则。人们更多地关注用户界面如何忠实和有效地体现概念模型,而不关注概念模型本身的结构。
本书后续部分的目标就是填补这一空白。书的第二部分提供了一种讨论概念的语言,以及表达概念的结构。书的第三部分给出了三种设计原则,它们决定概念的选择及概念的构成。
设计原则可以有不同的使用方式。它们是设计评论达成共识的基础,或者可以被系统地应用于启发式评价,但其更重要的作用是塑造设计师的思想。例如,一旦你掌握了诺曼的映射概念,你就知道,在用户界面设计中,应当使控件的布局和被控对象的布局相映射,这样你就能直观地创建出自然映射的用户界面。
同样,掌握了概念的原则和模式语言,你就能成为更好的软件设计师,因为它们能给你一种更直接、更清晰地表达思想的方法,让你在更加系统的框架中增强直觉和增加经验,并让你的判断更具设计敏感性。
► 选取一个熟悉的软件,找出可以代表这个软件特征的少数核心概念。再分析一个类似的软件,看看你是否可以从概念上解释这两个软件的共性和差异。
► 找一个你参与开发或使用的软件,尝试指出让这个软件成功或失败的概念。
► 以组概念为例,在你熟悉的软件中找到一个复杂的功能,并将这个功能分解为独立的、较小的概念。这些较小的概念是否能揭示该软件与其他软件之间的关系,或者是否能更统一地应用于不同软件?