一個Bug讓人類科技倒退幾十年?

良許發表於2023-03-11

大家好,我是良許。

前幾天在直播的時候,問了直播間的小夥伴有沒人知道「千年蟲」這種神奇的「生物」的,居然沒有一人能夠答得上來的。

所以,今天就跟大家科普一下這個人類歷史上最大的 Bug 。

file

1. 全世界的恐慌

一個Bug會讓人類的科技倒退幾十年?

這不是危言聳聽,而是真實存在的歷史。

1999 年的跨年夜,人們集體陷入恐慌,大家忙著取現金,忙著屯糧,還有人鑽進山洞避難,他們感覺世界末日即將到來。

進入新千年本來是一件非常值得紀念的日子,畢竟這輩子這樣的機會也不多,但為何全世界卻亂成了一鍋粥呢?

引起這場混亂的主角,就是著名的「千年蟲」。

2. 什麼是千年蟲

現在新一代的程式設計師大多是 95 後或 00 後,千年蟲來襲的時候他們要麼還沒出生,要麼還在玩泥巴,所以對這場混亂幾乎沒有任何感知。

所謂的千年蟲,並不是一種生物,而是一種計算機 Bug 。

那這又是一種怎樣的 Bug ,為何又造成如此大的混亂呢?

簡單來講,千年蟲是由於計算機內部時間的儲存不合理,導致時間紊亂,從而計算機罷工。1999 年到 2000 年雖然只隔了一年,但實際上這是世紀交替,導致系統時間錯亂,隨後崩潰。

而這些都是有歷史淵源的。

計算機剛誕生的時候,由於技術的限制,導致計算機儲存裝置非常昂貴。而且貴也就算了,這些儲存裝置的容量偏偏又非常小(也是沒辦法的事),所以程式設計師們在寫程式碼的時候,真的是對每個字元都要精打細算。

想想現在的程式設計師,可以隨意分配記憶體空間,不為儲存而發愁,真的是太幸福了。

為了節約記憶體,有位靚女想出了用 6 位數表達時間的辦法,比如 1989 年 10 月 1 日就寫成了 891001 。

這位靚女,就是軟體之母的格雷斯霍珀。也就是她,發現了人類歷史上的第一個 Bug ,同時也製造了人類歷史上最大的 Bug 。

file

當然,這裡並不是在貶低她,在軟體行業她給世人做出的貢獻都是有目共睹的。更何況,哪個程式設計師沒寫過 Bug ?

霍珀發明的 6 位數時間記錄法由於十分簡單並且非常省記憶體,所以大家都紛紛效仿。也正是這 6 位數時間記錄法的大規模使用,使得千年蟲開始悄悄埋伏在人類社會,只等千禧年開始反撲人類。

有計算機常識的小夥伴應該很快發現,這種時間記錄法由於年份的前兩位被抹去(如 1989 年直接記為 89 ),這就會造成在進入 21 世紀時,出現時間回退的現象。

也就是說,在 2000 年的時候,計算機會認為當前是 1900 年,時間混亂就會由此而產生。

file

在程式設計世界裡,時間是個非常重要的引數,有很多業務是依賴時間而開展的。一旦時間錯亂,可能會引起各種各樣莫名其妙的故障。

這就是著名的千年蟲問題。

3. 危機埋伏

實際上,在上世界五十年代末的時候,有位叫鮑勃貝默的電腦科學家就發現了這個隱藏的大問題,於是他就開始到處奔走,想讓大家認識到這件事情的嚴重性。

但是,他的聲音並沒有受到太多關注,原因很簡單,那時候距離千禧年還有四十多年,大家覺得還遙遙無期,自己可能都活不到那個時候,以後的事情就交給後人解決吧。

而且,6 位數時間記錄法已經大規模使用了,新寫的程式碼都要考慮與老程式相容。如果換成其它時間表達法,那麼工作量就會十分巨大。

file

時間就這麼很快進入到 20 世紀 90 年代,已經越來越多人開始意識到了這個問題的嚴重性。特別是 1999 年,因為計算機的誤判,分別在三個日子出現大規模 bug 現象,這似乎在提醒人們千年蟲造成的影響將更為嚴重。

在當時,計算機雖然沒有大量普及到普通人,但銀行、證券公司、股票交易所、工廠、機場、發電站,甚至是核彈發射井,都已經大量使用計算機,而且都幾乎埋伏著千年蟲。

要知道,這些都關乎人類的命脈。

一旦千年蟲發作,你的銀行賬戶會被清零,交通也會混亂,電力水利系統癱瘓,飛機航線消失,最可怕的是核電站相當於核彈爆炸的效果,直接經濟損失不會小於 1.6 萬億元。

恐慌於是就開始在全球蔓延,大家趕緊把現金從銀行取出來,食物、生活用品,也都被哄搶一空,更有甚者,都已經找好了附近的防空洞,彷彿新的世界大戰一觸即發。

