标题粗略看是有点违反常识的,bug通常是指某些代码存在问题导致系统没有按照期望方式工作,应该是需要尽可能被修复的,这样系统才会正常工作。但是,开发实践中会发现在某些情况下,本来功能没有问题,在你信心满满的修复了某个bug之后,某项功能反倒变成有问题了。这是怎么回事呢?在bug fix本身没有问题的情况,最可能的原因是你的某些上层模块依赖于这个被修复bug的行为,当bug修复之后,这个被依赖的bug行为不存在了,所以导致这些上层模块不工作。下面举一个来自实践中的真实的案例。

有一个函数isdigitstring,它负责检查输入字符串是否是数字字符串。我们在对这个函数做单元测试的时候,发现它存在一个明显的bug。如果输入字符串为空,这个函数会判断这个空字符串为数字字符串,很明显这个判断是不正确的。在单元测试中发现这种bug是非常鼓舞人心的,而且解决这个bug是非常容易的,只需要在函数里面增加一个空字符串的判断处理即可。像预料的那样,我们接下来应该是立即修复这个bug, 然后自豪的宣称代码质量又得到了极大的改善。

意外的是某个资深的软件工程师对此提出一个奇怪而强烈的意见,这个bug现在不能被修复!什么?这是一个毫无疑问的低级错误,修复它看起来完全不存在side effect, 因为它看起来是如此的简单和直接。作为合格的软件工程师来说,我们的职责难道不是尽可能的发现bug和修复bug? 这位提出意见的工程师随即解释了他的理由,原来这个bug在不久前已经被发现,但是同时也发现存在这个bug的函数在代码中被大量使用,代码里所有的现有调用者都已经假定空字符串就是一个数字字符串!所以,如果我们修复了这个bug, 所有调用这个函数的地方都会有问题(因为它们都依赖于这个错误的假定)。这个项目已经临近结束,我们可以修复isdigitstring的bug, 但是我们基本上已经不能负担修改此函数的caller代码的时间成本。也就是说,我们暂时最好的决定居然是不修复这个bug。很明显在新的项目代码里,我们必然会修复这个bug和修复所有的caller代码(不再依赖于错误的假定)。但是对一个低级错误bug的解决方案是"won't fix", 的确会令一个热情的软件工程师内心感觉到挫败。

那么经验教训是什么呢?在项目早期就必须开始单元测试,否则在后期修复一个简单bug的成本可能都会变得非常巨大;低层&公用的代码的修复成本通常会比较高;整体系统工作正常并不一定表示局部模块不存在bug。

当你的系统依赖于某个bug...的更多相关文章

  1. yum安装centos系统依赖库

    安装centos系统依赖库,安装软件过程中,经常需要的一些库,可以在编译安装软件前执行如下命令: 首先更新系统(这步可以不执行) yum -y update 这种更新是全部更新,但是有时一些软件不想更 ...

  2. CentOS7+Win10双系统的CentOS7启动bug

    自从安装了CentOS7系统,它的启动时间常常要三分钟以上,实在忍不了. 以下是CentOS7系统的启动记录片断: May 18 13:04:05 DESKTOP-23V3CHU kernel: XF ...

  3. Spring 循环引用(一)一个循环依赖引发的 BUG

    Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...

  4. CentOS 7.1系统自动重启的Bug定位过程

    [问题] 有同事反应最近有多台MongoDB的服务器CentOS 7.1系统会自动重启,分析了下问题原因. [排查过程] 1. 检查系统日志/var/log/message,并没有记录异常信息,jou ...

  5. WPF 属性系统 依赖属性之内存占用分析

    关于WPF的属性系统园子内有不少这方面的文章.里面大都提到了WPF依赖属性的在内存方面的优化.但是里面大都一笔带过.那么WPF到底是怎么样节约内存的.我们通过WPF属性和普通的CLR属性对比来看一下W ...

  6. 修正DejalActivityView在iOS8之前系统上存在的Bug

    DejalActivityView是国外的第三方库,可自定义文本内容和文本长度的菊花转加载指示器效果.该第三方库与其它hud存在不同,能够遮盖键盘:可以自定义遮盖NavigationBar或不遮盖Na ...

  7. 完整版unity安卓发布流程(包括SDK有原生系统依赖关系的工程)

    要3个东西!NDS,SDK,JDK, NDK官网下载:https://developer.android.google.cn/ndk/downloads/index.html(注意系统是不是64位) ...

  8. 关于Android2.X系统自定义图片圆角BUG的解决

    今天在做项目的时候遇到的一个问题. 预期的效果是这样的:

  9. 360极速浏览器在XP系统下的一个bug

    今天在做页面开发的时候,发现360浏览器在XP系统下不支持focus事件,而主流的IE(包括IE6),firefox,chrome都没有这个问题.前段开发的悲剧啊,各种浏览器兼容性的问题.

随机推荐

  1. 机器学习实战基础(二十一):sklearn中的降维算法PCA和SVD(二) PCA与SVD 之 降维究竟是怎样实现

    简述 在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响.同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或 ...

  2. 数据可视化之分析篇(一)使用Power BI进行动态帕累托分析

    https://zhuanlan.zhihu.com/p/57763423 通过简单的点击交互,就能进行动态分析发现见解,才是我们需要的,恰好这也是 PowerBI 所擅长的. 就帕累托分析来说,能从 ...

  3. Django之实现登录随机验证码

    登录验证码是每个网站登录时的基本标配,网上也有很多相应的文章, 但是从生成验证码到 应用到自己的网站上的全步骤,并没有看到很多, 为了节约大家的时间,我把整体步骤写下来, 即拿即用哈 1. 生成随机验 ...

  4. Activiti工作流--分布式实现方案

    一.运行环境 以下所有的描述都是基于Activiti的5.20.0.1版本 public interface ProcessEngine extends EngineServices { /** th ...

  5. 服务端socket重用属性设置

    初始化socket socket是一种系统资源,并不是每次初始化都一定成功,因此为了避免初始化失败,一般使用多次初始化的方式,如下所示: unsigned int times = 0x0; while ...

  6. centos7+jexus5.8.3部署ASP.NET的MVC项目

    1.在centos7终端以root权限安装jexus5.8.3的独立版 命令:curl https://jexus.org/release/x64/install.sh|sh 2.跳转到目录/usr/ ...

  7. vue+axios+springboot文件下载

    //前台代码 <el-button size="medium" type="primary" @click="downloadFile" ...

  8. 前端需要知道的 HTML5 SEO优化

    title标签,字数不能过长(不超过70个字符最优) <title>淘宝网 - 淘!我喜欢</title> 使用description以及keyword标签(不超过300个字符 ...

  9. pandas_查看数据特征和统计信息

    # 查看数据特征和统计信息 import pandas as pd # 读取文件 dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Pyth ...

  10. 再见了Antirez永远的Redis之神

    其实antirez(Redis作者)退出Redis维护一发布我就在很多咨询网站上面看到了,当时也没太多感慨. 今天比较有空想去看看霉霉Twitter的,然后看到了antirez,我就又一次回顾了他的退 ...