程序猿是最好的职业,程序猿也是最糟糕的职业。牛逼的程序猿可以拯救世界,糟糕的程序猿也可以毁灭地球(也许有那么一天吧)。前两天咱们刚刚说过,微软为什么跳过Windows 9, 准备直接推出Windows 10;之前百思不得其解。直到今天看到这么一段代码:
对于非码农来说,这段代码可能难于理解;不过没关系,我稍微解释一下,你们就都懂了。
第40行的os代表的是操作系统(Operating System),从第41行的if
语句开始,这是在判断操作系统的版本。我想我们绝大多数的人都是从 Windows XP 开始接触电脑的;但是,你们也许也听过说,在 Windows XP 之前,还有 Windows 2000 以及 Windows 95、 Windows 98。因为 Windows XP 跟之前的 Windows 95/98 有了很大的不同,XP 上的很多软件已经不能在 Windows 95/98 上面运行了。 好了,我们的问题来了——挖掘机技术哪家强——开个玩笑。
好吧,真正的问题来了,我们怎么判断操作系统的版本呢?于是“聪明”的程序猿写下了上面的那条语句 os.startsWith("Windows 9")
,翻译成人类的语言就是:“如果操作系统以 'Windows 9'开头”,那么就认为它是 Windows 95/98。你看, Windows 95 和 Windows 98 不都是以 ‘Windows 9’开头么?所以这何止正确,简直正确得天衣无缝,无懈可击——直到真正的 Windows 9 面世之前。
那么可以想象,如果微软真的推出 Windows 9 系统的话,那么我们现在使用的一大批软件——包括 Java, 事实上这段代码正式来自于 java-1.7.0-openjdk ——都将可能无法运行,并且很可能会报出这样的错误——“对不起,您的操作系统版本太旧,请升级至最新的 Windows 操作系统”。苍天可鉴啊,这可是最新最新的 Windows 操作系统啊。可是,在程序的世界里,Windows 9 就是会被判定成过时的操作系统。这个时候怎么办呢? 修改代码,不可能,历史上的代码数以亿记,根本不可能将相关代码全部修改,那怎么办? 微软给出了答案——跳过 Windows 9,咱直接迈入 Windows 10 的时代——果然是标准的程序猿修改 Bug 的思路啊!
程序猿犯下类似这样的错误是偶然吗? 从历史上来看,我不得不说,绝对不是。类似的例子可以举一大堆。著名的比如“千年虫事件”。这也是“聪明”的程序猿犯下的著名的错误之一。
什么是“千年虫”呢? 我觉得并不是所有的读者都明白,简单解释一下。所谓的“千年虫”其实是计算机表示日期时出现的一个问题。在计算机刚开始发展的时候,大约六七十年代吧,为了节约空间,就用六位数字来表示日期。比如 86/08/25, 就可以表示我的生日: 1986年8月25日;既方便又省事,从此就可以在计算机里表示日期了,程序猿又一次“拯救”了世界。
在九十年代之前,系统运行得一切正常。但是,到了九十年代,人们发现问题来了,99/12/31 之后的日子肿么办? 00/01/01 代表什么意思呢? 显然计算机不会把它识别成2000年,反而它可能会识别成 1900年。 这会造成什么影响呢?简单举个例子:新鲜出炉食物立马会被计算机识别成过期100年;这个还好说。可是对于银行系统,那这玩笑就开大了,好容易存了几十年的钱,正准备取出来养老,瞬间存款利息变零,想死的心都有了……
不过,好在千年虫的问题发现得早,从97年开始,就在逐步修复漏洞;真到了2000年的时候,只引起了一些骚乱,并没有酿成大错。那是不是从此计算机就没有日期上的问题了呢?只能说暂时没有了。
哦? 那就是还有咯! 事实上,确实还有。不管是专业的程序猿,还是非专业的普通群众,大家肯定都听说过操作系统除了 Windows 以外,还有一个大名鼎鼎的 Unix。 说 Mac OS X (苹果系统)的朋友可以去面壁一会儿,因为 Unix 算得上是 Mac OS X 的祖宗呢。在 当今Unix/Linux 系统中,时间其实是用一个整数来表示的,代表的含义是从 1970年1月1日零点零分零秒起,过去了多少秒。比如整数 0 就代表 1970年1月1日0点0分0秒,而整数 86400 代表的就是 1970年1月2日0点0分0秒。 为什么呢? 因为 86400秒 整好是一天24小时对应的秒数。很简单,对吧。这下,你懂了在 Unix/Linux 内部,整数是怎么样换算成日期时间的了吧?
好了,问题又来了。我们知道整数是无穷无尽的,但是,计算机能够表示的整数有范围吗? 当然有了。你们都听说过 32 位的系统, 64 位的系统吧? 这里面的 “位”数,就决定了计算机能够表示的整数的范围。比如,最大的两位数那就是 99 嘛,最大的三位数那就是 999嘛; 稍微有点不一样的是,计算机里表示数是用的二进制,而我们平时使用一般是十进制。当然,这个区别你们不用知道那么详细了,不然我们程序猿还有什么神秘感可言呢? 总而言之,你们知道计算机表示的整数是有范围的就可以了,并且,32位 二进制数表示的最大整数是 2147483647。也就是说,从1970年1月1日开始,2147483647秒后,时间又将归零,这个归零的具体日子大约是在2038年的某一天。也就是说,在2038年,我们又将遭遇一次类似“千年虫”的问题。理论上是的,但是实际上不会。因为距离2038年还有二十几年呢,到那个时候,计算机应该都是 64 位的系统了。 虽然 64位的系统也会有时间归零的问题,不过,在64位系统里,要出现这个问题,还得等将近3000亿年呢……
好吧,今天只是给大家讲点轻松的话题;所以,什么程序猿造成航天飞船爆炸之类的事情就不说了。作为一个程序猿,我深感肩上的责任重大啊。好了,我又该去拯救地球了。