1、全世界的恐慌
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 就是我们的敌人!珍惜你身边的每一位程序员,也许将来他们就是拯救世界的主角!- EOF -
关注「程序员的那些事」加星标,不错过圈内事
点赞和在看就是最大的支持❤️
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/