一个Bug让人类科技倒退几十年?
大家好,我是良许。
前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的。
所以,今天就跟大家科普一下这个人类历史上最大的 Bug 。
1. 全世界的恐慌
一个Bug会让人类的科技倒退几十年?
这不是危言耸听,而是真实存在的历史。
1999 年的跨年夜,人们集体陷入恐慌,大家忙着取现金,忙着屯粮,还有人钻进山洞避难,他们感觉世界末日即将到来。
进入新千年本来是一件非常值得纪念的日子,毕竟这辈子这样的机会也不多,但为何全世界却乱成了一锅粥呢?
引起这场混乱的主角,就是著名的「千年虫」。
2. 什么是千年虫
现在新一代的程序员大多是 95 后或 00 后,千年虫来袭的时候他们要么还没出生,要么还在玩泥巴,所以对这场混乱几乎没有任何感知。
所谓的千年虫,并不是一种生物,而是一种计算机 Bug 。
那这又是一种怎样的 Bug ,为何又造成如此大的混乱呢?
简单来讲,千年虫是由于计算机内部时间的存储不合理,导致时间紊乱,从而计算机罢工。1999 年到 2000 年虽然只隔了一年,但实际上这是世纪交替,导致系统时间错乱,随后崩溃。
而这些都是有历史渊源的。
计算机刚诞生的时候,由于技术的限制,导致计算机存储设备非常昂贵。而且贵也就算了,这些存储设备的容量偏偏又非常小(也是没办法的事),所以程序员们在写代码的时候,真的是对每个字符都要精打细算。
想想现在的程序员,可以随意分配内存空间,不为存储而发愁,真的是太幸福了。
为了节约内存,有位靓女想出了用 6 位数表达时间的办法,比如 1989 年 10 月 1 日就写成了 891001 。
这位靓女,就是软件之母的格雷斯霍珀。也就是她,发现了人类历史上的第一个 Bug ,同时也制造了人类历史上最大的 Bug 。
当然,这里并不是在贬低她,在软件行业她给世人做出的贡献都是有目共睹的。更何况,哪个程序员没写过 Bug ?
霍珀发明的 6 位数时间记录法由于十分简单并且非常省内存,所以大家都纷纷效仿。也正是这 6 位数时间记录法的大规模使用,使得千年虫开始悄悄埋伏在人类社会,只等千禧年开始反扑人类。
有计算机常识的小伙伴应该很快发现,这种时间记录法由于年份的前两位被抹去(如 1989 年直接记为 89 ),这就会造成在进入 21 世纪时,出现时间回退的现象。
也就是说,在 2000 年的时候,计算机会认为当前是 1900 年,时间混乱就会由此而产生。
在编程世界里,时间是个非常重要的参数,有很多业务是依赖时间而开展的。一旦时间错乱,可能会引起各种各样莫名其妙的故障。
这就是著名的千年虫问题。
3. 危机埋伏
实际上,在上世界五十年代末的时候,有位叫鲍勃贝默的计算机科学家就发现了这个隐藏的大问题,于是他就开始到处奔走,想让大家认识到这件事情的严重性。
但是,他的声音并没有受到太多关注,原因很简单,那时候距离千禧年还有四十多年,大家觉得还遥遥无期,自己可能都活不到那个时候,以后的事情就交给后人解决吧。
而且,6 位数时间记录法已经大规模使用了,新写的代码都要考虑与老程序兼容。如果换成其它时间表达法,那么工作量就会十分巨大。
时间就这么很快进入到 20 世纪 90 年代,已经越来越多人开始意识到了这个问题的严重性。特别是 1999 年,因为计算机的误判,分别在三个日子出现大规模 bug 现象,这似乎在提醒人们千年虫造成的影响将更为严重。
在当时,计算机虽然没有大量普及到普通人,但银行、证券公司、股票交易所、工厂、机场、发电站,甚至是核弹发射井,都已经大量使用计算机,而且都几乎埋伏着千年虫。
要知道,这些都关乎人类的命脉。
一旦千年虫发作,你的银行账户会被清零,交通也会混乱,电力水利系统瘫痪,飞机航线消失,最可怕的是核电站相当于核弹爆炸的效果,直接经济损失不会小于 1.6 万亿元。
恐慌于是就开始在全球蔓延,大家赶紧把现金从银行取出来,食物、生活用品,也都被哄抢一空,更有甚者,都已经找好了附近的防空洞,仿佛新的世界大战一触即发。
4. 应对千年虫
所以,千年虫一旦发作,让人类科技倒退几十年绝对不是笑话,严重的话可能将直接毁灭人类文明!
于是,为了应对千年虫的出现,各国政府投入了大量的人力物力,想尽各种办法来阻止千年虫的出现。
程序员们熬夜加班,一点点重写有问题的代码。这时候,别说 996 了,为了人类命运,007 也是在所不辞。
但是,由于时间紧迫,工作量巨大,想要在 2000 年前修复完所有的代码,是不可能的一件事情。所以,程序员们只重写了那些简单又很关键的程序。
而剩下的程序,则采用 windowing 修复法,也就是将时间框定在 1920 年至 2020 年,这样 00 就只能代表 2000 。
大家也想到了,这其实就是将千年虫爆发时间往后延长了 20 年,像不像你改 Bug 的样子?
但在时间异常紧迫的情况下,这也是不得己的事情。采用这种修复法,程序员修复了 80% 的 Bug ,也算是应对千年虫取得了阶段性的胜利。
但毕竟没有 100% 消除千年虫,大家依然没有完全放下心来。所以为了应对很多不确定因素,政府、机构纷纷出来了很多政策,以降低千年虫可能造成的影响。
5. 千年虫造成的影响
时间到了 1999 年的最后几秒,大家都紧张到了极点。直到钟声敲响后,人们发现,经济没有崩溃,交通依然正常,导弹没有飞来,几亿颗悬着的心终于放下来了。
千年虫虽然没有大规模爆发,但依然如期而至。
就比如冈比亚,由于缺乏外界的援助,政府机构的计算机受到千年虫袭击而瘫痪,冈比亚政府宣布当天(周一)为非工作日,以暂时减轻出事机关所要承受的压力。
除此之外,全球各国都受到了千年虫不同程度的影响。但相比于人类毁灭,这点损失已经算是非常小的了。
6. 卷土重来的千年虫
前面提到,为了应对千年虫,程序员采用了 windowing 修复法。而这种修复治标不治本,只是将千年虫爆发时间延后了 20 年而已。
所以在 2020 年时,除了新冠这个大病毒之外,千年虫这个老病毒又卷土重来了。
所幸在这 20 年间,人们没有忘记这个千年虫,都做了充足的准备,没有造成重大损失,所以当年大家对千年虫的感知不大。
也有可能是因为大家的关注点都在疫情上了吧。
除了这种 6 位数时间表达法造成的重大 Bug ,还有一种更隐蔽的 Bug ,那就是 2038 年问题。
这种问题又是如何出现的呢?学计算机的朋友都知道,计算机的计时基点是 1970 年 1 月 1日,我们电脑内部时间就是统计从这个基点到现在为止过去了多少秒。
而当时,都是 32 位操作系统,所能表达的极限是 2147483647 (第一位是符号位),换算成时间的话就是 2038 年 01 月 19 日 03 时 14 分 07 秒。
应对这个问题,就是扩展 Unix 时间长度,用 64 位表示,最大可以表示 292,277,026,596 年 12 月 4 日 15 时 30 分 08 秒。而在那个时候,人类的文明还有没有存在都是个问题。
7. 千年虫对程序员的教训
在编程世界里,关于时间的表达都是非常重要的,轻则程序运行异常,重则会出现千年虫类似的重大 Bug 。
所以有关于时间的一些业务处理,都要十分慎重再慎重。
当年我还在职场的时候,有个业务就是关于时间的校正。为了保证时间的准确性,我们采用了 4 种时间验证法(GPS时间、固件时间、内存时间、系统运行时间),彼此互相验证,减少出错的可能。
所以,程序员真正的战场是在代码里,而不是甲方,也不是产品经理。手里的键盘就是我们的武器,程序设计就是我们的秘密,一个个 Bug 就是我们的敌人!
珍惜你身边的每一位程序员,也许将来他们就是拯救世界的主角!
学习编程,千万不要急于求成,一定要多读一些经典书籍,多看源码,多下苦功夫去死磕代码,这样技术才能长进。给大家分享一些程序员必读经典书籍,一定要多读几遍:
有收获?希望老铁们来个三连击,给更多的人看到这篇文章
推荐阅读:
- 干货 | 程序员进阶架构师必备资源免费送
- 刷题 | LeetCode算法刷题神器,看完 BAT 随你挑!
欢迎关注我的博客:良许Linux教程网,满满都是干货!
相关文章:

