开发大部分都是调试,但是我觉得教怎么正确调试的人不多,所以我试着给初学者总结一下调试的概念。

TL;博士

  • 即使对于经验丰富的开发人员,大部分开发工作都是调试。提高调试效率提高开发效率。
  • “盲目搜索”或“模糊地查看代码”无法解决错误。表现出色,观察会做。
  • 错误的原因可能是我的误解。如果您客观地观察自己的理解,您可以有效地消除错误。

入门:大部分开发都是调试

如果你是初学者,正在开发,你可能会因为“我一直在调试”而感到沮丧。尽管高级工程师正在大量生产干净且有效的代码,但我编写的代码不断抛出错误,并且根本无法按预期工作。

即使是高级工程师也不会从一开始就编写完美的代码。像任何新手程序员一样,我编写有缺陷的代码,然后对其进行调试以生成工作代码。您只提交有效的代码,因此看起来您正在毫不费力地创建完美的代码。这是一种感觉,但我认为 80% 到 90% 的开发时间都花在了调试上。

反过来说,一个优秀的程序员不是能快速写出无bug代码的人,而是能快速解决bug的人。
在本文中,我们将整理调试的原因以及如何高效调试。

有很多错误

一个bug是“一个没有按预期工作的程序”,但实际上一个词有很多种“bug”。执行可能由于错误而停止,可能不会返回预期值而没有错误,应该执行的函数没有执行,或者由于内存错误等条件而发生的错误。首先,我们将对错误进行分类并考虑一种有效的调试方法。

错误分类

让我们在“如何编写与逻辑”轴和“您想要编写的代码与已编写的代码”轴上对错误进行分类,这对您的调试方式有很大影响。

初心者プログラマーに伝えたいデバッグの話

愚蠢的错误

初心者プログラマーに伝えたいデバッグの話
这是一种“我想写的代码在写作风格上是正确的,但写的代码是错误的”的模式。这是一个微不足道的错误,例如“输入错误的变量名”。这种类型的错误在实际代码中最常见。
无论您搜索多少,都不会找到这种类型的错误。即使你冷漠地看代码,也有很多事情是你没有注意到的。
在这种情况下,仔细检查错误声明很重要。如果写“未定义变量”等,可能是这种模式。

书写错误

初心者プログラマーに伝えたいデバッグの話

这是一种“我一开始想写的代码写错了”的模式。由于误解和知识不足导致的Bug,例如“我误解了变量的顺序”和“我不了解javascript for ... of ...的行为”。
在这种情况下,无论你怎么看代码,你都不会注意到它,因为你一开始就误解了它。您可能会通过查看错误消息注意到它,但这种情况非常罕见。如果不通过搜索或阅读书籍输入信息,这种类型的错误不会消失。
然而,这是一个令人兴奋的错误,因为它也是一个学习新写作方法的机会。

逻辑实现错误

初心者プログラマーに伝えたいデバッグの話
从这里开始,不是关于“如何写作”,而是关于逻辑。
首先是“我想写的逻辑没有实现”类型的bug。
逻辑错误通常不会首先产生错误。因此,不可能“看到并修复错误”。此外,搜索并不能解决它。

逻辑设计错误

初心者プログラマーに伝えたいデバッグの話
最后,这是一种“我首先误解了逻辑”的错误。
这也是一个关于逻辑的错误,所以在大多数情况下不会发生错误。此外,除非您正在实现通用逻辑,否则即使您进行搜索,您通常也不会获得点击。
因此,除了一一检查逻辑之外,几乎没有其他方法可以调试。

概括

在调试中,需要同时查看“我理解正确吗?”和“我的理解是否正确反映在代码中?”当你面临一个错误时,它是什么类型的错误?我不知道,所以我需要在假设所有可能性的同时继续调试。

考虑到这一点,您可以看到“看代码”或“暂时搜索”效率低下。
即使看代码,也只能勾选“我的理解是否正确反映在代码中?”永远找不到由“误解”引起的错误。
即使搜索,也只能确认“我理解正确吗?”你找不到由愚蠢的错误引起的错误。

高效的调试方法

到目前为止,我们已经了解了“错误分类”和“低效调试方法”。基于此,最有效的调试方法是什么?我会考虑的。

观察代码的行为

错误是“您的假设和实际行为之间的差异”,因此最好的捷径是比较您的假设和实际行为。
因此,与其“阅读代码”,不如让我们“执行代码”。你的代码工作正常吗?即使读了也看不懂。运行它并检查。

观察代码行为的第一步是“阅读错误语句”。错误是计算机未能成功执行“编写的代码”时发出的消息,因此它可能包含有关该错误的重要信息。
事实上,大约 80% 的错误可以通过正确理解错误来解决。大多数错误都是微不足道的错误,常见的错误通常会引发易于理解的错误。所以,首先要养成阅读错误的习惯。
我经常觉得“错误是英文的,我看不懂”,但是如果遇到看不懂的错误,就去搜索一下。这里的关键不是“寻找解决方案”,而是“寻找错误的意义”。

如果看了报错还是不能解决,我们试试“插入打印语句,执行代码”。这是一种称为“打印调试”的调试方法。发生错误的部分周围的每个变量的值是多少?通过观察“代码的行为”,您可以检查“它是否按预期工作?”例如,如果错误是“此变量的值很奇怪,无法处理”,请尝试显示该变量的值以检查“值真的很奇怪吗?”的输入是什么?
打印调试有很多有效的工具和方法,所以你可能想看看。

关键是将其视为“做而不是阅读”。通过执行代码,您可以处理各种各样的错误,因为您可以面对“实际行为”而不受“我的误解”的约束。
事实上,我会说我花了大约 10% 的时间来阅读代码进行调试。我花了很多时间思考“我应该在什么条件下运行它来找出错误的原因?”

让我们用语言描述代码的预期行为

一旦您习惯了通过阅读错误语句和使用打印调试来观察代码行为,我建议“考虑代码的预期行为”。假设类似于“此变量此时应具有此值”或“此函数应在此时间执行”。

通过表达你的假设,你可以有效地观察你的代码的行为。打印debug的时候,如果同时打印“假设值”和“实际值”,偏离预期就很明显了。
如果你在应该执行的函数中放了一条打印语句,它执行正确吗?可以观察到。

此外,对于复杂的错误,使用断言语句(甚至是不存在的语言......)进行调试也是一个好主意。在代码中,在程序中写一个“应该满足的条件”比如“这个变量此时应该有这个值”,如果条件不满足,就会产生错误。通过这样做,您可以看到“假设和现实开始偏离的时刻”。

口头表达预期的行为对“逻辑错误”具有强大的力量。逻辑错误通常不会产生错误,即使您尝试打印它们,您也经常不知道它们是对还是错。在这种情况下,让我们仔细地表达我们的假设。仅仅口头表达假设通常会导致愚蠢的错误被注意到并迅速解决。

最后:不完美也没关系

调试让您无所适从。辛辛苦苦写出来的代码没有按预期工作,让你长时间处于不知道原因的境地。另外,当我在远程工作,没有机会看到高级程序员调试时,我常常感到很无助,感觉好像我一下子就写出了完美的代码。
在这种情况下,没有所谓的“最有效的调试”。即使是经验丰富的程序员也经常花费数小时来查看代码,并大喊“为什么它不起作用?”

您不必第一次就完美地完成所有事情。当你遇到一个你不能很好解决的错误时,我希望你想“我听说你说打印调试”或者“我应该试着用语言表达我的假设”


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308631905.html

相关文章: