86. 两个错误的结果可以是正确(也会更难修复)



两个错误的结果可以是正确(也会更难修复)

        代码从不说谎,但可能自相矛盾,有些矛盾可能会导致“这怎么可能正常工作?”的时刻。
        在一次访谈中,阿波罗11号月球模块软件的主设计师,Allan Klumpp,透露说该软件的控制引擎包含一个可能导致着陆器不稳定的bug。但是,另一个bug补偿了第一个,而且软件在两个bug都没有发现和修正的情况下,在阿波罗11号和阿波罗12号的月球着陆中使用了。
        考虑一个返回完成状态的函数,设想它本就返回true的时候返回了false,现在调用函数没有检查返回值。一切都正常,直到有一天有人发现没有检查并添加。
        或者考虑一个使用XML文档保存状态的应用程序,设想一个节点把文档中说的“TimeToDie”错写成了“TimeToLive”。当写文档和读文档的代码都有这个相同的错误时,一切都没有问题,但是修正一个,或者增加了一个读取同一个文件的程序,对称性就打破了,代码也就出问题了。
        当代码中的两个问题造成了一个可以看到的错误时,按部就班的修正办法可能又出问题。开发人员收到 一个错误报告,找到问题并修正,重新测试,但报告的错误仍然存在,因为第二个问题还在。于是第一个修复被移除,代码被重新审查,直到第二个潜在的问题被发现,并对其修正。但第一个问题又回来了,报告的错误仍然存在,于是第二个修正就回滚了。这个过程继续重复,但开发人员已经错过了两个可能的修正方法,并在尝试找一个不可能有效的修正方法。
        代码中两个相互影响并表现成一个的问题的错误不但难以修正,并会将开发人员带入死胡同,直到他们发现已经在先前尝试过正确的答案了。
        这种问题不仅会在代码中出现,在写需求文档中也可能出现,它可能从一个地方传到另一个地方。代码中的一个错误可能补偿文档中的错误。
        它也可能传播给人:用户发现应用程序中说左意味着右,他们会相应地适应。它们甚至会传播给新用户:“记住那个程序说点击左边的按钮,实际指的是按右边的按钮”。修改bug以后,用户又需要重新训练。
        单个的错误可以很容易定位和修正,而多个产因、需要多个修复的,就更能解决了。部分原因是简单的问题更容易修复,人们倾向于相对更快地修复它们,而把更难的问题放到以后再改。
        对于如何定位相互影响的问题产生错误,没有简单的建议,需要对可能性的了解、明智的头脑以及考虑所有可能的意愿。

原文:Two Wrongs Can Make a Right (and Are Difficult to Fix) by Allan Kelly

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值