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

news2024/11/19 15:19:18

大家好,我是良许。

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

所以,今天就跟大家科普一下这个人类历史上最大的 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.coloradmin.cn/o/388446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中的自动类型提升与强制类型转换

一、自动类型提升 自动类型提升是指在程序运行时因为某种情况需要,JVM将较小的数据类型自动转换为较大的数据类型,以保证精度和正确性。在Java中,需要进行类型提升的情况有以下几种: 1. byte、short和char提升为int类型 当运算…

spark sql(五)sparksql支持查询哪些数据源,查询hive与查询mysql的区别

1、数据源介绍 sparksql默认查询的数据源是hive数据库,除此之外,它还支持其它类型的数据源查询,具体的到源码中看一下: 可以看到sparksql支持查询的数据源有CSV、parquet、json、orc、txt、jdbc。这些数据源中前面五个我还能理解&…

【Python】RPA批量生成word文件/重命名及批量删除

批量生成word文件 场景:需要新建多个类似文件名 比如:今天的事例是新建12个文件名为: ​ 保安员考试试卷1及答案.docx ​ 保安员考试试卷2及答案.docx ​ … ​ 保安员考试试卷12及答案.docx 痛点: ​ 手动操作重复性高&a…

目标检测中回归损失函数(L1Loss,L2Loss,Smooth L1Loss,IOU,GIOU,DIOU,CIOU,EIOU,αIOU ,SIOU)

文章目录L-norm Loss 系列L1 LossL2 LossSmooth L1 LossIOU系列IOU (2016)GIOU (2019)DIOU (2020)CIOU (2020)EIOU (2022)αIOU (2021)SIOU (2022…

【SpringCloud】SpringCloud详解之Eureka实战

目录前言SpringCloud Eureka 注册中心一.服务提供者和服务消费者二.需求三.搭建Eureka-Server四.搭建Eureka-Client(在服务提供者配置:用户订单)前言 微服务中多个服务,想要调用,怎么找到对应的服务呢? 这里有组件的讲解 → SpringCloud组件…

深圳大学《计算机论题》作业:大数据与人工智能技术对人类生活的影响

说明 本作业为小组作业,要求基于一场报告完成(即观后感)。共分4个小题,讨论人工智能时代的伦理思考。由于版权原因,不提供报告的具体内容,只展示答题内容。 第一题 (1) 你如何看待…

winform控件PropertyGrid的应用(使运行中的程序能像vistual studio那样设置控件属性)

上周在看别人写的上位机demo代码时,发现创建的项目模板是"Windows 窗体控件库"(如下图) 生成的项目结构像自定义控件库,没有程序入口方法Main,但却很神奇能调试,最后发现原来Vistual Studio启动了一个外挂程序UserContr…

LSM(日志结构合并树)_笔记

WAL:Write Ahead Log 写前日志,顺序日志文件 1 LSM tree的定义 LSM tree: Log-Structured-Merge-Tree,日志结构合并树。 Log-Structured Merge-tree (LSM-tree) is a disk-based data structure designed to provide low-cost …

Linux操作系统学习(了解文件系统动静态库)

文章目录浅谈文件系统了解EXT系列文件系统目录与inode的关系软硬链接动静态库浅谈文件系统 当我们创建一个文件时由两部分组成:文件内容文件属性,即使是空文件也有文件属性 一个文件没有被打开是存储在磁盘中的,而磁盘是计算机中的一个机械…

你想赚的钱不一定属于你

昨天一个同行跟我说,最近有个五十多万的订单,客户是拿着别人家的设计来找的他,跟了也有大半个月了,自己明明报的价格比原设计的公司要低,客户一直说会尽快下的,他原本想着能够从这个订单里赚到几万块&#…

王道计算机组成原理课代表 - 考研计算机 第六章 总线 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 计算机组成 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “总线” 章节知识点总结的十分全面,涵括了《计算机组成原理》课程里的…

软件测试用例(3)

按照测试对象划分: 一)界面测试: 1)软件只是一种工具,软件和人的信息交流是通过界面来进行的,界面是软件和用户交流的最直接的一层,界面的设计决定了用户对于我们设计软件的第一映像,界面如同人的面孔,具有最吸引用户的…

Java中String详解(从原理理解经典面试题)

本篇文章我先通过经典面试题,筛选需要观看本篇文章的朋友,然后咱们介绍String的基本特性,通过基本特性就可以找到面试题的答案。最后咱们再深入每个面试题,通过字节码、编译原理、基本特性深入剖析所有的面试题,让大家…

jsp试卷分析管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP试卷分析管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

三、JavaScript

目录 一、JavaScript和html代码的结合方式 二、javascript和java的区别 1、变量 2、运算 3、数组(重点) 4、函数 5、重载 6、隐形参数arguments 7、js中的自定义对象 三、js中的事件 四、DOM模型 五、正则表达式 一、JavaScript和html代码的结合方…

代码执行漏洞 | iwebsec

文章目录00-代码执行漏洞原理环境01-eval函数示例命令执行写入webshellbash反弹shell02-assert函数示例webshell03-call_user_func函数示例04-call_user_func_array函数示例总结05-create_function函数示例06-array_map函数示例总结08-preg_replace漏洞函数示例07-preg_replace…

Centos 部署Oracle 11g

Centos 部署Oracle 11g部署Oracle 11g准备工作服务器信息oracle安装包服务器准备oracle环境安装Oracle静默方式配置监听以静默方式建立新库及实例部署Oracle 11g 在SpringMVC模式下开发web项目,必然会使用到关系型数据库来存储数据,目前使用比较多的关系…

18、多维图形绘制

目录 一、三维图形绘制 (一)曲线图绘制plot3() (二)网格图绘制 mesh() (三)曲面图绘制 surf() (四)光照模型 surfl() (五)等值线图(等高线图)绘制 cont…

电力系统系统潮流分析【IEEE 57 节点】(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…

C语言函数:字符串函数及模拟实现strcmp()

C语言函数&#xff1a;字符串函数及模拟实现strcmp() strcmp()函数&#xff1a; 作用&#xff1a;进行字符串的比较大小。 引入&#xff1a;如下代码&#xff0c; #define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main() {char* p "wan";char* q &qu…