程序猿犯下的错

程序猿是最好的职业,程序猿也是最糟糕的职业。牛逼的程序猿可以拯救世界,糟糕的程序猿也可以毁灭地球(也许有那么一天吧)。前两天咱们刚刚说过,微软为什么跳过Windows 9, 准备直接推出Windows 10;之前百思不得其解。直到今天看到这么一段代码

Windows 9的真相

对于非码农来说,这段代码可能难于理解;不过没关系,我稍微解释一下,你们就都懂了。

第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亿年呢……

好吧,今天只是给大家讲点轻松的话题;所以,什么程序猿造成航天飞船爆炸之类的事情就不说了。作为一个程序猿,我深感肩上的责任重大啊。好了,我又该去拯救地球了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容