1.1 开端
在计算机发展的早期,人们共享可读的源代码是一种普遍存在的行为。很多计算机开发过程都发生在大学和企业的研究部门,如AT&T的贝尔实验室。这些机构有着悠久的开放与协作传统,因此,即使代码没有正式进入公共领域,但是也得到广泛分享。
计算机公司将软件与自己的系统一起交付,通常还包括源代码。用户经常要自己修改软件,以便它能支持新的硬件或者增加新的功能。当时许多供应商的态度是,软件是使用硬件时所必需的,但独立销售是万万不行的。
事实上,在早期,计算机系统的用户往往需要编写他们自己的软件。IBM 704计算机(如图1-1所示)的第一个操作系统,即GM-NAA I/O输入/输出系统,是由通用汽车研究所的Robert L. Patrick和北美航空的Owen Mock在1956年编写的。(操作系统是支持计算机基本功能的软件,例如调度任务、执行应用程序以及控制包括存储设备在内的一些外围设备。)
图1-1 1957年IBM 704计算机在NASA Langley
直到20世纪70年代末,澳大利亚新南威尔士大学的John Lions对UNIX操作系统的第六版源代码进行注释时,共享代码的文化在某些圈子里仍然很浓厚。“Lions注释”的复印本在大学计算机科学系和其他地方广为流传。虽然UNIX操作系统的代码所有者AT&T在技术上不允许这种随意的、非正式的共享,但这是当时的常态。
1.1.1 啊,UNIX操作系统
对软件进行修改使其在新的或不同的硬件上运行的想法在UNIX操作系统上得到发展。1973—1974年,人们用C语言重写了UNIX操作系统(V4版本)。C语言是Dennis Ritchie在贝尔实验室新开发的一种编程语言。按照当时的标准,使用一种高级编程语言重写UNIX操作系统虽然不是完全创新,但却是一种不寻常的、新的甚至有争议的做法。
按照当时的情况,更典型的做法是使用特定机器架构的汇编语言。虽然编写好的代码很有挑战性,也很耗时,但是,由于汇编程序代码和特定架构的机器代码指令(可以直接在硬件上执行)之间密切相关,因此汇编程序是非常高效的。而在当时计算机性能有限的条件下,效率是非常重要的。
然而,由于用C语言重写,UNIX操作系统可以相对容易地被修改并安装到其他机器上。也就是说,它是“可移植的”,这确实不同寻常。当时的常态是为每个新的硬件平台编写一个新的操作系统和一套支持系统以及应用软件。
当然,为了进行这些修改,你需要源代码。
AT&T愿意提供这项服务有几个原因。其中一个特别重要的原因是,在1975年第六版发布后,AT&T开始向大学和商业公司以及美国政府授权使用UNIX操作系统。但这些许可证不包括任何支持或错误修复,这样做的目的就是“追求软件商业化”。而AT&T认为根据协议条款,它无权这样做,因为它是作为一个受管制的电话服务垄断机构来运作的。共享软件源代码允许持有者自行修复和将UNIX操作系统“移植”到不兼容的新系统中。(我们将在第3章中再次讨论版权和许可证的 话题。)
然而,20世纪80年代初期,整个行业对共享软件源代码的宽松态度开始走到尽头。
1.1.2 不再有免费的午餐了吗
1982年,AT&T与美国联邦贸易委员会签署了同意法令,规定分拆贝尔地区运营公司(如图1-2所示)。该法令允许AT&T将软件作为一项业务进行发展。在其他方面,该法令允许AT&T进入计算机行业。不久之后,AT&T开始开发UNIX操作系统的商业版本。
图1-2 AT&T与美国联邦贸易委员会于1982年签署的一项同意法令
由于AT&T UNIX操作系统的许可证持有者们开发并发布了各种专有的UNIX版本,这些版本都或多或少地与对方不兼容,这就导致了接下来数十年的“UNIX混战”。这是一段极其复杂的历史。除了注意到它创造的垂直筒仓与UNIX操作系统所取代的小型机和大型机没有什么不同以外,它也与开源的发展没有什么关系。
在同一时期,AT&T以其新的UNIX操作系统实验室子公司的名义与加州大学伯克利分校就其UNIX操作系统的衍生产品(又称“分叉”)——伯克利软件发行版(Berkeley Software Distribution,BSD)发生了法律纠纷。准确地说,这其实是与加州大学伯克利分校的计算机系统研究小组(Computer Systems Research Group,CSRG)的争论。
加州大学伯克利分校计算机系统研究小组曾是AT&T的教育许可机构之一。随着时间的推移,该研究小组修改并增加了授权版本的UNIX操作系统的功能,并在1978年开始将这些附加功能以BSD发布。之后,BSD增加了许多重要的功能,包括彻底重新架构和重写许多关键子系统,同时增加了许多全新的组件。由于其宽泛的变化和改进,BSD版本的UNIX操作系统逐渐被视为一种全新的,甚至更好的UNIX操作系统。许多AT&T的授权者最终将大量BSD版本的代码纳入他们自己的UNIX版本中。(由于不同公司对AT&T风格和伯克利风格的青睐度不同,这进一步加剧了UNIX战争。)
加州大学伯克利分校继续开发BSD版本的代码,并逐步取代大多数仍在AT&T许可下的标准UNIX工具。这最终促成了1991年6月Net/2的发布。Net/2是一个几乎完整的操作系统,表面上可以自由再分发。这反过来又导致AT&T起诉加州大学伯克利分校侵犯版权。
UNIX操作系统曾是许多源代码共享的中心,但是它的商业化导致了一个更加分裂和封闭的UNIX环境。
1.1.3 PC是一种不同的文化
但分享精神也受到更广泛的侵蚀。
20世纪80年代,PC领域越来越多地被IBM PC及其克隆产品所支配。而这些计算机上运行的是Microsoft公司的操作系统。在很大程度上没有什么开源的显著特征。在某种程度上,这可能反映了一个事实:PC相对标准化的系统架构使得源代码的可移植性优势变得不再重要。
此外,人们购买PC的费用中并不包括开发软件所需的大多数工具,而购买这些工具的费用可能会很快增加。Microsoft公司的DOS操作系统包含了BASIC编程语言解释器,但即使以当时要求不高的标准来看,这款工具也是过时的,无法用于正式场合。当Borland公司更现代的Turbo Pascal在1984年首次亮相时,价格仅为50美元,鉴于典型的编程语言包要数百美元,因此这是一次彻底的创新。编程库和其他资源——包括大部分书本、杂志和其他离线的信息——增加了费用。相对随意的业余爱好者并不适合对一款软件进行改动。
当然,人们在IBM PC上编程。随着时间推移,一个非常健康的自由软件和共享软件开发社区应运而生。
笔者就是其中之一。
共享软件——至少在当时这个词被普遍使用——是一种先试后买的软件。当时,零售的盒装软件可以卖到数百美元,但无法保证它一定能在你的计算机上正常工作,如果不能正常使用,那就要祝你能够顺利退货了。
笔者编写的软件是一款小型DOS文件管理器——一个35KB的汇编程序,名为Directory Freedom。它是笔者和另一个开发人员共同开发的。当时我们参考了《计算机杂志》(PC Magazine)上的汇编代码列表。这个程序虽然没赚到太多钱,但还是有一定的用户基础,至今笔者仍然时不时会收到关于它的电子邮件。笔者还将自己编写的各种实用程序上传到本地的电子公告板系统(BBS)。
但是,发布源代码从来都不是一件特别重要的事情。
1.1.4 打破社区
类似的商业化动态也在其他地方上演。麻省理工学院人工智能实验室,这个在Steven Levy所著的《黑客》(Hackers)一书中被誉为“纯粹的黑客天堂,科技广场的修道院,人们在那里以黑客为生,以黑客为命”的地方正在发生变化。在这里,Lisp正在被商业化。
Lisp编程语言是人工智能研究的主要工作,但它需要很高的算力,在当时的普通计算机上不能很好地运行。因此,在将近10年的时间里,人工智能实验室的成员一直在试图优化系统以运行Lisp。直到1979年,这项工作已经取得了进展,商业化看起来是一个合理的选择。
最终,两家公司——Symbolics和Lisp Machines Inc.成立了。但这是一个混乱且激烈的过程,导致开放合作的减少和实验室成员的大量流失。
Richard Stallman是人工智能实验室的一员,他并没有去前景更好的Lisp Machines Inc.,但他还是因为实验室社区的分裂而受到很大的影响。Stallman之前编写过被广泛使用的Emacs编辑程序。正如Glyn Moody在《反叛的代码》(Rebel Code)(Perseus Publishing,2001)中写道:“Stallman为Emacs立下一条‘非正式’的规定,即任何人对Emacs做出任何改进都必须把它们发回给他。”
他在Symbolics与Lisp Machines Inc.两家公司的竞争中感受到专有代码的影响。他认为缺乏共享阻碍了软件社区的形成。这也促使他决定开发一个自由且可移植的操作系统。关于Stallman作为自由软件倡导者,还有一个广为流传的故事。因为拒绝访问实验室新安装的激光打印机(Xerox 9700)的软件源代码,Stallman不能像以前一样通过修改实验室激光打印机的源代码给打印机发送指令。
1.1.5 自由软件进入混战
1983年,Richard Stallman在互联网(当时仍称为ARPANET)的Usenet新闻组上宣布:“从这个感恩节开始,我将编写一个完全与UNIX操作系统兼容的软件系统,称为GNU(Gnu’s Not UNIX)并将它免费送给所有能使用它的人。”如图1-3所示。
图1-3 Stallman的自由软件基金会(Free Software Foundation,FSF)
和GNU项目通常被认为是自由和开源软件运动的开端
﹝来源:自由艺术许可证下的Victor Siame(vcopovi@wanadoo.fr)﹞
作为辩解,他接着写道:
我认可的黄金法则要求,如果我喜欢一个程序,就必须把它分享给其他喜欢它的人。出于良知,我不能签署一份保密协议或软件许可协议。为了能在不违反自己原则的情况下继续使用计算机,我决定组装一个包含足够多的自由软件的系统,这样就可以在没有任何非自由软件的情况下继续干下去。
它将基于UNIX操作系统的模式,也就是说,它将由模块化的组件组成,例如实用程序和C语言编译器,这些都是构建一个工作系统所必需的。该项目于1984年开始,时至今日,因为GNU Hurd操作系统的内核一直没有完成,所以事实上还没有“GNU操作系统”。没有内核,它们就没有办法与硬件通信,也就没有办法运行实用程序、应用程序或其他软件。
然而,Stallman确实完成了他的操作系统的许多其他组件。关键在于,这些组件包括从源代码构建一个正常运行的操作系统以及从命令行执行基本的系统任务所需的部分。因为UNIX操作系统的一个特点是设计模块化,所以,修改和改编UNIX操作系统的部分内容而不是一次性全盘替换整个系统是完全可行的(这一事实对后来Linux操作系统的发展至关重要)。
1.1.6 建立自由的基础
然而,从开源起源的角度来看,同样重要的还有1985年的GNU宣言(GNU Manifesto)、1986年的自由软件定义和1989年的GNU通用公共许可协议(General Public License,GPL),这些规范正式确立了防止“限制自由软件之自由”的原则。
GPL要求,如果以二进制(即机器可读的形式,无论是原始形式还是修改后的形式)发布GPL授权下的程序,那么必须提供可读的源代码。通过这种方式,用户可以在原始程序和其他人改进的基础上进行开发。但是,如果用户自己进行更改并发布它们,那么还必须保证这些更改可供其他人使用。这就是所谓的“copyleft”或出于彼此义务的互惠许可。
20世纪80年代末,自由和开源软件仍处于起步阶段。(事实上,“开放源代码”这个词甚至还没有被创造出来。)那时Linux操作系统还没有诞生。BSD版本的UNIX操作系统很快就卷入一场与AT&T的官司中。互联网还没有完全商业化。但是,特别是在事后看来,我们可以开始辨别出今后将变得重要起来的模式:协作、回馈以及帮助人们了解规则并适当合作的框架。
但是,真正让Linux操作系统和开源崭露头角的是20世纪90年代的互联网繁荣。尽管这一阶段的开源最终只是一个更重要的故事的第一幕。在这样的背景下,开源即将崛起,而计算机硬件和软件的格局也将发生根本的变化。