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

大家好,我是良许。

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

所以,今天就跟大家科普一下这个人类历史上最大的 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教程网,满满都是干货!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jQuery《一篇搞定》

今日内容 一、JQuery 零、 复习昨日 1 写出至少15个标签 2 写出至少7个css属性font-size,color,font-familytext-algin,background-color,background-image,background-sizewidth,heighttop,bottom ,left ,rightpositionfloatbordermarginpadding 3 写出input标签的type的不…

flex布局左边宽度固定,右边宽度动态扩展问题

我们希望在一个固定宽度的容器中&#xff0c;分左右两边&#xff0c;左边宽度固定大小&#xff0c;右边占满&#xff0c;使用flex布局时&#xff0c;如下&#xff1a; 对应代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta…

LeetCode - 198 打家劫舍

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装…

【华为机试真题 Python实现】2023年1、2月高频机试题

文章目录2023年1季度最新机试题机考注意事项1. 建议提前刷题2. 关于考试设备3. 关于语言环境3.1. 编译器信息3.2. ACM 模式使用sys使用input&#xff08;推荐&#xff09;3. 关于题目分值及得分计算方式4. 关于做题流程5. 关于作弊2023年1季度最新机试题 两个专栏现在有200博文…

2023还有人不知道kubernetes?| 初步理解kubernetes

文章目录Kubernetes(K8s)一、Openstack&VM1、**认识虚拟化****1.1**、什么是虚拟化**1.2、虚拟化分类**2、OpenStack与KVM、VMWare2.1、OpenStack2.2、KVM2.3、VMWare二、容器&编排技术1、容器发展史1.1、Chroot1.2、FreeBSD Jails1.3、Solaris Zones1.4、LXC1.5、Dock…

深度学习 Day26——使用Pytorch实现猴痘病识别

深度学习 Day26——使用Pytorch实现猴痘病识别 文章目录深度学习 Day26——使用Pytorch实现猴痘病识别一、前言二、我的环境三、前期工作1、设置GPU导入依赖项2、导入猴痘病数据集3、划分数据集四、构建CNN网络五、训练模型1、设置超参数2、编写训练函数3、编写测试函数4、正式…

【LeetCode】1544. 整理字符串、LCP 44. 开幕式焰火

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1544. 整理字符串 LCP 44. 开幕式焰火 1544. 整理字符串 1544. 整理字符串 题目描述…

金三银四、金九银十 面试宝典 Spring、MyBatis、SpringMVC面试题 超级无敌全的面试题汇总(超万字的面试题,让你的SSM框架无可挑剔)

Spring、MyBatis、SpringMVC 框架 - 面试宝典 又到了 金三银四、金九银十 的时候了&#xff0c;是时候收藏一波面试题了&#xff0c;面试题可以不学&#xff0c;但不能没有&#xff01;&#x1f941;&#x1f941;&#x1f941; 一个合格的 计算机打工人 &#xff0c;收藏夹里…

正则表达式高阶技巧之匹配模式(使用python实现)

匹配模式介绍不区分大小写模式模式的指定方式应用单行模式多行模式注释模式其它模式修饰符的作用范围介绍 我们在正则中所说得匹配模式&#xff08;match mode&#xff09;&#xff0c;指的是匹配时使用的规则。设置特定的匹配模式&#xff0c;可能会改变对正则表达式的识别&a…

业内人士真心话,软件测试是没有前途的,我慌了......

我在测试行业爬模滚打7年&#xff0c;从点点点的功能测试到现在成为高级测试&#xff0c;工资也翻了几倍。个人觉得&#xff0c;测试的前景并不差&#xff0c;只要自己肯努力。 我刚出来的时候是在鹅厂做外包的功能测试&#xff0c;天天点点点&#xff0c;很悠闲&#xff0c;点…

Spark SQL支持DataFrame操作的数据源