file

4. 應對千年蟲

所以,千年蟲一旦發作,讓人類科技倒退幾十年絕對不是笑話,嚴重的話可能將直接毀滅人類文明!

於是,為了應對千年蟲的出現,各國政府投入了大量的人力物力,想盡各種辦法來阻止千年蟲的出現。

程式設計師們熬夜加班,一點點重寫有問題的程式碼。這時候,別說 996 了,為了人類命運,007 也是在所不辭。

但是,由於時間緊迫,工作量巨大,想要在 2000 年前修復完所有的程式碼,是不可能的一件事情。所以,程式設計師們只重寫了那些簡單又很關鍵的程式。

而剩下的程式,則採用 windowing 修復法,也就是將時間框定在 1920 年至 2020 年,這樣 00 就只能代表 2000 。

大家也想到了,這其實就是將千年蟲爆發時間往後延長了 20 年,像不像你改 Bug 的樣子?

但在時間異常緊迫的情況下,這也是不得己的事情。採用這種修復法,程式設計師修復了 80% 的 Bug ,也算是應對千年蟲取得了階段性的勝利。

file

但畢竟沒有 100% 消除千年蟲,大家依然沒有完全放下心來。所以為了應對很多不確定因素,政府、機構紛紛出來了很多政策,以降低千年蟲可能造成的影響。

5. 千年蟲造成的影響

時間到了 1999 年的最後幾秒,大家都緊張到了極點。直到鐘聲敲響後,人們發現,經濟沒有崩潰,交通依然正常,導彈沒有飛來,幾億顆懸著的心終於放下來了。

千年蟲雖然沒有大規模爆發,但依然如期而至。

就比如甘比亞,由於缺乏外界的援助,政府機構的計算機受到千年蟲襲擊而癱瘓,甘比亞政府宣佈當天(週一)為非工作日,以暫時減輕出事機關所要承受的壓力。

除此之外,全球各國都受到了千年蟲不同程度的影響。但相比於人類毀滅,這點損失已經算是非常小的了。

file

6. 捲土重來的千年蟲

前面提到,為了應對千年蟲,程式設計師採用了 windowing 修復法。而這種修復治標不治本,只是將千年蟲爆發時間延後了 20 年而已。

所以在 2020 年時,除了新冠這個大病毒之外,千年蟲這個老病毒又捲土重來了。

所幸在這 20 年間,人們沒有忘記這個千年蟲,都做了充足的準備,沒有造成重大損失,所以當年大家對千年蟲的感知不大。

也有可能是因為大家的關注點都在疫情上了吧。

除了這種 6 位數時間表達法造成的重大 Bug ,還有一種更隱蔽的 Bug ,那就是 2038 年問題。

這種問題又是如何出現的呢?學計算機的朋友都知道,計算機的計時基點是 1970 年 1 月 1日,我們電腦內部時間就是統計從這個基點到現在為止過去了多少秒。

而當時,都是 32 位作業系統,所能表達的極限是 2147483647 (第一位是符號位),換算成時間的話就是 2038 年 01 月 19 日 03 時 14 分 07 秒。

file

應對這個問題,就是擴充套件 Unix 時間長度,用 64 位表示,最大可以表示 292,277,026,596 年 12 月 4 日 15 時 30 分 08 秒。而在那個時候,人類的文明還有沒有存在都是個問題。

7. 千年蟲對程式設計師的教訓

在程式設計世界裡,關於時間的表達都是非常重要的,輕則程式執行異常,重則會出現千年蟲類似的重大 Bug 。

所以有關於時間的一些業務處理,都要十分慎重再慎重。

當年我還在職場的時候,有個業務就是關於時間的校正。為了保證時間的準確性,我們採用了 4 種時間驗證法(GPS時間、韌體時間、記憶體時間、系統執行時間),彼此互相驗證,減少出錯的可能。

所以,程式設計師真正的戰場是在程式碼裡,而不是甲方,也不是產品經理。手裡的鍵盤就是我們的武器,程式設計就是我們的秘密,一個個 Bug 就是我們的敵人!

珍惜你身邊的每一位程式設計師,也許將來他們就是拯救世界的主角!


學習程式設計,千萬不要急於求成,一定要多讀一些經典書籍,多看原始碼,多下苦功夫去死磕程式碼,這樣技術才能長進。給大家分享一些程式設計師必讀經典書籍,一定要多讀幾遍:

file

免費送給大家,只求大家金指給我點個贊!

程式設計師必讀經典書單(高畫質PDF版)

有收穫?希望老鐵們來個三連擊,給更多的人看到這篇文章

推薦閱讀:

歡迎關注我的部落格:良許Linux教程網,滿滿都是乾貨!

相關文章