无意间看到金阳光老师推送的关于bug学习的文章,虽然短小,但是醍醐灌顶,分享出来,希望有更多人可以看到。

原文如下:

Bug 是绝佳的学习机会。所以我们怎样尽可能多地从修复的 bug 中吸取经验?我至今已经用了 13 年的一个方法是,写下这个 bug 的简单描述、修复方法以及吸取的经验。

遥想 2002 年,我偶然发现一篇描述这个方法的博客(很不幸,我没再找到)。我从那时起就使用这个方法了,并且相信它能帮助我成为一个更出色的程序员。

每当我修复一个特别棘手或有趣的 bug,我总会花几分钟写下一些这个 bug 的信息。这有一个典型记录的例子:

例子

【日期】:2004-08-17

【问题】:当解码 Q.931 信令时无限循环

【原因】:当在Q.931信令中发现一个未知的元素id时,我们试图通过读取它的长度来跳过它,并且将位置指针迁移几个字节。但是,在这个例子中的长度是零,导致我们反复跳过相同的元素id。

【怎么发现的】:在解码一个 Ethereal 从 Nortel 追踪到的安装信息时发现了这个问题。他们的信息是 1016 字节长度(包含大量快速启动元素),但我们的 MSG_MAX_LEN 是 1000。通常我们会收到一条来自 common/Communication.cxx 的信息,但现在,当直接输入需要解析的数据时,数组末端内存访问越界,其恰好是 0,暴露了这个问题。

为了找到它,我仅仅在 9931 解码中添加一些打印输出。但很幸运数据恰好是零。

【修复】:如果长度是零,设置为 1。这方式总是行得通。

【在哪些文件修改了】:
callh/q931_msg.cxx
callh/q931_msg.cxx

【我导致的】:是的

【解决Bug的时间】:1小时

【教训】:信任收到信息中获得的数据。不仅仅是产生大量可能导致问题的数据。显示长度为 0 也同样不好。

实施方式

我有一个命名为 bugs.txt 的纯文本文件。在文件的顶部是一个具备所有标题的模板,但是没有包含信息。当我添加一个新的记录,我复制模板部分,粘贴在模板下面。然后完成记录并且填满信息。大多数展示在上面例子中的 fields 应该是不需要声明的。

有必要指出这并不是 bug 追踪器。我并没有添加所有我修复的 bug 。例如,如果我只是忘记在代码中添加声明,一旦发生这种情况,我就意识到问题出在哪里了,我并不会添加这条记录。仅仅当 bug 本身,或是修复,或是调试过程特别有趣,我才会添加一条新的记录。通常,是我导致了这个 bug。但是偶尔,特别是花几天时间才追踪到的困难 bug,尽管不是我造成的我也会添加一条记录。

一旦修复了一个 bug,我的第一反应是松了口气然后继续前进。我试着一更正后就写下这个记录。这时我的脑海中依然清晰保留所有的细节。拖延会让精确回忆发生的事情变得很困难(或者我压根忘记写下这条记录)。

至今,我已经有 194 条记录,平均每个月有一条新的记录。最重要的是教训部分。这里需要自我反省。是什么导致这个 bug 的特殊性?我发现经验常常来自于三个不同的方面:

编码。我在代码中犯了什么错误?我是否忘记了 else 部分代码?是否系统调用失败,但没有检查 response?我在未来应该怎么调整代码来防止这些问题?

测试。一般不包括本可以在测试中捕获的 bug 。要是这样的话,应该在哪个阶段测试——单元、功能、系统?丢失了哪个测试用例?

调试。我本可以怎样快速定位 bug?我是否使用了正确的方法?我是否假定了太多?我是否需要在代码中使用更好的日志记录?

益处

Nassim Nicholas Taleb 在 《Antifragile》中写到:“错误包含丰富的信息”。我完全同意这个观点。Bug 帮助我们更好地理解系统,告诉我们怎样提高编码、测试和调试技巧。所以我认为尽可能从 bug 中学习经验,是再正常不过的事了。

我发现为每个有趣的 bug 记录下来,让我轻易学习到很多。在记录的行为中我会对发生的事情思考得更深刻。同样,一旦记录下来,我可以在之后检查发生的事情。偶尔,我也会浏览文件,只阅读教训部分,对我认为是从 bug 中学到的最有价值的经验加强记忆。

我记录 bug 文件至今已经有 13 年了。这是一段漫长的时间,但是我坚持下来了,因为作为一名程序员,它帮助我进步。尝试一下吧,看看它是否也对你有益!

