October 3, 2011

我和Linus大学时那些事儿

原作 Lars Wirzenius,地址 http://liw.fi/linux20/

特别感谢 ggarlic,da chen, Jack Ma, ant_sz 对翻译的指正!

这是一个冗长的故事,如果你现在没兴趣阅读它,可以试着等到卧病在床,脑袋里一团浆糊,把止疼药当糖吃时再读,希望您阅读时不要感到不适 :) 。当然,在无意识的状态下听语音合成器对你高语速的朗读是一个更好的选择。

Linux 今年二十岁啦。这是一段很长的时光,因为参与了故事的开端,我想分享一些当年的回忆。

1988年我高中毕业并进入赫尔辛基大学计算机科学专业。学校九月开学,同时我被邀请进入Spektrum俱乐部,成员是那些学习数学、物理、化学、地理和计算机科学的瑞典语使用者。

Spektrum是一个不错的社交俱乐部,由于我曾一直很害羞,而俱乐部在我刚进入这个陌生城市时,给我一个轻松与人认识的途径。也就是在这里,我认识了另一个说瑞典语的同年级计算机专业学生,他叫 Linus Torvalds.

第一年,我们选了相同的课,因为那些都是公共必修课,再加上我们在 Secktrum 认识,我们也有了一些友谊。

那时候计算机很贵,学校提供了满是跑着MS-DOS的PC和少量Mac的机房,还有一些连接到VAX/VMS系统的终端。我从没很喜欢过MS-DOS,而且它们也常常被占用着。我也很难搞定那些Mac,因为过去没玩儿过图形界面的东西。于是我很自然地选择了那些终端,即使VAX/VMS实在是一个令人讨厌的系统。

圣诞节时,事情发生一些变化。计算机系藏有一台Ultrix小型机,几乎没人使用,而我碰巧的到了那台计算机的访问权限。Ultrix是DEC版的UNIX,我曾读到过Unix,主要是在K&R写的C语言书中。我甚至曾写过一些MS-DOS用的类unix命令行工具。能使用Unix电脑实在是意见快事—管道实时工作,而不是通过临时文件!同时运行多进程!文件名不会不自然地被缩减!解放了!

我把玩这个大概是叫kreeta(芬兰语Crete岛)的Ultrix机时,有一天我不小心键入了rm命令。我曾有一个坏习惯,把em,一个定制版的MicroEMACS,敲成"rm",所以我极力避免这样。不过,那天我把rm something敲成了rn something,于是我发下呢了Usenet新闻组。

当我从完全的诧异中恢复过来时,机房也该关门了,门卫把我赶了出去。我回到家,不禁回想:那儿真是个世外桃源,人们讨论着C语言等好多有趣的东西,而我也可以看他们的讨论,没什么比这更美妙了!

我把"rn"告诉了Linus,他也非常喜欢它,我们都花了很多时间读这写新闻组。不过那一年我们一直在潜水。我们都很清楚,新闻组有规定"不要发水贴浪费他人的时间"。

我很快爱上了comp.lang.c新闻组,这里有被人实验室的大牛参与,Dennis Ritchie大神最近刚在组里停止发言了,不过其他人还在,比如Andrew Koening大神,我刚读了他写的《C陷阱与缺陷》。我一个大一小朋友,实在不敢打扰大牛们的谈话。Linus倒没这么害羞,不过他也怕出错不想说话。

第一学年在五月结束了,六月时我们都开始了义务兵役,不过在不同的地点服役。第二年我没再见过Linus,芬兰军队教我闭嘴、少胡思乱想、加速、射击还有在餐厅里收拾脏盘子,我的智商在那就个月里下降不少,那是段无趣的经历。

三月时我退役,没多久我得到了一份工作,为芬兰翻译句写一个数据库程序。程序是用dBASE IV写的,这段经历让我学会了我不该让别人替我挑选工具,虽然用破铜烂铁写出好软件也不是不可能,不过这种是还是尽力避免的好。

那个夏天,我重新联系上了赫尔辛基的同学们,包括Linus在内。有一个叫Patrik的学长,他住的地方有一个桑拿房,每周他都请我们去一次。乃们这些把桑拿和同性恋当成近义词的色狼可别想歪了,在芬兰,桑拿就是沐浴,药澡,甚至是冥想,跟性没啥关系。

Linus有一张勉强算出名的照片,看起来半裸着,喝着啤酒,就是在Patrik那儿拍的。拍照的是一个同学,叫Stina,当时Linus有穿裤子,不过因为是大夏天,所以上身没穿衣服。这不是放荡,真的!/* 译者注:欲盖弥彰? */

