光阴似箭,日月如梭。前晚和家人吃饭时,娃爹感叹道:“真快啊,转眼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 出的问题。”