调试理论
#教程 #发展 #java #开发人员

在软件开发的景观中,错误是旅程中不可避免的一部分,尽管有时会令人沮丧,但调试是该过程不可或缺的一部分。没有逃避这个真理,我们越早接受它,我们就可以越早掌握调试的艺术。

在本系列的接下来的几篇文章中,我将解释调试背后的鲜为人知的理论。我们都知道(在某种程度上)调试的实践,但是也有一个理论上的基础,我们大多数人从未在大学中学到(我肯定不是地狱)。了解该理论将帮助您采用更有条理的方法来解决问题,并会提高您对代码的理解。

在我们继续之前,我想提到本系列中的大多数内容都涵盖在我的书“Practical Debugging at Scale: Cloud Native Debugging in Kubernetes and Production” (Apress)中。

同时,当我们讨论书籍时,我的新书Java 8 to 21: Explore and work with the cutting-edge features of Java 21â(bpb)是Java在Amazon上的Java编程中排名第一的新版本。

错误的简单性和复杂性

调试是迷宫般的旅程,通常让人想起爱丽丝梦游仙境。它要求急性观察,无限的好奇心,计算出的实验和冒险感。但是,对调试的普遍情绪是对抗性的一种,主要是因为它所带来的挫败感以及它所发现的令人不安的真理。

现实是,回想起来,大多数错误都很简单。当我们最终指出这个问题时,共同的回应是一个难以置信的吟:“我怎么想念的?”尽管这种反应是自然的,但它会产生一种羞耻感和不足的感觉,通常会导致冒名顶替综合症。尽管我有40年的编程经验,但我可以自信地说,我今天遇到的错误与开始一样“愚蠢”。这种不断的谦卑感觉,类似于普遍调试的面孔,使我保持扎根。

在调试期间经历的情绪令人惊讶,沮丧和谦卑,这提醒了我们的谬误。它类似于一种冥想形式,可以控制自我。也许一些领导人甚至可以从调试作为基础的方法中受益,使他们更接近其任务和团队的现实。

在调试时,我有一个重要的原则是从愚蠢开始。我寻找我能想到的最愚蠢的错误,并且在令人惊讶的情况下,确实是错误。这不是理论的一部分

拥抱调试方法

跟踪错误的第一步是识别代码中的可能区域。这涉及通过文档和进行基础研究进行搜索。从那里开始,我们需要制定一种解决错误的策略。在我们急速寻找解决方案的情况下,这一步骤通常被忽略,导致无组织和混乱的方法。我们需要制定计划,做出假设,然后测试这些假设。

接下来,我们应该隔离导致问题的行为,并旨在始终如一地重现它以进行测试。理想情况下可以在调试器内的本地环境中完成。如果我们可以始终如一地重现错误,我们将无法真正验证我们的修复程序,从而增加了该过程的不确定性。

验证和消除

之后,我们必须验证测试和环境的结果与我们的初始假设保持一致。本着鲁棒的精神,建议有两种形式的验证,因为一种可能存在缺陷。我写了关于this post的双重验证的重要性。

一旦我们做出了这些验证,我们将进入淘汰阶段,从亚瑟·柯南·道尔(Arthur Conan Doyle)著名的名言中汲取灵感:

“一旦消除了不可能,无论剩下的一切,无论多么不可能,都必须是事实。”

换句话说,我们需要“ Sherlock Holmes”我们的问题并排除可能性,直到我们留下最合理的解释为止。

有了更深入的了解,我们可以继续解决该问题。解决过程应包括提交问题,创建失败的测试案例,验证提议的修复程序可以解决测试案例,并同时提交错误和修复。

阅读文档:误解

经常说,5个小时的调试可以节省您5分钟的阅读文档。但是,这句话具有误导性。阅读文档不是答案,尤其是考虑到与API,平台,系统等相关的文档量的庞大。文档在五分钟内永远不会阅读,很少记住可以解决错误的水平。在过去的几十年中,我是一个开发人员,我通过搜索文档解决了错误,但从未提前阅读文档。

这里的关键是知道什么,何时何地搜索问题。搜索引擎和诸如Stack Overflow之类的平台已彻底改变了调试,使我们能够直接输入错误消息并找到潜在的解决方案。这种方法不是万无一失的,但这是一个很好的起点。

游戏计划的重要性

制定游戏计划可使我们免于被试用和错误调试的深渊吞噬。很多年前,由于我没有使用有条不紊的方法,我因“大于大”角色而失去了两个工作日。”

在进行调试过程之前,回答以下问题至关重要:

  • 用户可以再现此?

  • 我可以在机器上重现它吗?

  • 问题是否始终发生?

  • 问题是回归吗?

这些问题的答案将塑造您的游戏计划和调试过程的过程。最后,耐心和策略可以节省宝贵的时间并防止不必要的挫败感。

在下一期中,我们将探索用于调试无法复制的问题的游戏计划。请继续关注并接受调试冒险!

最后一句话

调试,尽管被视为令人沮丧,但它是软件开发的重要组成部分,提供了学习和个人成长的时刻。调试的有条理的方法涉及确定负责该错误的代码区域,制定战略游戏计划,隔离和重现测试错误,最后解决问题。一个普遍的误解是,阅读文档可以节省数小时的调试。但是,更多的是知道在哪里以及搜索什么。耐心和明确的策略可以防止不必要的时间浪费,并使调试过程更有效。

在下一部分中,我们将更深入地研究游戏计划的调试计划,尤其是专注于难以复制的问题。我们将进一步探索可以有效解决此类难以捉摸的错误的策略和工具。