Debugging 你对无所不在的事物有什么看法;测试,测试,测试&引用;原则?

Debugging 你对无所不在的事物有什么看法;测试,测试,测试&引用;原则?,debugging,testing,Debugging,Testing,在过去,编程通常涉及较少的猜测。我会写几行代码,并且一眼就能100%确定代码做什么和不做什么。错误主要是打字错误,但与功能无关 在过去的几年里,我相信这种“试错”编程有一种趋势:编写代码(就像在草稿中一样),然后反复调试,直到程序的行为符合要求为止。测试,再测试,再测试。 有趣的是,在我的VisualStudio中,“运行”按钮已被标记为“调试”的按钮所取代(我知道您有一些bug!)。我必须承认,在我编写的几个应用程序中,我不能保证代码没有bug 你觉得怎么样?或者我们的系统现在过于复杂(浏览器

在过去,编程通常涉及较少的猜测。我会写几行代码,并且一眼就能100%确定代码做什么和不做什么。错误主要是打字错误,但与功能无关

在过去的几年里,我相信这种“试错”编程有一种趋势:编写代码(就像在草稿中一样),然后反复调试,直到程序的行为符合要求为止。测试,再测试,再测试。 有趣的是,在我的VisualStudio中,“运行”按钮已被标记为“调试”的按钮所取代(我知道您有一些bug!)。我必须承认,在我编写的几个应用程序中,我不能保证代码没有bug


你觉得怎么样?或者我们的系统现在过于复杂(浏览器/操作系统/服务包兼容性等),这就证明了在所有类型的环境中进行测试是正确的。

事实上,我经历了相反的情况。虽然它曾经是一个运行直到成功的案例,但我现在进行单元测试直到测试通过。。。就我所见,这似乎至少是一个相当普遍的转变

我不得不说,在我的经验中,第一次只使用打字错误的代码从来都不是标准的。不同之处在于,现在我可以更快地发现问题,也可以发现旧问题是否再次出现。有时,我可以管理非常简短、简单的代码,而不会出现错误(在堆栈溢出上发布可以提高这一能力),但是大型复杂系统?真见鬼


在我看来,“测试,测试,测试”原则是一个很好的原则。。。但我不认为这与反复运行整个程序有关。我经常将它与运行单元测试联系起来。我很少需要在单元测试中使用调试器——通常情况下,失败会通过检查使原因变得明显,因为只有少量代码正在测试。

可能是因为在以后的几年中,开发人员已经意识到“100%确定性”实际上可能不正确吗?开发软件是非常复杂的,即使这些工具经过多年的发展,我们也意识到编写好的代码是很困难的。诚然,调试和自动化单元测试使我们的工作效率更高,但我们仍然会产生bug,就像我们当时所做的那样,只是现在我们有了不同的工具来捕捉它们

您可以编写您认为您100%知道它做什么和不做什么的代码,但是总会有您没有想到的边缘情况,或者您没有预料到的异常抛出。有时,在调试器的帮助下,尝试和错误编程可以成为缩小问题范围的有用工具


了解您可以使用哪些工具来帮助生成错误最少的代码是很重要的。

我发现测试方法可以帮助我设计代码。有时必须完成的工作太复杂,无法一次完成。测试迫使我把它分成更小的部分,当我解决这些问题时,我能够把它们组合成一个更大的整体。

一个词的答案是“复杂性”。真正的答案是“不必要的复杂性”! 会计原则在过去30年中没有改变。那么,为什么编写一个会计系统在今天要困难得多呢?有一个图形用户界面是很好的,但是我们必须走极端吗

多年来,软件开发一直陷入恶性循环。复杂性在不断增加,我们只是将其隐藏在层层包装之下,而不是减少复杂性。最终会有东西给你


当我们喜欢形式而不是功能时,我们必须付出代价。

我认为优势来自于一种间接的方式:当您接受测试和单元测试时,您必须以这样一种方式编写您的应用程序,即您可以实际编写测试:

  • 类需要以这样一种方式编写:您可以实例化单个对象,而不需要整个应用程序和操作系统,而只需要几个辅助对象。这意味着您需要最小化依赖关系,并使与周围系统的所有通信都显式化

  • 实现测试用例意味着您必须找到使您的类做一些有意义的事情的命令和调用的最小序列。这通常指向笨拙的设计决策,或者表明类很难用于某些目的

总而言之,当您接受测试时,您最终得到的系统在其组件之间的相互依赖性最小,并且测试用例作为如何使用组件的文档

测试(执行您的系统)告诉您一些关于“bug的存在,而不是它们的缺失”(afaik这个术语是由dijkstra发明的)。它指出了一个方向,即测试套件的强度是测试的关键:“您有这么多的测试用例,可以说,很多bug都不存在。这意味着您的软件的大部分工作都与预期的一样”

具有强大/强大测试套件的一些示例:

  • 许多代码是由单元测试执行的(传统的覆盖率术语)
  • 您没有假阴性测试(显示绿色但实际上应该是红色的测试)。假阴性测试是邪恶的,因为它们给了您错误的测试用例质量感觉。有关良好测试断言和假阴性的详细信息,请参见和
  • 这些需求已经被很好地理解了(我已经看到了很多这样的情况:自动化测试测试测试了错误的东西,开发人员误解了业务需求)。对于开发者来说是绿色的,但是对于商业来说,系统并没有像预期的那样工作(另一种假阴性的例子,但是在更高的层次上)
从某种意义上说,只有通过数学证明程序的正确性才能得到证明(这只会给生命和金钱带来回报)