《Effective Debugging:软件和系统调试的66个有效方法》——第1章 宏观策略 第1条:通过事务追踪系统处理所有的问题

第1章

宏观策略

要想解决问题,就必须先选定最佳的策略,这样才可以事半功倍。如果当前的策略无法奏效,那就应该立刻改用成功率第二高的办法。

第1条:通过事务追踪系统处理所有的问题

请想象这样一种场景:George在电话里朝你大吼,说你开发的那个应用程序“运行不了”,于是你赶紧把问题写在便签上,然后把它贴在显示器旁边,显示器周围还有很多类似的纸条。现在你开始回想,自己到底有没有把新版程序所需的最新库文件发给George。实际上,我们不应该这样来处理问题,而是应该改用下面的办法。

首先,要保证有一套事务追踪系统(issue-tracking system)可供使用。很多开源软件库,如GitHub和GitLab等,都提供基本的事务追踪系统,该系统与它们所提供的其他功能是集成在一起的。有些组织使用一种名为JIRA的专有系统,这种系统要复杂得多,它可以在企业内部运行,也可以作为服务来运行。还有一些组织使用开源替代品,如Bugzilla、Launchpad、OTRS、Redmine或者Trac。选择哪个系统并不重要,重要的是必须保证所有的事务都记录在这个系统里面。

如果某个问题没有记录在事务追踪系统中,那我们就拒绝处理该问题。坚持使用这样的系统,能够带来下面几个好处:

  • 可以看见调试工作所取得的进展。
  • 可以对软件的发行进行追踪与规划。
  • 帮助我们确定各种工作项(work item)之间的优先次序。
  • 帮助我们把常见的事务及其解决方案整理成文档。
  • 防止我们遗漏某些问题。
  • 可以自动生成发行说明(release note)。
  • 可以用作知识库,使我们对软件中的缺陷进行估量及反思,并从中总结经验。

对于公司里面那些不必亲自汇报问题的高层员工来说,你可以代他们汇报问题。如果某个问题是你自己发现的,那你也可以自己把这个问题提交到系统里面。有一些公司规定:在修改代码之前,必须先指明这次修改所涉及的事务。

我们还要保证的是:每一项事务都能够精确地描述问题的重现方式。最好能在其中给出一个简短(short)、自足(self-contained)且正确(correct,也就是可以正确编译并运行)的例子(example),即SSCCE。我们可以把这个例子直接剪下来,粘贴到应用程序中,以便重现它所要说明的问题(参见第10条)。为了使大家能够写出有效的错误报告(bug report),我们应该制订一份规范,并劝说所有人都认真遵照这份规范来撰写报告。(我看到有一家公司把这些规范贴在厕所门上。)

此外,错误报告还必须具备精确的标题(precise title),并写明bug的优先级(priority)、严重程度(severity)、受影响的利益相关者(stakeholder),以及该bug的发生情境(environment)。在填写这些内容时,要注意以下几点:

  • 精准的标题使我们能够在事务汇总报告中迅速找出这个bug。用“程序崩溃”这几个字做标题是很糟糕的,应该改成“正在保存时单击刷新按钮,会使程序崩溃”。
  • 严重程度能够帮助我们判断bug的优先级。与数据丢失有关的问题当然是很严重的,而另外一些无关紧要的问题,或是可以用某种明确的方式来绕过的问题,则显得不那么严重。团队可以根据bug的严重程度来对清单里面的各项事务进行分类,以决定哪些事务需要立刻解决,哪些可以稍后解决,哪些应该忽略。
  • 对事务进行分类并排定其次序之后,就可以把结果填写在优先级这一栏中了,这使得我们能够据此安排各项事务的处理顺序(参见第8条)。在很多项目中,bug的优先级是由开发者或项目主管来设置的,如果允许终端用户来设置,那么他们总是会把自己提交的所有bug都设置成最高优先级。虽说管理人员、客户代表、其他团队的开发者以及销售人员都宣称自己提交的事务应该最先得到处理,但我们还是应该根据实际情况来设置优先级。
  • 在事务中指出受到影响的利益相关者,可以帮助团队获知与该事务有关的其他一些信息,并帮助产品拥有者来决定事务的优先次序。有些公司甚至会在利益相关者后面标注他们给公司带来的年度收入。(例如,“由Acme所提交,该客户给公司带来的年度收入是25万元。”)
  • 对于某些难以捕获的bug来说,情境描述可以提供线索,使得我们能够重现这种bug。不要强迫用户填写过多的信息,例如,PC的序列号、BIOS的日期,以及系统中每一个程序库的版本等,这样做会令用户觉得非常麻烦,从而跳过这些内容。我们只应该询问与bug密切相关的那些细节,对于Web应用程序来说,浏览器的信息自然是相当重要的,而对于移动应用程序来说,我们或许想知道设备的制造商及型号。如果能够通过软件来自动提交这些信息,那就更好了。

