当你的系统依赖于某个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都没有这个问题.前段开发的悲剧啊,各种浏览器兼容性的问题.
随机推荐
- 从对象到类,Java中需要知道的这些东西
1. 对象的诞生 在平时的开发中,我们使用对象的时候,都是直接new一个临时变量然后进行各种逻辑赋值然后返回,但是你有没有想过一个对象在创建的过程中经历了什么呢,为什么创建时静态变量就已经赋完值了 ...
- P4017 最大食物链计数(洛谷)
老师开始帮我们查漏补缺啦!我们的老师这两天给了我们一些我们没怎么学的函数和算法,比如STL的函数和拓扑排序之类的,这个题就是讲拓扑排序的. 先看题板: 题目背景 你知道食物链吗?Delia 生物考试的 ...
- 014.Nginx跨域配置
一 跨域概述 1.1 同源策略 同源策略是一个安全策略.同源,指的是协议,域名,端口相同.浏览器处于安全方面的考虑,只允许本域名下的接口交互,不同源的客户端脚本,在没有明确授权的情况下,不能读写对方的 ...
- 基于Vue的UI框架element el-table表格的自定义排序
html部分: <el-table-column prop="phoneCache" label="手机缓存包编号" align="center ...
- java环境搭建--Windows 10下java环境搭建
1.下载jdk:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html(注意需要注册登录Oracle账号) 2.安装此处 ...
- .Net Core Controller
[HttpGet] public async Task<ActionResult<IEnumerable<ABBUserModel>>> GetUser() { / ...
- Python语言及其应用PDF高清完整版免费下载|百度云盘|Python新手入门
百度云盘:Python语言及其应用PDF高清完整版免费下载 提取码:6or6 内容简介 本书介绍Python 语言的基础知识及其在各个领域的具体应用,基于最新版本3.x.书中首先介绍了Python 语 ...
- Jarvisoj-web Login
题目入口: http://web.jarvisoj.com:32772/ 有个登陆框,随便提交参数然后bp抓包 get到了一个Hint,给了sql查询的语句 select * from `admin` ...
- Python 变量类型及变量赋值
在 Python 中,变量不一定占用内存变量.变量就像是对某一处内存的引用,可以通过变量访问到其所指向的内存中的值,并且可以让变量指向其他的内存.在 Python 中,变量不需要声明,但是使用变量之前 ...
- 从键盘输入一个字符串(长度不超过30),统计字符串中非数字的个数,并将统计的结果显示在屏幕上,用EXE格式实现。
问题 从键盘输入一个字符串(长度不超过30),统计字符串中非数字的个数,并将统计的结果显示在屏幕上,用EXE格式实现. 源程序 data segment hintinput db "plea ...