一段没人敢动的旧代码,差点在千禧年把全世界拉下水
有个事情现在的年轻程序员可能很难想象:在计算机存储空间还按字节精打细算的年代,写代码的人为了抠出几个字符的位置,在日期表示上做了一个极省的决定——用六位数字记录时间,格式是XX/XX/XX,年份只取后两位。
也就是说,系统默认前两位是19。1998年就存成98,1999年就存成99。当时的人觉得这笔账怎么算都划算,反正这堆代码不可能跑到2000年还在用。
结果所有人都错判了。
后来一代又一代的程序员,全都沿着这条路往下走。有人也提过,说到2000年这个省事的写法会炸,但没人当回事。理由很简单:前辈写的代码,跑得好好的,谁敢乱动?圈子里有条不成文的规矩——一段代码哪怕已经变成一坨纠缠不清的东西,只要它还能跑,就尽量别伸手去改。你永远不知道动一根线头会不会把整张网扯散。
就这样,这套六位数的时间标记法渗透进了各个角落。银行在用,民航在用,政府机构在用,军方也在用。等到大家回过神来,这已经不只是一家公司的技术债了,这是整个人类社会坐在上面的一座庞然大物——层层叠叠,由无数个当年为了省事而留下的历史遗留堆积而成。
这座庞然巨物上面跑着维持现代文明的各类系统,而它的底座刻着一行小字:年份只能用到1999。
可以想象一下那个画面:一个人周日晚正常入睡,按计划周一起床上班。结果醒来一看日历,上面写的不是星期一,而是星期八。一种原本不存在的日期突然出现在计时体系里,大脑第一反应是空白——今天算什么?该干嘛?电脑面对的情况一模一样。当99翻成00,系统会以为自己回到了1900年,紧接着就是逻辑错乱,全线停摆。
放任不管的话,2000年1月1日零点一过,所有踩着这座累积多年的旧代码运行的关键设施,会像多米诺骨牌一样接连倒下。机场的调度系统、铁路的信号控制、各种军事设施的指挥网络,一旦机器不认识今天的日期,后果不是闹着玩的。
那一年,社会上确实出现了真实的恐慌。有人担心银行系统会把存款当成1900年的数据来处理,余额直接归零,于是冲到柜台要把钱全取出来换成现金和粮食。这种恐慌不是看了什么末日电影之后自己吓自己,而是人们隐约意识到:这次要命的漏洞,好像不太一样。
1999年,全世界都在跟时间赛跑,想把这座压在所有人之上的旧代码堆积给拆掉。但问题是它太大、太广、太深了。连着各行各业、各个年代、各个厂商的设备,有些原始文档早就找不到了,有些当年的开发人员已经不在岗位上了。最后只能集中精力,先把最关键的地方保住。
那一年最终扛过去了。新世纪的太阳照常升起来。但它不是白扛的。
事后统计,光是为了给这个漏洞善后,直接修复的投入加上间接的经济损失,总额超过了六千亿美元。部分公共服务系统还是在元旦当天短暂瘫痪了。人类文明没有被一笔清零,但这一跤摔得足够疼——折算下来,相当于连续两年半把全美国所有交通事故造成的直接和间接损失加在一起。
而那一切的开端,不过是多年前有人觉得,年份多写两个数字太浪费空间了。