Debugging 最佳错误修复/错误查找策略-所有语言

Debugging 最佳错误修复/错误查找策略-所有语言,debugging,language-agnostic,error-handling,Debugging,Language Agnostic,Error Handling,我发现,当我和其他一些更有经验的程序员在肩上冲浪时,他们在寻找代码中的错误时都有不同的策略 我的意思不是理解编译器错误消息,而是理解错误消息发生的原因——通过遵循代码流并定位语义错误,立即理解错误消息发生的原因。这听起来太容易了 问题是:东西往往会变得巨大。我不能把所有3000行代码都记在心里,包括GUI的自动生成代码。即使我把每一个片段分开,重新开始,重新阅读每一个片段还是太难了 我只是想知道什么是最常见的做法,使东西的工作:)。如果你不明白为什么编译器会抛出错误消息,你该怎么办?编译器错误不

我发现,当我和其他一些更有经验的程序员在肩上冲浪时,他们在寻找代码中的错误时都有不同的策略

我的意思不是理解编译器错误消息,而是理解错误消息发生的原因——通过遵循代码流并定位语义错误,立即理解错误消息发生的原因。这听起来太容易了

问题是:东西往往会变得巨大。我不能把所有3000行代码都记在心里,包括GUI的自动生成代码。即使我把每一个片段分开,重新开始,重新阅读每一个片段还是太难了


我只是想知道什么是最常见的做法,使东西的工作:)。如果你不明白为什么编译器会抛出错误消息,你该怎么办?

编译器错误不是bug,它们是你的朋友。所有程序员害怕的时刻是他们的代码编译和链接没有错误,他们必须实际运行这该死的东西。这就是bug开始出现的时候


编译器错误指定发生错误的实际行(通常为正负一行)。他们通过分析语法来实现这一点,而不是分析“代码流”或语义。作为程序员,你的任务是纠正语法;错误存在于语义中,只有在程序编译并运行时才能对语义进行调查

编译器错误不是bug,它们是您的朋友。所有程序员害怕的时刻是他们的代码编译和链接没有错误,他们必须实际运行这该死的东西。这就是bug开始出现的时候


编译器错误指定发生错误的实际行(通常为正负一行)。他们通过分析语法来实现这一点,而不是分析“代码流”或语义。作为程序员,你的任务是纠正语法;错误存在于语义中,只有在程序编译并运行时才能对语义进行调查

如果您不理解编译器为何抛出错误消息,则需要将这些消息复制到stackoverflow或Google搜索框中。除了一些值得注意的例外,编译器是我们的朋友…我认为…

如果您不理解编译器抛出错误消息的原因,您需要将消息复制到stackoverflow或Google搜索框中。除了一些值得注意的例外,编译器是我们的朋友……我认为……

我最好的策略是使用多种策略。尽管如此,我的最佳策略是:

  • 不作任何假设。任何你确信无疑的东西都是让虫子藏身的石头。如果你不把石头翻过来,你就永远找不到虫子
  • 形成假设并进行检验。通过测试,我的意思是特别提出一个你可以执行的实验,如果(并且只有当)你的假设是正确的,它将显示一个结果。如果是错的话,那就另当别论了
  • 每隔几年花一次周末看科伦坡的老剧集
  • 不要被评论所迷惑;只信任代码
  • 慢慢来。咬下你吃不下的东西只会让你窒息
  • 定义问题,直到它有一个锋利的尖端。很多时候,这会给你一个正确的解决方法。无论如何,你解决一个你无法定义的问题的机会很小
  • 确保你能重现问题。找到最简单的例子来重现它
  • 找到最接近您的情况最简单的失效情况
  • 记录能够回答问题的数据,而不仅仅是填满空间

    • 我最好的策略是有多种策略。尽管如此,我的最佳策略是:

      • 不作任何假设。任何你确信无疑的东西都是让虫子藏身的石头。如果你不把石头翻过来,你就永远找不到虫子
      • 形成假设并进行检验。通过测试,我的意思是特别提出一个你可以执行的实验,如果(并且只有当)你的假设是正确的,它将显示一个结果。如果是错的话,那就另当别论了
      • 每隔几年花一次周末看科伦坡的老剧集
      • 不要被评论所迷惑;只信任代码
      • 慢慢来。咬下你吃不下的东西只会让你窒息
      • 定义问题,直到它有一个锋利的尖端。很多时候,这会给你一个正确的解决方法。无论如何,你解决一个你无法定义的问题的机会很小
      • 确保你能重现问题。找到最简单的例子来重现它
      • 找到最接近您的情况最简单的失效情况
      • 记录能够回答问题的数据,而不仅仅是填满空间

      将代码分成几个有意义的小部分


      关键是有意义的部分,您应该能够记住一个部分做了什么,而无需再次阅读它的代码。

      将您的代码分成一些有意义的小部分


      关键是有意义的,你应该能够记住一个部件做了什么,而无需再次阅读其代码。

      你关于假设的第二点——这不是自动化(例如单元)测试发挥作用的地方吗?微笑我还没有听说过自动生成假设的系统——这就是艺术的来源。当然,你的观点都与编译eror无关,我显然错误地认为这是问题所在about@Neil巴特沃斯——这个问题很复杂;他询问调试、语义错误等问题,但也使用了“编译器错误”一词。我通过假设他错误地将所有消息称为“编译器错误”来解决歧义,并根据该假设进行了回答。关于假设的第二点——这不是自动化的吗(例如,单元)测试开始发挥作用了吗?微笑我还没有听说过自动生成假设的系统——这就是艺术的来源。当然,没有