大部分的软件符合的是实现模型
要设计反映实现模型的软件要容易的多:每个函数一个按钮,每个数据一个输入字段,每个事物步骤一页,每个代码模块一个对话框,在软件世界里这太常见了。而当充分反映了工程师成果的同时,它对于用户的目标,以及为了完成这些目标需要进行的任务没有任何相关的反映。就好像Terry Gilliam的类似1984的电影,《巴西》(一部充满了玩笑性的糟糕界面例子的电影)中一样,这样产生的界面只会疏远用户并把他们搞糊涂。
由工程师设计的软件遵循的是实现模型
如果由工程师,那些最清楚软件如何工作的人,来进行软件的交互设计,往往得到的表现模型会和实现模型非常的一致。对于工程师而言,这样的模型是合理、真实而且正确的;可惜的是,它们对于用户来说没什么帮助和效果。大部分的用户不关心程序是如何实际实现的。
用户界面遵从实现模型而不是用户的心理模型的情况,可以从流行的软件传真产品中可以找到很合适的一个例子。它过程的每一步都令人烦恼的分在不同的步骤,用户不得不费力的控制,而这些从用户的角度来看都是无用的。与用户的交流完完全全的成了致力于符合软件内部的逻辑。对于每个可能的用户动作都有一个不同的对话框。在程序方便获取信息的时候,这些信息才被提示给用户——而不是在对于用户觉得自然的时候提供。
如果我们想要发一个传真,我们要么是发给一个以前名字已经输入到程序里的人,要么是给一个还没有输入过姓名的新的人。但是这个程序遵从的是实现模型:执行这两个功能的代码是在不同的模块里的,所以程序就为每个功能提供了分离的对话框。这样,为了选一个人或输入一个名字,我们不得不以分离的两条途径进行程序,尽管选择和输入姓名是程序的一个主要功能。设计师根本就没有想过用户在建立和发送传真时的步骤,而仅仅是把程序不得不作的步骤转换为界面。
这有一个较好的方式来对付这个问题:当我们输入新的传真的姓名和号码时,程序应该自动记录下来。程序的主窗口应该显示以前的传真接收人的姓名列表,这样我们就可以从中快速的选出我们想要的人。
Windows的界面也时不时的滑入到实现模型中。资源浏览器努力想让计算机里所有的存储器看起来像是统一的系统,但是,要给用户成功的传达这种意图,这些存储器的行为也应该是统一的。然而,它们的行为是依赖于特定驱动器的物理特性。如果你在同一个硬盘驱动器中拖动文件从一个目录到另一个,程序会解释为移动,也就是文件会从旧的目录中去除并加入新的目录,基本上接近于心理模型。然而,如果你把文件从C盘拖到D盘,这个操作会被解释为拷贝,就是说文件加入到新的目录,但是不从旧目录中移去。
这是与实现模型——文件系统实际工作的方式相一致的:当操作系统在同一个驱动器中把文件从一个目录移到另一个,只不过是把磁盘文件的入口表中的入口重新定位。并没有实际的清除和写入文件。然而,当向另一个物理驱动器中移动文件时,就必须要实际的向新的驱动器中拷贝数据了。要符合用户的心理模型,应该在拷贝之后清除原来的文件,尽管这和实现的模型是不同的。
因为把文件从一个硬盘拖到另一个处理为拷贝是一个让人合意的行为,特别是从硬盘上往比如ZIP盘之类可移动媒体上拷贝,很多人不会意识到这是实现模型的一个副作用。而当计算机发展,逻辑卷表示的不仅仅是物理驱动器时,这个副作用就不再有用反而变得烦人,因为我们不得不记住每个卷的类型的不同行为。
数学式思维导致实现模型的界面
交互设计需要向用户隔离实现模型。一种技术对于解决构造软件的问题是合适的,并不意味着它也适合于用户的心理模型。就像你的车是由金属部件焊接而成的,并不意味着你必须学会焊接技巧才能驾驶汽车。
在软件中用来表达和处理信息的数据结构和算法是基于数学运算法则的合理工具。所有的程序员都对这些算法训练有素,比如递归,分层数据结构(?hierarchical data structures)和多线程。当用户界面也试图精确的表现这些递归、分层数据或多线程的概念时,问题出现了。
数学式思维是程序员特别容易踏入的实现模型陷阱。数学式的思考可以解决编程问题,所以程序员自然把这些数学模型作为发明用户界面的合适术语。没有什么比这个更离谱了。
设计窍门 用户不懂得布尔逻辑。
举个例子,程序员的工具箱中最悠久也最有用的工具之一就算布尔代数。它是一种简洁的数学系统,非常方便用来描述数字计算机内部严格的“开或关”的万物。布尔代数只有两个主要的运算:与(AND)和或(OR)。问题是英语中也有and和or,而且它们通常对于不是程序员的人而言,是恰好和布尔的AND和OR相反的意思。如果程序用布尔符号来表达自己,用户误解它就可想而知了。
比如在查询数据库的时候这个问题就常常出现。如果我们希望从员工档案中选出在亚利桑那以及在德克萨斯州的人,用英语我们会对一个人说,“寻找在亚利桑那和德克萨斯州的所有员工”( "Find all my employees in Arizona and Texas.")而在数据库的布尔代数术语中正确的表达应该说,“找在亚利桑那或德克萨斯的员工。”("Find employees in Arizona OR Texas." )没有员工会同时住在两个州,“寻找在亚利桑那和德克萨斯州的员工”,在布尔运算中是无意义的,总是会返回空的结果。
数据库查询程序,或者任何有着同样性质,即采用布尔运算和用户打交道的程序,都必然遭受严重的用户界面问题。期待用户看透这种混乱是毫无道理的。用户对于英语都能良好掌握,那么为什么他们还不得不用一种不熟悉的,有着烦人的,重新定义的关键字的语言来表达事物?