从本质上讲,不,但是您仍然应该尽力而为。我将说明原因(如果您没有足够的耐心,也可以跳过结论)
考虑一个与二进制搜索的实现一样琐碎的问题。一个非常流行的实现有一个错误,该错误在大约二十年内未被发现。如果二十行代码要花二十年的时间才能使无缺陷程序得到广泛使用,甚至被证明是正确的,那么我们真的可以期望一个庞大的程序是无缺陷的吗?
无论如何,我们可以期望一个大型程序有多少个错误?我发现的一个数字是“每1000行10个缺陷”(代码完整第二版,第517页-仅使用示例,没有引用任何数据),这使我们的软件中存在大约20万至30万个错误。幸运的是,我们有提高程序质量的方法。众所周知,单元测试,代码审查和常规手动测试可以减少错误的数量。尽管如此,这个数字仍然很高。
如果我们能够解决所有错误中的95%,那将是不可思议的。但是,我们的软件中仍然有10000至15000个错误。
幸运的是,由于该软件被广泛使用(并因此受到广泛测试),因此将发现一些错误。因此,我们将逐渐减少错误。但是,更少的错误也意味着很难发现其余的错误-因此,不要指望在修复错误时会出现线性曲线。发现最后几个错误确实很棘手,并且可能会逃脱几年的检测(假设它们曾经被发现)。
您似乎还错误地认为,如果软件没有更改,就不会出现新的错误。如果该软件依赖于第三方库,则新版本可能会破坏某些功能-即使应用程序的代码仍然相同,也会引入新的错误。新的操作系统也会破坏以前运行良好的应用程序(有关流行示例,请参阅Windows Vista)。还考虑编译器错误等。
尚不清楚代码验证工具是否可以真正解决错误的软件问题。解决任何程序的停顿问题当然是不可能的,但是有可能证明程序的行为符合规定。证明程序可能有错误。规范本身可能存在错误。
显然,我们可以大大减少bug的数量,但是我们几乎不可能达到零。
因为有人认为您所做的每个修复都会产生更多的错误,但是我认为那不是真的。
(添加了重点)
你是对的。这个说法是错误的。这是一个例子:
int main() {
int x[10];
x[10] = 8; //Buffer overflow here
return 0;
}
现在,让我们修复此错误:
int main() {
int x[11];
x[10] = 8; //No buffer overflow here
return 0;
}
看到?我们修复了一个错误,没有引入任何新错误。
但是,每次修复错误时都冒着创建一个新错误的风险,这是正确的,尽管可以减轻这种风险(例如,通过单元测试)。
假设我修复的每100个错误中,我不小心引入了一个新错误。因此,如果我修复了10000个错误,就会引入100个新错误。如果我修复了这些新错误,那么我将介绍一个错误。但是那又怎样呢?该程序现在减少了9 999个错误,因此它可能比以前要好(假设新错误不比以前的错误严重10万倍)。
此外,修复错误可能会暴露新的错误。但是这些错误也可以修复。如果您做对了,最终该软件将比开始时处于更好的状态。
我在一些顶级程序员那里老了,由于我在OP中提到的概念,最好不要修复很多错误。
此行为是过失的。如果有错误,您可以修复它。做吧 当然,您应该尽力防止添加新错误,但是如果我每修复10个严重的错误就引入一个小错误,那不是停止修复错误的正当理由。实际上,这是继续修复错误的充分理由。
因此,您所修复的错误更少,将来会有更少的错误返回给您
您所修复的错误越少,将在您的软件中保留更多的错误,使您的用户烦恼。确实,他们不会“将来再来找您”。他们不会回来,因为他们从来没有离开过。“回来”的概念与回归相关。同样,可以降低回归的风险。
有些错误无法修复,因为它们的用途非常广泛,以至于人们开始依赖它们,而修复这些错误会破坏这些用户的程序。它发生了。但是,在这种情况下,它们真的可以被视为错误吗?
“修复错误,制造错误”的思路可能与那个可怕的怪物有关 -这种代码难以理解和难以维护,仅触摸它便会产生错误。如果您的代码库中有一个怪兽,那么您可能需要先对其取消妖怪化,然后再进行任何操作。
最后,如果您是一个糟糕的程序员,那么您碰到的任何东西都会产生新的错误。这显然会使高级程序员感到紧张。但是,说“不要做任何事情。不要触摸任何东西。甚至不要呼吸。” 这可能不是创建健康工作环境的正确方法。教育更好。
结论:
- 不断获得大量新功能但没有错误修复的软件不可避免地会变得很烂。
- 具有中等数量的新功能但已修复其错误的软件更有可能被使用。
- 那些尝试几乎没有错误的人(平均)要比那些不在乎那些错误的人少。
- 期望程序最终没有错误是不合理的。
- 高级程序员不一定能胜任。
- 修复您的错误。
- 采用可提高软件质量的方法。