程序员的日常三件事:写bug、改bug、背锅。连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug。

那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢?

- 1 -

新手开发+新手测试=无敌巨坑

有一天凌晨,某组的程序员们被电话轰炸醒了。用户纷纷投诉自己的业务数据离奇消失了!

大伙排查半天,原来是新来的小王埋的坑。他三个月前开发的定时任务出bug了!

那时刚来的小王刷刷地将代码写完后,手把手教新来的测试实习妹子怎样测试这块代码,估计是妹子还没搞清楚里面的逻辑时便稀里糊涂地将代码上线了。

万万没想到这bug隐藏这么久,由于错误的逻辑导致错误的数据,错误的数据导致任务死循环执行,当执行的时间过长,到某个点时,系统如汽水开瓶般“砰”地崩了。

业务不熟导致逻辑理解有问题,是大部分新人都会存在的问题。此时最好安排个有经验的测试“调教”下,降低bug发生率。

- 2 -

不考虑系统拓展性,怎么方便怎么写

史上最出名的“千年虫”bug令全世界恐慌,甚至传出“世界末日”的谣言。

原因竟让人啼笑皆非:当时的程序员没考虑到软件会被使用至21世纪,为了节省内存省略掉代表年份的前两位数字”19”,或者默认前两位为”19”。

“千年虫“千年一遇,可日常关于时间的低级bug经常发生,而且通常等到一段时间后的某个特定时间点才暴露出来,让人防不胜防。

例如正则只匹配了“16”,“17”年,等到18年零点到来问题才暴露。

关于时间的bug非常多,大到闰年、夏令时、节假日、时区等,小到时间格式,每年都会碰到不小心遗漏的时间bug,所以很多公司对时间的通用测试用例就有许多条。

除了时间问题,程序员如果只考虑本次需求或者单个系统时,常常将字段设置不正确,后续业务拓展或者和别的系统交互时发现字段不够用,只能修改字段长度了。

- 3 -

不考虑上下游系统,招呼不打便随意改接口

曾遇到A系统上线后,大伙回归A系统正常运行后,正乐滋滋地松一口气之际,本来好端端运行的B系统突然坏了,B组人排查半天发现,原来是A提供的接口改了,B系统不兼容新接口。

大概程序员走过最长的路便是背锅之路了。

2005 年 12 月 8 日瑞穗证券的交易员因手误输入错的股价,2 分钟后这人试图通过交易软件撤销这笔卖单。可是连续输入 3 次撤单指令,都被东证的交易系统拒绝了。这次事故造成400 亿日元的损失。

后来查明是交易系统出 bug了,程序员在 2000 年某次程序修改时不小心埋进去的。

所以很多公司会严格要求在程序修改后必须经过严格的回归测试,来验证对其他业务流程有没有影响。

- 4 -

复制、粘贴,我闭着眼,有bug看不见,debug了没?

已发布已验证的代码,是安全可靠的,是可以拿来即用的,无需质疑,不用浪费时间去调试,这是程序员的惯性思维。

被记入史上bug王之一的阿丽亚娜5型自毁事件就是因代码复用而导致的。1996年6月4日,阿丽亚娜5型运载火箭发射点火后,由于bug,在发射39秒后火箭发生偏轨,最终被迫引爆自毁。

这件事情发生的原因是因为5型火箭是基于4型火箭开发的,发射系统的代码程序员也直接照搬4型的。

该段代码在4型火箭中被反复验证,但在5型却没有进行验证。实际上4型的飞行条件和5型的飞行条件截然不同,最终导致事故发生,此次事故损失3.7亿美元。

有测试工程师说,最害怕开发说这次没啥改动,跟线上某功能差不多。这时候反而要细心验证代码的正确性。

这是因为“安全心理”作祟:程序员直觉已信任上线的代码是正确的,便直接复制过来用,不会再花时间自测,因为这是“对的”,“毋庸置疑”的。

此时测试人员不可轻易听信开发的话,更要严谨对待,毕竟程序员的三大谎言有:没问题的;只改了两行代码;和线上一样。

程序员花30分钟写程序,花2小时改bug。bug,子子孙孙无穷尽也。所以在面对测试人员的质疑时,程序员们一定要保持镇定,该甩锅时速速甩掉:这是历史问题,我没动过;刚刚在我这是好的,你环境配错了;你重启试试……

最后一招是两个字:我改!