使用事务追踪系统时,我们一定要通过它来记录进度。大部分追踪系统都允许用户在每个事务后面持续追加各种形式的评论。这些文档可以把调查及修复bug时所经历的步骤记录下来,其中也可以包括修复bug时所遇到的困境。这样做可以使公司内的工作更加透明。我们应该精确地写出记录或追踪程序行为时所执行的各种命令,这样做很有用,因为明天你可能就要重新执行这些命令,你或你的同事也有可能要在一年之后寻找一个类似的bug。当你辛苦地完成了为期一周的bug搜寻工作之后,这些笔记可以帮助你回顾工作内容,使你能够更好地把这些天所做的事情解释给团队或管理者听。

要点

  • 通过事务追踪系统来处理所有的问题。
  • 确保每项事务都能够以短小、自足而又正确的范例(SSCCE),精确地描述出该问题的重现方式。
  • 对事务进行分类,并根据每项事务的优先级与严重程度来安排工作。
  • 通过事务追踪系统来记录进度。
时间: 2024-10-23 19:16:43

《Effective Debugging:软件和系统调试的66个有效方法》——第1章 宏观策略 第1条:通过事务追踪系统处理所有的问题的相关文章

《Effective Debugging:软件和系统调试的66个有效方法》——导读

前 言 我们在开发软件或对运行软件的系统进行管理的时候,经常会遇到故障.有些故障是因代码问题而引发的编译错误,这种故障可以在短时间内修复:还有一些故障则会使大型系统停机,这将给公司带来每小时数百万的损失(具体货币单位依情况而定).要想成为一名优秀的专业人士,你就必须在发生故障时迅速找出背后的原因并加以修复.这正是调试的意义所在,也是本书所要谈论的主题. 本书是写给有一定经验的开发者看的,而不是一本介绍性质的读物.它假设读者能够理解用各种编程语言所写成的代码片段,并且会使用高级的GUI编程工具以及

《Effective Debugging:软件和系统调试的66个有效方法》一导读

前 言 我们在开发软件或对运行软件的系统进行管理的时候,经常会遇到故障.有些故障是因代码问题而引发的编译错误,这种故障可以在短时间内修复:还有一些故障则会使大型系统停机,这将给公司带来每小时数百万的损失(具体货币单位依情况而定).要想成为一名优秀的专业人士,你就必须在发生故障时迅速找出背后的原因并加以修复.这正是调试的意义所在,也是本书所要谈论的主题. 本书是写给有一定经验的开发者看的,而不是一本介绍性质的读物.它假设读者能够理解用各种编程语言所写成的代码片段,并且会使用高级的GUI编程工具以及

《Effective Debugging:软件和系统调试的66个有效方法》一第1条:通过事务追踪系统处理所有的问题

第1条:通过事务追踪系统处理所有的问题 请想象这样一种场景:George在电话里朝你大吼,说你开发的那个应用程序"运行不了",于是你赶紧把问题写在便签上,然后把它贴在显示器旁边,显示器周围还有很多类似的纸条.现在你开始回想,自己到底有没有把新版程序所需的最新库文件发给George.实际上,我们不应该这样来处理问题,而是应该改用下面的办法.首先,要保证有一套事务追踪系统(issue-tracking system)可供使用.很多开源软件库,如GitHub和GitLab等,都提供基本的事务

《Effective Debugging:软件和系统调试的66个有效方法》一第8条:把工作焦点放在最为重要的问题上

