光陰似箭,日月如梭。前晚和家人吃飯時,娃爹感歎道:“真快啊,轉眼2025年都快過去了,21世紀已經走過四分之一了。”。
這一句話,把我的思緒一下子拉回到新舊世紀交匯的那個冬天。Y2K,Year 2000。 “千年蟲”,一度被渲染成可能讓世界陷入混亂的技術問題,我正是因為它,賺到了人生的第一桶金。
對2000年前已經參加工作的網友,尤其是做 IT 的人來說,那是一個很難忘的問題。當年計算機係統在設計時,常常隻用兩位數字記錄年份,“00”可能會被識別成1900年,從而導致各種與日期相關的數據出錯。
1999年夏秋之交,我代表公司參加一次工程師年會。午飯時,同桌一位來自其他公司的工程師談起Y2K,情緒異常激動,幾乎把它描述成一場即將到來的災難。 他說自己到時會準備好大量現金,還在家裏囤食品。“銀行係統一亂,錢取不出來,超市機器也用不了,肯定會缺貨。”。
我當時覺得他說得有些誇張,但也承認,這確實是個真實存在的技術問題。那段時間,凡是和 IT 沾邊的公司都如臨大敵,生怕被這隻“蟲”咬殘了,紛紛招人排查係統。 我進入職場後在一家高科技公司,不久帶團隊完成了一款高端產品。產品運行在 Unix 係統之上的 SUN/Solaris 平台,而這個係統,也存在Y2K隱患。

產品上市後,公司戰略調整。這個部門被整體裁掉,隻留下了一位資深維修工程師。原因很簡單 — 產品雖然不再生產,但已經賣出去的設備有維修合同,還需要定期保養。而我負責的那款高端產品,更是重點對象。
在部門被裁掉前兩周,我已經申請轉到公司其他部門,研發更複雜、更高端的產品,不但保住了工作,還升職加薪。這段經曆我以前在博客裏寫過。
臨近2000年,那位維修工程師找到我。他對“千年蟲”問題並不十分理解,擔心處理不好會出亂子,尤其是我曾經負責研發過的高端產品。於是向公司申請,希望我能協助解決。
那時,我已經拿到綠卡,業餘時間也注冊了自己的公司——正規的股份有限公司,有紐約的稅號,注冊了商標,也有了產品銷售條碼。我提出了一個條件:這件事由我的公司來接手做,公司把費用付給我的公司。
公司同意了。維修工程師也告訴我,因為不能影響我的本職工作,公司會對我獎勵。最終雙方簽了合同:一筆五位數的費用;如果在Y2K之前完成修複,並在之後驗證無誤,還會再支付同等數額的一筆獎金。
我估算了一下工作量,大約40小時。事實上,真正懂係統的人都知道,Y2K並不是末日來臨。計算機硬件本身並不在乎是1999還是2000,所謂“千年蟲”,不過是操作係統裏一個時間處理函數在設計時沒有考慮到年份擴展而已。
1999年12月,Solaris 已經發布了Y2K補丁(patch),專門解決這個問題。簽合同前我就告訴過維修工程師這一點。至於他是不會打補丁,還是覺得反正公司已經撥了預算、又不是他出錢,我也沒有深究。
年前年後,我的公司輕鬆入賬五位數,獎金也都如數到位。這件事讓我第一次真切體會到:用知識、經驗和資源賺錢,和單純靠時間換工資,是完全不同的感覺。
如果換成開一家披薩店,或者做旅遊業,需要烤多少個披薩、拉多少個旅遊團,才能賺到這筆錢?而我不過是用了幾十個小時,解決了一個別人恐慌、在我卻並不感到複雜的問題。

轉眼25年過去了。每個人都在各自的生存軌道上努力前行。每到新舊交替、歲末年初,往事總會浮上心頭。讓人意識到,時代的浪潮來過,而有些機會,隻屬於當時、當下,和看得懂的人。
AT&T Bell Labs 的 Ken Thompson, Dennis Ritchie, Brian Kernighan 發明了UNIX OS 和 C語言。
UNIX 生下了 Linux。Linux 又生下了 Android。
C語言生下了 C++ 和 Java。
今天,全世界男女老少的日常運作,用手機打電話、用服務器上網瀏覽,都在使用著這幾位前驅的發明創造。
==“【SUN 這個公司已經消失了。 UNIX 還在。】
它們的基因還留在世間,而且活得很好。”
==“早期程序員為了節省存儲空間,用兩位數表示年份。有時候,一點兒事都省不的。”
它們的基因還留在世間,而且活得很好。
SUN 創造了 Java。雖然 SUN 自己不在了,但 Java 使用廣泛程度多年來一直保持在前幾名。
UNIX 雖然勢微了,但它的兒子 Linux 是服務器 OS 的霸主,孫子 Android 是手機 OS 的雙雄之一。
聖誕及新年快樂!
計算機本身不理解“時間的意義”, 它隻會做比較和計算。
1999年12月31日 ~ 99, 2000年1月1日 ~ 00, 一比較, 00 < 99, 會出現混亂。 @新林院
在20 世紀六七十年代,計算機資源非常昂貴:內存貴,磁盤小,程序員要省每一個字節。所以係統的time stamp 沒有采用4位數來記錄年。 那時看來很合理。 因為沒人想到 OS 會活那麽多年到 Y2K。
好奇,為什麽它會成一個問題?
計算機內部儲存“日期”或“年”都應該是用 integer data type 吧?
(有的的處理方法,內部儲存“日期”這個整數是從幾千年前特定某一天到那一天之間總共的天數。給人看時再換算成年、月、日。)
如果是整數,那分辨 2001 和 1901 就應該沒問題。
很難想象程序師會荒唐到用 character data type 在內部儲存日期。
那 Y2K 蟲是不是在 user interface 裏,輸入年度的 input field 長度隻有 2,然後程序把它換算成整數,再加 1900?
如果是的話,那該程序就隻能處理 1900 年到 1999 年,需要修改 user interface,把輸入年度的 input field 長度增加到 4。
==“很多人不清楚SunOS 的Y2K bug, 那是MM/DD/YY format 出的問題。”