有人(尤其是开发人员)会说,这三个例子中的问题,甚至都不是缺陷:

  首先,客户没有提出明确的需求;

  其次,只要使用“正确”,软件的功能都可以“正常的”完成;

  再次,其他公司的大部分软件都是这么做的,而且似乎卖得也不错。

  然而,用户只要有选择权,她们会用脚投票,放弃那些“烂”软件。

  后,由社会因素导致的“真正的”缺陷,我也能举出半打,比如说时间:

  我曾经有篇博客中讲过时间因素导致的缺陷。时间是一个典型的社会因素:对程序员来说,时间不过是简单2012073112000001(2012年7月31日12点零1秒)十六位字符,但是在实际的社会中,时间会涉及到时区、原子时、世界时、闰年、闰月、闰秒,如果读者有心,可以去检索一下,前面列出的任何一个时间因素都造成过严重的软件缺陷。

  所以,个人主张,软件——尤其是那些以消费用户为目标群体的软件——测试必须搬出我们舒适的带有中央空调的办公室,走入到社会中去。

  一旦我们把软件测试“搬出实验室”,会发现:那些在实验室看起来正常的东西对于客户来说“不正常”——具体例子看前文。一旦我们把软件测试“搬出实验室”,会发现:影响软件质量的因素开始迅速复杂化。

  比如近我坚持使用 TDCDMA 网络的手机,因为我知道许多商人需要依靠中国移动网络接打电话。但是,大部分移动app对TDCDMA网络的兼容性都有问题,在 WCDMA 网络下很好:这是因为 TD 网络是独生于中国的网络,国外没有。

  比如我的家在近郊,我很想知道有多少移动互联网公司会测试在弱信号情况下的软件稳定性?

  比如一旦考虑到需要适配十种分辨率,几十种品牌的三百种安卓平台,安卓app的测试复杂程度会迅速膨胀。

  比如考虑到软件的用户群体的多样性,任何一个在实验室里正确的功能终对用户来说可能都是灾难:由于我老婆使用浏览器的习惯,IE8在她手下崩溃的频率要高很多。

  比如考虑到业务的复杂性,胡乱的使用输入框而不对输入数据进行控制,后都可能导致灾难性的后果,而一家企业,一个医院的业务复杂程度,岂是几篇博客可以说清的?一旦我们把软件测试“搬出实验室”,我们会发现,现有的测试是大大不足的,而且这种测试是单纯靠工具,代码很难测试全面的。

  向计算机解释人类是由于何种脑残的原因,通过夜观天象开始计时,结果每每发现这种记时误差很大于是找出各种闰年,闰月,闰秒来弥补?快省省吧,Linux内核号称是由这个星球上会写代码的人搞出来的,由于2012年某凭空多出一个闰秒,多少Linux核心进程死锁服务器挂掉这种事情,他们会随便告诉别人吗?

  向计算机解释为什么我的老奶奶在七十岁以后手开始抖动以至于在于无法完成哪怕一次鼠标的双击操作?快省省吧,双击操作是反社会软件设计的典型:如果你跟朋友打招呼时拍一下脑袋,他会认为是亲昵的表示,想象一下这时你来了个“双击”,嗯,很可能你们要开打。

  一旦我们把软件测试“搬出实验室”,我们会发现,手工测试人员是宝贵的:

  他们似乎是团队中那个真正像个“人”那样思考的人……

  说到这,大家应该清楚我的观点了,对于手工测试工程师来说:别光盯着学代码,学工具,琢磨琢磨这个“社会”。

  PS: 单身程序员们,如果下次你用“这是特性不是缺陷”来搪塞测试人员报的“应该双击而不是单击”缺陷时,请花几秒考虑一下这个场景——恰恰是你们这种木有社会责任感的行为,导致漂亮的银行妹子每天加班,没时间跟你约会,所以你才单身的…好吧…这个 bug 你改不改?