人为错误

搭乐高积木的时候,你总有可能把红色的块儿放到应该放绿色的地方;炒菜的时候,你总有可能手抖把盐多洒了很多;装电脑的时候,你稍一用力就有可能把显卡撞到主板上、把电容撞断。人为错误在各种产品的使用当中无处不在。

炒坏了一盘菜,最多只是浪费一点食物,但在某些时候,这些人为错误可能性命攸关。如果你玩过 KSP,就知道制造出一个地对地载人导弹非常容易,但要让航天器真的进入轨道再安全返回难上加难;如果你玩过 FSX,就知道制造飞机坠落非常容易,而降落在跑道上需要充分的训练。显然大家都不希望自己坐的飞机天天坠毁,因此我们必须有一些措施来防止这些人为错误的发生;而现实中的飞机并不天天坠毁,说明这些措施已经被应用了。当然,现实中也有空难,这些空难的调查与教训可以为我们提供对这些人为错误和避免人为错误的措施的更深入的理解。

在设计这种复杂而重要的系统的时候,防止人为错误是非常重要的,让使用者走钢丝的行为几乎一定会导致严重的问题。

要避免人为错误,首先我们需要知道人们为什么会犯错误。我们反过来考虑,人们在干什么的时候会犯下错误:首先人们看到或者听到了一些东西,然后对这些东西有一些理解,根据这些理解和以往的认知、形成一个反应,在这个过程中可能涉及和他人的交流,然后根据这些自己的反应和他人的信息来做出决定并执行。这里的每一步都会有人为错误产生的机会。人们可能会错看一些东西,对看到的东西有错误的感知,对感知到的输入有错误的评估分析,可能和他人交流沟通产生错误(当然,他人也可能给出错误建议),最后做出执行的时候可能按了错误的按钮。

  1. 感知错误:使用者可能对环境有错误的感知,比如“彩虹”或者“海市蜃楼”就是错误的视觉,航空驾驶中的空间迷向就是错误的空间判断。
  2. 认知错误:即使双眼看到的是确实的形状,犯错者依然可能错误理解,比如说开车的时候屏幕上有一个大的右箭头,驾驶员不一定能判断这是在说“正在右转”还是说“请立刻右转”还是在说“请立刻向右变道”等。手机导航中经常有“靠左直行(上高架),但不要左转”这样的说法,这样的话迷惑了我认识的若干位司机。
  3. 分析错误:这是最可能的种类。举例来说,你觉得菜咸了,加了点糖,但加糖其实并不会让菜更不咸;你的手机通知栏有一个奇怪的三角形符号在闪烁,你并没有看懂它的意思(或者你在打游戏因此没注意),然后手机就死机了(因为过热)。这里包括你不知道应该怎么做、或者忘了、或者来不及反应、或者系统指示不明确。
  4. 交流错误:语言交流和文字交流会对交流的信息有所歪曲。比如本来寄到三十七号楼的快递,寄到了三四七号楼。如果是一个组织共同决策,整个组织可能因为社交社会学之类的原因做出错误决定。
  5. 执行错误:假设有一个弹窗,有一个红色的“接受”和一个绿色的“拒绝”。再比如,上下都可以插,但插反了就不能用的物理接口。

正确认识了问题,我们才能对症下药来解决这些问题。这里有一些防止人类错误的基本范式,此处的写法比较泛泛,虽然带着一些例子但并不特别精确。

  • 机械臂。这里指使用技术手段扩展人类的感知,用以防止感知错误。在开高速的时候,如果你只看前方,不会感觉车速很快,但转头看侧面的时候电线杆就会飞快越过,产生速度眩晕感;因此驾驶员应当依赖其速度表。为了解决夜间飞行没有参照物、空间迷向,飞机自带了姿态表,以确定在空中飞机的姿态。
  • 冗余。首先对于性命攸关系统的仪表需要冗余,以防止一套仪表失效导致重要问题。但此处冗余主要指人员冗余,比如一套银行保险柜应该有若干个人共同开锁才能打开,飞机火车应该至少有两个驾驶员。
  • 教学。对使用者进行训练与考试,保证他们能对环境做出正确的决定。周期性地重复考试,以保证在长达数年的工作过程中不致忘记。如果真的发生了人为错误的安全事故,就可以把事故教训加到教学中。
  • 监管。有时候有些人会过于熟悉流程,以至于全凭直觉、不按规章、跳过步骤。此时需要监管人员来防止他们过于散漫、降低安全性。如果有多个使用者各自操作一套系统并且需要协作防止撞车,监管人员应该独立出来进行协调(例如空管)。
  • 制定交流规范。法律文书中有“房间中有四万(40000)元现金”的方法防止涂改,口语中要复诵一遍对方的要求以让双方核对交流没有差错。设计 NATO Code 等方式精确地传达字母,不致被音近或口音等影响。举例来说,每次我和别人说电话号码,说到数字 4 或者 7 的时候都会用手指在空中比划一下阿拉伯数字的形状,因为我的南方口音念的这两个数字对于北京土著来说很容易听错。
  • 降低对反应速度的要求。从异常情况发生,到异常情况产生影响,之间的时间应当尽可能长,用尽可能明显直观的语言来对用户表述异常情况,让他们不用匆忙作出决定。
  • 防呆设计。颜色、形状和用途应该有鲜明的联系,例如交通标志中红色、三角形就代表危险或者警告,警报按钮或者武器发射按钮也都是红色的。重要的按钮应该很硬,防止误触。重要的软件操作应该出现二次弹窗审核,或者需要特殊的授权(sudo)。“如果它看起来成功了,那么它应该就成功了”:如果插口插反了,它应该卡住或者发出噪音。

本文主要思考来自于 ACI (空中浩劫)等纪录片,但其主要原则对于其他领域的设计也应当是通用的,例如医学手术设备或对他人的生命财产安全有重要影响的软件。