软件Bug训练人变成条件反射


科学必须可复制重现,但很难,以可靠性著称的计算机也有Bug:

你是否曾经在使用一个新程序或系统时,发现它有令人厌恶的错误,但过了一段时间后,你就不再注意到这些错误了?如果是这样,那么恭喜你:你已经被电脑训练得能够避免一些问题了。

例如,我以前有一台笔记本电脑,当我向下滚动网页的时间过长时,它就会锁死,以至于需要拔掉电池(我猜是视频驱动程序处理完整命令队列的逻辑有问题)。更改驱动程序版本并没有解决问题,我很快就学会了在滚动长网页时稍作休息。直到今天,当我快速滚动网页时,偶尔还会感到一阵内疚或恐惧。

我的一个孩子当时大概只有三岁,他坐在 Windows 机器前,几分钟内就使图形用户界面毫无反应。即使观察了他按下的键,我也无法重现这种行为,至少部分原因是,几十年来我一直接受如何使用电脑的培训,很难以这种不恰当的方式使用电脑。现在,这个孩子(8 岁)已经长大了:和其他数百万人一样,他可以连续使用 Windows 电脑几个小时而不死机。

操作性条件反射描述了人类(当然也包括其他生物)根据行为产生的后果调整行为的方式。
我喝啤酒至少部分是因为这让我感觉良好,而我避免喝 16 瓶啤酒至少部分是因为这让我感觉不好。

条件反射对我们的行为具有强大的指导作用,它可以在我们毫无察觉的情况下发生。

我最喜欢的一个故事是,一堂心理学课上,教授站在角落里讲课,当他站在教室的某个地方时,学生就会注意他,而当他不站在角落里时,学生就会看别处。

软件错误是如何训练我们的?

我们中的大多数人学到的核心经验是,坚持使用久经考验的制度,避免陷入困境。

具体来说,我们会

  • 定期重启操作系统和应用程序,避免软件老化效应、
  • 避免在电脑工作时中断它(尤其是在安装或更新程序时),因为提前退出代码几乎总是错误的、
  • 当电脑负荷过重时,做事速度要慢一些--相反,电脑新手往往会因为点击次数越来越多而使负荷过重的情况更加严重、
  • 避免过多的多任务处理、
  • 避免使用深奥的配置选项、
  • 避免依赖隐式操作,比如 MS Word 在退出时会询问我们是否要保存文档,如果存在未保存的更改。

我有一种直觉,人们之所以不信任 Windows,其中一个原因就是 Windows 更需要这些策略。

例如,我从不让我妻子的 Windows 7 电脑超过两周不重启,而我的 Linux 电脑每隔几个月才重启一次。有一次,我在 Windows 3.1 上从事软件开发工作,如果要继续工作,我的电脑一般每天至少要重启两次。在我拥有的半打 Windows 笔记本电脑中,没有一台能在不重启的情况下可靠地挂起/恢复十次。我写这篇文章的初衷并不是要挑微软的刺,但他们的系统与我所有最残酷的调节过程都有关系。

鲍里斯-贝泽尔(Boris Beizer)在他那本有趣但早已被人遗忘的书《冰冻的键盘》(The Frozen Keyboard)中讲述了这样一个故事:

我的妻子没有接受过电脑培训。她有一项重要的写作任务要做,而文字处理软件是她的首选工具。这个软件包很不错,但和大多数软件一样,它也有缺陷。在几个月的时间里,我们使用了相同的硬件和软件(她用来做笔记,我用来写书)。她的程序偶尔会崩溃,但我不会。我看不懂。我打字比她快。我比她更滥用设备。她每次使用设备,我都要用上十个小时左右。无论从哪个角度看,我都应该更经常出现问题。然而,她所做的某些事情却触发了我无法通过尝试触发的错误。我们该如何解释这个谜团?我们能从中学到什么?

我花了几个小时观察她对系统的使用,并将其与我的进行比较,这才找到了答案:
她不知道哪些操作对软件来说是困难的,因此她的使用模式和按键没有避开潜在的麻烦区域。

而我却明白,而且我不自觉地避开了麻烦点。

我没有测试该软件,所以我不想让它失败,我只想以最少的麻烦完成我的工作。

程序员不善于发现自己的错误,尤其是微妙的错误,部分原因就在于这种免疫力。

在自己的工作中发现错误是一种自我毁灭。

我们可以延伸这个概念来解释,为什么一些经过全面测试的软件在投入使用后,才会出现大量前所未见的错误:程序员在测试时下意识地避开了问题点,从而获得了对错误的免疫力。

贝泽尔的观点引出了我写这篇文章的三个原因中的第一个,即我认为对于软件测试感兴趣的人来说,知道可以通过颠倒我们习惯的操作来生成有趣的测试用例是非常有用的。

例如,我们可以长时间运行操作系统或应用程序,我们可以在计算机进行安装或更新时中断它,我们还可以在计算机的响应时间受到影响时尝试让它超负荷运行。

我写这篇文章的第二个原因是,我认为操作性条件反射可以部分解释这样一个明显的悖论:许多人认为大多数软件在大多数时候都运行得很好,而另一些人则认为软件基本上就是垃圾。我认为,后一阵营的人能够以某种方式抵制或摒弃他们的条件反射,从而以更公正的方式使用软件。或者,他们只是学得比较慢。无论如何,这些人都会成为软件测试团队的优秀成员。

最后,我认为软件错误的操作性条件反射也许值得进行一些实际研究,而不是我在这里的空洞观察。人机交互研究人员可以通过在程序中加入错误并观察由此产生的使用模式来研究这些效果。另一个不错的实验是通过向不同用户注入不同比率的故障,提供随机负强化,并观察由此产生的行为。任何从事过技术支持工作的人都见过因不可预知的故障而产生的怪异的货物崇拜仪式。

总之,电脑就是斯金纳箱,而我们就是实验室里的小白鼠--有时我们会得到一点食物,有时我们会受到惊吓。