汽车对冰激凌过敏
一天,某汽车制造厂总裁收到一位汽车用户的抱怨信,信中写道:
“总裁先生,这是我第二次给您写信。我不会责怪您没有答复我提出的问题,因为这个问题实在太荒诞了。但它确是事实,我想再重述一次——
我家一向有晚餐后吃冰淇淋的习惯。由于冰淇淋有许多种,所以当大家一致同意吃那一种时,我便被催促开车去商店购买。最近,我买了一辆贵厂出产的汽车。从此以后,去商店就出现了一个奇怪的问题:每次我从商店买完香子兰冰淇淋回家时,汽车就起动不了;但我买其它种类的冰淇淋时,车子却起动得很好。不管这个问题有多么荒唐,我还是想让您知道我对这一问题是非常关注的。是什么原因使得我买香子兰冰淇淋时汽车起动不了,而买其它冰淇淋车就容易起动呢?真切希望您能派人来解决一下。”
这确是一个十分罕见而有趣的问题。尽管总裁感到半信半疑,但他还是派了一个工程师前去查看。
使工程师很惊讶的是,提出这个问题的竟是一位受过良好教育的男子。这位男子安排他在晚饭后开始工作。晚上,他们跳上汽车去冰淇淋店,也是买香子兰冰淇淋。返回时,车子果然起动不了。之后,工程师又连续去了三个晚上。第一个晚上,车主买巧克力冰淇淋,车起动了;第二个晚上,买草莓冰淇淋,车也起动了;第三个晚上,他们买香子兰冰淇淋,车起动不了。
工程师绝不相信这部车会对香子兰冰淇淋过敏。于是,他又调来了几种不同型号、不同厂家的汽车,采用了相同的方法实验了三天,结果还是一样:买香子兰冰淇淋时,汽车起动不了,而买其它种类的冰淇淋,则能很好起动。
现在的问题已不在这部车本身,而是所有的汽车都对香子兰冰淇淋过敏。工程师依旧不相信这会是事实,他开始了更深入的探究。每次他都作详细记录,写下相关的各种数据,如日期、所用汽车类型、汽车往返时间,等等。但仍没有发现什么令人惊喜的线索。一个月过去了,工程师一直没有停止思维的运转。终于有一天,他发现了问题所在,即车主买香子兰冰淇淋所花的时间比买其它冰淇淋所花的时间要短。
这又是为什么呢?原来答案在冰淇淋店的货架上。香子兰冰淇淋很受顾客欢迎,所以分箱时将其摆放在货架前面,容易取货付货;而其它冰淇淋则都堆在货架后面,这就需要花较长的时间去找。于是,问题就变成了:为什么车停很短时间就起动不了。工程师进一步研究,找到了原因所在。即,不是因为香子兰冰淇淋有何神秘之处,而是因为汽锁使车子起动不了。每天晚上买其它冰淇淋时,都需要更多一段时间,而这段时间可使汽车充分地冷却以便起动;但当车主买完香子兰冰淇淋时,汽车引擎还很热,所产生的汽锁耗散不掉,因而汽车起动不了。
原因找到了,由“这部汽车为什么对香子兰冰淇淋过敏”,到“为什么所有汽车都对香子兰冰淇淋过敏”,工程师采用了“求同法”,即在众多的先行情况中,找到一种唯一相同的情况。而由“为什么所有汽车都对香子兰冰淇淋过敏”到“为什么车停时间短就起动不了”,他则运用了“求异法”,即在众多与被研究现象相关的先行情况中,找到一种唯一不同的相关情况。正是借助这两种基本的探求因果联系的逻辑方法,工程师使问题得以转换,从而发现了使汽车“过敏”的真正内幕。
CMS系统的新记录BUG?
一个使用了多年的CMS系统,突然有一天,公司内有人提出存在BUG。原因是新发的新闻标题后的日期不在()中,而是括号变成了))。
这和汽车过敏一样,为什么偏偏只有这一条过敏呢?一个已使用多年的系统,程序BUG的可能性已是极小。但仍是仔细查看了源码,没有问题。
于是想到了数据本身。结果发现,所发新闻标题中,竟有一个上标的TM,这是一个UNICODE字符。网页本身是UTF8编码格式,按理说也没有问题。然而,最大的问题却真的藏在这里。经过使用HEX编辑器查看源文件发现,标题结束时,还有一个上标TM,HEX编码(3F),罪魁祸首就是它。当它与(组合时,即产生了另一个不可见字符,不仅如此,还使得后面的")"出现了重复。当然,这是操作系统本身的BUG,程序无法改变操作系统的原有的错误。但我们可以改变一下数据。当清除了本条新闻标题后的上标TM之后,显示正常。 汽车对冰激凌过敏与CMS系统新记录BUG,这两个似呼完全不相干的事情,却蕴藏着一个相同的道理:BUG就是设计缺陷,一个表面看来无BUG的系统,在特定坏境,好特定的数据场合,就会出现 。这类BUG最大的问题是难以重现,由此,必须模似相同的数据,而要查清这类BUG也需要从数据上着手。
这或许,也算是一个查找BUG的技巧吧。