当你的系统依赖于某个bug...

Learnandthink^_^ Learnandthink^_^     2022-11-23     625

关键词:

标题粗略看是有点违反常识的,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。

九dip依赖倒置原则(代码片段)

...赖于抽象 首先,模块是个抽象的概念,可以大到一个系统中的子系统作为一个模块,也可以是某个子系统中的组件,也可以是某个组件中的某个类。都可以称为模块。先看第一条:  高层依赖于低层模块:是指高层模块需... 查看详情

cargo使用文档-指定依赖项

...//doc.crates.io/specifying-dependencies.html#platform-specific-dependencies你的crates可以依赖于其他的库:1.crates.io2.git库3.本地文件系统的子目录也可以临时覆盖依赖项的位置-比如说,这样就能够测试你的工作内容的依赖项的BUG修复。你可以对... 查看详情

当你的类没有定义 #each 时,返回 Enumerator::Lazy 的最佳方法是啥?

】当你的类没有定义#each时,返回Enumerator::Lazy的最佳方法是啥?【英文标题】:What\'sthebestwaytoreturnanEnumerator::Lazywhenyourclassdoesn\'tdefine#each?当你的类没有定义#each时,返回Enumerator::Lazy的最佳方法是什么?【发布时间】:2013-04-0409:3... 查看详情

如何使用 PIP 查看依赖于某个包的所有包?

】如何使用PIP查看依赖于某个包的所有包?【英文标题】:HowcanIseeallpackagesthatdependonacertainpackagewithPIP?【发布时间】:2014-01-0506:41:21【问题描述】:我想查看依赖于带有PIP的某个包的包列表。也就是说,给定django,我希望看到djan... 查看详情

你如何找出哪些 NPM 模块依赖于你的?

】你如何找出哪些NPM模块依赖于你的?【英文标题】:HowdoyoufindoutwhichNPMmodulesdependonyours?【发布时间】:2013-09-1818:22:27【问题描述】:很容易看到特定模块依赖于哪些模块,但我似乎无法找出如何查看哪些模块依赖于特定模块。... 查看详情

gem简介

...些rails项目依赖的软件或者环境,或者是依赖的关系库,当你的项目中缺少的时候,你 查看详情

debian下,升级包安装时依赖于内核版本吗?

...并不仅限于内核版本。而是其他的依赖软件。一般来说,当你下载下deb升级包后,使用dpkg命令安装时,会有提示。如果提示缺乏依赖。那么使用apt-getinstall-f来安装依赖。如果提示版本太低。那么只能将整个系统全部更新。更换a... 查看详情

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库 创建静态库:ar-rcstest.a*.o查看静态库:ar-tvtest.a解压静态库:ar-xtest.a查看程序依赖的动态库:readelf-axxx|greplibrary如:可以看到,下面的交叉程序hello执行... 查看详情

一波程序员搞笑动态图

1、当我改完最后一个Bug,以为可以关闭bug单的时候…2.当你的代码没有错误,没有警告,一次便编译通过时~3.当我开始使用新框架,却忘记阅读文档时4.放完假,第一天回来上班的你5、收拾东西准备下班的时候,测试又提bug过来... 查看详情

docker与虚拟机技术

...载中心总能看到一个以docker镜像方式下载的下载选项,而当你下载下来运行发现,这就是一个虚拟机嘛。究竟是不是呢?一起来看看。我们先来看看传统意义上的虚拟机:基础设施(Infrastructure)。它可以是你的个人电脑,数据中... 查看详情

compser简介和初体验

....在20年的发展过程中,无数开发者开发了无数的类库.但是,当你想用某个库时,是怎么做的呢?  比如:phpmailer,一个发邮件的 查看详情

需要分布式系统的原因

需要分布式原因:1.职责单一一个服务只做一类工作2.系统安全,内外网隔离3.易于维护,每个服务足够小,只需要更新某个服务而不是所有服务器都暂停,更加容易监控服务器的负载4.第三方接入,不同语言开发部署环境不一样... 查看详情

五大原则让你的代码不再受bug的困扰

牢记以下五项基本原则,能够帮助大家尽可能减少代码中的bug。  Java编程语言的人气自然无需质疑,从Web应用到Android应用,这款语言已经被广泛用于开发各类应用及代码中的复杂功能。  不过在编写代码时,bug永远是困扰... 查看详情

立体式校验保护,让你的系统避免90%以上的bug(代码片段)

1.概览在实际开发过程中,数据校验是最为重要的一环,问题数据一旦进入系统,将对系统造成不可估量的损失。轻者,查询时触发空指针异常,导致整个页面不可用;重者,业务逻辑错误,造成流... 查看详情

ros官网中级教程学习总结(1-6)(代码片段)

...utorials。本博客为1-6小节。手动创建ROSpackage添加xml文件。当你的package里已经包含配置文件(package.xml),ROS能够找到它。执行:rospackfind[包名称]。应该注意到我们刚才所创建的package.xml依赖于roscpp和std_msgs.而catkin恰恰是利用... 查看详情

依赖倒置原则

依赖倒置原则就是抽象类和接口在使用时的一些规范和建议,我们的应用上层模块不直接依赖于下层模块,不具体依赖某个类或者对象,而是依赖于某个抽象。接着上一节的Demo,我们有3个手机的对象。分别是LumiaPhone,Galaxy,Apple... 查看详情

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库

...t.a*.o查看静态库:ar-tvtest.a解压静态库:ar-xtest.a查看程序依赖的动态库:readelf-axxx|greplibrary如:可以看到,下面的交叉程序hello执行依赖于如下两个动态库。rebi@ubuntu:~/test$arm-none-linux-gnueabi-readelf-ahello|grep"library"0x00000001(NEE... 查看详情

linux系统怎么用wine求简单明了。

...运行Windows程序,wine是必不可少的,所以,请将wine安装到你的系统里。二、将你的Windows所在的分区加载到某个目录。(本文假定这个目录是/mnt/c).三、修改wine.conf。这也是最关键的步骤。在wine.conf里,系统默认有五个驱动器:A,软... 查看详情