31

20年前偷懒修复的千年虫bug归来,程序员:该来的总会来

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzA3NTIyODUzNA%3D%3D&%3Bmid=2649580862&%3Bidx=2&%3Bsn=6a8ed7c798aa5c5c6f2d78b13d46728c
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

UFRzMnF.gif

新的十年开始了。

二十年前,在千禧之年钟声敲响的时候,诸多 Y2K 应急队的程序员坐在电脑前惴惴不安, 他们此前刚刚用最简单易行的 “懒人方法” 修补了一个被称为“千年虫”(Millennium Bug,又称 Y2000 problem,简称“Y2K”)的大 bug 。二十年后,这群程序员老了,但是新一代的青年程序员又要为老一辈的懒惰而付出代价。

据《纽约时报》报道,纽约的停车收费表从 2020 年 1 月 1 日开始不支持信用卡付款,整个城市的一万多个计费表已手动更新,仅通过现金或 ParkNYC 接受付款; 波兰公司 Novitus 生产的收银机由于记录时间故障而无法打印收据; 视频游戏 WWE 2K20 于 2020 年 1 月 1 日午夜停止工作; 华为手表和部分设备丢掉了新年伊始两三天的 TrueSleep 睡眠数据,需要更新并重启……

jYbYbeR.jpg!web

图 | 纽约市交通局表示,停车计时器的信用卡支付软件设定在 1 月 1 日失效,导致了一起大规模故障(来源: The New York Times)

程序员 Jef Poskanzer 在推特上发文: 似乎有相当数量的系统出现 #2020 错误 当年解决 Y2K 问题的方案把这个问题推迟了 20 年……20 年后的今天,当时的一些系统仍然还在使用,系统以为我们在 1920 年。

ENRZziz.jpg!web

图 | Jef Poskanzer 的推文(来源: Twitter 截图)

千禧年前后出生的青少年们或许很少有人知道“千年虫”。

大约在 20 世纪 80 年代中期以前投用的系统上,囿于存储空间有限,再加上人们普遍觉得系统更新会很快,所以程序员大多采用两位数来表示年份,比如 06/15/98,而不是 06/15/1998。 但是到了 2000 年,系统只知道是 01/01/00,不知道这是 1900 还是 2000。

千年虫主要集中在配备较早的主机系统上,如在 IBM 4381,IBM AS/400 等机型上运行的应用程序,比如美国的 AT&T 电讯公司,其内部就有超过 3.6 亿行的应用程序需要检测是否存在 Y2K 问题。 另外,在自动化仪器仪表、电梯、警报系统、恒温灯等嵌入式设备也容易存在千年虫隐患。

视频 | Y2K 启示录(来源: YouTube)

计算机在上世纪六七十年代开始普及,到九十年代,人们开始意识到问题的严重性: 不知道从 1999 年最后一天的 23:59 到 2000 年第一天的 00:00 的转变意味着什么? 在渲染和炒作下,大众的惊恐程度不亚于“2012”。 人们猜测,如果程序停止运行、崩溃或者发出错误指令,是否影响到银行、电站、航线等等,存款会一夜清零、恐怖袭击、飞机坠落、股市崩溃,世界陷入混乱?

当时甚至有媒体报道,有人把山洞当做避难所,存储了很多食物、医疗包等必需品,还有一些人把银行存款纷纷取出来或者是购买黄金。

6rY3qqU.jpg!web

图 | 1999 年 1 月 18 日,TIME 的封面(来源: Time)

为了避免 “灾难” 发生,政府和企业动用大量资源查找和修复这个 bug。 有报道显示,当时克林顿政府和业内人士估计,用 “windowing” 的方式修补 80% 的计算机,预计耗资数千亿美元。 BBC 报道认为全球花在防备千年虫上的费用在 3000 亿到 5000 亿美元之间。 真实耗资目前无法考证。 也有言论说千年虫是个商业大骗局。

当时修复 bug 的方式有两种: 完全重写代码,或者采用 “windowing” 的方式快速修复。 “windowing”就是把 00 到 20 之间的所有日期都当做 20XX 年而不是 19XX 年。很显然,相比于把所有两位数表示的年份都修改成四位数,后一种方式更省钱、更快而且更容易。

从 1970/01/01 开始,很多编程语言和系统都把日期时间以秒来处理,也叫 Unix time。 因此,鉴于中点 1970 的重要性,编码人员选择 1920 到 2020 作为标准窗口。

Unix time 被广泛用于各种行业操作系统,并被视为是一种标准。 Unix 和 Windows 系统有环境变量来为系统设置 “转折年”。 “转折年” 以后的任何一年属于本世纪,“转折年”以及 “转折年” 之前的任意一年属于上个世纪。 但是一些产品,如 Microsoft Excel 95 使用的是 1920-2020 年的 windowing,在解决千年虫问题之后,仅仅过 20 年就有可能再次出现日期错误。

j6bUZvf.jpg!web

图 | 2020 年 “Y2K” 又回来了(来源: Popular Mechanics)

当时的专家认为,等到程序员投入大量的资金和时间去永久修复好这些 bug 之后,系统早就被更换了。 所以,尽管 “windowing” 修复的程序智能使用二三十年,专家也觉得足够了。

伦敦经济学院 (London School of Economics) 的迪伦 • 穆尔文 (Dylan Mulvin) 表示: “windowing 是所有解决方案中最糟糕的一种,即便是在千年虫问题期间。

2020 年的到来,意味着我们已经进入到了 1920-2020 窗口期的末端。 2019 年 11 月,由于被发现容易受到 Y2020“攻击”,大数据公司 Splunk 向用户推出了修复服务,它的用户涵盖了美国《财富》一百强公司中的 92 家。由于各家公司尚未披露相关细节, 目前还不清楚 “Y2020” 将持续多久

另外,在 2038 年我们将面临另一个数据存储问题。 32 位的 Unix 和 Linux,能存储的最大数字为 2 的 31 次方,即 2147483647。从 1997 年开始计算,2147483647 用来表示的秒数最多只能用到 2038 年 01 月 19 日 03 时 14 分 07 秒,在这个时间之后,系统会回到 - 2147483648,代表的时期是 1901 年 12 月 13 日 20 时 45 分 52 秒。

不同于千年虫,2038 会影响的不仅仅是应用层,而是会影响到最底层的时间控制功能。 不过幸运的是,如果能在 2038 年之前把所有 32 位系统淘汰并采用 64 位的话,我们将会巧妙地躲开 2038 问题。

-End-

参考:

https://www.newscientist.com/article/2229238-a-lazy-fix-20-years-ago-means-the-y2k-bug-is-taking-down-computers-now/

6ra6BbV.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK