一个Bug让人类科技倒退几十年?

news/2024/10/31 3:29:51/

大家好,我是良许。

前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的。

所以,今天就跟大家科普一下这个人类历史上最大的 Bug 。

file

1. 全世界的恐慌

一个Bug会让人类的科技倒退几十年?

这不是危言耸听,而是真实存在的历史。

1999 年的跨年夜,人们集体陷入恐慌,大家忙着取现金,忙着屯粮,还有人钻进山洞避难,他们感觉世界末日即将到来。

进入新千年本来是一件非常值得纪念的日子,毕竟这辈子这样的机会也不多,但为何全世界却乱成了一锅粥呢?

引起这场混乱的主角,就是著名的「千年虫」。

2. 什么是千年虫

现在新一代的程序员大多是 95 后或 00 后,千年虫来袭的时候他们要么还没出生,要么还在玩泥巴,所以对这场混乱几乎没有任何感知。

所谓的千年虫,并不是一种生物,而是一种计算机 Bug 。

那这又是一种怎样的 Bug ,为何又造成如此大的混乱呢?

简单来讲,千年虫是由于计算机内部时间的存储不合理,导致时间紊乱,从而计算机罢工。1999 年到 2000 年虽然只隔了一年,但实际上这是世纪交替,导致系统时间错乱,随后崩溃。

而这些都是有历史渊源的。

计算机刚诞生的时候,由于技术的限制,导致计算机存储设备非常昂贵。而且贵也就算了,这些存储设备的容量偏偏又非常小(也是没办法的事),所以程序员们在写代码的时候,真的是对每个字符都要精打细算。

想想现在的程序员,可以随意分配内存空间,不为存储而发愁,真的是太幸福了。

为了节约内存,有位靓女想出了用 6 位数表达时间的办法,比如 1989 年 10 月 1 日就写成了 891001 。

这位靓女,就是软件之母的格雷斯霍珀。也就是她,发现了人类历史上的第一个 Bug ,同时也制造了人类历史上最大的 Bug 。

file

当然,这里并不是在贬低她,在软件行业她给世人做出的贡献都是有目共睹的。更何况,哪个程序员没写过 Bug ?

霍珀发明的 6 位数时间记录法由于十分简单并且非常省内存,所以大家都纷纷效仿。也正是这 6 位数时间记录法的大规模使用,使得千年虫开始悄悄埋伏在人类社会,只等千禧年开始反扑人类。

有计算机常识的小伙伴应该很快发现,这种时间记录法由于年份的前两位被抹去(如 1989 年直接记为 89 ),这就会造成在进入 21 世纪时,出现时间回退的现象。

也就是说,在 2000 年的时候,计算机会认为当前是 1900 年,时间混乱就会由此而产生。

file

在编程世界里,时间是个非常重要的参数,有很多业务是依赖时间而开展的。一旦时间错乱,可能会引起各种各样莫名其妙的故障。

这就是著名的千年虫问题。

3. 危机埋伏

实际上,在上世界五十年代末的时候,有位叫鲍勃贝默的计算机科学家就发现了这个隐藏的大问题,于是他就开始到处奔走,想让大家认识到这件事情的严重性。

但是,他的声音并没有受到太多关注,原因很简单,那时候距离千禧年还有四十多年,大家觉得还遥遥无期,自己可能都活不到那个时候,以后的事情就交给后人解决吧。

而且,6 位数时间记录法已经大规模使用了,新写的代码都要考虑与老程序兼容。如果换成其它时间表达法,那么工作量就会十分巨大。

file

时间就这么很快进入到 20 世纪 90 年代,已经越来越多人开始意识到了这个问题的严重性。特别是 1999 年,因为计算机的误判,分别在三个日子出现大规模 bug 现象,这似乎在提醒人们千年虫造成的影响将更为严重。

