The Essence of Software.Chapter.10.概念熟悉度
设计新手常以为专业设计师拥有凭空想出全新点子的奇妙能力。但那些看似瞬间迸发的灵感,更多源于多年经验的积累。优秀的设计师脑海中有一系列的设计方案,随时可以为她遇到的新设计问题提供参考。只有当标准解决方案无法满足需求时,她才会去寻找新方法。
在这一点上,软件设计与其他设计领域并无不同。要应用以往设计的经验教训,你首先需要能够将设计思路提取为可复用的片段。这正是概念所要达到的目的。概念是针对某个特定设计问题的特定解决方案——不是庞大而模糊的问题,而是在多种语境中反复出现的微小且定义明确的需求。
为一个已经有极佳适用概念的目标去发明一个新概念,不仅是白费力气,还容易让那些可能已经熟悉现有概念的用户感到困惑。在本章中,我们将看到一些这方面的例子。但首先来看好的情况——即熟悉的观念被成功复用的情况。
概念的成功复用
概念复用十分泛滥,特别是在 Web 应用中。事实上,有时所有的社交媒体应用看起来本质上都一样——全都是某款无处不在的超级应用的变体,它们让你与人和社区建立联系,分享文字、图像和视频,并通过评论和评分对他人的贡献做出反应。稍作退后来看,许多流行的应用——Facebook、Twitter、Instagram、WhatsApp、SnapChat 等——似乎几乎难以区分,仅仅在一些小细节上有所不同。
当这个类别中又一款应用出现时,你最初可能会对它与现有应用的区别感到困惑。但你在弄清楚如何使用它时不会遇到任何困难,因为它很可能会提供所有你已经熟悉的概念:
用于创建内容的 帖子 (post)、消息 (message) 和 评论 (comment);
用于访问和过滤内容的 好友 (friend)、关注者 (follower) 和 群组 (group);
用于质量控制的 评分 (rating)、赞成 (upvote) 和 审核 (moderation);用于突出内容的 通知 (notification)、收藏 (favorite) 和 近期活动 (recent activity) ;诸如此类。

同一个概念可能会以不同的伪装出现。所以旧的 聊天室 (chatroom) 概念变成了 WhatsApp、Google Groups 或 Facebook 中的 群组 (group),以及 IRC 或 Slack 中的 频道 (channel)。Twitter 在将其设计与现有概念联系起来方面提供了一个很好的例子。例如,以下是它如何解释 关注者 (follower) 概念的 (图 10.1):
在 Twitter 上关注某人意味着什么?…当你关注某人时,每次他们发布新消息,它都会出现在你的 Twitter 主页时间线上。
在回答这个问题时,Twitter 提供了该概念的操作原理。这正是 Twitter 用户需要知道的。关注某人的含义并不是根据喜欢他们或者甚至想读他们的推文这种抽象概念来解释的。它是作为一个简单的场景给出的:你关注,他们发布,你在你的时间线上看到消息。
但我省略了 Twitter 解释中的一个关键部分(由省略号标记)。完整的回答以此开头:
关注某人意味着你选择了订阅他们的 Twitter 更新。
当你关注某人时…
这里相关的是第一句话。如果你已经了解了这个概念,它可以省去你学习的麻烦,它指出 关注者 (follower) 只是熟悉的 订阅 (subscription) 概念的一种形式,在其中你订阅了一组事件——在这个例子中是来自特定用户的推文——并在它们发生时收到通知。

