不知道你们有没有遇到过一种神奇的产品 bug,就是只偶尔出现一次,但之后就再也不能复现。

所谓复现,就是按照第一次出 bug 的条件和步骤再次引发问题。

一般来说,绝大多数成立的 bug 都是可以复现的,测试人员会写复现步骤,然后程序员以此来解决 bug。

如果你和我一样做过技术写过代码,那一定遇到过上面我说的那种 bug,无法复现。

此外,如果你用过 Windows 系统的电脑,那使用过程中也一定遇到过蓝屏死机的情况,有时候是完全没有任何征兆就突然出现了。

打开网易新闻 查看精彩图片

那么,这种神奇的 bug 到底是怎么产生的呢?

其实今天跟你们聊这个话题也是源于我们星球一位同学给我发来的问题,他们最近上线产品后就遇到了一个这样的 bug,但是怎样都无法复现。

发现时是在测试过程中,测试用例在,截图在,但后续在一行代码都不改的前提下,这个问题就再也没有出现过。

以前我遇到这类问题时没有溯源,但这次我还是到网上查了下类似 bug 的由来和案例,其中在油管上的一个视频或许给了我答案。

在说可能的原因和逻辑之前,我先给你们说个真实故事。

2003 年,比利时首都在进行大选,他们的选举机制是采用投票的方式进行。

每个公民可以领到一张实体磁卡,这张磁卡里会录入他们的个人信息,到投票站投票时需要把这张磁卡插入到对应的投票机电脑里,然后进行选票。

打开网易新闻 查看精彩图片

你可能会好奇,为什么要用实体磁卡?直接用电脑登录个人信息投票不行么?

理论上是的,但是他们为了防止计算机出现问题导致选票丢失,所以磁卡是用来备份的。

万一计算机故障或者有人黑进系统干扰选举,他们还可以单独统计磁卡来计算选票,以此保证选举的公平性。

打开网易新闻 查看精彩图片

这套投票机制已经在他们那运行了很多年,一直都没有出现什么问题。

可是,那一次的投票统计结果中出现了一个异常情况。

一个名叫 Maria 的候选人得到了 4610 票,这个得票数远远超过了她所在党内选票的理论上限。

发现异常后,工作人员对投票的磁卡进行了挨个读取并重新统计得票数,实际票数只有 514 票。

打开网易新闻 查看精彩图片

既然投票人只投了 514 票,那这 4610 票又是怎么来的呢?

在检查过投票系统的代码后没有发现什么问题,投票机硬件经过反复重新测试也没有发现什么异常。

此时,参与调查的计算机学家发现了一个问题,这两个数字之间的差额是 4096,这在计算机里是一个比较特殊的数字。

你们前几年应该都玩过一款叫 2048 的游戏吧,也就是从 2 开始一直按照 2 的次方去合并数字来得到更大的数字,最终合并出 2048 算获胜。

打开网易新闻 查看精彩图片

2048 就是 2 的 11 次方,如果 2048 再做一次平方,也就是 2 的 12 次方,就得到了前面提到的数字 4096。

到这里,就引出了一个新概念,二进制

二进制是一种计数方式,计算机里所有的指令最终都是二进制,包括程序员写的代码也会经过编译转化为二进制被计算机执行。

简单说,计算机的世界就是被 0 和 1 组成的复杂指令构成的。

到硬件层面,芯片中的晶体管就是根据 0 和 1 来判断开关,通过复杂的构成组合成了计算的复杂操作。

既然想到了二进制,计算机科学家又做了一个尝试。

他们把 514 这个数字和 4610 这个数字的二进制展开,你会看到这两排数字。

打开网易新闻 查看精彩图片

仔细看,514 和 4610 这两个数的二进制其实只差了一位,就是顺数的第 4 位,514 在这个位置上是 0,而 4610 是 1。

也就是这 1 位的差异,直接让 514 变成了 4610。

那问题又来了,这种转变是怎么发生的呢?

这里我们要了解另一个新概念,比特反转

比特反转是计算机科学中的一个概念,是指将二进制的位进行反转的过程,可以通过异或运算、磁场干扰、机械振动、硬盘老化或者问题变化产生。

除了异或运算之外,其他的几种方式都是被动发生。

显然,这个投票系统如果不是主动的程序 bug 产生的问题,那就是被动的比特反转。

其中,科学家判断可能性最大的就是磁场干扰,或者叫射线干扰。因为数据存储地没有地震,也没有硬盘老化情况。

说到这你可能有点迷糊,磁场和射线还能引发系统 bug?

还真会。

我还看到一个案例,2013 年一个游戏博主在玩《超级马里奥64》里的一个关卡时,偶然跳到了游戏画面天花板的上面。

正常来说,这个地方是不能上来的,但他也不知道为何就跳了上来,而且之后重新闯关时就无法复现了。

打开网易新闻 查看精彩图片

他对此一直百思不得其解,以为是游戏的 bug,但其他玩家也没有复现过这个问题。

为此,还有另一位玩家悬赏 1000 美金让大家去复现和解决这个问题。

6 年后,身为程序员的他做了多次尝试,发现在起跳代码片段上对应的二进制节点是 11000101,他写了一个脚本,在跳跃节点把这个二进制的最后一位改成 0,竟然可以成功复现跳到天花板上去的现象。

至此,这个问题也被定义为比特反转。

可是,导致比特反转的这些磁场和射线来自哪里呢?

如果所处环境没有什么改变磁场的装置的话,那这种改变大概率来自天上。

准确点说,是来自宇宙深处,也就是宇宙射线。

一定会有读者说,你这不扯淡么,咋不说来自地狱。

其实你们可以去查阅和研究一下相关案例,不仅这两个,有几个航空飞行事故也是由宇宙射线造成计算机系统异常导致的。

离地面越高,宇宙射线越强,虽然大气层已经帮我们阻挡了一层,但还是会有弱化后的高能射线到达地面。

如果此时碰巧击中了计算机中的芯片晶体管,那就有可能导致比特反转,进而产生难以复现的 bug。

是不是觉得很神奇?

从某种程度上来说,人类的进化可能也会受到宇宙射线的干预,可能千百万上亿年前,人类的祖先可能就是因为一次宇宙射线导致 DNA 序列变化而造就了今天的我们。

虽然概率足够小,虽然现在也有技术能防止这种情况的出现,但再小的概率也是概率。

一旦遇到,跟中了大彩票没什么区别。

那问题来了,有没有可能你的银行卡余额数字被宇宙射线击中?

················· 唐韧出品 ·················

安可时刻

虽然理论上存在上面讲的可能性,但你们在做产品过程中还是小心测试、客观求证、认真对待每一个 bug。

很多产品中的大问题往往是由一些小忽视引发的,尤其是线上 bug,遇到了就比较难搞。

还是那句话,产品无小事。

PS:长沙的产品训练营定档6月1号了,也是唯一一场,要参加的还可以联系我。此外,深圳和广州正在招募中,人满就发车。

打开网易新闻 查看精彩图片