DataFrame提供统一接口加载和保存数据源中的数据&#xff0c;包括&#xff1a;结构化数据、Parquet文件、JSON文件、Hive表&#xff0c;以及通过JDBC连接外部数据源。一个DataFrame可以作为普通的RDD操作&#xff0c;也可以通过&#xff08;registerTempTable&#xff09;注册成…

嵌入式安防监控项目——实现真实数据的上传

目录 一、相关驱动开发 二、A9主框架 三、脚本及数据上传实验 https://www.yuque.com/uh1h8r/dqrma0/tx0fq08mw1ar1sor?singleDoc# 《常见问题》 上个笔记的相关问题 一、相关驱动开发 /* mpu6050六轴传感器 */ i2c138B0000 { /* #address-cells <1>…

web实现太极八卦图、旋转动画、定位、角度、坐标、html、css、JavaScript、animation

文章目录前言1、html部分2、css部分3、JavaScript部分4、微信小程序演示前言 哈哈 1、html部分 <div class"great_ultimate_eight_diagrams_box"><div class"eight_diagrams_box"><div class"eight_diagrams"><div class&…

SpringBoot-实用开发篇

SpringBoot开发实用篇开发实用篇中因为牵扯到SpringBoot整合各种各样的技术&#xff0c;所以在整合每一个技术之前&#xff0c;都会做一个快速的普及&#xff0c;这样的话内容整个开发实用篇所包含的内容就会比较多。在学习的时候&#xff0c;如果对某一个技术不是很清楚&#…

硬刚ChatGPT!文心一言能否为百度止颓?中国版ChatGPT“狂飙”的机会在哪儿?

文章目录目录产品背景发展历程科技简介主要功能合作伙伴结语文心一言 &#xff08;英文名&#xff1a;ERNIE Bot&#xff09; *是百度基于文心大模型技术推出的生成式对话产品&#xff0c;被外界誉为“中国版ChatGPT”&#xff0c;将于2023年3月份面向公众开放。 [40] 百度在人…

python自动化办公(二)

上接python自动化办公&#xff08;一&#xff09; 文章目录文件和目录操作使用shutil库文件查找globfnmatchhashlib文件和目录操作 使用shutil库 shutil库也是Python标准库&#xff0c;它可以处理文件、文件夹、压缩包&#xff0c;能实现文件复制、移动、压缩、解压缩等功能。…

Vue基础23之路由第二节

Vue基础23路由路由的query参数src/router/index.jsDetail.vueHomeMessage.vue路由的query参数命名路由src/router/index.jsHomeMessage.vueApp.vue总结路由的params参数src/router/index.jsHomeMessage.vueDetail.vue总结路由 路由的query参数 src/router/index.js //该文件专…

Gehpi的网络布局

Gehpi的网络布局1. 力引导布局2. 辅助布局布局是网络可视化中的重要概念&#xff0c;指将点和边通过某种策略进行排布&#xff0c;应尽可能满足以下4个原则&#xff1a; 节点均匀分布在有限的区域内避免边的交叉和弯曲保持边的长度一致整体布局能反映图内在的特性 Gephi的布局…

卷积神经网络

目录卷积神经网络概述神经网络原理卷积神经网络卷积层怎么控制输出数据&#xff1f;如何抓取特征池化层归一化层全连接层局部感受野权值共享多卷积核池化子采样多卷积层卷积神经网络的训练前向传播BackForward反向传播权值更新过程中的卷积网络结构层的排列规律层的尺寸设置规律…

web3:区块链共识机制系列-POS(Proof of Stake)股权证明算法

web3相关学习一并收录至该博客&#xff1a;web3学习博客目录大全 前情衔接&#xff1a;web3:区块链常见的几大共识机制及优缺点 目录前言算法公式与原理算法公式运作原理以Peer Coin为例缺陷优点缺点特点分类发展历程casper协议1.什么是无成本利益关系问题2.引入casper协议解决…