在当时,计算机虽然没有大量普及到普通人,但银行、证券公司、股票交易所、工厂、机场、发电站,甚至是核弹发射井,都已经大量使用计算机,而且都几乎埋伏着千年虫。

要知道,这些都关乎人类的命脉。

一旦千年虫发作,你的银行账户会被清零,交通也会混乱,电力水利系统瘫痪,飞机航线消失,最可怕的是核电站相当于核弹爆炸的效果,直接经济损失不会小于 1.6 万亿元。

恐慌于是就开始在全球蔓延,大家赶紧把现金从银行取出来,食物、生活用品,也都被哄抢一空,更有甚者,都已经找好了附近的防空洞,仿佛新的世界大战一触即发。

file

4. 应对千年虫

所以,千年虫一旦发作,让人类科技倒退几十年绝对不是笑话,严重的话可能将直接毁灭人类文明!

于是,为了应对千年虫的出现,各国政府投入了大量的人力物力,想尽各种办法来阻止千年虫的出现。

程序员们熬夜加班,一点点重写有问题的代码。这时候,别说 996 了,为了人类命运,007 也是在所不辞。

但是,由于时间紧迫,工作量巨大,想要在 2000 年前修复完所有的代码,是不可能的一件事情。所以,程序员们只重写了那些简单又很关键的程序。

而剩下的程序,则采用 windowing 修复法,也就是将时间框定在 1920 年至 2020 年,这样 00 就只能代表 2000 。

大家也想到了,这其实就是将千年虫爆发时间往后延长了 20 年,像不像你改 Bug 的样子?

但在时间异常紧迫的情况下,这也是不得己的事情。采用这种修复法,程序员修复了 80% 的 Bug ,也算是应对千年虫取得了阶段性的胜利。

file

但毕竟没有 100% 消除千年虫,大家依然没有完全放下心来。所以为了应对很多不确定因素,政府、机构纷纷出来了很多政策,以降低千年虫可能造成的影响。

5. 千年虫造成的影响

时间到了 1999 年的最后几秒,大家都紧张到了极点。直到钟声敲响后,人们发现,经济没有崩溃,交通依然正常,导弹没有飞来,几亿颗悬着的心终于放下来了。

千年虫虽然没有大规模爆发,但依然如期而至。

就比如冈比亚,由于缺乏外界的援助,政府机构的计算机受到千年虫袭击而瘫痪,冈比亚政府宣布当天(周一)为非工作日,以暂时减轻出事机关所要承受的压力。

除此之外,全球各国都受到了千年虫不同程度的影响。但相比于人类毁灭,这点损失已经算是非常小的了。

file

6. 卷土重来的千年虫

前面提到,为了应对千年虫,程序员采用了 windowing 修复法。而这种修复治标不治本,只是将千年虫爆发时间延后了 20 年而已。

所以在 2020 年时,除了新冠这个大病毒之外,千年虫这个老病毒又卷土重来了。

所幸在这 20 年间,人们没有忘记这个千年虫,都做了充足的准备,没有造成重大损失,所以当年大家对千年虫的感知不大。

也有可能是因为大家的关注点都在疫情上了吧。

除了这种 6 位数时间表达法造成的重大 Bug ,还有一种更隐蔽的 Bug ,那就是 2038 年问题。

这种问题又是如何出现的呢?学计算机的朋友都知道,计算机的计时基点是 1970 年 1 月 1日,我们电脑内部时间就是统计从这个基点到现在为止过去了多少秒。

而当时,都是 32 位操作系统,所能表达的极限是 2147483647 (第一位是符号位),换算成时间的话就是 2038 年 01 月 19 日 03 时 14 分 07 秒。

file

应对这个问题,就是扩展 Unix 时间长度,用 64 位表示,最大可以表示 292,277,026,596 年 12 月 4 日 15 时 30 分 08 秒。而在那个时候,人类的文明还有没有存在都是个问题。

7. 千年虫对程序员的教训

