Debugging 随着代码变得越来越复杂,有哪些好的策略可以修复bug?

Debugging 随着代码变得越来越复杂,有哪些好的策略可以修复bug?,debugging,language-agnostic,Debugging,Language Agnostic,我“只是”一个程序员爱好者,但我发现随着我的程序越来越长,bug变得越来越烦人——也越来越难以跟踪。就在一切似乎都在顺利进行的时候,一些新的问题似乎会自然而然地出现。我可能要花很长时间才能找出问题的原因。其他时候,我会添加一行代码,它会破坏另一个单元中的某些内容。如果我认为一切都很顺利,这可能会让我感到沮丧 这对每个人来说都很常见,还是更像是一种新手?我听说过“单元测试”、“设计框架”和其他各种概念,这些概念听起来似乎可以减少缺陷,使我的应用程序“健壮”,而且所有内容一目了然:) 那么,虫子对受

我“只是”一个程序员爱好者,但我发现随着我的程序越来越长,bug变得越来越烦人——也越来越难以跟踪。就在一切似乎都在顺利进行的时候,一些新的问题似乎会自然而然地出现。我可能要花很长时间才能找出问题的原因。其他时候,我会添加一行代码,它会破坏另一个单元中的某些内容。如果我认为一切都很顺利,这可能会让我感到沮丧

这对每个人来说都很常见,还是更像是一种新手?我听说过“单元测试”、“设计框架”和其他各种概念,这些概念听起来似乎可以减少缺陷,使我的应用程序“健壮”,而且所有内容一目了然:)

那么,虫子对受过专业培训的人来说有多重要呢


谢谢——Al C.

流行的观点似乎是,程序员平均每1000行代码产生12个bug——这取决于你要求的确切数字,但总是每行代码产生12个bug——因此,程序越大,bug就越多

低级程序员倾向于创建更多的bug

新手经常被语言的特质所束缚,缺乏经验也会导致更多的bug。随着你的继续,你会变得更好,但你永远不会创建无bug的代码。。。即使在30年后,我仍然有bug,但那可能只是我自己。

众所周知,“修复,在其他地方引起问题”,这确实是单元测试背后的主要动机之一

其思想是,如果您独立地为系统的每个小部分编写详尽的测试,并且每次在任何地方进行更改时都在整个系统上运行这些测试,您将立即看到问题。然而,主要的好处是,在构建这些测试的过程中,您还将改进代码以减少依赖性

这类问题的典型解决方案是减少耦合;使不同部件之间的相互依赖性降低。更有经验的开发人员有时有以这种方式构建系统的习惯或设计技能。例如,我们使用接口和实现而不是类;我们将模型-视图-控制器用于用户界面等。此外,我们可以使用有助于进一步减少依赖关系的工具,如“依赖关系注入”和面向方面编程

所有的程序员都会犯错误。优秀且经验丰富的程序员构建他们的程序,以便更容易发现错误并限制其影响


这对每个人来说都是一件大事。大多数公司花在维护上的时间比写新代码的时间要多

这是一种常见的新手行为。当然,当你获得更多的经验时,你仍然会有bug,但它们会更容易发现和修复,因为你将学习如何使代码更加模块化(这样更改一件事不会在其他地方产生连锁反应),如何测试它,以及如何构造它以使其快速失效,接近问题的根源,而不是在某个武断的地方。一个非常基本但非常有用的东西不需要复杂的基础设施来实现,那就是检查所有函数的输入,这些函数具有非平凡的断言预定义。这为我节省了好几次时间,否则我会遇到奇怪的错误和几乎无法调试的任意行为。

显然,错误对任何程序员来说都是一件大事。只需查看有关堆栈溢出的问题列表,就可以看到这张图

业余爱好者和经验丰富的专业人士之间的区别在于,专业人士将能够利用自己的经验以一种更“防御性”的方式编写代码,从一开始就避免了许多类型的bug

  • 有两种编写无错误程序的方法;只有第三种方法有效~艾伦·J·佩利斯

  • 程序中发生错误的唯一方法是由作者放在那里。没有其他机制是已知的。程序不能通过与其他有缺陷的程序坐在一起来获取bug~哈兰磨坊


  • 讨厌的虫子发生在每个人身上,从专业人士到业余爱好者。真正优秀的程序员会被要求追踪真正讨厌的bug。这是工作的一部分。当你盯着一个讨厌的bug看了两天,沮丧地大喊:“这是谁写的垃圾!?”,你就会知道你是一个软件开发人员。。。才发现原来是你。:-)

    软件开发人员的一部分技能是能够在他/她的头脑中保持大量相互关联的项目。听起来你正在发现当你的心理模型系统崩溃时会发生什么。通过实践,你将学会设计不那么脆弱的软件。有很多关于软件设计的书籍、博客等。当然,对于特定的问题,堆栈溢出

    综上所述,你可以做以下几件事:

  • 一个好的调试器是无价的。通常,您必须逐行检查代码,以找出哪里出了问题
  • 如果对项目有意义,请使用垃圾收集语言,如Python或Java。GC将帮助您专注于使事情正常工作,而不是陷入令人恼火的内存错误
  • 如果你写C++,学会爱上RAI.<
  • 编写大量代码。软件是一种艺术形式。大量的练习会使你做得更好

  • 欢迎来到堆栈溢出

    如果bug不是问题,那么我就可以在10分钟内编写一个100000行的程序

    你的问题是,“作为一名业余医生,我担心我的病人的健康:有时当我不够小心时,他们会生病。病人的健康对你这些专业医生来说也是个问题吗?”


    是的:这是中心问题,甚至是唯一的问题(对于任何足够全面的“bug”定义而言)。

    您是否自动化了测试?如果你这样做
    var mom = "mom";
    people[mom]