对幻灯片分组:避免发明
当设计师可以在复用通用概念和发明新概念之间做出选择时,最好复用通用的概念——除非在某些明确的方面通用概念无法如此有效地实现目的。
为了说明这一点,让我们来看看两种幻灯片演示工具如何让你组织幻灯片的顺序。这里的目的是为了能够将演示文稿组织成更小的幻灯片组,以便你可以单独处理每一组。预期的操作原理大致如下:
如果你将一组连续的幻灯片分组,你就可以同时对整个组应用操作,比如显示或隐藏这些幻灯片,移动它们等等。
Apple Keynote 为此目的提供了 幻灯片组 (slide group) 概念。组是位于父幻灯片下的一系列幻灯片,通过相对于父幻灯片缩进组成员来显示 (图 10.2,左)。你可以切换组的可见性,并可以通过拖动父幻灯片将其作为一个整体移动。
Microsoft PowerPoint 提供了 节 (section) 概念来实现相同的目的 (图 10.2,中和右)。每一节都可以命名,并且像 Keynote 一样,有一个开关来显示或隐藏其包含的幻灯片。这在很大程度上效果不错,而且绝对不是一个糟糕的设计。
但在我看来,Keynote 的设计更有效,也更易于使用。虽然 PowerPoint 的节受限于单层组织,但你可以将组嵌套在组中(深度可达六层)。在这些示例幻灯片中,你可以看到,在 Keynote 中,幻灯片 11 位于标题为 “grouping slides” 的幻灯片下方,而它本身又位于 “concept familiarity” 下方;在 PowerPoint 中,在名为 “concept familiarity” 的节内不可能有结构,因为节不能嵌套。你可以在演示文稿的顺序中向前和向后移动节,但你不能将一个节放在另一个节内。
组的用户界面更直观。要创建一个组,你需要选择一些跟随在将成为父幻灯片之后的幻灯片,然后向右拖动它们;要移除组,你需要将它们向左拖回。如果你将在组中间的一张幻灯片向左拖动,它将被提升一层 (如你所愿),并且它原来所属的组将被拆分为两个平级的兄弟组。
创建节则比较棘手。你可能认为你可以选择一段连续的幻灯片(比如所有关于概念熟悉度的幻灯片),然后调用 “添加节 (add section)” 命令。如果你那样做,它确实会创建一个节,但是那个节将包含从第一张选中的幻灯片到整个演示文稿结尾的所有幻灯片。如果选中的幻灯片在某个节内,新节将紧随其后;如果不是,将为前面的幻灯片创建第二个新节 (名为 “默认节 (default section)”)。
这太复杂了!(我承认读起来也很乏味。)但更糟糕的是,它是不可预测的。你没有任何理由能猜到添加一个节会产生这种效果。例如,创建一个仅包含选定幻灯片的新节,这在道理上是同样合理的(或许更好)。
相比之下,Keynote 的行为在很大程度上是简单且可预测的。如果你开始时没有任何组,当你将一张幻灯片向右拖动时,你将创建一个组,其中该幻灯片是子项,其前一张幻灯片是父项。与节不同,没有其他的组会自发出现。也许唯一你可能无法预测的行为是,如果你选择了几张不相邻的幻灯片并将它们向右拖动会发生什么。在那种情况下,你会在视觉上看到(当你开始拖动时)这些幻灯片被分组到一个单一的连续序列中,然后将成为同一父项的子项。
为什么苹果能够设计出一个更好的概念?在很大程度上,是因为他们不是从零开始。这也是为什么苹果的概念感觉更直观的原因。我们以前在其他情境中见过它。我们可以称之为 大纲树 (outline tree) 概念。每种大纲工具和文字处理器都有它:你可以制作一个项目列表(通常是短句或短语)并引入层级,这样产生的结构就是一棵树,每个节点上都有一个大纲项目。
导出预设:当扩展破坏了熟悉度
我们的第二个不熟悉概念的例子出现在不同的情境中。在这个例子中,我们会看到设计最初采用了一个传统且熟悉的概念,但随后为了新的功能对其进行了扩展,导致熟悉度丧失。
这个概念是 预设 (preset)。它的目的是省去用户为常用命令输入参数的麻烦。取而代之的是,参数被保存为预设,当命令被调用时,用户可以选择显式设置参数,或通过选择先前保存的预设自动设置。
Adobe Lightroom Classic 在许多不同的命令中有效地使用了预设。有用于打印、用于编辑、以及用于导入和导出图像的预设。我想关注的麻烦例子涉及在导出中使用 预设 (preset) 概念。
看一下导出对话框的截图 (图 10.3)。右侧是参数设置;左侧是预设的 (层级) 列表。你可以手动调整参数;你也可以点击预设的名称,这将导致参数采用预设值,如果你愿意,随后还可以覆盖这些值。这对任何使用过预设对话框的人来说都是熟悉的。
但现在如果你仔细看预设列表,你会注意到每个预设名称旁边都有一个复选框。结果证明,这是一个强大的扩展,它允许你一次选择多个预设。现在你可能会想:这可能是什么意思?好吧,通常来说,对于 预设 (preset) 概念,这并没有太大意义,因为在执行命令时只能使用一组参数。但对于这个特定的命令,人们可能希望用不同的预设多次执行。例如,你可能一次性将选定的照片导出为高分辨率和低分辨率两个版本。