在编程世界里,关于时间的表达都是非常重要的,轻则程序运行异常,重则会出现千年虫类似的重大 Bug 。

所以有关于时间的一些业务处理,都要十分慎重再慎重。

当年我还在职场的时候,有个业务就是关于时间的校正。为了保证时间的准确性,我们采用了 4 种时间验证法(GPS时间、固件时间、内存时间、系统运行时间),彼此互相验证,减少出错的可能。

所以,程序员真正的战场是在代码里,而不是甲方,也不是产品经理。手里的键盘就是我们的武器,程序设计就是我们的秘密,一个个 Bug 就是我们的敌人!

珍惜你身边的每一位程序员,也许将来他们就是拯救世界的主角!


学习编程,千万不要急于求成,一定要多读一些经典书籍,多看源码,多下苦功夫去死磕代码,这样技术才能长进。给大家分享一些程序员必读经典书籍,一定要多读几遍:

file

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

推荐阅读:

  • 干货 | 程序员进阶架构师必备资源免费送
  • 刷题 | LeetCode算法刷题神器,看完 BAT 随你挑!

欢迎关注我的博客:良许Linux教程网,满满都是干货!


http://www.ppmy.cn/news/33019.html

相关文章

系统架构:经典三层架构

引言 经典三层架构是分层架构中最原始最典型的分层模式,其他分层架构都是其变种或扩展,例如阿里的四层架构模式和DDD领域驱动模型。阿里的 四层架构模型在三层基础上增加了 Manager 层,从而形成变种四层模型;DDD架构则在顶层用户…

jupyter的安装和使用

目录 ❤ Jupyter Notebook是什么? notebook jupyter 简介 notebook jupyter 组成 网页应用 文档 主要特点 ❤ jupyter notebook的安装 notebook jupyter 安装有两种途径 1.通过Anaconda进行安装 2.通过pip进行安装 启动jupyter notebook ❤ jupyter …

webpack之处理js资源

原因是 Webpack 对 js 处理是有限的,只能编译 js 中 ES 模块化语法,不能编译其他语法。 针对 js 兼容性处理,我们使用 Babel 来完成 针对代码格式,我们使用 Eslint 来完成 Eslint 可组装的JavaScript和JSX检查工具 1. 配置文件…

如何给网页加速,如何加速网页速度?

如何加速网页速度?提高移动网页加载的速度,可以从服务器的优化、网页的容量、请求响应等方面入手,这些方面优化后必然可以提高加载速度。1、服务器硬件软件配置要好,网络、读写响应等要做好优化。2、可以开启gzip压缩技术&#xf…

UE实现建筑分层抽屉展示效果

文章目录 1.实现目标2.实现过程2.1 基础设置2.2 核心函数3.参考资料1.实现目标 使用时间轴对建筑楼层的位置偏移进行控制,实现分层抽屉的动画展示效果。 2.实现过程 建筑抽屉的实现原理比较简单,即对Actor的位置进行偏移,计算并更新其世界位置即可。这里还是基于ArchVizExp…

Windows与Linux端口占用、查看的方法总结

Windows与Linux端口占用、查看的方法总结 文章目录Windows与Linux端口占用、查看的方法总结一、Windows1.1Windows查看所有的端口1.2查询指定的端口占用1.3查询PID对应的进程1.4查杀死/结束/终止进程二、Linux2.1lsof命令2.2netstat命令一、Windows 1.1Windows查看所有的端口 …

如何用Python和hashlib实现文件MD5码的批量存储

目录 简介: 源代码: 源代码说明: 效果如下所示: 简介: 可以考虑以下几个可能的应用: 如果你需要对文件进行校验或验证,你可以使用MD5码来检查文件是否被篡改或损坏。如果你需要对文件进行分…

20230314整理

1.JVM内存区域 程序计数器:字节码解释器通过改变程序计数器来依次读取指令,在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。它的生命周期随着线程的创建而创…