一个Bug让人类科技倒退几十年?
大家好,我是良许。 前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的。 所以,今天就跟大家科普一下这个人类历史上最大的 Bug 。 1. 全世界的恐慌 一个Bug会让人类…...

2023王道考研数据结构笔记第四章串
第四章 串 4.1 串的定义 4.1.1 串的相关概念 串:即字符串(String)是由零个或多个字符组成的有限序列。一般记为S‘a1a2…an’ (n>0) 其中S是串名,单引号(注:有的地方用双引号,如Java、C&am…...

【AI绘图学习笔记】深度学习相关数学原理总结(持续更新)
如题,这是一篇深度学习相关数学原理总结文,由于深度学习中涉及到较多的概率论知识(包括随机过程,信息论,概率与统计啥啥啥的),而笔者概率知识储备属实不行,因此特意开一章来总结(大部…...

CSGO服务器配置全贴纸插件方法教程
CSGO服务器配置全贴纸插件方法教程 关于插件的警告 一定要了解V社对于CSGO社区服务器的规定,全皮肤插件/全手套插件等,在设置了GSLT的情况下,是有可能被封禁GSLT账号的(所以慎用) 配置好服务器之后呢,想安…...

Python爬虫——使用socket模块进行图片下载
Python爬虫——使用socket模块进行图片下载什么是socket爬虫的工作流程socket爬取图片为什么能用socket能下载图片socket下载图片和request下载图片的区别使用socket下载一张图片使用socket下载多张图片方法1方法2什么是socket Socket 是一种通信机制,用于实现网络…...

通用游戏地图解决方案设计解析
前言: 在软件开发过程中,我们都希望能设计出一个稳健的,可维护的系统,为了实现这个目的,人们总结出了很多相关的设计原则,比如SOLID原则, KISS原则等等。SOLID每个字母代表了一种设计原则&…...

java @Autowired @Resource @Inject 三个注解的区别
javax.annotation.Resourcejdk 内置的,JSR-250 中的注解。依赖注入通过 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor 来处理。org.springframework.beans.factory.annotation.Autowired org.springframework.beans.factory.annotati…...

「媒体分流直播」媒体直播和传统直播的区别,以及媒体直播的特点
传媒如春雨,润物细无声,大家好直播毋庸置疑已经融入到了我们生活的方方面面,小到才艺,游戏,大到政策的发布,许多企业和机构也越来越重视直播,那么一场活动怎么最大化的进行传播,一是…...

数据是如何在计算机中存储的
我们普通人对于数据存储的认识恐怕大多数都是从自己使用的电脑来的。现在几乎人手一台电脑,而我们的电脑存储着各种各样的文件,比如视频文件、音频文件和Word文档等。这些文件从计算机术语的角度都可以称为数据。 如图1-1所示是Windows 10 “我的电脑”的截图。通过该截图我…...

Day907.分区表 -MySQL实战
分区表 Hi,我是阿昌,今天学习记录的是关于分区表的内容。 经常被问到这样一个问题: 分区表有什么问题,为什么公司规范不让使用分区表呢? 一、分区表是什么? 为了说明分区表的组织形式,先创建…...

C++概览:工具链、基础知识、进阶及总结
本篇写给C初学者,作为概览,文中仅包含各方面基础知识,无深入分析。 C基础概念简介 C编译过程示意图 关键词:源文件、预编译、编译、汇编、链接 C工具链总结 cmake项目工程文件是一种中介工程文件,可以转化成其他…...

目标检测中回归损失函数(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…...

JOSN数据转换和解析
文章目录JOSN数据转换和解析内容回顾Map 集合转成 JSON 字符串List 集合转换成 JSON 字符串Ajax 异步和同步异步概念同步概念异步和同步区别异步请求案例同步请求时间格式化旧时间 api 格式化格式化和解析的工具类JSTL 时间格式化JSTL 使用JOSN数据转换和解析 内容回顾 ajax …...

浅析Linux内核中进程完全公平CFS调度
一、前序 目前Linux支持三种进程调度策略,分别是SCHED_FIFO 、 SCHED_RR和SCHED_NORMAL;而Linux支持两种类型的进程,实时进程和普通进程。实时进程可以采用SCHED_FIFO 和SCHED_RR调度策略;普通进程则采用SCHED_NORMAL调度策略。从…...

安装 RustDesk 服务器 (适用 Rocky Linux, CentOS, RHEL 系列发行版)
环境:Rocky Linux 9.1 1. 安装 Docker Engine 可以参考 [[linux-docker-rocky-install]] https://cc01cc.com/2023/03/02/linux-docker-rocky-install/英文可以参考官方文档 Install Docker Engine on RHEL https://docs.docker.com/engine/install/rhel/ 2. 安装…...

23种设计模式-策略模式
策略模式是一种设计模式,它允许在运行时选择算法的行为。它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端。在本文中,我们将深入探讨策略模式的概念和实际应用&#…...

C#开发的OpenRA的游戏主界面怎么样创建
通过前面加载界面布局数据,可以把整个界面逻辑的数据加载到内存, 但是这些数据怎么显示出来,又是没有定义的。比如前面定义了多个界面的布局, 又是怎么样知道需要显示哪一个界面? 现在就来解决这个问题,其实整个游戏都是可以通过yaml文件进行配置的, 所以我们需要从yaml…...

考研还是工作?两战失败老道有话说
老道入职第一周自我介绍谈谈考研谈谈工作新的启程自我介绍 大家好!在下是一枚考研失败两次的自认为聪明能干的有点小帅的实则超级垃圾的三非名校毕业的自动化渣男。大一下就加入实验室,在实验室焊板子、画板子、培训、打比赛外加摸鱼;参加过…...

引用是否有地址的讨论的
说在前头,纯属个人理解,关于引用是否有地址,实际上并没有一个很统一的说法, C标准没有规定一个引用是否需要占用一块内存。 这里引用知乎“C 中引用是一块内存的标记,那引用本身有地址吗_百度知道 (baidu.com)”里面的…...

1、JAVA 开发环境搭建 - JDK 的安装配置
文章目录一、下载 JDK81、官网地址:[**https://www.oracle.com**](https://www.oracle.com)二、安装 JDK1、鼠标右键安装包,以管理员身份运行(无脑下一步即可)2、细节说明三、配置环境变量1、为啥要配置环境变量呢?2、原因分析3、配置环境变量…...

【Storm】【六】Storm 集成 Redis 详解
Storm 集成 Redis 详解 一、简介二、集成案例三、storm-redis 实现原理四、自定义RedisBolt实现词频统计一、简介 Storm-Redis 提供了 Storm 与 Redis 的集成支持,你只需要引入对应的依赖即可使用: <dependency><groupId>org.apache.storm…...

算法代码题——模板
文章目录1. 双指针: 只有一个输入, 从两端开始遍历2. 双指针: 有两个输入, 两个都需要遍历完3. 滑动窗口4. 构建前缀和5. 高效的字符串构建6. 链表: 快慢指针7. 反转链表8. 找到符合确切条件的子数组数9. 单调递增栈10. 二叉树: DFS (递归)]11. 二叉树: DFS (迭代)12. 二叉树: …...

CentOS 7.9汇编语言版Hello World
先下载、编译nasm汇编器。NASM汇编器官网如下图所示: 可以点图中的List进入历史版本下载网址: 我这里下载的是nasm-2.15.05.tar.bz2 在CentOS 7中,使用 wget http://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2下载…...

CoreData数据库探索
CoreData是什么 Core Data 是苹果公司提供的一个对象-关系映射框架(Object-Relational Mapping,ORM),用于管理应用程序的数据模型。Core Data 提供了一个抽象层,使开发人员能够使用面向对象的方式访问和操作数据&…...

FreeRTOS入门
目录 一、简介 二、堆的概念 三、栈的概念 四、从官方源码中精简出第一个FreeRTOS程序 五、修改官方源码增加串口打印 一、简介 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、…...

JVM运行时数据区划分
Java内存空间 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机…...

重装系统一半电脑蓝屏如何解决
小编相信大家在使用电脑或者给电脑重装系统的时候都遇到过电脑蓝屏等等故障问题。最近有用户就遇到了这样一个问题,问小编重装系统一半电脑蓝屏怎么办,那么今天小编就告诉大家重装系统一半电脑蓝屏的解决方法。 工具/原料: 系统版本&#x…...

SpringBoot(tedu)——day01——环境搭建
SpringBoot(tedu)——day01——环境搭建 目录SpringBoot(tedu)——day01——环境搭建零、今日目标一、IDEA2021项目环境搭建1.1 通过 ctrl鼠标滚轮 实现字体大小缩放1.2 自动提示设置 去除大小写匹配1.3 设置参数方法自动提示1.4 设定字符集 要求都使用UTF-8编码1.5 设置自动编…...

springboot整合redis
1.redis的数据类型,一共有5种.后面结合Jedis和redistemplate,以及单元测试junit一起验证 1)字符串 2)hash 3)列表 4)set(无序集合) 5)zset(有序集合) 2.Jedis的使用 a)引入依赖 <!--加入springboot的starter的起步依赖--><dependency><groupId>…...

【Java】Spring Boot下的MVC
文章目录Spring MVC程序开发1. 什么是Spring MVC?1.1 MVC定义1.2 MVC 和 Spring MVC 的关系2. 为什么学习Spring MVC?3. 怎么学习Spring MVC?3.1 Spring MVC的创建和连接3.1.1 创建Spring MVC项目3.1.2 RequestMapping 注解介绍3.1.3 Request…...