我们在那个秋天重新开始学习,我继续跟Linus在一起玩,一起上一些课,参加聚会,特别是一起去机房。我们都特别喜欢折腾Unix,我们有一们关于C和Unix编程的课,我1987年就了解C语言了,当时我自学了K&R的第一版《C程序设计语言》,我觉得Linus之前也有一些经验。大部分课程对我们来说有一些太基础,所以我们花了一些时间做着类似于精简代码,比谁的代码更短这样的小蠢事儿。

我们也兴冲冲地通过其他途径探索Unix和相关技术,我写了第一个我的Cron计划任务,为了挤爆Linus的邮箱,然后告诉他,Unix其实是实时更新访问时间戳的(当然,Linux已经修复了这些)。 Linus有一次发现学校里有台Postscript打印机,于是手工写了一些PS代码想看看长啥样,打印出来后发现都是些奇形怪状的方框。

我们跟Kreeta玩的不错,除了它崩溃的时候。Ultrix并不是一个高质量的系统,一个bug就是如果用户使用mknod系统调用,那么内核会在一分钟内崩溃。在编程课讨论mknod的那段日子,kreeta大部分时间都是在蓝屏:(…

1990年的圣诞节过去后,1月5日,Linus买了一台新电脑。他在家曾用着一台Sinclair QL,不过他还是想要台386。他用学生贷款买了一台。他满心打算着要学学多任务处理,想看看386如何实现多任务。很不幸,买电脑时附带了一个叫Prince f Persia的电脑游戏。 /* 译者注:哈哈哈哈 */

几个月后,Linus终于把那游戏玩腻了,开始真正学习386编程。一天我去他那儿玩时,他像我展示了一个多线程的小程序,虽说很简陋,但的确令我吃惊:一个线程在屏幕上输出A,另一个输出B,于是可以看到A、B之间的交替输出。

当然,最令人惊讶之处在于Linus自己实现了所有的代码。这样的商业代码并不是很贵,但作为一个学生的小hack就很酷了。那一刻我明白了孤身一个程序员也可以做出伟大的作品,而那些底层的神秘技术其实也很简单。

当然,我并没有期望Linus的小hack能真的弄出什么名堂来,有两个原因:一是这个程序只是A、B交替输出,并没有真正做出什么东西;二是根据我对Linus这些日子的了解,他很聪明,却很懒,而且偶尔和最的时候他会和别人争吵,说一些人能想象的最愚蠢的话。

然而Linus把386多任务程序坚持了下去,点点滴滴地加入了更多功能。其中一项就是他希望能通过Modem访问Kreeta。他开始加入简单的终端模拟器,而不是使用已有的程序。为此需要两个线程:一个从键盘读入字符并写入串口,另一个从串口读入并输出到屏幕上。在加入了VT-100转义符解释器后,他拥有了一个能在家阅读Usenet的很好的终端模拟器。

Linus真正想要的是家里能有一台Unix计算机,他听说过Minix还买过那本书/译者注:《操作系统设计与实现》/,并让Minix在他的386上跑了起来。真的跑起来了,可惜在其他地方包括学校机房的机器都无法运行Minix。他只好一面折腾Minix,一面增强他的多任务程序,渐渐的就玩儿大了。

1991年的春天,我又找了份零工挣钱买电脑。那份工作需要用C++写一个地理信息系统。我忘了让别人替我选工具的教训,这份工作让我很忙很忙,所以我没怎么了解Linus在那个春天和夏天都干了啥。不过有一点,我们讨论了各种编程相关的话题,他解释了一些在他的程序里写入日至信息的东西,包括一些如print_string("error:i=");print_int(i);print_string("\n");这样的函数,而我觉得很震惊。Linus当然知道,C标准库中的printf函数可以让这一切变得很简单那,不过由于他实际上写的是一个操作系统内核,不能调用C标准库,而他自己又不知道如何实现一个printf

所以我帮他写了一个sprintf,这是我对Linux内核的第一次贡献。它现在还在那里,不过已经被snprintf替代了(这当然是一个更好的接口)。Linus认为自己可以再提升一下代码性能,部分代码要进行手工优化,这是的我有些退缩,不过Linus乐在其中,我也就没太在意。

Linus的多任务程序蓬勃增长,加入了新的功能,例如磁盘驱动、内存管理、文件系统。这足以作为一个运行用户程序的内核,于是Linus在Minix下编译程序,再拿到自己的内核上运行。

在这之前,1991年夏天,我们都开始在Usenet上说话了。那年八月,Linus在comp.os.minix新闻组第一次提到了他的内核项目。不久,他决定开放他的代码,于是找了ftp.funet.fi的一个管理员上传他的代码。到此,这个项目需要一个名字了,Linus想把它其名为Freax,不过ftp管理员Ari Lemmke决定称之为Linux,现在你还可以在早期Linux的Makefile里看到Freax这个名字。

我记得第一版Linux并不可以直接安装,Linus需要搞定一下系统安装的方式。他自己的电脑已经慢慢的由Minix转变为Linux。我提供了我的电脑,Linus过来做了一些hack,直到他能把Linux通过软盘装进去。安装过程可并不容易,需要一个磁盘扇区的十六进制编辑器,不过这已经走在了正确的方向上。

接下来的几个月中,Linux的到了一些关注,其他人也开始参与hack。1991年的圣诞节假期,Linus加入了虚拟内存,这让Linux的实用性大大增加。

还是在1992年,Linus开始考虑让Linux版本号向接近1.0发展,所以他在一个版本中把版本号从0.12升到0.95,接着0.96,0.96b,0.96c … 我想可能会有0.96c++2,哈哈。在0.97时代,我受不了内核文档的缺乏了,所以写了第一个README文件来帮助大家编译内核。

1993年,我和Linus都留校任计算机系助教:我们辅导学生写作业,检查他们是否完成。这意味着我和Linus共用一间办公室。这对Linux的开发很有好处,Linus有一份收入,所以不用为温饱担心,更重要的是:网速快了,这对我们帮助很大,尤其是Linux开始加入联网能力的时候。

在一段时间里,Linux的网络功能还有不少bug,于是我们被学校禁止接入校园网/译者注:原来Linux从一开始就和校园网关系不好/,当然,这更给了Linus修复此功能的动力。

更快的网速带来的一个好处就是下软件之需要几秒钟,比如Linux内核。这让Linus不太注重做备份,或者说,版本控制,除了一些频繁的打包发布,这需要分发到各个镜像站。

快速的网络也让我和Linus有机会见到雨后春笋般出现的各种发行版。不管怎样,Linus选了Red Hat,我觉得我应该平衡一下,所以选了Debian,此后我们也都坚持着自己的选择。

各种发行版的涌现对Linux大有裨益。虽说那时候Linux相比Mac和Windows还非常难用,至少人们不再需要使用十六进制编辑器来安装和启动系统了。这使得用户数量大大增加,一部分用户也参与系统开发,于是雪球越滚越大。

1994年,Linux版本号终于达到1.0,在大学里我们可以为此办一个不错的发布活动。在大礼堂里,计算机系的主任发表演讲,这些让我们相信Linux吸引了主流媒体的目光。当时还有电视录像,有一部分还可以在网络上找的到。在活动现场,我们有一个Linux 1.0编译仪式一直在后台运行。

1997年,Linus毕业,并加入了Transmeta公司,搬到美国,之后我便几乎与他失去了直接联系。

想知道1998年我对Linux世界是怎么看的?读一读《Linux轶事》。

从Linux这20年中,我们能学到什么?

最重要的一点,就是每个人都能改变世界。一个伟大的成就背后必然是一点一滴的积累,在芬兰语中我们称之为sisu。明智自然不错,不过你还记得那个20年前那个有些傻傻的,喝醉的,甚至发布自己半裸醉照的家伙?并不太明智,却从未放弃。所以说即使很愚蠢,只要在正确的到路上坚持不懈就能取得成就。所以你应该想"没问题,我来搞定",而不是"这个很难弄吧"。

还有一点,不论你有多么聪明,多么有毅力,你都需要得到其他人的帮助。一场革命至少需要数十年,你不可能独自完成它。

自由也是最重要的原因,自由地获取、研究、分享、修改和再分发,把软件的自由放在第一位是必不可少的,不仅对于Linux,对于全世界人们的幸福都不可或缺。

在过去的20年里,我们目睹了一场革命,Linux是这场革命中的一部分。Internet是这场革命最伟大的推动者,自由软件运动是另一个推动者。这场革命的核心是将人们从被动的消费者转变为具有创造性的,不断交流这的表现者,他们组成了这个新的世界。当然,这场自由的革命还没有停止,它将继续前行。

让我们祝愿Linux和自由软件在未来的20年里继续发展,将自由的革命推向更远!