每个人桌面上一台电脑,这曾经是无数计算机先驱的梦想,这个梦想很早就实现了,在1997年,乔老师和比老师就说过,「比尔,我们共同控制了100%的桌面系统市场」,当然乔老师没说的是,比老师控制了97%,乔老师还不到3%。时至今日,乔老师走了,比老师颓了,移动终端把传统的 PC 市场冲击的七零八落。普通用户都知道了Windows、Android、OS X 、iOS、BlackBerry等等,但是,他们依然不了解的是另一款在计算机发展史上起到了革命性作用的操作系统:Linux!
当大家使用 Google 搜索时,使用 Kindle 阅读时,使用淘宝购物时,使用 QQ 聊天时,很多人并不知道,支撑这些软件和服务的,是后台成千上万台 Linux 服务器,它们时时刻刻都在进行着忙碌的运算和数据处理,确保数据信息在人、软件和硬件之间安全的流淌。可以这么说,世界上大部分软件和服务都运行在 Linux 操作系统之上,神马云计算、大数据、移动互联网,说起来风起云涌,其实没有 Linux 全得趴窝(微软除外)。
但是,Linux 和它的缔造者 Linus Torvalds 一样低调,这么牛逼的一个物件,居然只有程序员知道它的传奇,这不科学!所以我准备在这个系列中写写Linus Torvalds:他是 Linux 和 Git 的缔造者,他是一个传统的黑客,与沃兹一样,少年成名,崇尚自由,一生只为寻找欢笑,他,是一个真正的程序员。
注:为了防止大家把 Linux 和 Linus 搞混,我在后面的文章中统一采用 Linus 的中文译名:李纳斯。
李纳斯在2001年出过一本自传,叫做《Just for Fun》,是他和大卫·戴蒙合著的,当年我有幸读到这本书,了解了很多李纳斯的生平轶事,那时我就琢磨,这个天才已经达到人生的巅峰了吧,结果这位兄台并未停止前进的步伐,转手就在2005年搞出了分布式版本控制系统 Git,目前几乎全世界的程序员都在用 Git管理他们的代码,著名网站 Github 就是基于 Git 构建的。无论是 Linux 还是 Git,得一即可得天下,结果这哥们以一己之力发起了俩项目,而且都是主力开发人员。最终的结果是,成全了程序员,陶冶了用户,造福了一方百姓。正如李纳斯自己所言:「My name is Linus, and I am your God.」
Linus(一)——生命的意义
1969年末,李纳斯出生于芬兰的赫尔辛基市,算是赶上了60后的尾巴。小时候他是个其貌不扬的孩子,除了一个鼻子长的「富丽堂皇」之外乏善可陈。他为了让鼻子看上去小一些,经常戴上眼镜就不愿意摘下来,这个策略和现在的很多大脸女生购买三星的 Galaxy Note 手机有异曲同工之妙。幼时的李纳斯不修边幅邋里邋遢,不怎么费劲数学和物理就学得极好,社交圈却一塌糊涂,他母亲经常和别人说,这孩子非常好养,只要把他放到一个有电脑的小黑屋里,然后再往里扔点薯条和意大利面,就行了。李纳斯对此表示认同。
李纳斯把年幼的自己定位成 Nerd(书呆子),但是从他的自传里我却感受到了这位天才的有趣之处。他在书的前言里写到:
我对生命的意义有种理论。我们可以在第一章里对读者解释生命的意义何在,这样就可以吸引住他们。一旦他们被吸引,并且付钱买了书,剩下的章节里我们就可以胡扯了。(注:做人要厚道啊)
关于生命的意义,李纳斯的解释是,有三件事具有生命的意义。它们是你生活当中所有事情的动机。第一是生存,第二是社会秩序,第三是娱乐。生活中所有的事情都是按这个顺序发展的,娱乐之后便一无所有。因此,从某种意义上来说,生活的意义就是要达到第三个阶段。你一旦达到了第三个阶段,就算成功了。但首先要越过前两个阶段。
为什么李纳斯会这么说呢,我摘段原文给大家看看,非常有趣:
李纳斯:我给你举个例子来说明这一观点。最明显的是性,它开始只是一种延续生命的手段,后来变成了一种社会性的行为,比如你要结婚才能得到性。再后来,它成了一种娱乐。
大卫:性为什么是娱乐?
李纳斯:好吧,我是在对牛弹琴。我举一个别的例子。
大卫:别别,还是说说性吧
李纳斯:它是在另一个层次上的blablabla……
大卫(自言自语):哦,参与就是娱乐,而不是在一旁观看。好,我明白了。
那生存、社会秩序和娱乐又是如何与技术扯上关系的呢?
Linus(二)——天才也疯狂
李纳斯是这么解释的,技术的诞生同样是为了人类的生存,而且是为了让人生活的更好。汽车让人跑的更快,飞机让人飞得更高,互联网让人懂得更多,手机让人通信更快,一旦这些技术成了规模,就要并入社会秩序,然后下一个阶段就是娱乐,别看手机现在就是个打电话的工具,但是很快会进入娱乐阶段……(12年后的今天,手机已经彻头彻尾变成了一个娱乐工具,打电话反而成了附属功能)。
李纳斯说:「一切事物都将从生存走向娱乐,但这并不意味着在某个局部地区没有倒退的现象,而且毫无疑问许多地方都有这种情况。有时事物的发展往往分裂的。」
从这些内容我们可以看出,李纳斯有自己的一套理论,而且能自圆其说,其实每个人都有自己的理论,一件事做或者不做,都是自己说服自己,每一次进步,要么是推翻自己的理论,要么是完善自己的理论。李纳斯在很小的时候就建立了自己的理论领地,那就是数学、物理、逻辑,最后是计算机,所以他绝不是自己描述的 Nerd,而是一个大智若愚的牛娃,就像射雕里的郭靖一样,看着傻,其实比谁都精,脑子里装的都是十年二十年后的事儿。而且李纳斯比郭靖牛的地方是,就一个启蒙老师,还是自己的外公,和郭靖一比,高下立判!李纳斯基本上就是个自学成才的典范。
李纳斯的外公是赫尔辛基大学的一位统计学教授,数学家。他有一台Commodore VIC-20计算机(Commodore 是与苹果公司同时期的个人电脑公司,曾经创造过一系列辉煌,1994年破产),这台电脑的主要功能就是没有功能,你唯一能做的事情就是用 Basic 语言在上面编写自己的程序,老爷子当年就是这么做的,比如做一些数学运算和公式计算等。但是老爷子年老眼花,也不愿意打字,于是就把自己的外孙李纳斯放在腿上,让他帮助录入写在纸片上的程序。这种很有场面感的场景一再出现后,李纳斯除了对数学有了初步的认识,同时也把计算机玩的娴熟,很快他就在外公的指导下开始编写自己的程序。
评:很多大师级的人物,很小的时候就能在某个领域内头角峥嵘,展现出一些东西,然后经过长期的练习和创作,最终成为一代传奇。在这个过程里,环境是很重要的,逆境出人才基本上是个伪命题,这句话唯一的作用就是遇到困难时给自己打打鸡血。李纳斯就是个高知子弟,10岁人家就开始玩计算机了,我们10岁在干什么,打沙包么?甩方宝么?即使你在计算机方面有出众的天赋,但18岁以前连计算机的面儿都没见过,你就只能默默的牛逼了。等你真正开始展现出自己才华的时候,人家操作系统已经开发出来了,一入世就差别人十年的身位,除了冷冷的绝望,你还能感受到什么?
所以现在人们没事就北上广深杭,不是喜欢人多嘴杂空气差,而是在这些一线城市可以接触更多的人和事物,见更高的山,渡更宽的河。不是为了情怀,而是拥有格局。见都没见过,还同一个起跑线呢,一跑就得趴窝。所以,无论这些地方环境多恶劣,竞争多激烈,来的永远多过走的,不为别的,只是为了缓解些许绝望的感觉……
李纳斯用外公的计算机学会了 Basic 语言,并开始编写各种简单有趣的游戏,然后他又发现了 Basic 并不是计算机唯一能理解的语言,在它的下面,还有一种语言是由0和1组成,可以直接被计算机识别,于是李纳斯又开始用机器码编程,这次他可以控制更多计算机的细节,他与机器变得更加亲密。然后李纳斯就开始上中学了,中学的几年于他而言,其实没有太大变化,因为那些年他几乎都是坐在电脑前面度过的,在这个阶段,他熟练的掌握了汇编语言。
终于有一天,李纳斯向编程世界挺进的步伐变得缓慢下来,因为他上大学了,原因之一是他必须集中精力读书,原因之二是找不到什么项目去做。还有一件事,李纳斯开始服兵役了,那段时光对他来说是如此特殊:
在手执武器上了一个月的「体育课」之后,我便觉得在我有生之年完全有资格从此一动不动,享受平静的生活了。惟一可做的事情就是把编码打入键盘,或者手里端着一瓶比尔森啤酒!
Linus(三)——改变一生的书籍
终于,让李纳斯痛苦不堪的兵役终于结束了,除了敲锣打鼓欢庆重生之外,他开始继续拓展自己的编程之路,这时候,生命中最重要的一本书出现了,书的名字叫做《操作系统:设计和实现》,作者是 Andrew S. Tanenbaum。用李纳斯的原话表述就是「这本书把我推上了生命的高峰」。
那个时代 Unix 已经开发出来了。最早 Unix 是用汇编写的,开发过程中 Unix 的两位创始人Ken Thompson 和 Dennis Ritchie觉得用汇编写程序实在是太苦逼了,男人应该对自己好一点!于是老哥俩决定用高级语言来完成下一个版本,他们首先尝试了Fortran,失败!然后又基于BCPL(Basic Combined Programming Lanugage)创建了 B 语言,B 语言可以被认为是那个时代的解释型语言,不能直接生成机器码,效率上完全没法满足系统的需求,再次失败!我们都知道,一再失败的情况下总会有一位英雄人物挺身而出,这次是 Dennis Ritchie,他从失败的大坑中爬起来拍拍土抹抹泪,继续对 B 语言进行改造。这次 Dennis 为 B 增加了数据类型,并让 B 语言能够直接编译为机器码,然后又为这门语言起了个极其响亮的名字:「New B」,读一读神清气爽,念一念气冲云霄,从此一代语言巨星冉冉升起,40年后依然排在兵器排名榜第一位,怎一个牛字了得!当然,Dennis可能考虑了十几年后中国人民的感受,把「New B」改为了 C 语言,并用 C 语言重新编写了 Unix 的内核,Unix 与 C 从此珠联璧合,长相思守,再也无法分离。
操作系统、Unix 和 C 语言可以说是李纳斯心目中神山上的三座圣杯,为了至高无上的荣耀,他首先要攀上峰顶,把这三座圣杯捧在手中,然后再琢磨建造自己的宫殿的事儿。在那一年的夏天,李纳斯开始了高强度的阅读和学习,用他的话说就是做了两件事,「一件事是什么都没做,另一件事是读完了719页的《操作系统:设计和执行》。那本红色的简装本教科书差不多等于睡在了我的床上」。
李纳斯认为,Unix 是一个简洁、干净的操作系统,在 Unix 上的大部分任务都是通过一些基本操作完成的,这些操作被成为「System Call」,顾名思义,这些操作就是你对系统的呼叫,系统通过响应你的呼叫完成工作。比如 fork、clone(创建子进程),比如 open、close、read、write(文件访问)。这些基本的系统调用通过组合可以完成大部分功能。同时,Unix 还提供了极为强大的IPC(进程间通信)方式:pipe(管道)。很多工作在GUI(图形界面)软件环境下的读者,最常用的IPC操作可能是复制、粘贴、鼠标拖拽,这些操作虽然简单,但是必须由人来完成,想要自动化就很困难。而这些在 Unix 上实现起来就像大自然一样自然,你只需要在程序之间开辟出一段缓冲区作为管道,然后父进程和子进程就可以通过这个管道实现进程间通信了。举个例子,以前给大家介绍的查找历史命令的脚本,就利用了管道的功能,如下:
history | grep apache
这行命令的含义就是查找包含 apache 的历史命令,其中特殊字符【 | 】用来告诉命令行解释器(Shell)将前一个命令的输出通过「管道」作为接下来的一行命令的输入,就这样,一个简单的进程间通信就完成了。
总之,李纳斯在读完这本书之后,就像郭靖修习了九阴真经全本一样,对机器和代码的世界有了更为透彻的认知,接下来的事情就是等待一个打造传奇的机会。
等待的过程中,李纳斯也没闲着,他又开始编程了。好的程序员对编程的喜爱是溢于言表的,以下摘录一些李纳斯的编程感想:
对于喜爱编程的人来说,编程是世界上最有趣的事,比下棋有趣得多!因为你可以自己制订游戏规则,而你制定什么样的规则,也就会随之出现与此规则相符合的结果。
在电脑世界中,你就是创世者,你对所发生的一切拥有最终的控制。如果你功力深厚,你可以是上帝――在一个较小的层面上。
你可以建筑一个这样的房子,有一个活板门,既稳固又实用。但是每个人都可以看出一个仅仅以坚固实用为目的的树上小屋和一个巧妙地利用树本身特点的美妙小屋之间的差异。这是一个将艺术和工程融为一体的工作。编程与造树上小屋有相似之外……在编程中,实用的考虑往往被置于有意思、美观优雅或有震撼力的考虑之后。
在代码的世界里,李纳斯就是一个诗人!
Linus(四)——Linux 诞生
Unix 始于上个世纪60年代,在70年代得到了迅猛的发展,这时候的李纳斯还躺在祖父公寓里的摇篮里睡大觉,如果不是后来 Unix 王国自乱阵脚,出现阵营分裂和法律纠纷,可能 Linux 系统根本都不会出现。真实的情况是,Unix 浪费了大把的时间和机会,似乎就是为了等待这个大鼻子、头发纷乱的芬兰小子长大,然后一决高下。李纳斯赢得了自己的时间,他一刻不停的磨练自己的技艺,在清晨的微光中练习算法,在赫尔辛基的雪山上编译代码,随时随地补充的粮草和武器。二十一年之后,李纳斯抚着雪亮的刀锋上路了,他要去追寻属于程序员的最高荣耀。
1991年一月,李纳斯花费了三千五百美元,分期付款购买了一台杂牌组装电脑,内存4兆,CPU 33兆赫,还有一台14英寸的显示器,然后又买了 MINIX 操作系统,用十六张软盘把这个操作系统装到了计算机里。之后,李纳斯又用了一个月的时间,了解了 MINIX 的好和不好,并把这个系统改装成了自己得心应手的「战斗机」,开始了战斗的人生。就是在这台电脑上,催生了 Linux 的初始版本。
Linux 的诞生离不开 MINIX,MINIX 是 Mini Unix 的缩写,是 Andy Tanenbaum 教授编写的迷你版的 Unix 操作系统,源代码可以提供给大学和学生,用于操作系统教学,采用了微内核设计。其中的代码还作为《操作系统:设计与实现》的示例程序,这本书我们在 Linus(三)中提到过,给了李纳斯极大的启发。
李纳斯使用了 MINIX 之后,发现这个系统有很多缺陷,比如性能问题、内核问题、文件系统问题,最大的问题是终端仿真器,也就是我之前总提到的 Terminal,登录学校里的 Unix Server 和上网时,李纳斯都需要终端,但是 MINIX 无法满足这个需求。如果普通人遇到这种问题,估计就是发会呆然后洗洗睡了,或者说「你行你上啊」,李纳斯不是普通人!
他决定抛开 MINIX,从硬件层面开始,重新设计一个终端仿真器。牛人就是不同凡响,这个决定表明了李纳斯需要从 BIOS、CPU等硬件层面重新开发出一套系统,除此之外,还需要了解如何把信息写入显示器,如何读取键盘输入,如何读写调制解调器,早期储备的汇编语言和 C 语言能力终于派上了用场……
两个月之后,终端仿真器完成,对此李纳斯非常骄傲:
对于我了不起的成就,萨拉(妹妹)是了解的。我把终端显示给她看,她盯着显示器看了大约五秒钟,看着上面是一串A和一串B,说了声「很好」,然后就没有然后了。我意识到我的成就并不辉煌,这犹如你指给人看你铺设的一条长长的柏油马路,但想向别人解释这条马路的意义是完全不可能的。
当时是三月,也可能是四月,就算彼得盖坦街上的白雪已经化成了雪泥我也不知道,当然我也并不关心。大部分时间我都穿着睡衣趴在相貌平平的计算机前面噼噼啪啪的敲打键盘,窗户上的窗帘遮得严严实实,把阳光和外部世界与我隔离开来。
Linux 操作系统就这样开始了,一发不可收拾。李纳斯的当时编程状态是这样的:编程――睡觉――编程――睡觉――编程――吃饭――编程――睡觉――编程――洗澡――编程……
实现了终端仿真器之后,李纳斯马不停蹄,开始添加磁盘驱动和文件系统,那一年李纳斯还在上课,但是课程很简单,他唯一的课外活动就是参加每周三晚的同学聚会,这个长着大鼻子的技术天才,常常会因为担心自己缺乏社交能力和容貌丑陋而失眠,对那时的他来说,唯一有趣的事情就是把驱动程序写出来。于是他咬咬牙对自己说,还得干下去。(看来没有女神的好处就是可以写个操作系统出来,然后把自己叫做 上帝)。
随着工作的进展,终端仿真器正在开始向一个操作系统的方向发展,李纳斯显然也看清楚了这一点。
在整个创造 Linux 的过程中,我们没有看到李纳斯使用了什么样高级工具,估计那时也没有,整个系统基本上是一行行代码敲出来的,纯手工打造,这些先贤的编程功底和效率让我们叹为观止,所以,现在,我决定打开终端,输入 vi,然后键入:to be continued,感受一下李纳斯当年编程的风采……
随着李纳斯不断的敲击键盘,他的终端仿真程序也不停的扩张,从刚开始的小树苗长成了一株盘根错节的大树,树根牢牢的抓住土地,枝丫努力的伸向天空,花朵和果实开始在高远的天空中烁烁发光,所有的细节都在李纳斯的掌控之中。懂行的技术人员都看得出来,这个大鼻子的芬兰小子是准备开发一个操作系统啊。
是年6月份,李纳斯基本确定了要开发一个操作系统内核的计划,并开始着手搜集 Unix 操作系统标准的相关资料。1991年7月3日,格林威治时间上午10点钟,李纳斯在 MINIX 新闻组发出了一封求助邮件,寻求有关 Posix 标准的帮助,他在邮件中写道:
目前我正在 MINIX 系统下做一个项目,对 POSIX 标准很感兴趣。有谁能向我提供一个机器可读的最新的 POSIX 规则?如果能有个 FTP 地址就更好了。
这份公开的邮件是标识 Linux 问世的最早证据。邮件发出后不久,有人就寄来了厚厚的 POSIX 标准,同时赫尔辛基工学院的 Ari Lemke 也对李纳斯的邮件做出了响应,为李纳斯提供了一个 FTP 地址,用来上传他即将完成的操作系统。
注:POSIX 全称是可移植操作系统接口(Portable Operating System Interface)。IEEE 最初制定 POSIX 标准,是为了提高 UNIX 环境下应用程序的可移植性。随着技术的发展,POSIX 开始不局限于 UNIX 系统,后续的 Linux 和 Windows NT 都部分的遵循了该标准。POSIX 在李纳斯开发的过程中起到了灯塔的作用,直接后果就是 Linux 系统从一开始就走在了正规军的康庄大道上,基本没有跑偏过。Linux 几乎可以适配各种类型的硬件体系结构。
标准和 FTP 地址都有了眉目,李纳斯开始实现各种 System Call,以便让 Shell 运行起来。这段时间的工作让李纳斯时常感到灰心丧气,看着增加的代码量,工作似乎前进了一大步,但是检验一下功能又仿佛没有任何进展。有时候他还不得不放弃之前的想法和已经完成的代码实现,另辟蹊径重头再来,即使是在天才面前,代码也能让人欢喜让人忧。
终于 Shell 已经可以在新的操作系统上工作了,李纳斯开始编写拷贝(cp)和列表(ls)等程序。Shell 程序一旦完成,就好像完成了从0到1的飞跃,一切都变得无比顺利,李纳斯面前仿佛出现了一条阳关大道,一切都豁然开朗了,他说,要有光,于是就有了光。对于这种状态,李纳斯表示:「我很满意」,并且开始用「Linux」称呼这个操作系统。
这种满意非常重要,因为那个夏天李纳斯除了伏在电脑面前噼噼啪啪的敲击键盘,什么都没做。芬兰四月到八月的日子是一年中最美好的时光。人们到布满小岛的海上航行,去海滩上晒日光浴,到夏日小木屋中消遣时光。但是李纳斯,他只是在永无休止的编写程序,忘记了白天和黑夜,黑色的窗帘遮蔽了灿烂的阳光,也遮蔽了外面的世界。他唯一的想法就是,得赶紧把这该死的系统做出来!
1991年8月25日,李纳斯在MINIX 新闻组上发邮件做了一个调查,想知道大家希望这个新的操作系统具备什么特征。
1991年9月17日,李纳斯把已经完成的新操作系统上传到了Ari Lemke提供的 FTP 服务器上,并准备用「Freax」作为操作系统的最终代号,结果遭到了Ari Lemke的激烈反对。Ari Lemke对李纳斯说:
「李哥,您咋会想到用这么变态的名字命名操作系统呢?原来的Linux不挺好的嘛」
「那样不会显得自恋么?」
「您这样就不对了,操作系统是开天辟地的大事,人民群众都等着用您的名字命名呢,看看他们的眼神,您能辜负他们的期望吗?Linux 天生不就是用来了 Unix 遥相呼应的么?这是命,得认!」
「这……那我就不推辞了啊」
以上为意译,不过基本上和古代皇帝的黄袍加身是一个意思。新的操作系统最终以「Linux」命名,并在10年后名扬天下,20年后统治服务器领域,可谓 Linux 恒久远,Linus 永流传。
Linux 内核0.01版本终于发布了,虽然漫长的开发过程才刚刚开始,但李纳斯终于可以松口气了:
瞧,我真的做出了点什么。我没有在骗你们。这就是我所做的……
创造操作系统,就是去创造一个所有应用程序赖以生存的基础环境――从根本上来说,就是在制定规则:什么可以接受,什么可以做,什么不可以做。事实上,所有的程序都是在制定规则,只不过操作系统是在制定最根本的规则。——李纳斯
Linus(五)——继续前行
Linux 从一诞生就被打上了开源的烙印,这一点对 Linux 的后续发展起到了至关重要的作用。从1991年内核0.01版本发布,到1994年1.0版本闪亮登场,世界各地无数的开发者为 Linux 提交了代码,李纳斯为 Linux 建立了讨论组 comp.os.linux,全世界爱好开源和 Linux 的程序员与黑客都在上面讨论问题,他们就像群蜂筑巢一样,不断的通过个体和群体的力量交替推进 Linux 的飞速发展。
李纳斯对自己说:嗯,没有任何东西可以阻挡 Linux 的普及!
这种感觉估计很多程序员都体会过,当你设计的算法得出了正确结果的时候,当你自以为解决了一个海森堡 bug(Heisenbug,表示不可重现)的时候,当你完成了一段精妙代码的时候,你摘下厚重的眼镜,推开铺满灰尘的书桌,打开办公室唯一的窗户,迎着夕阳把一只废弃的圆珠笔扔出窗外,然后冲着天空大喊:还有谁~~~?这是一种拔剑四顾心茫然的情怀。
李纳斯还不止于此。他不仅单枪匹马写出了 Linux 的内核,而且做出了开源的决定。他把 Linux 放到了互联网上,并且允许那些希望使用和改进它的人们根据开源协议修改和提交源代码。这两点对互联网的影响是极其深远的,估计李纳斯当年也没有想到,当时的两个小小的涟漪,经过&#