调试是任何软件开发过程中不可或缺的一部分。这是一个系统的狩猎,可能隐藏在代码的复杂行中的错误和错误。就像猎人及其猎物一样,它需要一种精确的方法和一组特定的工具。让我们深入研究隔离假设以有效调试您的代码的有趣过程。
如果您有正在学习编码的朋友,则在我继续进行本周的帖子之前,我没有先验知识(从头开始学习编程)。每章都有一个随附的视频,我认为对于初学者来说,没有书籍。我很喜欢在此上传播这个词。
假设在调试中的作用
调试始于定义问题的象限,然后有条不紊地消除可能性,直到找到问题的根本原因为止。但是,此过程可能很危险,因为它需要对代码进行假设。
通常,调试会话失败或由于错误的假设而导致的时间更长。与其他任何阶段的错误相比
根据受欢迎的电视节目House博士来考虑一下。这是福尔摩斯(Sherlock Holmes)的医疗戏剧版本,其中主角,脾气暴躁的人类人物经常由于其患者提供的不完整或不正确的信息而面临挑战。这类似于调试,由于错误的假设或丢失的信息,我们经常将大部分时间花在狂野的鹅追逐上。
错误假设的解决方案:双重验证
错误假设的最佳解决方案是双重验证。对于每个假设,无论基础多么基础,我们都应该找到另一种验证它的方法。例如,假设我们的代码中有一个错误,取决于远程服务的结果。我们假设该服务正常工作,并通过使用Curl程序对此进行了验证。为了加倍验证,我们还应该在代码中添加一个跟踪点,以显示我们收到响应。
当我们缩小假设范围时,双重验证可能并不总是必要的。但是,如果该过程似乎卡住了,那么重新访问并确保每个阶段都已得到验证至关重要。通常,我们错过了一些简单而明显的东西,因此首先验证“低悬挂果”很重要。
扩展假设的周长:捕食者类比
可以比作调试以设置围栏以捕获捕食者。如果栅栏太小,我们冒着将捕食者放在外面的风险,浪费时间在空围栏的范围内搜索。相反,如果我们围绕大面积围栏,则需要大量时间来查明捕食者。
同样,在调试的背景下,错误(捕食者)及其根本原因可能位于应用程序的不同区域(围栏区域)。因此,我们需要做出仔细的假设并决定将注意力放在哪里。
了解程序为何行为的行为,根本原因是调试的最终目标。在定位错误甚至修复它是至关重要的步骤的同时,获得的理解对于将来的调试会议和长期基础工作是无价的。
优先考虑找到根本原因的假设
面对症状时,我们需要优先考虑我们的假设才能找到根本原因。我们的直觉和经验经常引导我们探讨这一根本原因。但是,我们必须避免采取直接从系统导致根本原因导致的捷径,因为这种方法通常证明是误导性的。相反,我们的重点应该放在下一阶段,即错误本身。
例如,如果一个值在屏幕上是不正确的,我们可以首先验证源返回正确的值并从那里工作。但是,当面对“不应该在这里”的价值时,我们可能不会立即采取行动。
一个有效的解决方案可能是时间旅行调试,这使我们可以在执行完成后穿越申请状态。当问题不容易再现时,该技术尤其有益,而我们正在处理一个难以调查的问题状态。
一个常见的错误:快速修复的诱饵
在调试期间犯的一个经常犯的错误正在赶到包含该错误的代码线,因为我们认为我们已经知道了问题。然后,我们专注于该虫子周围的特定区域,并浪费大量时间调查该代码。
相反,我们应该通过调试我们假设正确工作的代码来创建一个更宽的圆圈。通过这样做,我们要么发现假设无法正常工作,而且我们扩大了搜索,或者我们确认该假设正常运行,为我们提供了更深入研究的坚实基础。
。通过以下图进行了说明。我们急于缩小搜索范围,这使我们走上了错误的道路,在这些路径中,我们以假设的方式包围了症状,并花时间在那里而不是寻找根本原因。它本身可以与表达错误的位置完全不同的位置。
不利的一面是,宽外围搜索要大得多,但有时是搜索的最佳范围。
最后一句话
总结一下,调试确实是一个复杂的过程,它需要仔细而有条不紊的方法来隔离和消除假设。通过意识到常见的陷阱并采用了良好的策略,例如双重验证,优先考虑假设以及避免快速修复的诱惑,我们可以提高调试技能并提高过程效率。”
在下一篇文章中,我们将通过讨论可以为这些理论概念提供实际应用的常见问题和解决方案来进一步探讨该主题。敬请期待!