前阵子帮朋友调试后台页面的时候,被反复问到系统bug是什么意思,当时手上还卡着报错弹窗,一时不知道该怎么用书本上的话讲清楚,干脆直接拿眼前这个出错的界面给他对照着看。后台明明设置好了提交表单只能填数字,结果随便敲一串字母也能顺利提交,数据库里堆进去一堆乱七八糟的字符,页面偶尔还会毫无征兆地空白,点刷新才勉强恢复。我跟他说,眼前这些不受控制、不在设计预期里的情况,就是大家常说的bug。
很多人下意识会把bug等同于软件彻底崩溃,其实不是的。之前用过一个办公工具,功能整体都能用,统计表格的数字也大体正常,唯独导出文件的时候,每十份里面就有一份时间列错位,别的单元格数据又全都好好的。没有闪退,没有报错红字,只是输出结果悄悄跑偏,这种藏得很深的偏差,同样属于bug。
有一回闹过一个特别哭笑不得的情况。账号登录页,密码输错三次本该锁定十分钟,结果连续输错十几次依旧能继续尝试,锁定逻辑完全没生效。开发那边核对代码才发现,判断次数的变量没有持续累加,每次校验完就重置归零了。代码逻辑少考虑了一个分支,系统就做出了和设计要求不一样的行为,这就是bug产生的来由。
这只是我的个人感受,不是标准答案。
bug不一定每次都能稳定复现,这点最磨人。同一个操作,上午点十次都正常,到下午环境负载上来之后就随机出错。之前遇到过一个,只有在网络波动、同时打开三个关联页面的时候才触发,单独测试怎么都复现不了,排查来来回回耗掉好几天。这类偶发的问题,排查成本远比一触发就报错的bug高得多,很多时候只能靠着大量重复操作去碰机会。
也不是所有异常都归为bug。用户自己操作步骤弄错、网络中断、设备本身资源不够带不动程序,这些属于外部因素,代码本身没有问题,就不算系统bug。区分起来简单看一点:去掉外部干扰之后,如果程序依旧会出现不符合原定设计的行为,才算是bug。
修复bug也不是改一行代码就万事大吉。有时候补好了一处判断,又顺带影响到另外一个关联模块,引出新的异常。之前改表单校验的那个问题,修好字母能提交的漏洞之后,短时间内又出现了合法数字被拦截的反向问题,又要重新调整判断条件,反复测试好几轮才稳住。
到后面慢慢觉得,bug本质上就是写代码的时候,人的思考没有覆盖到全部场景。程序员按照预想的路径写好了流程,但是真实使用里总会冒出各种意料之外的输入、组合条件,系统没有对应的处理方案,就跳出奇怪的表现。它不是软件天生自带的故障,是逻辑疏漏留下的痕迹。
那天忙完调试关掉页面,朋友还在念叨,原来bug不一定是那种很吓人的崩溃。我没再多解释,只是看着后台刚刚清理完的脏数据,心里清楚,很多时候用户碰到的那些不起眼的小反常,就是它了。