转载金阳光老师的关于bug学习方法相关推荐

  1. 我的三年软件测试之路----金阳光老师自传

    时光飞逝,岁月如梭.一晃就在测试干了三年多.回想自己三年多的测试之路.感慨万千,看到中国测试整体行业比较弱势和迷茫,想用亲身经历来鼓舞大家在测试中路勇往直前,达到测试的更高境界! 话说2009,当时百 ...

  2. 大话Android自动化测试--金阳光自动化测试Android系列(1)--金阳光于2013年4月份

    本文转载来自:金阳光老师的csdn博客:http://blog.csdn.net/haorenmin2008 Android自动化测试框架和工具在四年多的发展日趋成熟.从五年前的第一代自动化架构演进到 ...

  3. 【金阳光測试】大话Android自己主动化測试--Android自己主动化系列(1)--金阳光于2013年4月份...

    Android自己主动化測试框架和工具在四年多的发展日趋成熟. 从五年前的第一代自己主动化架构演进到眼下第四代(本系列讲座第7篇后将具体剖析第三代和第四代自己主动化框架)从曾经最早谷歌推崇的monke ...

  4. 【金阳光測试】基于控件核心技术探讨---Android自己主动化系列(2)---2013年5月...

    第一讲分享了下安卓自己主动化一些概况和一些自己主动化框架现状和技术可以解决什么样的问题. 这次课就深入到android世界里面.遨游.翱翔.深入了解自己主动化測试核心技术. 搞过编程开发的同学听到in ...

  5. 基于控件核心技术探讨---金阳光自动化测试Android(2)---2013年5月

    本文转载来自:金阳光老师的csdn博客文章:http://blog.csdn.net/haorenmin2008 第一讲分享了下安卓自动化一些概况和一些自动化框架现状和技术能够解决什么样的问题.这次课 ...

  6. 【金阳光测试】基于控件核心技术探讨---Android自动化系列(2)---2013年5月

    第一讲分享了下安卓自动化一些概况和一些自动化框架现状和技术能够解决什么样的问题.这次课就深入到android世界里面.遨游.翱翔,深入了解自动化测试核心技术. 搞过编程开发的同学听到instrumen ...

  7. 【金阳光测试】--深入Monkey工具和使用--Android系列(3)2014年八月八号

    网上介绍Monkey用法不计其数.我也不想炒剩饭,写的和他们一样.Monkey基本原理是伪随机算法.这个算法我想大致介绍下(不感兴趣的朋友情无视它).伪随机数,或称伪乱数,是使用一个确定性的算法计算出 ...

  8. 【金阳光测试独家播出】-IOS专项测试体系预告-7.20号更新第一集

             You are my pretty sunshine,没有你的世界好好坏坏,只是无味空白--(PS: 前段时间电视剧<何以笙箫默>热播,无论是喜欢"高帅冷& ...

  9. 【金阳光测试】大话Android自动化测试--Android自动化系列(1)--金阳光于2013年4月份

    Android自动化测试框架和工具在四年多的发展日趋成熟.从五年前的第一代自动化架构演进到目前第四代(本系列讲座第7篇后将详细剖析第三代和第四代自动化框架)从以前最早谷歌推崇的monkey随机测试工具 ...

最新文章

  1. 面部识别辅助监控系统 人工智能为城市安全保驾护航
  2. 和君:建设你的知识结构书单
  3. C/C++中单井号与双井号的使用
  4. java调用url505_JAVA中三种URL连接方法
  5. request,response,session,application,out对象的常用调用的函数
  6. Spring5 版本新特性简述
  7. oracle允许空行,oracle用户权限的一些基本操作
  8. Python字符串类型:字符串索引、字符串切片、字符串format()方法格式化、字符串操作符、字符串处理函数
  9. Sencha Touch Hello World(转)
  10. git:关联github和本地仓库
  11. VLAN与Trunk的配置
  12. 随心测试_Python Se_007下拉列表操作2
  13. WORD2003无法打开WORD2000文档解决方法
  14. NDK中LOCAL_SHARED_LIBRARIES
  15. Flyme-Substratum主题
  16. 计算机微图表的类型,说说Excel中的微图表
  17. 数字调制解调—2ASK
  18. L1 VS L2(深度学习中的L1与L2)
  19. python3网络爬虫:爬取堆糖照片
  20. numpy expand_dims函数

热门文章

  1. 【ArcGIS学习系列】高级编辑功能介绍——持续不定期更新
  2. 团购网站集体转型谋生
  3. Java--案例--微信发红包
  4. c 语言课程设计日历,C++课程设计(日历的实现)
  5. 这八个产品原则,决定了产品能走多远
  6. 小猫说话叫自己阿贵 专家称可会说更多(图)
  7. iso文件系统转换成img格式的步骤整理
  8. 人工智能 机器学习 深度学习
  9. 对于电影我不是药神我有话要说
  10. 微信,已经严重地搅和了我们的生活!