计算机趣闻-千年虫问题

时隔二十年,这个由古老程序员留给新程序员的坑(bug)终于被填上了。
这场危机由程序员开始,也由程序员结束。

在20世纪末,人类社会曾经遭遇过一场空前的大危机,如果这场危机真的降临,甚至有可能终结整个人类文明。

后来,在全世界精英们共同努力之下,这场危机终于得以化解。

这场危机既不是地震,也不是海啸,更不是瘟疫大流行,而是电子计算机带来的“千年虫”问题。

“千年虫”不能称为计算机病毒,它是老一辈程序员留下来的bug(坑)。

 

千年虫问题,到底是怎么来的呢?

说到这个问题,就不得不提起一位伟大的程序媛小姐姐,Grace Murray Hopper。

2020112707395762

 

说起这位小姐姐,那可真是厉害了,她是美国海军准将,也是一位计算机科学家。

Grace Murray Hopper都取得过哪些成就呢?

她发明了最早的现代编译器:A-0系统。

她创造了最早的商用编程语言:COBOL。

她在出故障的计算机里发现了一只飞蛾,使得Bug与Debug成为了计算机领域的流行词汇。

为什么要谈起她呢?因为尽管Grace Murray Hopper很了不起,但是千年虫问题也是她带来的。

 

在上世纪60年代,计算机的存储资源非常稀缺,程序员在编写每一行代码的时候,都要为存储的使用而精打细算。

为了更好的节约内存空间,Grace Murray Hopper采用了6位数字的组合来存储时间信息。比如1965年7月23日,对应存储形式就是65/07/23,省去了前面的“19”。

这样的存储形式,很快就在计算机领域流传开来。尽管它节约了一定的存储成本,却埋下了两个隐患:

1. 由于年份只保留了后两位,当2000年到来的时候,年份存储的信息是“00”,计算机无法区分这到底是1900年,还是2000年。

2. 1900年不是闰年,但2000年是闰年,如果年份的前两位被默认为“19”,那么2000年的2月29日就会被当做3月1日,存储为00/03/01。

这两大隐患,都是到了2000年才会爆发出来,所以这个问题被称为“千年虫”问题,英文缩写为Y2K。

那时候的程序员估计也想不到,自己写的软件居然能运行四十年。

看上去只是时间上一个小小的误差,但是如果放任不管,那么在2000年1月1日,无论是天上的飞机,还是银行的账户,发电厂的自动化设备,亦或是核弹发射井,都有可能发生重大故障。

众所周知,现代的程序基本上都是基于原始的软件开发的。而那些重大的机构设备,例如银行和股票,机器都是几十年不更新的,世界上那么多运行的程序,想要解决千年虫问题绝不是一两个人可以完成的,它需要全世界的程序员一起努力。

作为程序员最害怕的时候是去维护三个月前自己写的代码,最最可怕的是去维护别人的代码。因为可能一些看上去不合逻辑的代码,修改一行也会导致严重的后果。

而如果要去维护四十年前别人的代码,那么恐怖等级将上升一个维度。因为你无法找到当事人去确认某一行代码是做什么用的,而那些程序员可不仅仅是离职那么简单,很有可能都已经离世了。

 

1.抓住重点

既然全量的程序改不过来,那就重点修改那些起到核心作用的程序,比如医疗、航空、金融、军事领域的程序,这样工作量就减少了许多。

2.修改时间窗口

对于大多数不那么核心的程序,程序员们想出了一个取巧的方式,这种方式叫做windowing,翻译过来就是时间窗口。

这种方法暂时保留了6位时间表达,但是表达的时间范围不再是默认的1900年-1999年,而是1920年-2019年。

比如,程序当中的“10”年,以前默认代表着1910年,现在代表着2010年。

这个做法大大降低了修改成本,但是没有根本解决问题,而是把问题的爆发推迟了20年。

这样基本上千年虫问题就解决了,因为已经过了2000年,世界没有毁灭。也没有发生大规模的灾难。

但是在一些局部地区还是带来了一些影响。

非洲冈比亚,一些政府机构的软件系统临时瘫痪了。冈比亚政府特意宣布当天(周一)为非工作日,以暂时减轻出事机关所要承受的压力。

中国广州,某商务公司的7台电脑接二连三出现故障,当他们向软件供应商公司求助时发现,那里已经接到100多家公司数据库瘫痪的消息。

当然,这些小问题和人类文明的毁灭相比,根本算不上什么事情了。

上面说到解决千年虫的办法是将问题的爆发推迟了20年,今年已经2020年了,那么千年虫问题会不会重新爆发呢?

担忧是由道理的,2020年1月1日,纽约的不符停车收费系统就瘫痪了,而波兰的一些老式收银机,也因为时钟故障而无法打印账单。

但是经过20年的过渡,绝大多数设备和程序都已经更新换代,这一次造成的影响微乎其微。

时隔二十年,千年虫这个由老程序员留给新程序员的bug(炸弹)终于被消除了。这场不见硝烟的战争,由程序员引发,也由程序员收尾。

 

 

本文来自投稿,不代表微擎百科立场,如若转载,请注明出处:https://www.w7.wiki/develop/4574.html

发表评论

登录后才能评论