如何隐藏一个让人很难发现的bug?的更多相关文章

  1. 如何写出一个让人很难发现的bug?

    程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug. 那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢? - 1 -新手开发+ ...

  2. No bean named 'xxxxx' is defined异常,已解决,这个坑很难发现,你get了吗

    出现No bean named 'xxxxx' is defined异常 没有定义名为xxx的bean 如果你的代码写的都对,根本问题只有一个地方出错了,那就是你的 basePackage=的包名路径 ...

  3. mysql的又一个让人捉摸不透的bug?

    这次就不说很多没有写博客了,因为前几天已经写过了.\^o^/ 昨天我们刚讨论了关于自动化运维工作的实现方式,如果批量执行,中间出错怎么办?突然有人提出mysql支持--force,可以跳过出错继续执行 ...

  4. 浅谈如何写出一个让(坑)人(王)很(之)难(王)发现的bug

    该文章内容来自脚本之家,原文链接:https://www.jb51.net/news/598404.html 程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因 ...

  5. Scala很难!

    Scala很难! 本文是从 Yes, Virginia, Scala is hard 这篇文章翻译而来. 首先要说的是,我是一个Scala粉丝,我作为一个Scala语言的倡导者差不多有5年历史了.我写 ...

  6. (转)如何学好C语言,一个成功人士的心得!

    zidier111发表于 2013-1-26 08:59:05   今 天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了所 ...

  7. 一个IT人士的个人经历,给迷失方向的朋友

    这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量.最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经历写出来与大家共勉,希望能 ...

  8. 函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网

    函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网 函数式编程很难,这正是你要学习它的原因 156 次分享 新浪微博 腾讯微博 Tweet 人人网 QQ空间 很奇怪不是,很少有人每天都使用函数 ...

  9. 一个IT人士的个人经历,给迷失方向的朋友(转)

    作者: 果子狸  来源: WP开发者社区  发布时间: 2013-11-08 10:43  阅读: 50078 次  推荐: 494   原文链接   [收藏] 这些日子我一直在写一个实时操作系统内核 ...

随机推荐

  1. HTML-字符实体,平方米(㎡)m²

    转载自:https://blog.csdn.net/hangGe0111/article/details/80983250

  2. onblur和onkeyup事件

    onblur:事件会在对象失去焦点时发生 提示:onblur 相反事件为onfocus事件 . onkeyup: 事件会在键盘按键被松开时发生. 提示:与onkeyup 事件相关的事件发生次序: on ...

  3. charles模拟弱网情况

    网络主要需要注意什么场景: 弱网功能测试 无网状态测试 网络切换测试 用户体验关注 下面我们使用charles测试弱网,针对不同网络下的测试 打开charles(抓包软件)  

  4. oracle三大范式

    范式: 设计数据库定义的一个规则, 三大范式, 灵活运用, 人的思想是活的 一范式 1, 不存在冗余数据 同一个表中的记录不能有重复----所以主键(必须有) 2, 每个字段必须是不可再分的信息(列不 ...

  5. JAVA中JavaBean对象之间属性拷贝的方法

    JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,对于这种情况,可以采用以下几个简便方法处理. 下面对这 ...

  6. mybatis报错:org.apache.ibatis.builder.BuilderException:Encountered " "shr" "shr " " at line 1,column 1

    程序报错如下: 解决:变量名冲突 表字段‘审核人’简称为shr,与mybatis的OGNL表达式发生冲突. 解决方法:修改冲突的变量名即可. 总结了一下变量命名可能发生冲突的变量集合: bor(字符| ...

  7. luoguP1505 [国家集训队]旅游(真的毒瘤)

    luogu P1505 [国家集训队]旅游 题目 #include<iostream> #include<cstdio> #include<cstdlib> #in ...

  8. 洛谷 - P3803 - 【模板】多项式乘法(FFT) - FFT

    https://www.luogu.org/problemnew/show/P3803 用反向学习的FFT通过这个东西. #include <bits/stdc++.h> using na ...

  9. BZOJ 1683.City skyline 城市地平线

    传送门 从左到右扫一遍,考虑什么时候会和之前形成同一幢房子从而不用统计 显然是当前的高度和之前某个点高度相同,并且它们之间没有更矮的建筑 考虑用一个单调栈维护一个单调上升的房子轮廓,然后对于扫到的每一 ...

  10. 最小生成树,Prim算法实现

    最小生成树 所谓最小生成树,就是一个图的极小连通子图,它包含原图的所有顶点,并且所有边的权值之和尽可能的小. 首先看看第一个例子,有下面这样一个带权图: 它的最小生成树是什么样子呢?下图绿色加粗的边可 ...