Linux/Unix设计思想第一章:Unix哲学_Linux/Unix设计思想第一章:Unix哲学试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 设计 > Linux/Unix设计思想 > 第一章:Unix哲学

Linux/Unix设计思想——第一章:Unix哲学

这个世纪的哲学会成为下一个世纪的常识。 ——中国幸运饼干 许多人都将发明Unix操作系统的殊荣授予AT&T公司的Ken Thompson,从某种意义上来说,他们是对的。1969年在新泽西州美利山AT&T公司的贝尔实验室,Thompson编写出了Unix的第一个版本。它作为Space Travel程序的平台运行在Digital PDP-7小型机上。此前,Space Travel程序运行在由麻省理工学院开发的Multics系统上。 Unix的开发基于Multics系统,后者属于最早的一批分时操作系统。在Multics开发之前,大多数计算机操作系统都运行在批处理模式下,这迫使程序员们要去编辑大堆的打孔卡片或纸带。在那些日子里,编程是一个耗时费力的过程。当时有一句流行语是:“上帝帮帮那些打翻了打孔卡片盒的傻瓜吧。”干过卡片机编程的人都懂。 Thompson借鉴了Multics的许多特性,并将它们融入到早期的Unix版本,其中最主要的特点就是分时处理。如果没有这种特性,那些在当前Unix系统或是其他操作系统上被人们视作理所当然的大部分功能,就会失去它们真正的力量。 Thompson的开发工作从借鉴Multics的想法入手,对于Unix开发人员而言,这样的套路可谓是驾轻就熟:良好的程序员写出优秀的软件,优秀的程序员“窃取”优秀的软件。当然,我们并没有暗示Thompson是一个小偷。但正是他这种在某些方面避免NIH(Not Invented Here,非我发明)综合征的意愿和基于别人的成果添加颇具创造性价值的做法,大力推动了这一款或许是历史上最精巧操作系统的出台。我们还将在后面探讨“窃取”软件的意义。现在只需要记住,将一个想法与人共享就如同一个大脑里有了两个想法。 1.1 NIH综合征 软件开发人员经常会受到NIH综合征的影响。在查看别人编写的软件解决方案时,他认为自己完全可以做得更好。也许他真的能更为痛快利落地完成这项工作,但他并不知道别的开发人员当时面临的限制条件。他们可能迫于时间或预算的压力,于是,只能集中精力处理这个解决方案中的某些特定部分。 NIH综合征的特点就是人们会为了证明自己能够提供更加卓越的解决方案而放弃其他开发人员已经完成的工作。这种狂妄自大的行径说明此人并无兴趣去维护他人竭尽全力提供的最佳工作成果,也不想以此为基础去挑战新的高度。这不仅是个自私自利的做法,还浪费了大量宝贵时间,而这些时间其实完全可以用来提供其他解决方案。更糟的是,新的解决方案有时候只是稍作了一些改进,或根本没有本质区别,从而使得这个问题变得更糟。 偶尔,新的解决方案确实会更好,这只是因为开发人员早已了解前人做过的工作,因此他们可以“取其精华,去其糟粕”,改善此解决方案。这是对前人工作的加强和延伸,并不是NIH综合征。这种借鉴其他开发者的概念是Linux世界中一种常见做法,当然前提条件是每个人都能得到源代码。事实上,在原有软件的基础上进行加强和扩展也是Unix哲学的核心概念之一。 1.2 Unix的开发 人们为Unix的可移植性感到惊叹,但一开始它并没有这个特性。Thompson最早是使用汇编语言编写Unix的。1972年,他采用了B语言这种具有可移植性的编程语言改写了代码。很明显,他可能是想利用不断涌现的新硬件的优势。1973年另一位AT&T公司贝尔实验室的成员Dennis Ritchie对B语言进行了扩展和调整,将其发展为今天全世界程序员为之爱恨交加的C语言。 同样,Thompson提供了一个后来广为Unix开发人员仿效的范例:背水一战的人们常常能够编写出伟大的程序。在必须编写某应用程序的时候,如果满足条件(1)它必须满足实际的需要;(2)周围并不存在任何了解该如何编写此程序的“专家”;(3)没有足够时间 “完美”完成任务,那么,写出优秀软件作品的概率就比较高。就好比Thompson的情况,他需要使用一种可移植的语言来编写这个操作系统,因为他必须将他的程序从一个硬件架构迁移到另外的架构;他找不到任何所谓的可移植性操作系统专家;他当然也没有足够的时间去把事情做到“完美”。 不过,Ken Thompson一人对Unix哲学整体发展的推动作用毕竟是有限的。虽然他在文件系统结构、管道、I/O子系统和可移植性等领域的设计方面做出了杰出贡献,然而Unix哲学的成型还是众人努力的结果。初期与Unix打交道的每一个人都将各自的专业领域知识应用在Unix上,帮助塑造了这一哲学理念。下面列出了一些贡献者和他们的主要贡献(参见表1-1)。 ------------------------------------------------------------------------------------------- 表1-1 Unix哲学的主要贡献者及其重大贡献 ------------------------------------------------------------------------------------------- 贡 献 者 所作的贡献 ------------------------------------------------------------------------------------------- Alfred Aho 文本扫描、分析、排序 Eric Allman 电子邮件 Kenneth Arnold 屏幕更新 Stephen Bourne Bourne shell命令解释器 Lorinda Cherry 交互式计算器 Steven Feldman 计算机辅助软件工程 Stephen Johnson 编译器设计工具 William Joy 文本编辑,类似C的命令语言 Brian Kernighan 正则表达式、编程规范、计算机排版、计算机辅助指令 Michael Lesk 高级文本格式、拨号网络 John Mashey 命令解释器 Robert Morris 桌面计算器 D. A. Nowitz 拨号网络 Joseph Ossanna 文本格式化语言 Dennis Ritchie C语言 Larry Wall Patch工具、Perl语言、rn网络新闻阅读器 Peter Weinberger 文本检索 ------------------------------------------------------------------------------------------- 上述人士只是Unix这一独特系统中最早和最知名的参与者,实际上最终有数以千计的人参与了Unix的开发工作。几乎每一篇以Unix主要组件为主题的论文,都列举了一大批贡献者。正是这些贡献者共同塑造了Unix哲学,让它逐渐被人们理解接受并流传至今。 1.3 Linux:一个人加上一百万人的智慧 如果说Ken Thompson是Unix的创造者,那么Linus Torvalds就是Linux操作系统的发明人,当时他还是芬兰赫尔辛基大学的一名学生。1991年8月25日他发出了那篇现在广为人知的新闻组主题文章,这篇以“嗨,大家好……我正在编写一个(免费)的操作系统”开头的文章对他的命运产生了深远影响。 Thompson 和Torvalds两人至少有一点相似之处,那就是对事物的好奇之心。我们可以找到证据,Thompson编写Space Travel程序只是为了好玩而已。而Torvalds在痴迷于类Unix操作系统——Minix的同时,也完全是因为非常感兴趣才会将流行的Unix命令解释器bash进行改编并运行在他的“玩具”操作系统上。同时,这些在一开始只是“为了好玩”的举动,却最终对软件产业产生了深远影响。 一开始,Linux也不是一款具备可移植性的操作系统。Torvalds无意将它移植到英特尔386之外的其他架构之上。从某种意义上说,他也只是背水一战,因为他的手头只有少量计算机硬件可供选择。因此,最初他并没有采取任何进一步的举措而只是将自己拥有的资源发挥到极致。但是他发现良好的设计原则和扎实的开发模式还是引领着他去把Linux变成一个可移植的系统。从那一刻开始,别的人接过了这个接力棒,很快便将Linux移植到了其他架构。 在Torvalds的Linux出现之前,借鉴他人编写的软件已成为相当普遍的做法。事实上也就是因为这样,Richard M. Stallman才会在具有里程碑意义的GNU公共授权协议(GPL)下正式确立了这一思想。GPL是一个适用于软件的法律协议,基本保证了软件的源代码可以自由提供给任何想要得到它的人。Torvalds最终为Linux采用了 GPL协议,这个举动免除了所有人对于相关法律与版权纠纷的后顾之忧,让他们可以自由借用Linux的源代码 。由于Torvalds将Linux免费开放出来,因此其他人自然也会将他们的软件免费提供出来以共同发展Linux。 从一开始,Linux已经表现出它确实是一个与与Unix非常相似的操作系统。它的开发人员全盘接受了Unix的哲学原理,然后再从头编写了这个新的操作系统。问题是在Linux的世界里,几乎再没有其他程序是重新编写的。一切应用都是建立在其他人写好的代码和概念之上。因此很自然地,Linux成为了Unix系统演变的下一步,或许更准确地说,它是Unix的一个大飞跃。 类似于Unix,在Linux技术发展的早期,有许多开发者参与其中并提供了帮助。不同的是,Unix开发者数量最多的时候也就几千人,而今天Linux的开发者数量却早已达到了几百万之多。这才是登峰造极的Unix!正是这种大规模的开发格局,保证了Unix的后代Linux将在很长时间内都是一款具备强大竞争力的系统。 Linux为Unix世界重新激起波澜,所谓的“开源”要比“专有”软件或是那些没有现成源代码的软件优越。多年以来,Unix开发人员一直坚信这一点。但计算机行业的其他人却被一些专有软件公司的大量宣传所蒙蔽,他们误认为任何借来的或是免费的软件在性能上都无法比拟那些要付费(有时甚至是耗费巨资)的软件。 在市场营销方面,Linux社区也更为精明,他们知道只要市场工作做得好,就算是劣质软件也可以成功销售出数百万份。当然,这并不是说Linux是伪劣产品。只是,有别于它的前身Unix社区,Linux社区认识到,即使是世界上最好的软件,也只有当人们对它产生了解并认识到它的真正价值时,才会为人所用。 我们将在后续章节再深入探讨这些主题。现在,让我们把Linux和Unix的历史留在过去,继续前行。事情会更加有趣。 1.4 Unix哲学概述 Unix哲学的几条准则看似简单。事实上,它们简单到会容易使人们忽略其重要性。这就是它们颇具欺骗性的地方。其实,简单的外表下掩盖着一个事实:如果人们能够始终如一地贯彻它们,这些准则可是非常行之有效的。 以下这份清单会让你对Unix哲学的准则有初步的认识。本书其余部分则会帮助你理解它们的重要性。 (1) 小即是美。相对于同类庞然大物,小巧的事物有着无可比拟的巨大优势。其中一点就是它们能够以独特有效的方式结合其他小事物,而且这种方式往往是最初的设计者没能预见到的。 (2) 让每一个程序只做好一件事情。通过集中精力应对单一任务,程序可以减少很多冗余代码,从而避免过高的资源开销、不必要的复杂性和缺乏灵活性。 (3) 尽快建立原型。大多数人都认同“建立原型”(prototyping)是任何项目的一个重要组成部分。在其他方法论中,建立原型只是设计阶段中一个不太重要的组成部分,然而,在Unix环境下它却是达成完美设计的主要工具。 (4) 舍高效率而取可移植性。当Unix作为第一个可移植系统而开创先河时,它曾经掀起过轩然大波。今天,可移植性早被视作现代软件设计中一个理所当然的特性,这更加充分说明这条Unix准则早就在Unix之外的系统中获得了广泛认可。 (5) 使用纯文本文件来存储数据。舍高效率而取可移植性强调了可移植代码的重要性。其实可移植性数据的重要性绝不亚于可移植代码。在关于可移植性的准则中,人们往往容易忽视可移植性数据。 (6) 充分利用软件的杠杆效应。很多程序员对可重用代码模块的重要性只有一些肤浅的认识。代码重用能帮助人们充分利用软件的杠杆效应。一些Unix的开发人员正是遵循这个强大的理念,在相对较短的时间内编写出了大量应用程序。 (7) 使用shell脚本来提高杠杆效应和可移植性。shell脚本在软件设计中可谓是一把双刃剑,它可以加强软件的可重用性和可移植性。无论什么时候,只要有可能,编写shell脚本来替代C语言程序都不失为一个良好的选择。 (8) 避免强制性的用户界面。Unix开发人员非常了解,有一些命令用户界面为什么会被称为是“强制性的”(captive)用户界面。这些命令在运行的时候会阻止用户去运行其他命令,这样用户就会成为这些系统的囚徒。在图形用户界面中,这样的界面被称为“模态”(modal)。 (9) 让每一个程序都成为过滤器。所有软件程序共有的最基本特性就是,它们只修改而从不创造数据。因此,基于软件的过滤器本质,人们就应该把它们编写成执行过滤器任务的程序。 以上列出了Unix开发人员所奉行的信条。在其他一些Unix书籍中你也会找到类似清单,因为这些都是大家公认的Unix基本理念。如果你也采用这些准则,那么人们就会认为你是一个“Unix人”。 下面还列出了10条次要准则,这些准则正在渐渐发展成Unix世界信仰体系的一个组成部分 。并非每个与Unix打交道的人都会将它们奉为信条,而且在严格意义上其中一些并不能算作是Unix的特性。不过,它们看起来依然是Unix文化(当然也包括Linux文化)不可或缺的一部分。 (1) 允许用户定制环境。Unix用户喜欢掌控系统环境,并且是整个环境。很多Unix应用程序绝对不会一刀切地使用交互风格,而是将选择的权利留给用户。它的基本思想就是,程序应该只提供解决问题的机制,而不是为解决问题的方法限定标准。让用户去探索属于自己的通往计算机的佳境之路吧。 (2) 尽量使操作系统内核小而轻巧。尽管对新功能的追求永无止境,Unix开发人员还是喜欢让操作系统最核心部分保持最小的规模。当然,他们并不总是能做到这一点,但这是他们的目标。 (3) 使用小写字母,并尽量保持简短。使用小写字母是Unix环境中的传统,尽管这么做的理由已不复存在,但人们还是保留了这个传统。今天,许多Unix用户之所以要使用小写的命令和神秘的名字,不再是因为有其限制条件,而是他们就喜欢这么做。 (4) 保护树木。Unix用户普遍不太赞成使用纸质文档。而是在线存储所有文字档案。此外,使用功能强大的在线工具来处理文件是非常环保的做法。 (5) 沉默是金。在需要提供出错信息的时候,Unix命令是出了名地喜欢保持沉默。虽然很多经验丰富的Unix用户认为这是可取的做法,可其他操作系统的用户却并不认同此观点。 (6) 并行思考。大多数任务都能分解成更小的子任务。这些子任务可以并行运行,因而,在完成一项大任务的时间内,可以完成更多子任务。今天已涌现出大量对称多处理(symmetric multiprocessing ,SMP)设计,这说明计算机行业正在朝着并行处理的方向发展。 (7) 各部分之和大于整体。小程序集合而成的大型应用程序比单个的大程序更灵活,也更为实用,本条准则正是源于此想法。两种解决方案可能具备同样的功能,可集合小程序的方法更具有前瞻性。 (8) 寻找90%的解决方案。百分百地完成任何事情都是很困难的。完成90%的目标会更有效率,并且更节省成本。 Unix开发人员总是在寻找能够满足目标用户90%要求的解决方案,剩下的10%则任由其自生自灭。 (9) 更坏就是更好。Unix爱好者认为具有“最小公分母”的系统是最容易存活的系统。比起高品质而昂贵的系统,那些便宜但有效的系统更容易得到普及。于是,PC兼容机的世界从Unix世界借鉴了此想法,并取得巨大成功。这其中的关键字是包容。如果某一事物的包容性强到足以涵盖几乎所有事物,那它就比那些“独家”系统要好很多。 (10) 层次化思考。Unix用户和开发人员都喜欢分层次来组织事物。例如,Unix目录结构是最早将树结构应用于文件系统的架构之一。Unix的层次思考已扩展到其他领域,如网络服务命名器、窗口管理、面向对象开发。 看完这份准则清单,你可能会觉得所有内容都有点儿小题大做。“小即是美”不是什么大不了的道理。“只做好一件事”本身听起来也相当狭隘。“舍高效率而取可移植性”也并不是那种能够改变世界的真知灼见。 这就是Unix所蕴含的道理吗?Linux难道也只是给目光短浅的人准备的小型操作系统? 也许我们应该提及,大众汽车公司曾经围绕着“小即是美”的概念开展了一次成功的汽车营销活动,并借此销售了数以百万计的汽车;或者想一想主流Unix供应商Sun公司的事例,它的商业战略基于“集中所有资源推出最好的拳头产品”这一思想,或者换句话说,也就是“只做好一件事”的理念。那么,人们对于掌上电脑、无线网络访问和手持视频的兴趣是否与可移植性有关呢? 让我们现在就开始这个精彩的旅程吧。

展开全文

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《Linux/Unix设计思想》其他试读目录

• 第一章:Unix哲学 [当前]
• 摘录:为什么软件会被称为“软件”