当你的系统依赖于某个bug...
标题粗略看是有点违反常识的,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...的更多相关文章
- yum安装centos系统依赖库
安装centos系统依赖库,安装软件过程中,经常需要的一些库,可以在编译安装软件前执行如下命令: 首先更新系统(这步可以不执行) yum -y update 这种更新是全部更新,但是有时一些软件不想更 ...
- CentOS7+Win10双系统的CentOS7启动bug
自从安装了CentOS7系统,它的启动时间常常要三分钟以上,实在忍不了. 以下是CentOS7系统的启动记录片断: May 18 13:04:05 DESKTOP-23V3CHU kernel: XF ...
- Spring 循环引用(一)一个循环依赖引发的 BUG
Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...
- CentOS 7.1系统自动重启的Bug定位过程
[问题] 有同事反应最近有多台MongoDB的服务器CentOS 7.1系统会自动重启,分析了下问题原因. [排查过程] 1. 检查系统日志/var/log/message,并没有记录异常信息,jou ...
- WPF 属性系统 依赖属性之内存占用分析
关于WPF的属性系统园子内有不少这方面的文章.里面大都提到了WPF依赖属性的在内存方面的优化.但是里面大都一笔带过.那么WPF到底是怎么样节约内存的.我们通过WPF属性和普通的CLR属性对比来看一下W ...
- 修正DejalActivityView在iOS8之前系统上存在的Bug
DejalActivityView是国外的第三方库,可自定义文本内容和文本长度的菊花转加载指示器效果.该第三方库与其它hud存在不同,能够遮盖键盘:可以自定义遮盖NavigationBar或不遮盖Na ...
- 完整版unity安卓发布流程(包括SDK有原生系统依赖关系的工程)
要3个东西!NDS,SDK,JDK, NDK官网下载:https://developer.android.google.cn/ndk/downloads/index.html(注意系统是不是64位) ...
- 关于Android2.X系统自定义图片圆角BUG的解决
今天在做项目的时候遇到的一个问题. 预期的效果是这样的:
- 360极速浏览器在XP系统下的一个bug
今天在做页面开发的时候,发现360浏览器在XP系统下不支持focus事件,而主流的IE(包括IE6),firefox,chrome都没有这个问题.前段开发的悲剧啊,各种浏览器兼容性的问题.
随机推荐
- Spring Boot 2.3.0正式发布:优雅停机、配置文件位置通配符新特性一览
当大潮退去,才知道谁在裸泳..关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis. ...
- Vue中token的实现
在学习vue的过程中,正好项目中做的web系统对安全性有要求 转载自https://www.jianshu.com/p/d1a3fb71eb99 总:通过axios,vuex,及自定义的方法实现.以下 ...
- Ethical Hacking - GAINING ACCESS(13)
CLIENT SIDE ATTACKS Backdoor delivery method2 - backdooring exe downloads Backdoor any exe the targe ...
- ModuleNotFoundError: No module named 'phkit.pinyin'
1 产生背景 在mac系统本地使用正常,在linux系统上phkit包缺少相应的python文件 2 解决方案 自己想出来,手动上传本地相关python代码到linux服务器 3 解决过程 首先通过项 ...
- 设计模式:decorator模式
两点: 继承同一虚接口,实现数据一致性 桥接方式指向被装饰类 目的:在不改变被装饰类功能的前提下增加新功能 特点:继承是子类和父类强耦合,桥接是低耦合 例子: class Print //抽象接口 { ...
- C++语法小记---面向对象模型(实例的内存分布)
面向对象的模型(内存分布) 对于一个对象而言,成员变量和成员函数是分开存放的 成员函数位于代码段,所有的类对象共有 成员变量为每一个对象独有,位于内存中 类对象在内存中的分布和struct完全相同 对 ...
- 【转载】基于dom的一些前端漏洞
最直接的xss --dom xss function trackSearch(query) { document.write('<img src="/resources/images/ ...
- Java流程控制(Scanner)
3.1用户交互Scanner 可以通过Scanner类来获取用户的输入: 语法: Scanner s = new Scanner(System.in); 通过Scanner类的next()与nextL ...
- python线程,进程,队列和缓存
一.线程 threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 创建线程的两种方式1.threading.Thread import threading def f1(arg): ...
- 编写优美Android注释的常用语法
编写优美Android注释的常用语法 短期目标是定期能出一篇简文,希望自己能坚持下去~~~~( ̄_, ̄ ) 附上Android君 今天要分享的是关于Android注释系统的一些强大功能!! 实 ...