第三章
编程的美妙
1、 开始编程
我真不知道该如何阐释自己对编程的狂热,但我可以试试。
对于任何编程的人来说,编程是世界上最有趣的事。它比下棋之类的游戏更有乐趣得多,因为它可以由你自己来制订游戏规则。而你制定什么样的规则,也就会导出与此规则相符合的结果。
然而,对于编程外行的人来说,它却似乎是世上最枯燥的事。
编程给人带来的最初兴奋的原因有部分是显而易见的,那就是:通过编程你可以支配一台计算机,你叫计算机做什么,它就做什么,永远准确无误,而且毫无怨言。
这本身就很有意思。
但是计算机在一开始让你入迷的盲从性,显然不得它成为招人喜爱的伙伴。事实上,这种特性很快就让人厌烦了。真正使编程令人欲罢不能的是:你能让电脑做你想做的事,但是你还必须想出怎样做到的办法。
我个人认为,计算机科学和物理科学有很多相似之处。两门学科都是在一个相当基础的层面上探讨一个体系是怎样运行的。当然,区别在于,在物理学中,你探究的是一个已经存在的客观世界的构成。而在计算机科学中,你却是在创造一个前所未有的体系。
在电脑世界中,你就是创世者,你对所发生的一切拥有最终的控制。如果你功力深厚,你可以是上帝——在一个较小的层面上。
我这么说恐怕要得罪地球上近一半的人口了。但是的确如此。你开始创造自己的世界,而唯一限制你的就是机器的性能,以及——在今天尤其如此——你自己的能力了。
想象一下建在树上的小屋的情形。
你可以建筑一个这样的房子,有一个活板门,既稳固又实用。但是每个人都可以看出一个仅仅以坚固实用为目的的树上小屋和一个巧妙地利用树本身特点的美妙小屋之间的差异。这是一个将艺术和工程融为一体的活计。编程与造树上小屋有相似之外,这是它之所以被看成是一项既有魅力同时又有实际贡献的活动的原因之一。在编程中,实用的考虑往往被置于有意思、美观伶俐或有震撼力的考虑之后。
编程是对创造的训练。
探究计算机工作原理的过程,是吸引我走进编程世界的最初原因。在这其中获得的最大的乐趣在于,我认识到了计算机科学与数学的类似:你必须从该体系自身的规则出发,推演出整个世界,在物理科学中,你被客观规律所束缚。但是在数学和编程中,只要能合乎逻辑地推演,就可以成立。思考数学问题,不会受到客观世界的逻辑的限制,数学只是逻辑自洽的符号体系。正如任何一名数学家都明白的,人完全可以建构出一套数学等式,以证明三加三等于二。事实上,你想有什么样的体系就可以什么样的体系。但是,随着复杂程度的提高,你必须多加小心,不要弄出什么与你创造的体系不一致的东西。
好的体系容不得任何错误。编程也与数学一样是这么回事儿。
人们对电脑如此着迷的原因之一,就是能从中获得自己创造一个新世界的体验,并贪图到它到底能够成为什么样子。在数学中,人们往往按照客观事物的可能性进行思想实验。比如,说到几何时,大部分人想的是与我们的经验相符合的欧几里得几何学。但是电脑却可以帮助人们形象化不同的几何,并不仅仅是欧几里得几何学。在电脑的帮助下,人们可以形象化这些虚构的世界,看到那些世界到底是什么样子。还记得Mandelbrot set吗——基于Benoit Mandelbrot等式的fractal images。要不是电脑,纯粹的数学世界绝不能这样形象地展示出来。Mandelbrot就是人为地制定了一些本不存在的与现实没有一点关系的世界规则,却创造出了的图案。通过编程和电脑,你能够构筑一个新世界,有时其设计会是非常美妙的。
但是在大部分时间中你却不能欣赏自己创造的美妙世界。你只不过是在编写执行某一任务的程序。这时你就不是在创造一个新世界,而是在电脑世界中解决一个具体的问题。问题通过将思考结果应用到问题中而得到解决。而能够坐下来,盯着电脑屏幕,将一个问题彻头彻尾地贯穿思考,就需要某种特定的人。
比如,需要像我这种书呆子气十足的人。
操作系统是计算机的所有功能的基础。而创造一个操作系统则是最终的挑战。
创造操作系统,就是去创造一个所有应用程序赖以运行的基础环境——从根本上来说,就是在制定规则:什么可以接受,什么可以做,什么不可以做。事实上,所有的程序都是在制定规则,只不过操作系统是在制定最根本的规则。
创造操作系统就像在为你创造的这片土地制订宪法,而其他在电脑上运行的程序则是为宪法所允许的普通法律。
有时,这些法律根本讲不能,但这正是你要面对的问题。你需要找到解决办法,并能够意识到自己以正确的方法找到了正确的答案。
还记得那些在课上总能答对问题的同学吗?他们的答案比别人来得快,他们能这样是因为他们没有刻意去追求。他们不在乎他们应该怎样来答题。他们只不过找到了合理的考虑问题的方法。人们一听到正确答案,一切听起来就都是那么回事了。
在电脑上也是这样。你可以鲁莽、生硬地行事,愚蠢地死死纠住问题不放,直到问题不再成为问题。也可以通过找到正确的方法,使问题突然消失。你可以从不同的角度看问题。直到灵光突现地认识到:问题之所以成为问题只在于你的方法错了。
也许能够证明这一点的最佳例子不是来源于计算机科学,而是数学。故事发生在十七世纪,日后将成为伟大的数学家的高斯还在上中学。一天,老师厌烦了授课,就让学生们计算从1到100的数字的和。他原以为学生们要花一整天来计算这道题。没想到初展才华的数学家仅花了五分钟就得出了正确答案:5050。他解答这个问题的方法不是真的把所有这些数字一一加起来,这样做既麻烦又愚蠢。他发现1加100等于101,2加99也等于101,然后3加98还是101,直到50加51等于101。不要几秒种,他就注意到一共是50对101,所以答案是5050。
也许这故事是虚构的,但它想说明的道理却很清楚:一个伟大的数学家不会采用平庸而繁琐的方法,因为他能看到隐藏在问题背后的真正内涵,并应用这一理解去找到更为简便的方法。
在计算机科学中也绝对如此。
没错,你能写一个程序来求出总数。这对于今天的电脑来说不过小事一桩。但是一个伟大的编程者能凭借其聪明的头脑就知道答案是什么。他知道怎样写出漂亮的程序,知道怎样采用一种全新的但最终会被证明是正确的方法。
不过还是很难说清楚,闭门冥思苦想地要找到解决某个问题的漂亮答案,为什么竟然有如此巨大的魅力?但是,你要是曾经有过找到更好方法的经历,你就会明白,这简直是无与伦比的感觉。
2、长腿的终端仿真器
我的终端仿真器(terminal emulator)长了腿。我经常用它登录到学校的电脑上,查阅电子邮件和参加MINIX讨论组。但是问题是,我还想下载和上传东西。也就是说,我必须能向磁盘里保存东西。为此,我的终端仿真器必须装个磁盘驱动。还需要一个文件系统驱动,这样才能查看磁盘里的东西,将我下载的内容保存成文件。
这是我在发明linux的过程中差点半途而废的一步。我当时觉得这太麻烦,也不值得。但是除此之外我也没什么可做的。那年春天我在上课,课程很简单,无需费太多的心思。当时我唯一的课外活动是每周三晚上参加同学聚会。我那时是一个社会“死物”(与“社会动物”相对——译者),于是那聚会就成为我除了编程和学习之外唯一一个可以干点别的事情的场合。要不是那聚会,我可以说是彻底与世隔绝了。同学聚会是我接触社会生活的仅有的地方,我几乎是每次不落地参加。该聚会对我是如此重要,以至于我有时会因为想着将要参加它而失眠,因为一直担着心不要因为缺乏社交风度、或由于自己丑陋的大鼻子、或明显缺少个女伴而出丑。这自然都是些典型的低级趣味。我之所以说这些,是因为要表明,当时我真的没有什么别的有意义的事情可做。而搞出驱动程序的工作却很有意思。所以我对自己说,我要干下去。
于是,我写了一个磁盘驱动程序。因为我想把文件保存在我的MINIX文件系统中,也因为MINIX文件系统本身整理得很好,于是我让自己的文件系统可以和MINIX文件系统兼容。这样,我就可以在MINIX系统下阅读我建立的文件并将它们存入同一张磁盘,以便MINIX系统也可以通过我的终端仿真器阅读到我建立的文件。
这花费了我大量的精力:编程——睡觉——编程——睡觉——编程——吃饭(饼干)——编程——睡觉——编程——洗澡(冲冲了事)——编程。随着工作的进展,这个项目很明显正在成长为一个操作系统。所以我转变了看法,不再把它看成一个终端仿真器,而是一个操作系统。这个转变出现在我马拉松似的编程过程中的哪个时间段,是在白天还是晚上,我已经想不起来了。也许在这一刻之前我还穿着破旧的睡袍奋力敲击着键盘,在为终端仿真器更多的功能;而转瞬之前我拥有的功能是如此之多,以至于整个体系已经变成了一个。
我把它称之为我的“gun-emac终端仿真程序”(gnu-emac of ternimal emulation programs)。gnu-emac终端仿真程序开始是一个编辑程序,但创造它的人又为它增加了一系列功能。设计者本想让它成为一个可以用程序控制的编辑程序,但是其程序可控性的特点很快使一切都黯然失色,它成为了一个从地狱中冒出来的编辑程序。它除了厨房水池子外几乎无所不包,这就是为什么这个编辑程序指令的图标有时竟是一个厨房水池。这个编辑程序的一大特点就是,其设计过程比任何其他编辑器都更复杂。
我的终端仿真器也是如此。它在不断地扩张。
3、寻求网上帮助
来自:torvalds@klaava.Helsinki.Fi(李纳斯?托沃兹)
讨论组:comp.os.minix
主题:Gcc-1.40和一个有关POSIX的问题
信息名称:1991 Jul 3, 100050.9886@klaava.Helsinki.Fi
日期:1991年7月3日,格林威治时间10:00:50
各位网友好!
由于我现在正在MINIX系统下做一个项目,对POSIX标准很感兴趣。有谁能向我提供一个(最好)是机器可读形式的最新的POSIX规则?能有FTP地址就更好了。
好吧,这就是一个芬兰小子希望检验一下自己的计算机技能限度的最早的公开证据。
POSIX标准是一个可以适用于数以百计的UNIX系统呼叫中的任意一个的一套冗长规则,计算机要执行任务(从读、写、开机和关机开始)就需要这个标准。POSIX则是指一个UNIX的标准体系,或一个由来自不同公司的代表所组成的一个组织,希望按照一个共同的标准进行运作。对于程序员开发的在该操作系统下的新应用软件或开发应用软件的新版本而言,标准是极其重要的。从POSIX这样的系统呼叫(system call),尤其是重要的呼叫(call)中,我可以获得一个操作系统应该具有哪些功能的一个单子;然后我就可以通过自己的方式在自己的系统中实现每一个功能。通过编写出这些标准,我的系统软件的源代码将可以被别人使用,以开发新的应用软件。
当时我并不知道我本可以直接从POSIX公司买到这些规则的软盘,但这无所谓。哪怕我能买得起,什么东西运到芬兰,往往会需要很长的时间。我不愿等上那么久,因此我四处搜求一个能从FTP地址上直接下载的版本。
没有人给我提供能找到POSI标准的来源。于是我开始了计划B。
我从学校找到运行sun器(sun server)的sun微系统版的UNIX手册。该手册中有一个完全可以凑合使用的系统呼叫的基本版本。从用户手册中能看出系统呼叫的主要功能,以及为完成这些功能所需要完成的步骤。但是,从中看不出具体的方法,而只是标明了最终的结果。于是我便着手从安德鲁?塔南鲍姆的书中和别的材料中收集一些系统呼叫。最终有人给我寄来了那几卷厚厚的POSIX标准。
不过我发的那个邮件并没有石沉大海。任何一个有相应知识的人(只有具备相应知识的人才会上MINIX的网站)都能看出我的计划是要开发一个操作系统,否则,我会需要POSIX规则呢?我的邮件引起了赫尔辛基工学院(我若不是对研究理论这么感兴趣,可能会在这儿求学)一个助教阿里?莱姆克(Ari Lemke)的好奇。阿里善意地给我回信说,他愿意为我在他们学校的FTP地址上建一个子目录,这样到时我可以把自己的操作系统发布上去,让感兴趣的人们下载。
4、linux
阿里?莱姆克一定是一个相当乐观的人。在我能拿出什么可以发布的东西之前 ,他就为我建立了一个子目录:ftp.funel.fi。我有了密码,一切都准备就绪,就等着我去登录然后上传内容了。但是我要再花上四个月才能找到一点我愿与世人分离的东西,或者至少与阿里或几个与我保持邮件往来的热衷于操作系统的狂热分子分离的东西。
我最初的目录是想开发出一个最终可以取代MINIX的操作系统。
这个系统不必比MINIX能干,但必须能胜任我最喜欢用MINIX做的事,以及其他我想做的事。比如,MINIX的终端仿真不仅太不方便,而且也不能进行任务控制——即把暂不用的程序放入背景中,同时内存管理也太简化。顺便说一下,它还是以苹果的操作系统(Mac OS)而不是以DOS为支持的。
开发操作系统就是搞明白系统呼叫应该做什么,然后以你自己的方式编出能使系统呼叫得以执行的程序。总有来说,共有几百个系统呼叫。有些是多功能的,其余的则很单一。有些更基本的系统呼叫确实是十分复杂的,并需要有大量的基础作为支持。比如,为完成“写”和“读”这两种系统呼叫,你就必须建立一个磁盘驱动程序,以便能够在磁盘里读或写东西。又比如“打开文件”的系统呼叫,你就必须创建一整套文件系统层,以便分析文件名和在磁盘上查找文件。要编写“找开文件”的系统呼叫,更需要几个月的工作。但这个程序一旦编写出来,用于别的功能的程序都可以借鉴。
早期的创建工作就是这样。我不但从Sun服务器的操作系统手册中查找标准,也从其他书中查到可用的标准,挑出一个一个的系统呼叫,然后为它们再编出可行的软件。
这工作很容易让人感到灰心丧气。
原因是:表面上一切如故,你看不到任何进展。你可以做几个试验性的程序,检验自己刚刚加上的东西是否可行。但这并不真的有什么用。在有的阶段你不得不放弃刚才的想法,那一长串的系统呼叫都白干了。一个真正的程序在运行之前,必须已经接近完成。你必须首先运行的程序是外壳(shell)程序,而在有这个外壳程序之前,要运行什么很难的。而且,这个外壳程序包括了很多你所需的系统呼叫。它运行起来之后,你才会从中找到一长串你尚需完成的功能。
在UNIX中,外壳程序是一切程序之母。它的作用是引发以后的一系列二进制语言程序(二进制程序是以计算机可识别的1和0为符号编写的程序。以机器语言编程,就是将二进制的源代码组合起来),这个外壳程序使你首先能登录(当然在真正的UNIX系统中,你运行的第一个程序传统上被称为init,而init的确需要很多基础的支持才能运行。它是一种对正在运行着的程序的控制工具。当没有任何程序运行时,init就没有用了)。
因此,我做的第一件事不是创建init,而是建一个外壳程序。我执行了约二十五个系统呼叫,正如我所说,这也是我要运行的第一个真正的程序。这个外壳程序不是我自己编的。我下载了一个叫Borne Shell的外壳程序。它是UNIX的初始外壳程序之一,可以从互联网上免费下载,名字来源于一个难听的双关语。编写该外壳程序的家伙名叫波恩(英文中的“忍受”或“出生”之意——译注),所以这个程序就叫做“Borne Again Shell”(“再次忍受或再次降生外壳程序”——译注),或一般被称为BASH(bash的英文意为“重击”——译注)。
当你试着从磁盘运行或导入一个真实的程序时,一般都会有“臭虫”(bug,IT业中称软件里的瑕疵为“臭虫”——译注)出现在磁盘驱动程序或导引程序中,因为程序往往会不理解它读到的东西,于是它就会在屏幕上显示出相关的信息。这很重要,你可以从中知道哪儿出了毛病。
于是,我就到了这样一个阶段:我试图导引外壳程序,屏幕上则显示出外壳程序中每一个我尚未能执行的系统呼叫。我导入并运行外壳程序,屏幕上则出现类似“系统呼叫517没有执行”这样的信息。我日日夜夜盯着屏幕上显示出来的系统呼叫,试着发现我在哪一条上面出了错。这比拿到一个系统呼叫的单子,然后一一使他们可以被执行要有意思多了。人们需要看到事情的进展。
到了八月底或九月初的时候,我的外壳程序终于可以工作了。过了这一关,后面的任务就轻松多了。
这可是一件大事。
我的外壳程序可以运行后,我马上开始着手其他几个程序,比如拷贝程序和列表程序,这些都比外壳程序简单得多。你所需的一发,外壳程序早就具备好了,所以一旦外壳程序完成,就好像是从0飞跃到100一样,因为一切都已就绪。这时,我已经拥有了一切必要的条件,感觉就像上帝创世纪那样,执掌一切地说:“让那里有光”,那里就真的有了光。在此之前,的确是一无所有。
是的,我深感满意。
这种满意很重要,因为那个夏天我除了伏在电脑面前,其他什么都没做。这么说一点也不夸张。芬兰四月到八月的日子是一年中最美好的时光。人们到布满小岛的海上航船,去海滩上晒日光浴,到夏日小木屋中消闲。但是我却在没日没夜地工作,不知哪一天是周末,哪一天是工作日。学生的黑色窗帘遮蔽了几乎昼夜灿烂的阳光,也遮蔽了整修世界。有些天——或夜晚?——我会从床上爬起来后直接坐到离床仅几英尺远的电脑旁。
爸爸显然在不断催促妈妈让我在暑假找份工作,但妈妈却不在乎:我并没有打搅她。萨拉会因为我有时上网使电话战线而有点恼火。她也许会写些毫不客气的话。毫不夸张地说,我和电脑之外的世界几乎没有任何联系。
当然,也许每周有一次,一个朋友会敲敲我的窗户,而我如果没在捣腾什么重要的编码时,会请他进来。我们会喝杯茶,也许还会挤在窄小的厨房里看一小时的MTV。现在回想起来,对了,有时乔科会来敲我的窗户,我们会出去喝点啤酒或玩司诺克台球。但是,诚实地说,那时我的生活也就这么简单了。
而我一点儿都不感觉自己是那种面色苍白、可怜兮兮的失败者。
外壳程序成功了。这意味着,我事实上已经建立起了可行的操作系统的基础,而我自己则乐趣无穷。
外壳程序成功之后,我开始检验其中的内装程序。接着我又编了足够的新程序,可以真正干点什么了。我用了MINIX中所有有用的东西。当我把外壳程序移到一个我为新的操作系统所建的特别区域中时,我开始把这个操作系统称为“linux”。
坦率地说,我一开始并不想把它以linux的名称发布出去,因为那显得我太自我中心了。那么,我为最终发布起的名字是什么呢?Freax(Freaks的变形,该词为“异想天开”之意——译注。) 事实上,在一些早期完成的文件中,即那些说明如何汇编源代码的文件中,有将近半年的时间我一直使用Freax这个名称来指代这个操作系统。但这其实是无所谓的,因为当时还没有任何人知道它,所以它其实并不需要什么名字。
5、开放源代码
来自:李纳斯托沃兹torvalds@klaava.Helsinki.Fi (李纳斯?托沃兹)
新闻组:comp.os.MINIX
题目:你在MINIX中最想看到什么?
总结:关于我的新操作系统的小型民意调查。
信息编号:1991年8月25,9541@klaava.Helsinki.Fi
嗨,所有使用MINIX的人们,大家好!
我在编一个(免费的)用于386(486) AT clones的操作系统(只是一个爱好,不会成为一个像Gnu那样大型的专业软件)。我从四月起就在酝酿,现在已准备就绪。我想听一听人们对MINIX有哪些欣赏或不满之处,因为我的操作系统和它有些相象(尤其是文件系统的物理排列方式)。
我目前已经装上了bash (1.08)和gcc (1.40),看来一切进展顺利,估计几个月内我就会得出一些实用的东西。我想知道大多数人在这方面有什么要求。任何建议都欢迎,但我可不保证一定会采纳。
李纳斯(torvalds@klaava.Helsinki.Fi)
附:对了,它不受任何MINIX源代码的影响,并有一个多线程的FS。记住。它不能安装(比如使用386任务转换文件等等),也许永远不会支持除了AT硬盘之外的东西。情况就是这样。
使用MINIX人群中最坚定的操作系统的狂热者看到了火花。我没有收到多少有关MINIX特点的建议,但却有许多别的问题。
>多告诉我们一点!它需要MMU吗?
回答:是的。
>在多大程度上使用C语言?在装截中会有什么困难?不会有人相信你的不可“半截性”,比如说我就想把它装截到我的Amiga软件上。
回答:它大部分使用C语言,但大部分人不会把我写的程序称作C语言。它使用了我能想到并找到的386的特征,我也想通过它充分了解386。我的一些C文件几乎和C语言一样是组合起来的。
如上所述,它也使用MMU,用于分页和分类(还不能存进软盘里)。正是分类使它成为一个真正的386的依赖者(每项任务都有一个64mb的编码和数据分类文件。
甚至有几个人提出愿意做试用版的试验者。
最后,把它发布出去并不需要太大的决心。我一直习惯与人交流程序,所以要做的唯一真正决定就是,我敢于向人们展示这一系统软件的最佳时机是何时,才不会使自己感到不自在,或更确切地说,什么时候发布才使我将来不至于为此感到羞愧。
我最终想实现的是有一个编译器和一个能在linux内部编程的真正的系统环境,而不必再用MINIX。但是当gnu程序可以运行时,我骄傲极了,愿意让整个世界都看到它。同时,我也想听到人们的反响。
外壳程序能运行时,我已为操作系统初步编了几个程序。其实还不能做什么,但你能看出和UNIX很相似。事实上,它运行起来像一个有点残疾的UNIX。
所以我决定将其发布出去。但我不会公开地告诉任何人,而是通过私人邮件告诉几个人——也许总共只有五到十个人吧——告诉他们我已将其上传到FTP地址上。其中包括阿里?莱姆克,布鲁斯?伊文斯,以及其他几个人。我还上传了linux的源代码和几个用于初始运行的小程序。我告诉人们要运行这个系统应该怎样做。人们还是MINIX386版本——还必须有GCC编译器,事实上是我自己版本的GCC。所以我把这些也传了上去。
我们有了一个给发布的内容编号的协议。它其实只有心理意义。如果我认为自己的东西已经完善,我愿意将其定为1.0版本,而在此之前,我给出的编号就表示出距离1.0版本还有多远的距离。所以,我将上传发布的那个版本的操作系统定为0.01版,让大家知道它离最后完善还有很大的距离。
对了,我想起了上传那天的日期:1991年9月17日。
我想只有一两个人看了我的作品。因为他们必须先费事地安装一个特殊的编译器,准备一个空间以便导入并汇编我的指令,然后却只能运行一个外壳程序。
基本上,运行外壳程序就是这个版本所能做的一切。它也可以把源文件打印出来,大概有一万行——如果字体小一点的话,大概不到一百页纸(而现在大概要有一千万行了)。
我发布这一操作系统的主要原因之一,是要证明我此前并非在说大话,而是我确实有所作为。在互联网上,说话没有太多责任。不管你做什么,不管是操作系统还是性,太多的人在这个计算机的虚假空间里弄虚作假。所以在告诉了那么多人你在发明一个操作系统之后,能够这样说真好:
“瞧,我真的做出了点什么。我没有在骗你们。这就是我所做的……”
6、linux有了用户
哦,阿里?莱姆克,是他为我把这个系统上载到FTP地址上铺平了道路。
他极不喜欢Freax 这个名字。倒喜欢我当时正在使用的另一个名字——linux,并把我的邮件路径命名为pub OS/Linux。我承认我并没有太坚持。但这一切都是他搞的。所以我既可以不惭愧地说自己不是那么以个人为中心,也不得不承认自己并非完全没有自我意识。并且我认为,这是个不错的名字。
如上所述,我的操作系统并非很有用。比如,如果储存太多的东西,或仅仅是因为不小心,系统就会马上崩溃。而哪怕你并非不小心,如果让它运行时间稍长一点,也会崩溃。但是在那个阶段,它并不是给人运行的,而是让人看的。对了,是让人仰慕的。
所以它只是为给少数几个热衷于开发新的操作系统的人分离的。他们都是非常迷恋技术的人,甚至是技术迷当中的特殊兴趣小组。
他们的反应无一例外是积极的,但是这是一种“它要是能这样或那样就更好了”的肯定态度。或说:“看起来倒是挺酷,但是在我的电脑上根本就转不起来。”
我记得一个人在邮件中写道,他真的很喜欢我的操作系统,并用了至少一大段文字来描绘它的好处。接着他说我的系统吃掉了他的硬盘,而我的磁盘驱动程序则是“又娇气又脆弱”之类的。他丢失了他先前所有的文件,但他还是对我的操作系统持积极支持的态度。读这样的邮件很令人感动。事实上是一个软件“臭虫”毁了他的文件系统。
我的就是这种反应。我修补了几个程序上的瑕疵,包括那个当内存用完时就会死机的漏洞,而且还取得了一个,经GCC编译器装载到操作系统上,这样我就可以编写小的程序了。这也意味着使用者在运行这个操作系统之前不必先导入我的GCC编译器了。
你是否渴望回到那样的时代,当男人像男子汉并且能自己编写驱动程序?
——linux0.02版本的上载宣言
十月初我发布了0.02版,包括了几个对瑕疵做的补丁程序和一些增加的新程序。十一月我又发布了0.03版。
我本来可能会在1991年底之前就洗手不干了。我已经做了很多自认为有意思的事。并非一切都绝对圆满,但在软件世界中,一旦你已解决了最根本的问题,兴趣就容易很快地消失。我也是那样。解决软件中存在的小问题并不是什么吸引人的工作。但接下来发生了两件让我继续下去的事,第一:由于失误,我破坏了我的MINIX分区;第二,人们不停地传给我反馈的意见。
那时,我在导入linux时仍要把MINIX作为主要的开发环境。我在Linux系统下做的大部分事只是这我写的终端仿真器从学校的电脑上读邮件和新闻。
学校的电脑总是很难登录,所以我编了个可以自动拨号的程序。但是在十二月时,我本想自动拨devtty1——这是系列电话线,但却错误地拨成了devhda1,既硬盘分区,结果是我无意中覆盖了保存的MINIX中最重要东西的空间。是的,这也就意味着我不能再进入MINIX的环境了。
那就是我要做出抉择的一刻。
我可以重新装入MINIX系统,或者也可以将错就错,自认linux已是足够的好,以至不再需要MINIX了。我将通过在Linux下编程来编译Linux,而只要我觉得需要MINIX中好的功能,我就把这些MINIX的优点编到Linux中。无疑,这是观念上重要的一步,因为你要摆脱原有的系统环境,使新的系统真的能够自我包容。这一步十分重大,因此我将十一月底发布的版本命名为0.10版。几个星期之后,就升级到了0.11版。
正是从那时起,开始有人使用这个系统并可以用它来做一些事了。
到那时为止,我已经修补了一系列的漏洞。但没有人向我提出新的建议。我记得为了满足更多存储的需要,我曾出过门,并将机器的内存从4兆升级到8兆。我还出去买了个浮点协同处理器(floating point co-processor),因为人们开始问我linux是否能支持他们的浮点协同处理器。这个附加硬件使我的电脑能执行浮点运算(floating point math)。
我记得是在十二月,德国的一个计算机只有2兆内存却试图汇编Kernel的家伙,他也不能运行GCC,因为那时的GCC需要1兆以上的内存。于是,他问我linux是否能用一个无需太多内存的较小的编译器来进行汇编。尽管我并不需要这个特别的功能,但我仍决定要为这个家伙实现这种功能。接着就出现了那个称为page-to-disk的东西,这就意味着尽管他只有2兆的内存,他也可以通过使用这个存储盘使他的电脑看起来宽敞一些。那是在1991年圣诞节前后。我记得曾在12月23日那一天加班加点,努力使page-to-disk运行。到了12月24日,它已经可以在某种程度上运行了,但是每隔一会儿就死机。最后到12月25日,也就是圣诞节那天,它终于成功了。这可以说是我为满足别人而不是为自己的需要而增加的第一项功能。
而我也为此感到很骄傲。
linux的用户天天都在增加,我也不断接到来自我曾向往的国度的电子邮件,包括澳大利亚和美国。关于此事,我在祖母家的圣诞聚会上对家人只字未提。不要问我为什么,我只是觉得没有必要和我的父母、姐妹或任何亲戚讨论这件事。他们不懂计算机。至少,我认为他们不懂计算机。
就他们而言,我每天干的事就是把电话线连到调制解调器上。当时的赫尔辛基,电话费在夜间可以打很多折,所以我在家的大部分工作都在深夜进行。但偶尔也会一整天地连在电话线上。我本想另接一条电话线,但是我母亲的公寓所在的大楼十分古老,没有额外的电话线,也不打算增加新的。那时我妹妹萨拉除了在电话上聊天之外也是无所事事,至少在我看起来是这样。所以我们会偶尔为抢电话线打架。真的会打起来。她和朋友打电话时,我会强行用“猫”拨号,她就会听到“嘀——嘀——”的声音。这自然会打断她,而她也就知道我确实、确实要上网收电子邮件了。
我可没说过自己是世界上最好的哥哥。
Page-to-disk是一个相当庞大的程序,因为它是MINIX没有涉及到的东西。该程序出现在0.12版中,于1992年1月的第一个星期发布。人们马上开始不仅仅把linux和MINIX相比较,而且开始和Coherent相比。后者是由TK开发的小型UNIXclone。从一开始,增加page-to-disk就使Linux在竞争中脱颖而出。
那是linux起飞的开始。
突然间,人们纷纷从MINIX转向linux。那时Linux尚不能胜任MINIX的所有工作,但是它还是可以做人们真正需要的大部分重要的工作。而它拥有一项人们特别喜欢的功能:有了page-to-disk,你可以运行超过你内存的巨大程序。这意味着,当超出内存之后,你可以将一块旧的内存存到磁盘上,要记存到了哪儿,仍然使用那块内存来解决你的问题。这在1992年的第一个星期是一件不寻常的事。
正是那个月,linux的用户从我知道名字并与其有邮件往来的五到十个人,增加到了成百上千我不知是谁的人。我并不认识每一个Linux的用户,这多有意思。
7、linux能换来金钱吗?
那时,互联网上正有一个恶作剧在盛行。
据说有一个叫克雷格的可怜男孩得了癌症,正在死亡线上挣扎,而在网民中则流传着一个连锁邮件,让人们向这个男孩邮寄明信片以表示对他的支持。实际上这是某人的一个恶作剧,可能根本就没有克雷格这么个人,更别提什么癌症了。但是这一呼吁竟招来了上百万张明信片。所以我半开玩笑寺要求使用linux的人给我寄明信片,而不用给钱。这像是一个人们会感叹“哦,上帝,又是一个要明信片的家伙!”的玩笑。在那时的个人电脑世界中,有一个有关软件共享的牢固传统。你下载了一个程序,就应该给作者寄回十块钱左右的回报。所以我收到了很多邮件问我是否要人们给我寄三十块钱。就是在这种情况下,我觉得必须说点什么了。
现在回想起来,我觉得那些钱一定会很有用的。我已欠了大约五千美元的学生货款,同时每个月要为我的电脑支付约五十美元。我另外的主要消费是比萨饼和啤酒。但是由于开发linux,我那时没有时间外出,最多每周出去一次。我不花钱约女孩子,把钱都花在了为我的电脑增加硬件上。也许要是换一个人,就会向大家要钱了,哪怕是为了减轻他那日夜辛苦劳动的单身母亲的负担呢?唉,我那时却没有想到这一点。去告我吧!
那时,我更想知道都有哪儿的人在使用linux。与收到钱相比,我更喜欢收到明信片。事实上,明信片确实在滚滚而来,从新西兰、从日本、从荷兰和美国。萨拉曾偶尔象征性地去取取信,突然意识到那总和他争吵的哥哥竟有来自那么遥远的朋友。那是她第一次认识到,在我总是占用电话线的时间里,我可能是在做一件会很有用的事情。那些明信片加起来足有几千封,但它们现在早已不知去向了,一定是在我某次搬家时丢掉了。我的朋友艾温坦说,我是他所见过的最不怀旧的人。
实际上,我不要钱还有很多原因。在最初发布linux的时候,我觉得自己是在沿着几个世纪以来的科学家们和其他学术界人士的脚印在前进,而他们的成就往往建立在别人所打下的基础上——用牛顿的话来说,我是站在巨人的肩膀上。这样做,我不仅仅是在与别人分离我的成果,别人也将会觉得我的工作是有用的。我还想听到反响(当然,是想听到赞扬)。朝那些可能会帮助我改进工作的反馈信息要钱是没有 。我想,如果我不是长在芬兰,我的态度会不完全不同。在芬兰,只是一个人稍微显露出一丝贪心的迹象,人们就会视之为可疑而不会羡嫉(自从诺基亚电话公司开始赚整个世界的钱并充实了很多芬兰人的钱包之后,这一点已经有了一些变化)。并且,对了,如果我不是在顽固的学究祖父和共产主义立场的父亲影响下成长起来的话,无疑我会对这件不要钱的事持不同态度。
无论如何,我不想把linux卖掉,我也不想失去对它的控制权。也就是说,我不想别人把它买掉。早在九月上传每一个版本时,我就在有关复制的文件中表明了这个版权声明。根据十九世纪的波恩公约,除非你将其出卖,你拥有自己所创造的一切东西的版权。作为版权所有者,我开始定下了以下关于Linux的规则:
1、 人们可以免费使用该操作系统,2、 但不3、 得将它作为商品。
4、 对其所作的改动和改进,5、 必须以源代码的形式将其公开(而6、 不7、 是二进制,8、 这是不9、 公开的。)
10、 如果不11、 同12、 意以上规定,13、 则无权对它进行复14、 制或从事任何行为。
你不妨自己设想一下。你为这个程序倾注了六个月的心血,你希望它是有用的,并且自己也能从中有所收获,但你肯定不想让它白白被人占去便宜。我想让大家都能够看到它和使用它,同时也可以随意对其进行改动和改进。但是,我也希望能确保我自己可以及时了解他们做过哪些改动。我希望自己有权使用源程序,这样,假如别人做了什么改进,我也可以利用它。我认为,要使linux发展成最完美的技术就必须保持它的纯洁性。如果有铜臭渗透进来,事情就要变黑暗了。所以,如果不让钱的问题掺和进来,就不会有贪欲的参与。
尽管我没兴趣拿linux去赚钱,但别的人却不这么认为,他们在给别人一份已经下载到软盘上的拷贝时都要索取回报。到了二月份,参加UNIX用户会议的人,几乎人人手上都有一张装有Linux系统的软盘。这些人也问我,他们能不能把Linux作为商品出售,比如说,只要五块钱,为的是收回软盘和时间上的成本。这听起来还有点道理,但问题在于,这样做就会侵犯了我的版权。
显然,我已经到了反思“linux是非卖品”这一立场的时候了。
那时,linux已经在网上引发了很多讨论,这使得我很自信,再没有人能够窃取我的劳动成果了——而这曾经是我最大的担忧。至少,假如真有谁这样做了,他也难逃众人的谴责。如果有人想篡夺Linux并将其变为一个商业项目,必将会在网上掀起黑客的反对潮,会有无数黑客似的人物大声斥责道:“嘿,那是Linux,住手。”当然,措辞可不会如此文雅。
事情的发展已经势不可挡:世界各地的黑客们每天都在共同分享彼此提出的修改建议。
我们正在集体创造一个最好的操作系统,这种发展轨道已经不可改变。正因为如此——因为linux已广为人知,我才觉得把它作为商品也是可以接受的。
但是,在使我自己看起来像个慈善先生之前,还有另一个关键的因素使我做出了这一决定。事实是,为了使linux有用,我曾依赖过很多在网上免费下载的工具——我把自己放到了巨人的肩膀上。这些免费软件中最重要的是GCC编译器,它是理查德?斯多曼的杰作,并且已经在公共执照协会(GPL)上注册了版权。在GPL条款之下,钱不是问题,只要有人愿意买,你可以卖一百万美元。但是,你必须提供软件来源。而得到或买到你的来源的人,将拥有和你一样多的对于该程序的。这实在是很高明的一招。我认可GPL的原则,但是和那些认为所有的软件创新都应该在GPL下向全世界公开的顽固的GPL信仰者不同,我认为发明者本人有决定如何处置自己的发明的权利。
于是,我抛弃了自己旧有的版权声明,采纳了GPL的内容,一个斯多曼也曾经和他的律师一道签署过的文件(因为有律师的参与,该文件被搞得洋洋洒洒有好几页)。
新的版权声明被放进了0.12版本中。但是,我记得在发布当晚我从睡梦中醒来,想到商业利益将可能有点古怪,因为当时所涉及的商业利益真是不多。但不知怎的,我觉得自己应该小心。我的担心之一是——现在仍然是——有人将丝毫不尊重我的版权地将linux掳去。我担心,在现实中,如果有个美国人侵犯了我的版权,我无法对其提起诉讼。现在这仍是我的担心。状告某人侵权很容易,而我的担心是,有的人会即使被起诉也继续从事这种违法行为,除非加诸某种强制执行的法律行动他们才会停止。同时我也不断地担心,在像中国这样的地方,企业并不承认GPL的效力,从而也不会尊重我的版权。
事实上,这些地方的法律体系对侵犯版权的制止在当时并不得力(中国已经签署了一系列的国际公约,李纳斯在这里谈的是1991年的情况——译注),而且,为防止违法行为的投入在这些地方被认为是不划算的。大软件公司和唱片公司曾作过努力,但是成效不大。
不过,事实减轻了我的担忧。有的人确实会暂时侵犯我的版权,但是他们往往也是那些尊重版权、反馈改进意见、使系统功能得以提高的人。他们将是系统升级过程中的一分子。相反,那些不尊重版权的人们则不会利用这些升级,他们的顾客也会离他们而去——我希望。
总的来说,我从两个方面看版权。比如一个每月挣五十美元的人,他可能会为一个软件花费二百五十美元吗?如果花一点钱买非法拷贝软件,而把五个月的工资用于吃饱肚子,我一点不觉得他不道德。这种侵权是道义上可以接受的。去追捕这种“侵权者”是不道德的,更不要说简直就是愚蠢的。就linux而言,谁在乎如果只将其用于个人目的时,一个人是否真正遵循了GPL呢?那些想藉此赚大钱的人们,才是真正不道德的,不管他们是在美国还是非洲,也不管程度如何。
贪欲从来就不是善的。
8、MINIX对linux
引人注目并非全是好事。
我从不擅长处理对抗,但也被迫站出来为linux和我的尊严辩护,因为安德鲁?塔南鲍姆不断攻击我的Linux取代了他的MINIX操作系统。我们都是网虫,所以论战是通过电子信件进行的。
他只穿着件T恤就浑身冒火,能怪谁呢?
在还没有linux讨论组之前,我一般都是在MINIX讨论组上宣布有关Linux的信息和寻找对这个操作系统感兴趣的人。对此,安德鲁怎么会高兴呢?
所以,开始的时候,他对我入侵他的讨论组有些不快。很显然,他也很不高兴自己的操作系统正在被一个来自芬兰雪原的新发明夺去光彩,而且看来有众多的软件设计者正在加入进去。同时,他对应该如何创建操作系统持与我对立的观点。那时,安德鲁属于主张以微内核的方法建立操作系统的计算机科学家阵营。他把MINIX做成适用于微内核和Amoeba(一种他当时正在创建的也适用于微内核的系统)的形式。
适用于微内核的系统在八十年代晚期和九十年代早期十分盛行,而linux的成功威胁到了这一运动。所以他不断地在网上帖一些难听的带攻击性的帖子。
微内核的理论依据是,操作系统是非常复杂的,所以要通过模式化来减少复杂性。微内核方法的原则,即核心的核心,是昼减少功能。它的主要功能是传播。电脑所提供的一系列不同的服务都是通过微内核的传播渠道实现的。因此,应尽量分割问题的空间,使其不再复杂。
我认为这种做法很愚蠢。
是的,每一个单独的部分是简单的,但是相互作用的多种功能如果放在一起就要复杂得多,而linux就是后者的情况。想一想自己的大脑。每一个单独的部分都很简单,但是各部分的相互作用构成了一个复杂的系统。这是一个整体比个别更大的问题。拿一个问题来说,如果你简单地将问题一分为二,说半个问题要容易一半,那么你就忽略了一个事实,即:你必须要考虑到两个半个之间的联系所带来的复杂性。微内核的理论是,如果把核分为五十份,那么每一份都只有五十分之一的复杂性。但是每个人都忽视了一个事实,即各部分之间的联系事实上比源系统更加复杂,而且那些个别部分也不是那么简单。
这是我对微内核最重要的反驳:你想实现的简单化是错误的简单化。
开始时,linux是一个较小的软件,而且简单得多,没有必要进行模式化。所以用Linux可以比MINIX更直截了当地做很多事。我最初发现MINIX的缺陷是,如果你同时运行五个软件,五个软件都要读不同的文件,那么五项任务要一个一个地先后进行。换句话说,你要向系统发出五次请求:“我可以读文件X吗?”文件系统主管读取的后台驻留程序先接受一个请求,对其进行回应,然后再接受一个,再进行回应……
linux系统只有一个核,在这个系统之下,五个不同的过程都对核进行系统呼叫。核必须要十分小心,不会将其混淆,但是它会很自然地让各个过程各行其是。因此Linux更加快捷高效。
MINIX的另一个毛病是:尽管你有了源代码,但是许可证并不允许你做很多事情。拿布鲁斯?伊文斯来说,他对MINIX做了重大改进,使其更易在386上使用,但是他却无法将其所做的改进纳入原系统之中,因为MINIX限制人们对其进行修改。从实用的角度来说,这不啻是一个灾难。使用者哪怕为了得到一个可使用的系统都要经过多个步骤,这真是太不实用了。
就这样,我与安德鲁?塔南鲍姆结束了交战,那是在1992年年初。想象一下,在一个暴风雪过后的早晨,你看见这样一条信息:
来自:安德鲁塔南鲍姆ast@cs.vu.ni(安德鲁?塔南鲍姆)
新闻组:comp.os.MINIX
题目:linux过时了。
日期:1992年1月29日,格林威治时间12:12:50
我在美国待了几个星期,所以没来得及对linux做多少评论(不是说如果我在,我就会说什么)。但是,Linux确实值得一评。我现在就有话要说。
正如你们所知,MINIX只是我的爱好,每当晚上我写烦了书,如果当时没有什么战争、革命、CNN直播的参议院听政会,我就会摆弄MINIX。我的真正职业是大学教授和操作系统领域中的研究人员。
由于我的职业,我想我知道在今后的十年左右时间里操作系统会向何处发展。有两个方面引人注意:
1)微内核对Monolithic system
大多数操作系统是独立一体的,也就是说,整个操作系统是一个单独的a.out文件,一个“核形式”运行。这种二进制中有管理过程、存储管理、文件系统及其他。这类操作系统目前有UNIX,MS-DOS,VMS,MVS,OS/360,MULTIC以及其他很多。
另一种则是基于微内核的系统,在这种系统中大部分OS都作为单独过程进行,还有许多通过沟通在核外运行。核的任务是管理信息仁慈,控制中断的情况,低层次的过程管理,还可能有I/O。这种形式的操作系统有RC400,Amoeba,Chorus,Mach,以及尚未发行的WindowsNT。
在我详尽论述两者的利弊之前,可以说那些设计了这两个操作系统的人们之间的急诊已基本结束。微内核胜出。Monolithic system唯一的优点在于运行上,而现在有足够的证据证明,微内核系统也能和Monolithic system一样快。
MINIX是一个基于微内核的系统。文件系统和存储管理相分离,在核外运行。I/O驱动也是分离的(在核中,只是因为英特尔中央处理器中的大脑是死的这一原因,才很难寻求其他的做法)。
linux是Monolithic风格的系统。这一做法是回到七十年代的一大退步,就像对一个令人激动的C程序以BASIC语言重新编写。对我来说,在1991年还写一个Monolithic system的系统是一个不折不扣的坏主意。
2)不分界域性(Portability)
很久很久以前有一种4004CPU,它成熟后变成了8008,接着它接受了整形手术,就成了8080。由8080诞生了8086,接下来是8088,再后来是80286、80386、80486,一直到了第n代。同时还出现了RISC芯片,有些能以100MIPS运行。200MIPS的速度以及更高能在近几年中出现。这些都不会马上消失,而是会很快从80*86发展开去。它们会通过在软件中解析80386来运行旧式的MS-DOS程序。我认为任何一个架构设计OS都是极大的错误,因为它会很快消失。
MINIX的设计就是不分界域性,并已从英特尔ported到680*0(Atari,Amiga,苹果),SPAC,以及NS32016。linux紧紧地与80*86联系在一起,方向错了。
别误解我,我并非不喜欢linux,主要是Linux会使所有那些想在BSD UNIX上运转MINIX的人弃我而去。坦诚地说,对那些想获得一个“现代的”免费OS的人们,我想建议他们找一个基于微内核的、portable的操作系统,如GNU之类。
安德鲁?塔南鲍姆(ast@cs.vu.nl)
附:顺便说一下,Amoeba有一个UNIX仿真器(在用户的空间中运行),但是还远未完成。若有人有志在此方面努力的话,请告诉我。运行Amoeba需要几个386,其中一个要有16M,所有的都必须具备WD以太网卡。
于是,我知道有必要维护自己的荣誉了,所以就有了下面的反击:
来自:李纳斯本尼迪克特托沃兹torvalds@klaava.Helsinki.Fi(李纳斯?本尼迪克特?托沃兹)
题目:回复“linux是过时的”
日期:1992年1月29日,格林威治时间23:14:26
组织:赫尔辛基大学
看到这种言论,我想我得有所回应了。先向那些已经听够了对linux系统进行的议论的MINIX用户们说声抱歉。我很想能“对诱饵视而不见”,但是……该是我好好地自我辩护的时候了。
安德鲁塔南鲍姆写道12595@star,cs,vu,niast@cs.vu.nl(安德鲁?塔南鲍姆)写道:
>我在美国待了几个星期,所以没来得及对linux做多少评论(不是说如果我在,我就会说什么)。但是,Linux确实值得一评。我现在就有话要说。
>正如你们所知,MINIX只是我的爱好,每当晚上我写烦了书,如果当时没有什么战争、革命、直播的参议院听政会,我就会摆弄MINIX。我的真正职业是大学教授和操作系统领域中的研究人员。
你用这个作为MINIX局限性的借口?对不起,但是你输了。我的借口比你的还多,而linux在很多领域还是胜MINIX一筹。更别说MINIX的大部分似乎是由布鲁斯?伊文斯编写的了。
反驳一:你说你把MINIX当作爱好来玩——那么,请问是谁在拿MINIX挣钱呢?又是谁在免费发送linux呢?再来谈谈爱好。让MINIX能免费获得,我对MINIX的最大抱怨就会消失。Linux在很大程度上对我是一个爱好(但是一个很严肃的爱好,最棒的一种爱好)。我没有从我的爱好中赚一分钱,它也不是我在大学要修的课程之一。我是纯粹用我自己的时间,在自己的机器上做出来的。
反驳二:你是教授和研究人员。这真是一个MINIX出现核心缺陷的好借口。我只能希望Amoeba不会像MINIX那样垮掉。
>1.微内核对Monolithic system
没错,linux是Monolithic的,我同意微内核是好一点儿。如果不是你的话题有争议性,我可能会同意你的大中分意见。从理论角度(及审美角度)而言,Linux输了。如果GNU的kernel在去年春天就已完善的话,我可能就不会开始这个工程。而事实是,GNU还没有完善,也远非如此。如果现在就已实现的这一点而论,Linux才大获全胜。
>MINIX是一个基于微内核的系统。linux是Monolithic的系统。
如果这是判断一个kernel好坏的唯一标准,你的观点就对了。但你没提到的是,MINIX在微内核方面的表现并不出色,而且对核内多元任务的操作仍存在着问题。如果我做的是一个在多线文件系统上有问题的OS的话,我就不会这么快来责备别人。而事实上,我竭尽所能来使人们忘记软件设计者在此问题上的惨败。
(是的,我知道MINIX拥有众多黑客支持者,但他们只是黑客。而布鲁斯?伊文斯告诉我有很多可以竞争的机会。)
>2.不分界域性
“不会界域性是给那些写不出新程序的人们准备的。”
——我,现在刚说的,口出狂言
事实上,linux比MINIX更具有分界域性。“你说什么?”我听见你说。是真的——但却不是在你所说的意义上。我使Linux尽量符合标准(我当时手边并没有POSIX标准)。把程序移植到Linux上比到MINIX上要容易得多。
我同意,不分界域性是个好东西,但是只有在它确实有意义的地方才是个令人向往的特性。没有必要专门使一个操作系统太具有不分界域性:能粘到可移植的API上就行了。操作系统的实质就是利用硬件的特点,并将其隐藏在一层高级的呼叫后面。而linux就是如此,它比任何kernel都更多地利用了386的特性。当然这便利真正意义上的kernel变得不可移植,但是这也使设计大为简化,是一个可以接受的权宜之计,因为这首先保证了Linux的诞生。
我也同意,linux又太不具有不分界域性了。去年一月我拥有了自己的386,而Linux系统的创建在一定程度上成为了一个让我认识386的项目。如果要成为一个真正的项目,必须能够在不分界域性方面做一些事情。但是,我最初的设计思想就是没有考虑到不分界域性,如果我这样说并不是太过分地为自己辩护。去年四月我开始这个项目时,认为不会有什么人会真的使用它。我很高兴我的这个想法错了。随着我对源代码的发布,每个人都可以免费来装截Linux,哪怕还不是很方便。
李纳斯
附:很抱歉我有时言辞过激。如果你没有其他的操作系统可供选择的话,MINIX已经挺好的了。如果你有五到十个386机器闲着没用,那么Amoeba也会不错,只是我确定无疑是没有的。我一般不会勃然大怒,但是在涉及到linux的问题时,我是有点容易感情用事。
在这件事上还有一些口舌,那是我唯一一次发火。但是我要说明的问题是:的确有反对的声音出现,哪怕在早先的日子里(或者我还证明了这一点:当你参加网上论坛时,一定要小心从事,打字错误和语法错误会永远纠缠着你)。
我和李纳斯把家人和朋友留在露营地,开始沿着一条清流的小溪做一次午后散步。我们的露营地是在东西亚拉(Eastern Sierra)一个叫格鲁夫尔温泉(Grover Hot Springs)的地方。此时是七月四日国庆日的周末,这里的风光秀美得好像是把《国家地理杂志》上的照片原封不动搬下来似的。“现在是柯达一刻,”李纳斯一边背诵着广告词,一边停下来欣赏着突兀的峭壁背景下铺满野花的草地。随后,我们在溪边坐下。我让他描述一下他的生活,尤其是自从linux越出了其发源地——即由他认识的那些参加新闻讨论组的狂热爱好者组成的小圈子——而广泛地传播开来之后,他的生活有何变化。
“这种感觉一定很棒,”我说道,“那些年你一直跳不出户,除了你的电脑之外只和这个世界保持着仅有的一点点联系。突然间,这个星上的每一个角落都有人认识到你正在进行的伟大工作,你成了这个对你寄予厚望的发展中的linux世界的中心……”
“我从不认为这对我来说是什么大事情,”他回答道,“我真的不认为是这样。对我来说,linux确实是那种我随时都在思考的东西,但这主要是因为总有问题需要我去解决。我确实为它投入了很多,但主要是因为它是一个智力的挑战,而不是因为任何感情的因素。
“我喜欢有这么多的人给我从事这个事业的动力,我曾认为自己已接受于完成它了,但我一直没有真正做到这一点。人们始终给我更多继续的理由,以及更多困扰的棘手难是,这使得继续完善linux变得更为有趣。否则,我可能早就干其他事情去了。但我没有,因为这是我喜欢的工作。做这件事充满乐趣。我怀疑,我对自己的大鼻子或其他这方面的事情的提成,显然比在Linux上花费的精力还要多。”
几个星期后,在斯坦福购物中心,李纳斯为怎样挑选一双慢跑鞋而犯愁。“你一般每星期跑多少里地?”售货员问李纳斯。李纳斯不由得笑了起来:在过去十年里他还从未?上过一里地。锻炼不是过去的首选功课。但在他感到疲惫的时候,李纳斯承认他愿意走出过度的自我监禁式生活。
“塔芙一定求过你,要你帮我去掉大肚子。”他开着开玩笑,一边拍着自己的肚子。
“告诉她,她的要求你本周内绝不可能达到。”我回答道。
接下来的一个半小时,我们开始在斯坦福校园里兜圈,以便找到一个可以合法停车的地方。然后,在伸展了一下胳膊腿之后,我们开始跑了起来。我们越过干涸的湖里狭窄的泥土小道来到林中,向着我们的目标——山顶巨大的卫星接收天线——前进。当然,我们根本没有跑到那儿。我一边迈着不寻常的轻快步伐奔跑,一边很惊讶李纳斯能够仅仅以一里的距离落在我后面而不被甩开。接着他终于不行了,几分钟后,我们在边的草上上舒展地躺了下来。
“你的家里人对因linux而发生的一切事情的反应是怎样的?”我问道,“他们对此一定感到非常的激动。”
“我不认为有谁真的对此很在意,”他回答道,“我不是说没有人真的关心这件事。但我一直花费我最多的时间在编程序上,这一次也与以前没什么不同,他们不至于为此而有什么更多的关切。”
“那么,你一定曾对你的亲属们说过些什么。比如当你和你爸爸一同出动时,你是否曾对他说:‘嘿,你可能不会相信我一天到晚在计算机上鼓捣的那个玩艺儿现在怎么样了,现在已经有好几百人在用它了……”
“没有,”他回答道,“我只是觉得没有必要与家人和朋友分享这些,我从来也没有想过要把它推荐给更多的人。我想起了在我写linux程序时,拉素曾经决定要买Xenix,UNIX的SCO系统版(微软开发的用于PC机的UNIX版本)。我记得他曾经试着劝说我‘不要在这上面犯错误了。’他的意思是叫我不要再继续写下去了。但我不在意他的话,最终,在这个问题上他也有所转变。但对我来说,Linux仍然不是什么大事情。在我看来,人们使用它固然是好事情,能够从中获得反馈意见也很棒,同时这些却并不是那么重要。我不想传播什么福音。我为人们使用我的代码而感到骄傲,但我从来也没有过要与所有人共同分享它的念头。我从来没有认为这是世界上最重要的事情。我也不认为有几百人用我的软件有任何的重要性可言,以至要告诉我爸爸。不是的,它对我来说更多的是一种乐趣。直到今天我也还是这么认为。”
“那么,你甚至都没有想过告诉你的父母、家人和朋友这些事吗?你自己真的不为这些事情而激动吗?”我问道,没有掩饰我的怀疑。
他沉吟了几秒钟,然后回答道:“我不记得我当时是否感到过激动。”
李纳斯买了一部新车,一部按他的定义很有“乐趣”的宝马Z3双座敞篷车,车身是金属蓝,完善的男孩子的汽车颜色。他选中这款颜色是因为没有他所中意的亮黄色。这黄色的宝马,他解释道,“看起来就像尿。”几年来,他去位于圣克拉拉的Transmeta公司总部上班时,总是将他的庞蒂亚克车尽可能停在离大门口近的地方。但现在,他却将心爱的宝马车停在他办公室外的窗前,按他的廉洁这样可以停在阴影中避免暴晒。于是,现在李纳斯在电脑前工作时就可以不时地欣赏一下他的新车了。
大约在一年多以前,我们曾经首次在一起外出旅行——开着我特意租来的白色野马敞篷车翻山去圣克塔克鲁兹。在我们这次旅行期间,李纳斯曾停下来观察我们所参观的桑拿浴场和酿酒厂外停着的运动型轿车。现在,我们是在他自己的运动轿车里翻山越岭。当他在十七号公路上驶过弯路时,他脸上浮起微笑。
“你应该得到这些。”我说。
我从车内的储物箱里拿出一摞CD。
“听什么?平克?弗洛伊德?”我问道,“或者詹妮斯?乔普林?”
“这是我小时候听的音乐。我小时候从来没有在音乐上花过钱,但我在我家的房间里捡到过它,我猜是我妈妈听过的,尽管我记得她是艾尔维斯?卡斯蒂罗(Elvis Costello)的歌迷。”
这是一个周五的下午,一个欢快而美好的加利福尼亚周五的下午,各种令人愉悦的感觉围绕着我们:蓝色的天空映入眼帘,火辣辣的阳光照在身上,鼻子里是山中桉树的芳香和清新空气的甜甜味道,耳中传来的是平克?弗洛伊德的歌声。在外人的眼里,我们看起来一定很像那种后青春期的陈腐过客,涂着防晒霜,放着经典的摇滚曲调。不过,并没有多少车超过了李纳斯的新宝马Z3。
我们把车停在圣塔克鲁兹以北一点儿的一号高速公路旁。路旁早停了些普通的车子,我们来到几乎没有什么人的空旷海滩上,舒舒服服地躺了下来。几分钟后, 我从背包里掏出录音机。再一次的,我请他讲一讲linux早期的事情。
李纳斯用手指在沙滩上画了个四方形,表示是他的卧室,然后又指出了他的床和计算机的位置。“我起床的第一件事就是检查有新的电子邮件,”他说道,一边用手指比划着,“有些时候我一整天都呆在屋子里。我看邮件不仅仅是为了看有谁在和我联系,而更多的是为了看是否附带为我准备了些特殊的问题,比如是否出现了新的状况和问题,或者是一些我们已有解决方案的老问题又遇上了新情况。”
李纳斯告诉我,那个时候他的社会生活是“可怜”的。接着他认为这样说听起来有点过分,所以他修正道,“可能比可怜稍微好一点。”
“我并没有成为一个完全的隐士,”他说道,“但是即使在linux出现之后,我一如既往地不善交际。我的大多数朋友都很善于与人相处,但我不行。你可以想象一下,如果从来没有给女人打过电话,那约会的情况会是怎样的呢?所以在那段时间里,我只有几个常到我那里敲窗子、想和我喝杯茶的朋友。我不认为有人会到处传说我正在做一项伟大的事业、我将改变世界之类的话。我不认为有人曾经这么想过。”
李纳斯唯一有规律的社交活动是每周的学生聚会,在这儿他可以和其他主修科学的学生混在一起,这个聚会由一些对技术的热爱胜过一切的人组成。
“什么是我担心的?正是一般的社交活动,也许提成不是一个准确的词汇,但这确实给我带来了很多情绪上的影响。在那个时候,只要一想到姑娘,linux系统就变得不再重要了。在某种程度上,今天也还是这样,我仍然可以不把Linux当回事。
“在大学的头些年,社会交际对我来说变得非常重要。这倒不是因为担心别人会嘲笑我驼背什么的,这种渴望社会活动的感觉来自于对朋友和别的什么东西的向往。我喜欢去学生聚会的原因之一就是,这是一种无须过分社会化的社交活动。在这样的晚上我融入了社会,而在其他时间我与计算机在一起。在学生聚会里玩远比linux更为感性,我从未为Linux感到心烦意乱,也从未因为Linux而睡不着觉。
“过去和现在,能够使我心烦意乱的,从本?上讲并不是技术,而是与之相关的社会因素。我为安德鲁?塔南鲍姆的帖子如此心烦的原因,主要不是因为他所提出的技术观点。
“使linux越来越完善和有活力的原因之一是,我不断地收到回馈的信息。这意味着Linux被人所注意,同时这也是一个正在形成的社会团体,而我是这个社会团体的领袖。这是一个明确的信号。这一毫无疑问是重要的,甚至比告诉爸爸妈妈我曾做了些什么更重要。我越来越关注那些使用Linux的人,至于我创造了一个社会圈子并获得了他们的尊重之类,却始终不是我关心的重点,甚至现在也仍然不是。不过,这确实是一个最重要的事实,也是我对塔南鲍姆的指责如此反应过度的原因。”
太阳已经没入了太平洋,到了该离开海滩的时候了。李纳斯坚持要我驾驶他的车返回——以体验一下这车究竟有多棒。我们要经过一段又长路又多的九号路返回硅谷。
李纳斯告诉我,他与MINIX创造者之间的争执,因为变得越来越富于攻击性而不再适于在公众面前进行,最后不得不通过私人电子邮件进行。接下来是几个月的平静。一天,塔南鲍姆给李纳斯来了一个电子邮件,指出在《Byte》杂志的背面有一条五行字的广告在推销商业性的linux版本。
“在我最后一次收到的来自安德鲁的电子邮件中,他问我是否真的在授意别人出售我的系统。我回信告诉他是的。然后我就再也没有收到过来自他的讯息了。”
大约一年后,当李纳斯到荷兰去作他的首次公开演讲时,有机会来自塔南鲍姆任教的大学,并希望获得那本改变了他一生的书籍——《操作系统:设计与执行》——的作者在该书上的亲笔签名。李纳斯在门口等了许久,但塔南鲍姆并没有出现,因为那时他恰好外出了。就这样,他们至今仍没有见过面。
在我首次公开演讲的头天晚上,我颤抖着躺在床上。房间里很冷,温度也就刚好在零度以上一点。荷兰的房间不像芬兰那样冬天有暖气,而我这间漏网的大屋子甚至还有一扇大玻璃窗,就好像荷兰永远只有夏天似的。但是,在1993年11月4日的这个夜晚,寒冷不是使我睡不着的唯一原因。我睡不着,因为我是如此的紧张。
在公开场合讲话一直是我的短项。中学时,他们让我说明一些我们曾吃力地研究过的东西,比如老鼠或其他什么的,而我总是讲不好。我站在那里,说不出话来,然后开始傻笑。说真的,我并不喜欢这样。当我很不情愿地被老师叫到黑板前,当着全班同学解答习题时,甚至比这还要难受。
在阿姆斯特丹附近的埃德市(Eide),我接受了在这里举行的荷兰UNIX用户第十五届年会的邀请,将在会上做主题发言。我很想通过这次机会证明一下自己在公开场合的说话能力。在此之前一年,我也曾收到过来自西班牙的类似邀请,但我拒绝了。其实在那个时候,我是非常希望出国旅行的,但我想前往一游的愿望被害怕公开演讲的心理抵消了(我现在仍然喜欢旅行,不过在今天,这已经不像当年那样新鲜了。在那之前,我几乎从未离开过芬兰。那以前我唯一到过的地方就是瑞典,我们在那儿露营过几次,或许还可以算上到莫斯科去看我爸爸那次,那时我才六岁)。
拒绝到西班牙庄旅游一番的机会让我有些懊恼。所以我告诉自己,如果还有第二次这样的机会,我绝不放过。我躺在床上,另外一些思绪渐渐取代了我的回想:我能克服恐惧站在人前吗?我还会像过去一样嗫嚅吗?或者比这更糟,我会在将近四百名来宾面前舔着嘴唇傻笑吗?
要真是那样,我就真是一个不折不扣的傻瓜。
我对自己说些惯常的废话以劝慰自己。来宾都希望我成功,如果不喜欢我的话他们根本就不会来,并且我也很熟悉演讲的主题:在linux的核心产品中采用那些不同的技术决定的理由,以及开放源代码的理由。然而,尽管如此,我还是不能让自己确信演讲会取得成功。我的脑子里像是有一台停不下来的火车引擎一样轧轧作响。
演讲到底怎样?噢,来宾们看到我明显地带着惊慌站在他们面前,把通过Power Point——感谢上帝安排微软发明了这种软件——放映幻灯作为敷衍场面的救生工具,并在回答他们的问题时羞涩迟疑,但他们富有同情心地接受了我的表现。
事实上,我的答疑是演讲中最棒的一部分。在我演讲完之后,马歇尔?克尔克?迈克库斯克(Marshall Kirk McKusik)——他现在在太阳微系统公司工作——走到我跟前,说他认为演讲很有趣。对这个表示我是如此感谢,我觉得我都想跪下来吻他的脚以示谢意了。在计算机领域里很少有让我尊敬的人,克尔克却是其中之一。正是因为在我第一次演讲后,他对我是如此的友善。
我的第一次演讲就像是在进行休克疗法。接下来我还要遭遇许多类似的状况,但这些经历开始让我变得更自信了。
大卫一直在问我,伴随着linux的不断成长壮大,我的大学生活尤其是精神状况有怎样的变化。但我不记得有任何教授和我谈到甚至是提到过它,我也不记得有谁指着我的背景对他的朋友说:“瞧,这就是那个李纳斯。”没有这样的事情。大学里我周围的人都知道Linux这回事,但大多数与其有密切关系的黑客都不是芬兰人。
9、最后的冲刺
1992年秋天我成了一名用瑞典语讲授计算机基础课的助教(这事的起因是,系里需要人用瑞典语上基础课,但在这之前的几年里,本系只有两名能讲瑞典语的主修生,拉尔斯和我,他们没有更多的选择,所以找上了我)。真实,我甚至对?上讲台和演算习题都感到担心,但这种情况持续得并不长,靠把注意力集中在讲课内容上并尽力不去自寻烦恼,我战胜了自己的担心。就这样,三年后我晋升为研究班的助教,从此,我的工作不再是在讲台上讲课 主要是在实验室里继续linux的发展完善研究。这可能也预示着一种趋势:有人愿意付酬让我从事Linux的研究。这也是我和Transmeta之间关系的基础。
大卫:“那么,linux是在什么时候开始成为一件大事情的?”
我:“它到现在为止也还不是。”
也许我说得太绝对了?好的,我可以作一点修正,在有许多人毋庸置疑地依赖着linux(作为他们计算机的操作系统)而不是把它当作玩具式的操作系统的情况下,它确实变得更像那么一回事了。当他们开始不再只是把它作为修修补补的玩意之后,我就认识到,如果出了什么问题的话,我就要对此负责任。或者说,我至少在精神上感到了某种责任感(至今还是如此)。在1992年,Linux从一个更像是游戏的玩意变成了一些人生活中不可或缺的一部分,成为他们的生计和生意。
变化发生在1992年春天。过了大约一年半后,当第一个X视窗系统在linux条件下运行时,我开始着手进行终端仿真。它意味着这个操作系统将有能力支持一个图形用户的界面,而用户也可以在多视窗条件下工作。这个工作应该归功于麻省理工学院的X视窗项目(X Windowing Project)。这个工作的完成将带来一个很大的改变。我还记得在此之前的大约一年半,我还和拉尔斯开玩笑,说总有一天我们会完成一个在Linux下运行的X系统。但我绝没想到这一天这么快地来到。一个名叫奥瑞斯特?扎布罗斯基(Orest Zborowski)的黑客能够把X视窗装载到Linux上去。
对于我们有了图形用户界面的事实,我有一个短暂的适应过程。在最初的一年里我甚至都没有把它作为通常的运行环境,但是现在我简直不能没有它了,在我工作时总是同时开着许多窗口。
奥瑞斯特的贡献不仅使我们有了窗口,同时它还打开了通向未来的大门。Domain Socket可以用于能够支持X视窗系统运行的本地网络,但我们可以指望这些同样的套接字(Socket)能让linux有能力跳出本地网络,而可以异地连接计算机。没有网络化的功能,Linux只能对那些从不上网或只是在家拨号上网的人还有点用。
靠着极大的乐观主义精神,我们开始在这些新颖的套接字上开发linux的网络工作功能,哪怕这些套接字本来完全不是为网络工作而设计的。
我相信这很容易做到。我们有一个关于版本发表的编号进度表,原计划是在1992年5月发表0.13版,由于有了恰当的图形用户界面,我感到我们对一个完整的、可靠的并且支持网络工作的操作系统这一既定目标有了95%的把握,所以我把将要发表的新版重新命名为0.95版。
嘿,我是不是很天真?请不要提到这个让我难堪的话题。
网络功能的开发让人很厌烦,我们花了差不多整整两年的时间去完成它,以形成一个可以发表的东西。当要加入网络功能时,突然之间所有的新问题都冒了出来,全都与安全问题有关。你不知道谁在旁边,也不知道他想要干些什么,你不得不足够小心地防备恶意的垃圾邮件对你的系统的攻击;同时,也再也不能完全控制有人想和你的系统连接的企图了。此外,许多人使用着不同的网络设备,依靠TCP/IP网络通讯协议这样的网络工作标准,很难让所有的超时(time-outs)正确。这些问题看起来好像要一直久拖不决下去。
到1993年末,我们大致上有了一个网络工作能力的解决方案,尽管部分人还很难让它正常地工作。我们还不能在没有8-bit boundaries的情况下解决网络问题。
我过分乐观地将新版本定名为0.95版,而不甚乐观的实际情况却将这种乐观变成了一种束缚。又花了我们将近两年的时间,1.0版才得以问世。在此期间,我们仍然需要不停地发布各种有关瑕疵修和添加功能的新版本。但在0.95和1.0之间,却没有那么多的数字可以作为序号,这让我们着实有些疯狂。等到0.99也用过之后,我们只好在它后面加上数字以简要表示附加的序列,接着又开始依靠字母来表示,比如0.99版第15A次后面紧接着0.99版第15B次,0.99第15Z次是最后一个以此方式命名的版本,因为,原本应该命名为0.99版第16A次的版本正是我们已经完成了的linux 1.0版。
1994年5月,新版本终于在赫尔辛基大学计算机科学系的礼堂里闪亮登场。现在回过头去看,完成这一版本的过程完全可以说混乱不堪的。
但是,没有任何东西可以阻挡linux的普及。我们有了自己的讨论组,取名为comp.os.linux,这是一个从我和安德鲁?塔南鲍姆激烈战斗的劫后灰烬中诞生出来的小团体,一个极具吸引力的游牧部落。当时,还或多或少地主导着互联网的Internet Cabal,每月都会针对每个讨论组吸引了多少读者发布一个非官方的统计报告,尽管这不是一个可以完全依赖的统计报告,但却是你可以找到的有关你的站点——在这里是指有多少人对Linux感兴趣——的普及程度的最好的参考信息。Alt.sex(一个著名的性问题网站,以另类性爱为其诉求——译注)站点那时是最受欢迎的(不过我对它并不热衷,我确实上过它一两次,不过是为了看看它吸引人的究竟是些什么玩意罢了。我更像是你那种类型的清心寡欲者。我宁愿和我的浮点处理器呆在一起,也不愿参与到alt.sex上那些热门话题中去——什么最新的做爱姿势啦,以及什么关于深度爱抚者们的报告之类)。
通过Cabal的月度统计,我可以很方便地追踪我们两个讨论组(comp.os.linux.)在网上的声望。而事实上我也确实做了这样的跟踪(虽然我可能是一些人心目中民于向强势挑战的英雄,但我却从来也不像那些糊弄人的新闻所表达的那样,是一个只知道科技的无私和利他主义的孩子)。到1992年秋天,我们的讨论组成员估计已经超过万人,这里面有些人只是加入到讨论组来自自到底发生了些什么,而并不是linux的使用者。每个月的统计结果出来的时候,首先提供的是一个普及率排名前四十名的讨论组的简要报告,如果你的讨论组没有挤进前四十名的话,你可以从另一个地方取得在这四十名之外的其他讨论组的完整报告,而我当时就不得不经常这样做。
我们的讨论组的排名仍在缓慢爬升。终于有一天,它挤进了前四十名。
这真是太棒了!我是如此地感到高兴,我记得我还为此写了一篇文章,在其中我基本列举出了包括MINIX的各种不同的操作系统,并说:“嗨,你们瞧,我们比(微软)视窗还要普及。”其实,真正的原因是当时的视窗系统还不能应用于互联网上。
1993年,我们的讨论组闯入排名前五位。那天晚上,我带着巨大的自我满足感躺到床上,为这样一个事实而兴奋无比:comp.os.linux和alt.sex不相上下,这意味着,linux应得和性一样普及了。
在我的小世界里当然不会有这样的竞赛。
我真的没有什么生活。在那个时候——正如我在前面已经提到过的,彼德?安文组织了一次在线捐活动,共筹得了三千元帮助我买计算机。在1993年圣诞节,我的计算机升级为486DX266——它在此后还要陪伴我好些年。在那个时候我的生活不过如此:吃、睡、到学校、编程、读电子邮件。我的朋友们越来越走向社会,我对此已习以为常。
十分坦白地说,我的大多数朋友也是失败者。
在埃德的那次演讲几乎使我确信我能应付任何事情,既然连站在一群俨然陌生的人面前并成为他们注意的中心这样难堪的事我都可以应付,我的信心在其他方面也渐渐建立了起来。我被迫就linux的修补和升级问题迅速做出了决定,而每一次这样的决定,都让我感到作为一个成长中的团体的领袖,我是称职的。在所有的决定中,纯粹的技术决定并不成其为问题,困难的是用老练的技巧向一个人指出你更乐于采用另一个人的建议而不是他的。有时候,我只是这样简单地对他说:“这东西用起来很不错,我们就用它吧。”
我从不认为接受不同于自己的想法是找到最佳解决方案的办法,而认为这可以防止在提出不同的竞争的程序员之间形成对立。尽管当时我可能不是这样想的,但这样做也有助于获得别人的信任。信任不是没有用的,在人们相信你时,他们更容易领会你的建议。
当然,你首先要建立别人之所以信任你的基础。对我而言,我猜想主要不是因为我发明了linux的核心部分,而是因为我最终做出了将它放到互联网上、并且对所有希望使用或改进它的人公开源代码的决定。
多从未想过自己在计算机之外的现实生活因为linux而有所改变,我也从未想过要做一位领导者。这一切的发生完全是一种偶然。
在一些关键性的发展阶段中,一个五人核心开发小组开始担当大多数的开发任务,他们由此觉得自己好像是一个筛子,有责任维持这个领域的工作。
我很早就明白,最好的领导者不是让手下做他要求他们做的事情,而是让手下做他们自己想要做的事。同时,最好的领导者也明白,当手下犯错时,要让他们自己有能力纠正而不要总是自己出面纠正。最佳的领导者是能够让手下自作主张的人。
让我换一个表述。
linux所取得的许多成功,其实可以归结为我的缺点所致:
1、 我很懒散。
2、 我喜欢授权给其他人。
黑客们,不,程序员们,把在linux和其他开放源代码的项目上工和放在比睡觉、锻炼身体、小圈子聚会,以主,有时是性生活更优先的地位。因为他们喜欢编程,更因为他们乐于成为一个全球协作努力的活动的一部分——Linux是世界上最大的协作项目,这一努力将给所有喜欢它的人带来最好最美的技术。这种努力是如此率真,又是如此有趣。
好了,我现在听起来就像是在不知羞耻地自吹自擂。开放源代码的黑客(程序员)们,不是特蕾莎修女在高技术领域的翻版,他们也在每个项目的“贡献者名单”和“历史记录”等文件中将他们的名字和贡献联系在了一起。最为多产的贡献者,将获得那些希望获得代码和雇佣顶尖程序员的产的注意。此外,黑客们的很大一部分动力,也来自于靠实实在在的贡献获得同行的认可和尊重的企图,这是一个重要的激励因素。每个人都想影响自己的同行、提高自己的声誉、改善自己的社会地位。
开放源代码的发展项目给黑客们提供了这样的机会。
不用说,我在1993年也如同在1992年、1991年一样将大部分时间花在了电脑前,这看来应该有所改变了。
10、塔芙
跟随着我爷爷的学院教学生涯,我也成了赫尔辛基大学的一名助教,被分配在这年秋季学期里开始用瑞典语教授《计算机科学入门》课程。
就这样,我遇上了塔芙。她对我一生的影响甚至比《操作系统:设计与执行》一书对我的影响还要大。不过,我不会用这种影响的细节来让你烦恼的。
当时,塔芙是我的班上十五个学生中的一个。她已经有了一个学龄前教育学的学位(不像在美国,芬兰要求学龄前儿童的教师要有大学学历),她还想学习计算机,却不能取得像班上其他同学那样的进步。当然,最后她还是?上去了。
我们交往的过程是如此简单。那是在1993年秋天,互联网还没有流行开来。因此,有一天,我在这个班布置的家庭作业就是给我发一个电子邮件(这要放在今天简直要笑死人),我对学生说:“今天的家庭作业:发给我一个电子邮件。”
其他人的邮件不是一些供记录的短语,就是一些没什么意思的笔记。
只有塔芙,她邀请我和她出去约会。
我娶了第一个通过电子方式走近我的女人。
塔芙是一个曾六次获得过芬兰空手道冠军的幼儿园教师。她的家庭很独特,尽管我认为还不如我们家那么离奇。她有许多朋友。从我们在一起的第一刻起,她就像是最适合我的女人。经过了几个月的约会,我和我的猫兰迪就搬到她的公寓房间去了。
在搬进去后的最初两周,我甚至都没有动过一下我的计算机。
不算上我服兵役的时间,这两周是我自从我十岁那一年坐在外祖父膝盖上摆弄计算机以来,离开计算机最长的一段时间了。不必详细描述,但这确实是除去服兵役之外我离开计算机最长的时间的记录了。不知为何,我并不为离开计算机而难受(再次声明,具体情节对你来说并不感兴趣)。对于这一切,我曾经看见她有几次嘀咕过什么“母性的胜利”,而我爸爸和妹妹可能只是感到困惑罢了。
不久,塔芙去找了只猫来和兰迪做伴。
晚上我们都有很好的安排,或是就我们俩人在一起,或是找几个朋友一块儿玩。早上五点我们就起床了,她去上班,而我也好早点儿到学校去,在没人打扰的情况下读一读与linux有关的电子邮件。