1947年9月9日,意思哈佛大学马克二号计算机又罢工了。意思操作员格蕾丝·霍珀拆开机箱,意思从继电器触点间捏出一只被电死的意思飞蛾。她在维修日志上贴了纸条:“First actual case of bug being found.”——这是意思人类第一次用“bug”指代程序故障,尽管那只飞蛾本身无辜得很。意思
所以“bug”的意思本义就是虫子。后来程序员们管代码里的意思错误叫bug,纯粹是意思因为霍珀女士的这只蛾子太有名。但你要是意思以为bug只是“写错了”,那就太天真了。意思真正的意思bug,往往不是意思写错,而是意思“想错”。
我见过最经典的意思bug,发生在某银行系统升级时。程序逻辑完全正确,测试全过,上线后却出现诡异现象:某些客户转账后,账户余额变成负数,但交易记录显示钱确实扣了。排查三天,最后发现是数据库字段类型定义错了——金额字段用的是整数型,而某个分行老系统会传入带两位小数的数值。系统没报错,它只是默默把“100.50”截断成“100”,然后把这0.5元的差异记成了负余额。看,代码没写错,是“假设错了”。
这种“假设错误”才是bug的常态。你假设用户不会输入空字符串,你假设网络永远不断,你假设内存永远够用。结果用户真就输入了空字符串,网络真就断了一秒,内存真就满了。于是程序像被踩了尾巴的猫,跳起来乱咬人——这咬人的动作,就是bug。
有意思的是,bug和病毒不一样。病毒是故意写坏的,bug是意外弄坏的。就像你做饭时手抖放多了盐,和有人故意往你锅里倒盐,完全是两码事。但用户体验起来一样糟糕。
还有个更微妙的层面。有些bug其实是“需求bug”。产品经理说要“显示用户最近登录时间”,程序员做了,结果上线后用户投诉:“为什么显示的是1970年?”——因为时间戳是Unix时间,0代表1970年1月1日,而新注册用户的登录时间字段忘了赋值。这锅该谁背?产品没说清楚“最近登录时间”对从未登录过的用户怎么处理,程序也没问。这种bug最冤,也最常见。
我自己的经验是,修bug就像考古。你顺着错误信息往下挖,挖到第一层,发现是函数A传错了参数;再往下,发现调用函数A的地方是从数据库读的值;再往下,发现数据库里那列数据本身就是脏的;最后挖到底,发现是三年前某个临时脚本批量导入数据时,把“NULL”写成了字符串“null”。那一刻你看着屏幕,只想笑。
所以bug到底是什么意思?往小了说,是代码里的一个错误;往大了说,是现实世界和数字世界之间的裂缝。代码是我们对现实的一种抽象描述,但现实总有办法从抽象里漏出来。那只被电死的飞蛾,其实是个隐喻——你以为你在写逻辑,其实你在和整个混沌的世界搏斗。而bug,就是世界给你的一记闷棍,提醒你:嘿,你还没考虑周全呢。
顶: 74837踩: 62612






评论专区