Unix系统由于其简洁、可移植性、安全可靠及开放性等特点,在服务器领域得到了广泛的应用。直到GNU/Linux流行开始前,Unix也是科学计算、大型机、超级电脑等所用操作系统的主流。现在其仍然被应用于一些对稳定性要求极高的数据中心之上。
而在Unix经过几十年的发展,UNIX在技术上日臻成熟的过程中,她独特的设计哲学和美学也深深地吸引了一大批技术人员,他们在维护、开发、使用UNIX的同时,UNIX也影响了他们的思考方式和看待世界的角度。
Douglas McIlroy是Unix系统上管道机制的发明者,也是Unix文化的缔造者之一。他归纳的Unix哲学如下:
程序应该只关注一个目标,并尽可能把它做好。让程序能够互相协同工作。应该让程序处理文本数据流,因为这是一个通用的接口。
罗勃·派克在他的《Notes on Programming in C》中提到了以下格言。虽然这些规则是关于程序设计的,但作为Unix哲学丝毫不为过:
规则一:你永远不会知道你的程序会在什么地方耗费时间。程序的瓶颈常常出现在意想不到的地方,因此在你确信找到瓶颈后再动手优化代码吧。
规则二:测试代码。只有在你详细测试了代码,并且发现一部分代码耗费了绝大部分的运行时间时再对程序作速度优化。
规则三:功能全面的算法(fancy algorithm)在处理小规模问题时效率很低,这是因为算法时间效率中的常量很大,而问题往往规模很小。除非你知道你遇到的常常是复杂的情况,否则就让代码丑陋但是简单而高效吧。(即使问题规模确实很大,也首先尝试第二条规则。)
规则四:功能全面的算法比简单的算法更容易产生Bug,更难实现。尽量使用简单的算法和数据结构。
规则五:数据决定一切。如果选择的数据结构能很好的管理数据,算法部分往往不言自明。记住,数据结构,而非算法,才是编程的关键。
规则六:没有第六条规则。
Pike的第一、二条规则重申了高德纳的著名格言:“过早的优化是一切罪恶的根源。” Pike的第三、四条规则被肯·汤普逊改述成:“疑惑不定之时最适合穷举。”事实上,这两条规则也是KISS原则的具体表现。规则五在之前Fred Brooks的人月神话中也被提及。Jon Bentley的《Programming Pearls》中也有一章阐述了相同的设计哲学。此规则作为“如果你的数据结构很好,那么控制它的算法就无关痛痒了”的例子常常被简化成“简约地写代码,聪明地用数据”。第六条规则当然只是Pike针对蒙提·派森之小品Bruces sketch的幽默发挥而已了。
1994年,X Window系统开发组的成员Mike Gancarz根据他自己的Unix系统经验以及和其他领域使用Unix系统的资深程序员们的讨论结果,写成了《The UNIX Philosophy》,提出了9条训格之言:
一:小即是美。
二:让程序只做好一件事。
三:尽可能早地建立原型。
四:可移植性比效率更重要。
五:数据应该保存为文本文件。
六:尽可能地榨取软件的全部价值。
七:使用shell脚本来提高效率和可移植性。
八:避免使用可定制性低下的用户界面。
九:所有程序都是数据的过滤器。
此外还有十条原则则并不为所有人认同,甚至还是争论的焦点(如宏内核和微内核之争):
一:应该允许用户定制操作环境。
二:让操作系统核心小而轻。
三:使用小写字母并尽量简短。
四:节约纸张,保护树林。
五:沉默是金。
六:并行地思考。
七:部分加部分大于整体。
八:寻找问题的帕雷托法则。
九:程序随需求而增长(Worse is better)。
十:层级地思考。
Unix哲学中更多的内容不是这些先哲们口头表述出来的,而是由他们所作的一切和Unix本身所作出的榜样体现出来的。从整体上来说,可以概括为以下几点:
1. 模块原则:使用简洁的接口拼合简单的部件。
2. 清晰原则:清晰胜于机巧。
3. 组合原则:设计时考虑拼接组合。
4. 分离原则:策略同机制分离,接口同引擎分离。
5. 简洁原则:设计要简洁,复杂度能低则低。
6. 吝啬原则:除非确无它法,不要编写庞大的程序。
7. 透明性原则:设计要可见,以便审查和调试。
8. 健壮原则:健壮源于透明与简洁。
9. 表示原则:把知识叠入数据以求逻辑质朴而健壮。
10. 通俗原则:接口设计避免标新立异。
11. 缄默原则:如果一个程序没什么好说的,就沉默。
12. 补救原则:出现异常时,马上退出并给出足够错误信息。
13. 经济原则:宁花机器一分,不花程序员一秒。
14. 生成原则:避免手工hack,尽量编写程序去生成程序。
15. 优化原则:雕琢前先要有原型,跑之前先学会走。
16. 多样原则:决不相信所谓“不二法门”的断言。
17. 扩展原则:设计着眼未来,未来总比预想来得快。
如果刚开始接触Unix,这些原则值得好好体味一番。谈软件工程的文章常常会推荐大部分的这些原则,但是大多数其它操作系统缺乏恰当的工具和传统将 这些准则付诸实践,所以,多数的程序员还不能自始至终地贯彻这些原则。
对于这些从Unix的发展中体现出来的哲学,对于我们初入门的新人有很好的指导教育作用,在今后的学习工作中,多考虑这些会让我们的工作更加得心应手。希望大家都能从中获得属于自己的一份哲学。
阅读(617) | 评论(0) | 转发(0) |