除了要体贴,好用的软件和人类一样还应该是聪明的。科幻小说家和未来主义者对智能产
品的描述,使得人们对于交互产品聪明的理解有一些迷惑。一些天真的观察家们认为软件确实
有智能。
但是对这个术语更有用的理解(如果最近10年内,你想尝试运输货物的话)是:在条件十分困难,甚至用户空闲的情况下,这些程序仍然能够努力工作。无论我们梦想的会思考的计算机是什么样子,我们其实有更好且更直接的方法可以让计算机更努力工作。本章将讨论一些重要的方法,帮助软件更努力地工作,更好地为人类服务。
利用计算机的空闲周期
每个程序中的每个指令都必须经过中央处理器(CPU)传递单个文件,因此我们需要为它优化程序。开发人员通过辛苦工作来保证指令数量的最小化,保证为用户提供良好的表现。然而我们通常会忘记,只要CPU快速地结束了所有工作,就开始空闲下来,什么也不做,直到用户执行下一个命令。我们为减少计算机的反应时间投入了大量的努力,却投入了很少或者几乎没有投入精力,以使计算机在没有响应来自用户任务时做一些前瞻性的工作。软件向CPU下命令,就好像军队一样,间歇性的命令使其行动或等待。行动的部分非常好,然而等待应该到此为止了。
在当前的计算机系统中,用户需要记住的事情太多,如文件名和文件在文件系统中的精确位置。如果一个用户想找到季度计划的电子表格,他必须记住文件名或者进行浏览。在这期间,处理器处于停止状态,浪费了数10亿次的循环运转。
当前多数软件也不关注情境。例如,当用户在辛苦地赶制电子表格工期时,程序能为其提
供的最大帮助也就跟他在空闲时间玩数字游戏差不多。凭良心说,软件再也不能在用户工作时
浪费这么多空闲时间了。在日常生活中,我们的计算机应该开始肩负起更多的责任。
在通常情况下,多数用户在不足几秒的时间内能做的事情很少,但这足以让典型的桌面计算机执行至少10亿条指令。无疑,这些周期都是空闲的。处理器除了等待,没有做任何事。反对利用这些周期的人总是认为:“我们不能做出假设,这些假设可能是错误的。”当前计算机的功能是如此强大,尽管这些说法是对的,但通常这种说法不值一提。简单而言,如果程序的假设是错的也没关系,它有足够的空闲和能力做出几个假设,而在用户做出最终选择时丢掉其他假设结果。
在Windows和Mac OSX的多线程化、多任务系统及多核多芯片系统中,你可以在后台执
行额外的工作,而不影响用户当前的任务。程序可以启动查找文件,如果用户开始输入,程序
可以放弃,直到下一次空闲时钟周期。终于用户停下来思考,而程序已经有了足够的时间扫描
整个硬盘,用户甚至不会注意到。这就是MacOSX中Spotlight的搜索比Windows搜索好很多
的地方。搜索结果几乎是同时出现的,因为系统利用了很多空闲时间来索引硬盘。
程序每次提供一个模态对话框时,它就进入空闲等待状态。当用户处理这个对话框时,它
什么事都不做,实在不应该出现这种情况。对于对话框来说,找到合适的帮助方法不会很困难。
用户上次是怎么做的?例如程序可以向用户建议以前的选择。
我们需要以全新并更主动的方式来思考软件应该怎样帮助人们实现其目标和任务。
聪明的软件有记忆
稍微一想就会明白,如果人们感觉某个交互产品是体贴和聪明的,那么这个产品肯定具有
关于这个人的知识并从其行为学习的能力。早期出现的体贴的产品就证实了这个事实,对一个
体贴并且很有帮助的软件来说,能够记住与之交互的人的相关信息是非常重要的。
开发人员和设计师通常假设用户的行为是随机的、难以预测的,并认为用户会通过不断的
询问来决定任务的合适过程。然而人类行为肯定不会像一台电子计算机一样被决定,而且也明
显不会是随机的,向用户提出傻问题肯定会让用户感到烦扰。
多数软件是健忘的,每次运行时很少记忆,甚至不记忆任何东西。如果我们的程序足够聪明,在使用期间能保留一些信息;通常这些信息也只是为了使开发人员更容易开展工作,而不
是为了用户。程序自动丢弃一些信息,如使用方式、改变方式、使用场合、处理的数据内容、
用户是谁,程序的不同功能是否用到,或者使用的频率如何等。在这期间,程序用驱动程序名、
端口分配和减轻程序员压力的其他细节填充初始化文件。从用户的角度看问题,使用相同的功
能设施可以显著提高软件的智能。
如果你的程序、网站或者设备能够预测用户下一步要做什么,那么它难道不能提供更好的
交互吗?如果你的程序可以预测用户在特定对话框或表单中的选择,难道不可以跳过那个部分
的界面吗?难道你不认为预测用户会采取什么行动是界面设计卓越的秘密武器吗?
你可以预测用户将要做什么,可以在程序中建立第六感,不可思议地准确预测用户下一步
将要做什么!那些数以10亿计浪费掉的处理器周期都会得到充分利用,你所需要做的就是给界
面赋予记忆的功能。
当我们在这种场景下使用记忆这个术语时,指的不是随机存取存储器(RAM),而是指在
多次会话中跟踪和反应用户行为的程序工具。如果你的程序简单地记住了用户上次做了什么(或
者怎么做的),它可以凭此来预测用户下次的行为。
如果我们能够赋予产品了解用户行为的能力,记忆并灵活地根据用户之前的行为显示信息
和功能的能力,那么在用户效率和满意方面会有很大的提高。我们都希望有个聪明且自觉的助
手,具有灵敏的直觉、源源不断的动力和好的判断,以及值得信赖的记忆。一个让使用过程充
满效率的产品就很像一位自觉的助手,记住了所有有帮助的信息和个人偏好,而不用去问。简
简单单就会有巨大的不同,不同之处在于用户是喜欢还是在忍受你的产品。下次当你发现程序
向用户提问时,设法也让程序向自己提出一个问题。
聪明的产品能够预测需求
通过回忆用户上次的行为来预测用户将要做什么,这是基于任务一致性原则(task coherence)做出的揣测。我们每天的目标和实现目标的方式(通过任务)通常是相同的。这不仅适用于像刷牙和吃早餐这样的任务,而且对于使用文字处理器、电子邮件程序、手机和电子商务网站这样的任务也适用。
当消费者使用产品时,使用的功能及使用方式和上次很可能极为相似,它甚至可能在同一个文档中工作,或者至少相同位置的相同类型文档上工作。的确他不会每次都做完全相同的事情,但是他很可能有少量的重复模式;因为具有明显的可靠性,所以你可以通过简单的权宜之计,即记住用户前几次使用的情况来预测他的行为,这样可以让你大幅减少程序必须向用户提问的次数。
例如,尽管莎莉使用Excel的方式和她使用PowerPoint或者Word的方式大不相同,但她每次使用Excel的方式却可能极为相似。莎莉喜欢使用12磅的Helvetica字体,这一喜好是个可靠的规律,并不需要程序询问她使用哪种字体或将哪种字体设置为默认格式。12磅的Helvetica字体对于莎莉来说是个可靠选择,每次如此。
应用程序还要密切关注各种动作。比如,在文字处理器中,你可能经常使用反白文本,在
黑色底板上写白字。为了做到这一点,你选择一些文本并将其字体的颜色改成白色,在没有改
变选择的情况下,又将背景颜色设置成黑色。如果程序充分注意到这一点,它会发现你要求的
两个格式化步骤中间没有其他选择。在你看来这是有效的单一操作,如果程序能够将这个独特
的模式重复几次,自动创建这种类型的新风格不是很好吗;或者比这更好,即创建一个新的反白工具栏控件。
多数主流程序允许用户设置默认值,但这并不能算作一种聪明的行为。即使对超级用户来
说,这种设置也是烦琐的过程,许多用户永远不会理解如何定制他们喜欢的默认值。
聪明的产品能够记住细节
确定程序应该记住哪些信息有一个简单的原则,即如果用户愿意操作,它就值得被程序记住。
用户做的每一件事都应该记住。我们的硬盘驱动器中有充足的空间,而程序的记忆功能是
对存储空间很好的投资。我们常常认为程序浪费磁盘空间,因为一个大的应用程序可能要占用
200MB 的空间。那是程序的通常用法,但是对于大多数的用户数据来说事实并非如此。如果你的
文字处理程序在每次运行时保存1KB的执行笔记,它仍然不会占据那么多空间。比如,你每个
工作日使用文字处理器10次,每年大约有250个工作日,每年运行程序2500次,净消耗量也仍
然只有2MB,这还是对全年的盘点。这个量大概还没有你桌面上的背景图像所占用的空间大。
设计原则
如果用户愿意操作,就值得程序记住。
任何时候,程序出现一个选项,尤其是已经向用户提供了该选项时,程序都应该记住这些
信息。程序可以使用用户以前的设置作为默认值,而不是使用无法更改的常量默认值,这样更
有可能满足用户所需。程序应该直接做出与用户上次选择相同的决定,而不是向用户询问。如
果错了,可以让用户纠正。无论用户设置的选项是什么,程序都应该记住。这样一直保留这些选项,除非用户重新更改。如果用户跳过程序或者关闭其功能,则不应该再向用户提供了;但
在用户乐意接受它们时,仍然能找到它们。
没有记忆功能的程序最讨厌的特点之一就是它们对文件和磁盘的帮助很少。用户需要帮助
的地方也就只有文件和磁盘。像Word这样的程序能够记住用户上次查找文件的位置。遗憾的
是,如果用户总是将其文件放在名为信件的目录下,但是只要用户有一次编辑一个文档暂时存
放在临时目录下,那么之后他的所有书信都会存储在临时目录下,而不是书信目录下。所以程
序不仅要记住文件最后一次访问的位置,而且必须记住每种类型的文件上次访问的位置。
窗口的位置也应该记住,如果你上次将文档最大化,那么下次它也应该是最大化的。如果
用户将窗口设置为与另一个窗口相邻,那么下次在用户没有给出任何指令时,窗口也应该以相
同的方式设置。现在,微软Office应用程序在这个方面已经很成功。
记住文件位置
所有打开文件的功能应该记住用户访问文件的位置。对于每个特定程序,多数用户只从极少的几个目录访问文件。程序应该记住这些源文件夹,并在打开的文件对话框中提供这些文件
夹。这样,用户再也不用每次都浏览文件夹目录进入特定文件夹了。
推断信息
软件不应该只是简单地记住一些明显的事实,还应该从这些事实中推论出有用的信息。例
如,如果程序记住了文件每次打开时修改的字节数量,那么它能够帮助用户检查修改操作的合
理性。假设文件修改字节数量的历史数据为126、94、43、74、81、70、110和92。如果某次
用户调用这个文件,修改了100个字节,可能不会有影响。但若修改字节的数量突然激增到5000
(可能因此永久性地删除了一页内容),程序可以认为出现了某种错误。虽然用户有可能不小心
做了令他难过的事,但这种可能性很低,所以不应该用一个确认对话框打扰他。但是程序有理
由在修改5000字节之前保留一个重要的副本以防万一.程序可能只需要在用户再次打开这个文
件之前保留这一副本,因为用户一眼就会发现错误,然后他会取消之前的操作。
取消多会话
在用户关闭文档或程序时,多数程序会放弃撤销堆栈,这是非常短视的行为。相反,程序
可以将撤销堆栈写入文件。当用户重新打开文件时,程序可以加载用户上次运行程序时的取消
堆栈,即使那是一个星期之前的事。
录入过去的数据
一个有良好记忆功能的程序可以降低用户犯错的次数,原因很简单,用户必须输入的信息大量减少,更多的信息可以通过程序的记忆直接获得。许多浏览器都具备这一功能,尽管智能
手机或桌面程序很少有这个功能。例如,在一个货品计价程序中,如果软件从过去的记忆中获
取日期、部门编号和其他标准字段,负责开发票的员工在这些字段上犯输入错误的机会就会变
得很少。
如果程序记住了用户输入的信息,并且将这些信息用于将来的合理性检查,程序就可以拒
绝输入的错误数据。现在的网络浏览器,比如IE或者火狐提供了一种机制,即命名的数据输入
域记住了以前输入的数据,允许用户从组合框中挑选一个值。对于安全意识强的用户,可以关
闭这种特性。但对于其他人来说,它既节省时间,又能防止错误发生。
程序文件的外部程序活动
应用程序在调用之前可以启动一个很小的线程,这个小线程密切关注它所处理的文件。它
可以追踪文件移动的位置,谁对它进行了读写,这些信息在用户再次运行该程序时也许有一定
的帮助。当其试图打开一个特殊文件时,程序可以帮助查找,即使文件已经移除。程序可以告
诉用户在其文件上执行了什么功能,如是否打印或者传真给某人。当然,用户可能并不需要这种信息,但这点时间对于计算机来说不算什么,毕竟对于所浪费的空闲周期来说,这不过是九
牛一毛。
让聪明的产品发挥聪明
如果设计人员能够认识到任务一致性在软件设计过程中的作用,那将不同凡响。设计师会
发现他们的思路会呈现全新的面貌。通常跳出的对话框不假思索地不见了,取而代之的是设计
师更多细致问题的提出和更具研究性过程的出现。程序应该记住多少?记住哪些方面?除了上
次的设置,是否还需要记住其他设置?模式有什么改变?设计师开始想象以下情况:用户连续
50次接受同样的日期格式,然后人工输入一次不同的日期格式。等下次用户输入一个日期,程
序应该使用哪种格式呢?50次相同的格式,还是最近一次使用的格式?一种新格式使用多少次
后会成为默认格式?即使存在疑问,程序仍然不该向用户提问。它必须发挥自己的主动性做出
选择。如果错了,用户可以自行更改程序选择。
下面的内容将对人们做出选择的一些特征模式进行阐释,这有助于我们解决一些与任务一
致性有关的更复杂的问题。
缩小决策数量
人们倾向于将决策选择降低到最小的有限数量。甚至当你每次做的事并不完全相同时,也
常常会从一个重复的较小选项集合中选择自己的行为。人们在无意中缩小决策集合,但软件可
以将其记录下来,并遵照它行事。
例如,仅仅因为你昨天在西夫韦购物,并不意味着你只在那里购物。但是,当下次需要日
常用品时,你可能又会选择西夫韦。同样,即使你喜欢的中国餐馆菜谱有250道菜,你也经常
会从自己偏爱的几道菜中做出选择。当人们开车上班或回家时,也经常是依据交通情况从少量
几条熟悉的路径中选择。当然,计算机可以毫不费力地记住这四五件事。
尽管简单记住最后一次的动作比不记任何事要好得多,但如果决策集合仅由两三个元素组
成,它仍可能带来特殊的麻烦。比如你交替地从一个文件夹中浏览文件,而在另一个文件中保
存文件。程序每次自动检索到上一次打开的文件夹,那它肯定无法提供用户想要的,唯一的办
法就是记住更多选择。
缩小决策集合使我们想到,程序必须记住的信息应该是用户经常使用的一组信息。和只有
一个正确答案的情况不同,好几个选项都是正确的,程序应该寻找更加微妙的线索来在小的集
合中确定哪一个才是正确的。例如,如果你用支票程序付账单,程序很快就会知道只有两三个
账户是经常使用的。但是它怎样才能知道对于一个特定的账单,哪个账户是最合适的呢?如果
程序记得付款人和每笔账目的数量,就能比较容易做出选择。每次你付的租金数量是完全相同
的。支付汽车贷款也是这样,支付给电气公司的每笔账目可能会有变动,变动大概在上次账目
的 10%~20%之间。所有这些信息可以帮助程序了解具体情况并利用这些情况帮助用户。
偏好阈值
人们所做的决策一般分为两大类,即重要的和不重要的。任何特定的动作都包含了上百次
的决策,但是其中只有很少是重要的,其余的都不重要。软件界面可以用偏好阈值来简化用户
任务。
在决定购买汽车之后你不会在意为其筹钱,只要物有所值。决定购买日用品,选择哪个结
账口付款不重要。在决定到迪斯尼乐园的马特洪峰驰骋时,你不会在乎乘坐的是哪个滑车。
偏好阈值证明,不断地向用户询问程序决策细节是不必要的,从而可以在用户界面设计中
给我们指导。用户请求打印之后,不必问他需要多少份,也不必问图像是横向还是纵向。我们
可以将这些设置假定为第1次使用的情形,并且为后继的调用记住这些设置。如果用户希望更
改设置,可以启用打印机选项对话框进行修改。
使用偏好阈值,我们可以轻易地跟踪哪些程序功能是用户喜欢调整的,哪些是用户一旦设
置好后就不会再改变的。知道这些后,程序可以在用户想控制的地方提供选择,而不必在用户
不感兴趣时打扰他。
多数情况下,多数是对的
任务一致性能够合理地预见用户的下一步行为,但也不是绝对的。如果我们的程序依靠该 原则,自然会遇见不确定性。如果我们能够以80%的准确率预见用户行为,则还有20%的情况是错的。可能有人认为应令用户选择,但用户可能在80%的情况下被不必要的对话框打扰。程序应径直做其认为最恰当的事,然后允许用户覆盖撤销,而不是让用户选择。如果撤销工具很容易使用、理解,用户就不会受到无谓的干扰。毕竟10次中只有2次需要撤销,而省去了8次多余的对话框,是很合算的。