乐趣区

关于java:一个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 就是咱们的敌人!

珍惜你身边的每一位程序员,兴许未来他们就是援救世界的配角!


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

收费送给大家,只求大家金指给我点个赞!

程序员必读经典书单(高清 PDF 版)

有播种?心愿老铁们来个三连击,给更多的人看到这篇文章

举荐浏览:

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

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

退出移动版