这项新功能的目的是完全合理的——即允许使用多个预设进行一系列导出,且显然这是许多用户要求的。但是把它挤进 预设 (preset) 概念会产生一些奇怪的异常。例如,如果你通过勾选复选框来选择一个预设,你将无法再编辑它的参数。
正如你可能预料的那样,当这个新功能被添加后,许多用户在应用程序的社区论坛上发布了求助请求。许多人(包括我)甚至没有意识到点击预设名称和点击复选框是不同的。那些变成灰色和隐藏的部分让用户感到困惑。对话框底部的 “了解更多 (Learn more)” 链接的存在表明 Lightroom 的设计师们非常清楚这些问题,但仍未解决它们。
应用概念特异性原则(concept specificity principle),我们在这里可能会发现两个不同的目的:(1) 保存命令的常见参数设置;(2) 使用不同的、但预先确定的设置重复执行命令。第一个目的通过 预设 (preset) 概念实现。第二个目的可能需要一个新概念,它将独立于 预设 (preset) 但与之一起使用:也许像 Photoshop 中的 动作 (action) 那样,将动作序列定义为用户可以定义和调用的小程序。
概念实例的符合性
当设计中出现的概念是一个熟悉的通用概念的实例时,它应该完全遵循通用概念的行为——除非有非常充分的理由不这么做,并且与标准概念的偏差表现得非常明显。否则,熟悉该通用概念的用户会感到困惑,他们会假设该概念的行为方式与他们在其他实例中看到的行为方式相同。
为了说明这一点,让我们来看看苹果 联系人 (contact) 概念设计中的两难困境。大多数人在手机上使用 Apple 的通讯录 (Contacts) 应用。除了存储电话号码以免你不得不记住它们之外,它还发挥了一个有用的功能,即在来电时将名字附加到号码上。许多人为朋友和家人输入昵称,所以如果在某位查尔斯·乔治 (Charles George) 的手机上,如果他没有按照礼仪在通讯录中将母亲的名字输入为伊丽莎白二世女王陛下 (Her Majesty Queen Elizabeth II),他母亲的来电可能会显示 “Mummy”。
这并不会引发什么灾难,但如果这位威尔士亲王 (Prince of Wales) 现在给他的母亲发了一封电子邮件,他可能会苦恼地发现邮件的收件人地址中包含了 “Mummy”。令人尴尬的是,当用户转发或回复时,附加在电子邮件地址上的名字会被传递,所以如果这封邮件涉及包含顾问在内的某些国家大事,它可能会在白金汉宫的所有办公室中流传,直到最终发给女王的每一封邮件都被称呼为 “Mummy”。
如果王子犯了这个错误,我认为我们必须原谅他,理由是他理所当然地认为,通讯录应用使用了一个我们可以称之为 昵称 (nickname) 的概念,它允许你用一个方便的别名或昵称来代替较长的电话号码或电子邮件地址。这个概念保持别名的私密性,所以从这个角度来看,通讯录应用的行为偏离了熟悉的预期。
为了替苹果辩护,我们可以说,这个概念从来就不是 昵称 (nickname);从一开始它就是一个 联系人 (contact) 概念,让你存储关于某人的所有信息,包括他们的全名。王子被误导是因为他碰巧按名字查找联系人,但苹果的应用同样对电话号码和电子邮件地址进行查找和自动补全。他的期望也受到了他在使用联系人发电子邮件之前,先用它打电话(其中从不发送名字)的影响。
在这个例子中,没有正确或错误的答案;重点仅仅在于,对一个概念的熟悉度以及它带来的随附预期,是设计中必须认真对待的强大因素。
经验与实践
本章的一些经验:
- 一位优秀的设计师不仅知道如何发明新概念,也知道什么时候根本不应该发明。如果你的目的已经由一项现有的发明解决,你最好复用它。
- 在这方面,概念就像任何其他发明一样。新颖之处在于,概念提供了一种以小而连贯的片段来构建软件设计的知识和经验的方法,从而提供了更精细的复用机会。
- 使设计变得易用的最简单方法,是从熟悉的、预先存在的概念来构建它。使用成熟且被充分理解的概念能减少不契合的可能性,并使设计对用户来说很直观。
以及一些你现在可以应用的实践:
- 在你发明一个新概念之前,先对现有的概念进行头脑风暴,看看是否有一个满足你的目的。记住,你需要的概念可能来自一个完全不同的领域。
- 当映射到用户界面时,对非传统部件的需求可能表明,底层概念本身就是错综复杂且非传统的。
- 如果现有的概念似乎只能部分满足你的目标,与其修改或扩展它,不如探索它是否能与另一个熟悉的概念组合,以提供你需要的功能。
- 当概念操作的行为不可预测,并且几种可能性似乎同等可能时,概念设计很可能有问题。好的设计有一种必然性的特质。