本文是理查德·斯托曼选集第三版的阅读笔记,我一直认为,互联网自由开放的精神是各种层出不穷创造力的来源,我也会尽我所能去捍卫它。
我的感受:这本书主要是对与自由相关的几个重要概念的思考,比如GNU,甚至有些『极端』和『矫情』,正文之前反而更有趣一些。
序言
软件和硬件对我们的信息时代和互联网一样重要。自由软件被称为是革命性的政治理论,就如同我们可以控制自己的生活,我们也应该能够控制那些延伸我们身体的机器。
自由软件作为一种政治理论承认了软件和硬件系统在我们社会中所扮演的角色。批判之前和现在的制度是必要的。我们也许会发现自己无法修改既存制度。我们成为了别人制造的那些不公道制度的牺牲品,而他们本身就是不公道的。而这些制度的产出并非总是显而易见,特别是当我们被迫接受这些制度安排,尤其是当它们已变成标准化和品牌标准的时候。自由软件并不仅仅只是批评:它可以成为提供自由的替代品,依赖于自由的标准,自由地为大众使用。
自由软件提供了一种转变的范例,我们可以自由的从前人那里理解并学习,自由地成长和分享,从错误中学习,从学习中受益,并分享这些益处给每一个人。
投身于自由软件不仅仅是对于知识,同时也包括授权:授权学习,授权修改,授权分享,以及授权使之能够被分享。争取信息时代的自由需要拒绝在自由软件核心原则上妥协,并且要有牺牲精神。很多人可能拒绝这些负担,他们只想获得更多的财富;而其他人却在努力增加人类知识的深度和广度。通过实现自由软件,我们能发现一种面向长期愿景的可持续性发展模式,不仅增加了知识,同时切实可行的的将这些知识自由地分享给所有人。这份崇高的事业以其无差别的关怀泽及我们每一个人;从现实到超现实,自由软件都被涉及。
当我们的世界最终理解了代码的威力和危险,终于认识到代码和法律、政府一样,必须透明才能获得自由时,不妨回首看着这位强硬且不屈不挠的程序员,会发现他终身奋斗的景象终于实现:自由和知识可以在编译器下幸存。
正文
“自由软件”(FreeSoftware)表示的是那些尊重用户和社区自由的软件。粗略的说,它赋予用戶运行、复制、分发、学习、修改并改进软件的自由。
如果一个软件的用户拥有以下四项基本自由,那么该软件可以被称为自由软件:
- 基于任何目的,按你的意愿运行软件的自由(自由之零)。
- 学习软件如何工作的自由,按你的意愿修改软件以符合你的计算的自由(自由之一)。可访问源代码是此项自由的先决条件。
- 分发软件副本的自由,因此你可以帮助你的邻居(自由之二)。
- 将你修改过的软件版本再分发给其他人的自由(自由之三)。这样可以让整个社区有机会共享你对软件的改动。可访问源代码是此项自由的先决条件。
学校有一项社会使命:要教导学生成为一个坚强、有才能,独立、相互协作并且自由的社会中的一名公民。学校应该像推广保育和选举一样推广自由软件的使用。通过教授自由软件,学生能成为自由的数字化时代的合格公民。这项工作能帮助社会从整体上脱离大集团公司的统治。
自由软件鼓励每个人学习。自由软件社区反对“高高在上的技术”——这会让大众对技术的基本原理敬而远之。我们鼓励任何年龄层次学生或个人阅读源代码,而且,我们希望他们学得越多越好。
学校使用自由软件最深层次原因是可以进行德育教育。我们希望学校教给学生基本的知识和有用的技巧,但是这只是学校工作的一部分。学校最根本的一项职能,就是培养好公民——其中包括助人为乐的习惯。在计算机领域,这就意味着我们需要教授学生分享软件的精神。
教授学生使用自由软件,让他们参与自由软件社区,就是一门生动鲜活的公民教育课程。这门课程教授将会把学生培养成为具有公共服务精神的行为模范,而不是垄断企业的超级大亨。所有学校都应该使用自由软件。
从国家的计算主权角度来说,国家需要坚持自由软件的主张(国家控制其计算过程)。所有用户理所应当控制自己的计算过程,但国家有代表人民对计算过程维持控制的责任。现在大多数政府活动都依赖计算过程,而对这些活动的控制则依赖于对计算过程的控制。而在任务很关键的机构里失去这种控制将会极大危害国家安全。
软件有实现的层次;例如,一个软件包可能包括库、命令和脚本。但这些层次对软件的自由没有明显的贡献,因为可以把所有这些层次都变得自由。设计程序的组件和设计把组件组合在一起的代码是同类的工作;与其类似,从源代码编译程序的组件和将这些从源代码编译出来的组件组合在一起的程序是同类的工作。使整个系统自由只需继续工作直到完成整件任务。
因此,我们坚持主张程序要在全部层次上自由。对一个分类为自由软件的程序,组成它的每一行源代码都得是自由的,这样你才能只用自由的代码重建这个程序。
自由软件和“开源软件”这两个说法其实说的几乎都是同一类软件,但是它们所秉持的价值观是根本不同的。开源是一种开发方法论,自由软件是一场社会运动。对自由软件运动而言,自由软件是一种道义责任,尊重用户最根本的自由。而另一方面,开源的哲学更关注如何让软件“更好”——只关心实用价值。开源认为,非自由软件只是手边问题的欠妥解答,关于“开源”的大多数讨论并不关注对与错,只关注知名度和成功。
然而自由软件运动中,非自由软件是一个社会问题,解决方案就是停止使用并转向自由软件。
科学文献存在的理由应当是传播科学知识,并且科学期刊存在的理由应当是促进这一进程,这应该是一种不言自明的真理。由此可以推论,使用这些科学文献的规则应当被设计为有助于实现这一目标。
我们现在所拥有的规则,称之为版权,最初建立于印刷机时代,这是一种从本质上来说相对中心化的印刷量产方式。在这样一种印刷环境下,期刊文章的版权仅仅约束期刊发行者——要求它们获得出版文章的许可——以及潜在的抄袭者。它有助于期刊运营以及传播知识,而并未影响科学家们或者学生们的有用成果,不论对于文章的作者还是读者。这种规则可以很好地适应这种体系。
但是,用于科学文献发表的现代技术是万维网(WorldWideWeb)。那么,什么样的规则才能确保在网络上传播科学文献和知识的效果最大化呢?文献应当以非私有格式发布,并且对所有人开放访问权限。而且每个人应当有权利为文献提供“镜像”,即在满足适当署名的条件下逐字发表原文。
这些规则应当同样适用于过去与未来的文献,只要它们是以电子形式发布的。但是,现在并不急迫需要改变当前的版权体系,由于它们仍然适合于纸版期刊,此处的问题不属于那个领域。
自由软件意味着软件被其用户所控制,而不是相反。具体的说,这意味着软件在到达用户手中时,就具有用户应该得到的四大基本自由。列表中的第一条自由是自由之零:按照你的意愿运行程序来做你自己想做的事情。
你所拥有的是决定软件能够用来做什么的机会——当你决定实现什么功能的时候。你可以编写一个主要被你认为行为正当的人使用的软件,你也没有任何义务去编写任何可能被别人用于你不认同的行为的功能。
结论是明确的:程序不应当限制用户利用它所完成的工作。自由之零必须完整无缺。我们需要禁止酷刑,但我们不能通过软件许可协议来做到这点。软件许可协议的正确职责是建立与保护用户的自由。
一个人做出的每个决定都取决于这个人的价值观和目标。人们可以有很多种不同的目标和价值观;声誉、利益、爱情、生存、快乐和自由,其中有一些目标只有一些优秀的人才可能拥有。当这个目标是一种原则时,我们称之为理想主义。
一个理想主义的目标激励着我在自由软件上的工作:传播自由与协作的理念。我想鼓励自由软件的传播,取代阻碍合作的专有软件,从而使我们的社会更加美好。
当我们谈论自由软件时,我们指的是行为的自由,而非价格免费。GNU通用公共授权被设计为确保您拥有发布自由软件副本(以及为此收费,如果您希望的话)的自由,确保您能收到源代码或者在您需要时能获取源代码,确保您能修改软件或者将它的一部分用于新的自由软件,并且确保您知道您能做这些事情。
为了保护您的权利,我们需要做出要求,禁止任何人否认您的这些权利或者要求您放弃这些权利。因此,如果您发布此软件的副本或者修改它,您就需要肩负起尊重他人自由的责任。
例如,如果您发布自由软件的副本,无论以免费还是以收费的模式,您都必须把您获得的自由同样的给予副本的接收者。您必须确保他们也能收到或者得到源代码。而且您必须向他们展示这些条款,以使他们知道自己享有这样的权利。
自由软件运动致力于带来一场社会变革:让所有软件成为自由的,这样所有软件用户将获得自由,并且将会成为协作化社区的一部分。与之相反,任何一个非自由的程序赋予了其开发者凌驾于用户之上的不公权力。我们的目标是终结这种不公。
自由之路,路漫漫兮。这需要经历很多步骤,花费很多年的时间才能达到这样一种境地:软件用户拥有自由成为一种常态。这些步骤当中的一些可能会非常艰难,甚至需要为之付出一些牺牲。而其中有些步骤可能会变得简单,如果我们与其他拥有不同最终目标的人们达成某种妥协。
“开源”的哲学满足于消费者价值并且以此为前提,肯定并且强化这些消费者价值,这就是我们不能支持“开源”的原因。
为了完全地、长久地建立一个自由社区,我们要做的绝不仅限于让人们使用某些自由软件。我们需要宣传按照公民价值评估软件(及其他事物)的理念,即基于它们是否尊重用户的自由和社区,而非仅限于所谓的“易用性”。这样人们就不会落入以吸引人、易用的特性作为诱饵的私有软件的陷阱之中。
为了推广公民价值,我们必须讨论它们并且说明它们怎样才能成为我们的行为准则。我们必须拒绝戴尔•卡耐基式的妥协,因为这将通过强调人们的消费者价值而影响他们的行为。
破坏性的妥协不仅仅是对他人的不良影响,它还会通过认知上的不一致扭曲您自己的价值观。如果您抱有某种价值观,但是您的行动表现出来的是与之相冲突的其他价值观,您很可能将会试图改变您的价值观或者行动,以便解决这种矛盾。因此,那些仅仅争论实践上的好处的,或者引导用户转向某些私有软件的项目,几乎不可避免地羞于哪怕只是暗示“私有软件是不符合伦理的”。对于它们的参与者,以及对于公众,它们只能强化消费者价值。我们必须拒绝这些妥协,如果我们想要坚持我们自己的价值观不动摇。
一条能够让您更快前行的道路有时并不是一条更好的道路,如果它通往错误的目的地。为了成就一个充满雄心壮志的目标,做出一些妥协是必需的。但是,一定要警惕那些将您引离最终目标的妥协。
在自由软件运动中,我们主张的是软件用户的自由。我们在规划视角的时候审视了哪些自由是美好的生活方式所必需的,并且使得实用的程序能够帮助一个友善、合力、协作的社区成长。我们对于自由软件的评价尺度指出了软件用户赖以同社区协作所需的自由。
我们主张程序员的自由,同对待其他用户一样。我们中的大部分人是程序员,在赋予您自由的同时也需要拥有我们自己的自由。但我们中的每个人都需要使用由他人编写的软件,并且我们需要在使用那些软件的时候拥有自由,而不仅仅是使用我们自己编写的代码的自由。我们代表所有用户的自由,不论他们经常、偶尔还是从不进行编程。
然而,有一种所谓的自由是我们绝不提倡的,即“为您所编写的软件随意选择授权许可的自由”。我们拒绝承认这一条的原因在于它实际上是一种权力而非自由。
如果我们不想要一个全面监控的社会,我们必须将监控视为一种社会污染,并且限制监控对每一个新系统的影响,如同我们要限制实体建设工程对环境的影响。
关于软件的基础知识
计算机程序员来写软件或者计算机程序。而程序可以认为是告诉计算机如何完成特定任务的一系列指令。你应该熟悉许多不同类型的应用程序:比如你的网页浏览器、你的文字处理器和你的邮件客户端等等。
程序最初的形态通常是源代码。这一系列高级指令由编程语言(比如C或者Java)编写而成。之后会被一个名为编译器的工具编译为一种更底层的语言——汇编语言。另一种被称为汇编器的工具会将汇编代码分解为最终的机器语言——计算机可以原生理解的最底层代码。
另一个重要概念是理解什么是操作系统。操作系统是控制输入输出,内存分配和任务调度的软件。通常点说,一些更常见且更有用的程序,比如图形用户界面(GraphicalUserInterface,GUI),也是操作系统的一部分。GNU/Linux操作系统包括GNU和非GNU软件,以及一个被称为Linux的内核。内核负责处理底层任务比如输入输出和任务调度。GNU软件包含了操作系统其余的大部分,比如GCC,一款支持多种语言的通用编译器;GNUEmacs,一款可扩展的并且有很多很多特性的文本编辑器;GNOME,GNU桌面环境;GNUlibc,一个程序库,除内核外所有其他程序与内核通讯时都必须使用的库;以及Bash,GNU命令行解释器可以读取你的命令行。这些程序很多都是早期由理查德·斯托曼在GNU工程里开发,并成为现代GNU/Linux操作系统的组成部分。
重要的是理解即使你没有修改程序源代码或直接使用所有这些工具的能力,找到一个可以做到的人也是相对容易的。因此,有源代码的程序你就有权力去修改、修复、定制和学习编程——而如果得不到源代码就没有这些权力。源代码是让一个软件变自由的必要条件之一,而其他必要条件可从本书的哲学和理想中找到答案。