第8条:把工作焦点放在最为重要的问题上 许多大型软件系统都含有数量极其众多的bug(有一些是已知的bug,还有一些则尚未发现).要想高效地进行调试,就必须把应该受到关注的bug与可以忽略的bug明智地区分开.这样做不是为了单纯地缩减事务清单中的未决事务,而是为了帮助我们开发出稳定.易用.可维护而且效率较高的软件,毕竟这才是公司给我们支付薪水的原因.为此,我们要通过事务追踪系统来设定各项事务的优先级(参见第1条),从而使自己能够把工作重心汇聚在优先级较高的那些事务上,并把优先级较低的事务忽略掉.下

《Effective Debugging:软件和系统调试的66个有效方法》——第8条:把工作焦点放在最为重要的问题上

第8条:把工作焦点放在最为重要的问题上 许多大型软件系统都含有数量极其众多的bug(有一些是已知的bug,还有一些则尚未发现).要想高效地进行调试,就必须把应该受到关注的bug与可以忽略的bug明智地区分开.这样做不是为了单纯地缩减事务清单中的未决事务,而是为了帮助我们开发出稳定.易用.可维护而且效率较高的软件,毕竟这才是公司给我们支付薪水的原因.为此,我们要通过事务追踪系统来设定各项事务的优先级(参见第1条),从而使自己能够把工作重心汇聚在优先级较高的那些事务上,并把优先级较低的事务忽略掉.下

《Effective Debugging:软件和系统调试的66个有效方法》一第4条:从具体问题入手向上追查bug,或从高层程序入手向下追查bug

第4条:从具体问题入手向上追查bug,或从高层程序入手向下追查bug 要想确定问题的来源,通常有两种办法.一种是从问题的具体表现入手,向上追查其来源,还有一种是从应用程序或系统的顶层入手,逐步向下探查,直至找到其根源.对于某种类型的问题来说,其中一种方法的效果通常要比另一种更好,但是如果你在采用某个方法时遇到了困境,那么不妨试试另一个方法.如果问题表现得很明确,那我们就应该从发生问题的地方入手,向上追查bug.这可以分成三种情况.第一种情况是程序崩溃.在这种情况下,为了便于排查问题,我们通常可以

《Effective Debugging:软件和系统调试的66个有效方法》一第6条:使用软件自身的调试机制

第6条:使用软件自身的调试机制 程序是一种很复杂的东西,因此它们通常都包含内置的调试机制.(至于怎样给自己正在开发的软件里面添加这样的机制,请参见第40条.)这种机制有很多好处,其中包括:我们可以通过禁用后台执行或多线程执行等特性来简化程序的调试工作.我们可以有选择地执行其中某一部分功能,以便通过测试用例来精确地再现相关的故障.程序可以给我们提供与性能有关的报表及其他信息.程序可以把更多的信息记录在日志文件中.因此,我们应该花一些时间,看看自己要调试的这款软件内置了哪些调试机制.想要了解这些机制

《Effective Debugging:软件和系统调试的66个有效方法》——第4条:从具体问题入手向上追查bug,或从高层程序入手向下追查bug

第4条:从具体问题入手向上追查bug,或从高层程序入手向下追查bug 要想确定问题的来源,通常有两种办法.一种是从问题的具体表现入手,向上追查其来源,还有一种是从应用程序或系统的顶层入手,逐步向下探查,直至找到其根源.对于某种类型的问题来说,其中一种方法的效果通常要比另一种更好,但是如果你在采用某个方法时遇到了困境,那么不妨试试另一个方法. 如果问题表现得很明确,那我们就应该从发生问题的地方入手,向上追查bug.这可以分成三种情况. 第一种情况是程序崩溃.在这种情况下,为了便于排查问题,我们通常

《Effective Debugging:软件和系统调试的66个有效方法》——第6条:使用软件自身的调试机制

第6条:使用软件自身的调试机制 程序是一种很复杂的东西,因此它们通常都包含内置的调试机制.(至于怎样给自己正在开发的软件里面添加这样的机制,请参见第40条.)这种机制有很多好处,其中包括: 我们可以通过禁用后台执行或多线程执行等特性来简化程序的调试工作. 我们可以有选择地执行其中某一部分功能,以便通过测试用例来精确地再现相关的故障. 程序可以给我们提供与性能有关的报表及其他信息. 程序可以把更多的信息记录在日志文件中. 因此,我们应该花一些时间,看看自己要调试的这款软件内置了哪些调试机制.想要了