这有什么寓意?

What is the moral of this?

一位伟大的人物曾经说过:

"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it."

这是真的吗?你认为这有什么寓意?

嗯,不确定我是否完全同意这一点。就我而言,它并不总是正确的。的确,有时调试非常困难,因为您可能会抛出所有 exceptions、多个 errors。的确,在某些情况下,您需要做很多 更多 of research 来解决调试时的错误,而不是编写您的代码代码。

此外,我会总是建议任何人编写代码仔细,阅读多次确定你没有犯任何明显的错误,然后调试它。而且如果你这样做,你调试代码的难度肯定会降低!

感觉像是一种寓言。寓言通常从一个特定的角度展示世界,并不一定反映真相(无论如何这是一个相对的概念:)。但是寓言确实会让你好奇——这就是它们的作用所在。

这次也不例外。调试并不总是困难的。但是调试是一种非常没有效率的花费工作时间的方式。这是查找错误的最慢、最复杂和最昂贵的方法之一。更好的方法是预防错误而不是对抗错误。调试应该被视为最后的手段,当一个错误仍然以某种方式进入你的代码时,尽管你建立了所有的防线。如果你确实求助于调试,请确保你专注于应用有助于在最早阶段检测错误的实践,而不是磨练你使用调试器的技能(尽管它也可能有用)。

此类错误预防或早期检测实践包括以下内容:

  • 保持编码风格。公司通常有编码标准——这些标准应该保持最新并允许包含新的实践。当您使用的语言正在快速发展时,这一点尤为重要。 Google C++ Style Guide 是一个好的编码标准应该是什么样子的例子。

  • Pair programming。如果有两个人处理代码,则更容易、更快地发现错误。这种方法确实有效,但首先它很昂贵,其次并不是每个人都舒服。所以我不会推荐它作为一种普遍的做法。但它确实有助于在编写新代码时避免大多数错误。

  • Code review。除了错误修复之外,代码审查还允许开发人员彼此共享知识并讨论高级问题。这是一项重要且必要的实践。您只需要弄清楚您的团队可以在代码审查上高效地花费多少时间,以保持质量和时间消耗之间的平衡。代码审查在 Steve McConnell 的 "Code Complete".

  • 中有详尽的解释
  • 使用单元测试测试新编写的代码。这种做法的更高级版本称为 Test-driven development (TDD)。与要测试的代码一起编写的测试几乎可以帮助您立即找到并修复大量错误。编写单元测试的做法有一个有趣的副作用:由于您的 类 和函数必须进行测试,因此它们往往会变得更简单且耦合度降低,从而提高代码的整体质量和可读性。

  • Static code analysis. It’s automated code review, so to speak, with the review being done by a software tool rather than a human programmer. On the one hand, software tools aren’t good at detecting high-level bugs in algorithms; on the other hand, they are excellent at detecting typos not easily noticeable to the human eye (examples: 1, 2, 3).

  • 还应使用 dynamic code analysis, regression testing 等方法。但是这些,不同于以往的做法,我考虑的是第二道防线。

所以,"What is the moral of this?"

我认为如果您必须经常使用调试器来查找错误,那是一个非常糟糕的迹象。这意味着您的整个开发过程一开始就没有正确组织。它可以通过采用上面讨论的早期错误检测实践来改进。