【操作系统】Unix的哲学

Douglas McIlroy是Unix系统上管道机制的发明者,也是Unix文化的缔造者之一。他归纳的Unix哲学如下:
程序应该只关注一个目标,并尽可能把它做好。让程序能够互相协同工作。应该让程序处理文本数据流,因为这是一个通用的接口

总的来说是:"简单原则"----尽量用简单的方法解决问题----是"Unix哲学"的根本原则。这也就是著名的KISS(keep it simple, stupid),意思是“保持简单和笨拙”。

下面就是我对"简单原则"的笔记。如果你想最简单地完成一项编程任务,我认为可以从四个方面入手:

1. 清晰原则。

代码要写得尽量清晰,避免晦涩难懂。清晰的代码不容易崩溃,而且容易理解和维护。重视注释。不为了性能的一丁点提升,而大幅增加技术的复杂性,因为复杂的技术会使得日后的阅读和维护更加艰难。

2. 模块原则。

每个程序只做一件事,不要试图在单个程序中完成多个任务。在程序的内部,面向用户的界面(前端)应该与运算机制(后端)分离,因为前端的变化往往快于后端。

3. 组合原则。

不同的程序之间通过接口相连。接口之间用文本格式进行通信,因为文本格式是最容易处理、最通用的格式。这就意味着尽量不要使用二进制数据进行通信,不要把二进制内容作为输出和输入。

4. 优化原则。

在功能实现之前,不要考虑对它优化。最重要的是让一切先能够运行,其次才是效率。"先求运行,再求正确,最后求快。"(Make it run, then make it right, then make it fast.)90%的功能现在能实现,比100%的功能永远实现不了强。先做出原型,然后找出哪些功能不必实现,那些不用写的代码显然无需优化。目前,最强大的优化工具恐怕是Delete键。

 

UNIX 的特点:

Everything (including hardware) is a file.
所有的事物(甚至硬件本身)都是一个的文件。

Configuration data stored in text.
以文本形式储存配置数据。

Small, single-purpose program.
程序尽量朝向小而单一的目标设计。

Avoid captive user interfaces.
避免过于复杂花哨的界面。

Ability to chain program together to perform complex tasks.
将几个程序连结起来,处理大而复杂的工作。

 

Unix的影响和哲学

 

Unix是第三次工业革命中计算机软件领域最具代表性的产物。在这近40年中,由Unix造成的影响是最有深远意义的。就我看来,Unix为软件领域带来了至少以下有积极的东西,由这些东西所引发的直接或间接的事物更是举不胜数。
 

1)  软件开发的若干哲学和思想。

2)  全民参与推动软件,代码共享的模式。

3)  开启了黑客文化和开源项目。

4)  免费和商业的完美结合的Linux。

5)  C语言,而后发展的C++,Java等等类C的语言和脚本。

6)  TCP/IP,其的Socket编程已成为今天通用的网络编程主流。

 

说到Unix为我们所带来的软件开发的哲学,我必需要说一说。Unix遵循的原则是KISS(Keep it simple, stupid)。在http://en.wikipedia.org/wiki/Unix_philosophy 上有很多的基本上大同小异的Unix哲学,都是很经典的。
 

Doug McIlroy 是认为UNIX的哲学是这样的:三条哲学,简明扼要,就是这三条哲学贯穿着整个Unix世界。尤其是第一条“do one thing and do it well”真是相当精彩!

 

Doug McIlroy(UNIX 管道的发明人、UNIX 传统的奠基人之一) 认为 UNIX 的哲学是这样的:

Write programs that do one thing and do it well.

写一次只做一件事,并能把这件事做好的程序。

Write programs to work together.

写互相协作(调用)的程序。

Write programs to handle text streams, because that is a universal interface.

写处理文件流的程序。因为这(处理文件流)是一个通用接口。

 

只要是Unix的程序员,他们会比别的程序员在任何时候都会不停地强调着这三条哲学。

而《The Art of Unix Programming》总结了下面这些哲学,都是至理名言啊。

The Art of Unix Programming》 总结了下面这些哲学:

Rule of Modularity: Write simple parts connected by clean interfaces.

模块化原则:写简单的,能够用清晰的接口连接的代码。

Rule of Clarity: Clarity is better than cleverness.

清晰化原则:清晰的代码要好过“聪明”的代码。

Rule of Composition: Design programs to be connected to other programs.

组件化原则:设计可以互相关联(拆分)的程序。

Rule of Separation: Separate policy from mechanism; separate interfaces from engines.

隔离原则:策略和机制分离,接口和引擎分离。

Rule of Simplicity: Design for simplicity; add complexity only where you must.

简洁原则:设计力求简洁,直到无法更简洁。

Rule of Parsimony: Write a big program only when it is clear by demonstration that nothing else will do.

小巧原则:不要写大的程序(模块、方法)。除非很明显的,没有别的办法可以完成。

Rule of Transparency: Design for visibility to make inspection and debugging easier.

透明原则:为可见性设计,使检查和调试更容易。

Rule of Robustness: Robustness is the child of transparency and simplicity.

健壮性原则:健壮性是透明和简单的孩子。

Rule of Representation: Fold knowledge into data so program logic can be stupid and robust.

陈述性原则:将认知转化为数据。所以,程序的逻辑可以是愚蠢(简单易懂)的,健壮的。

Rule of Least Surprise: In interface design, always do the least surprising thing.

最少的惊讶原则:在界面设计中,少做令人惊讶的设计。(不要标新立异)

Rule of Silence: When a program has nothing surprising to say, it should say nothing.

沉默原则:如果一个程序没有什么特别的东西要说(输出),那就什么都别说。

Rule of Repair: When you must fail, fail noisily and as soon as possible.

修复原则:如果必须失败,那就尽早。

Rule of Economy: Programmer time is expensive; conserve it in preference to machine time.

节约原则:程序员的时间是非常宝贵的。程序员的时间(编程时间)优于机器时间。

Rule of Generation: Avoid hand-hacking; write programs to write programs when you can.

 生产原则:避免手工编程。如果可以的话,编写可以编写程序的代码。

Rule of Optimization: Prototype before polishing. Get it working before you optimize it.

优化原则:建立原型后再去修正。当它能正常工作后,再去优化它。

Rule of Diversity: Distrust all claims for “one true way”.

多样性原则:怀疑所有所谓的“不二法门”。

Rule of Extensibility: Design for the future, because it will be here sooner than you think.

扩展原则:为未来设计,因为未来来的比你想象的要早。


Mike Gancarz (X Windows 的设计者)给出了下面九条哲学思想:

Small is beautiful.

小即是美。

Make each program do one thing well.

让每个程序(方法)只做一件事情,并把它做好。

Build a prototype as soon as possible.

尽早建立原型。

Choose portability over efficiency.

注重可移植性,而非效率。

Store data in flat text files.

将数据存储在存文本文件中。

Use software leverage to your advantage.

利用软件来发挥你的优势。

Use shell scripts to increase leverage and portability.

使用Shell脚本提高编程的手段和程序的可移植性。

Avoid captive user interfaces.

避免过于复杂花哨的界面。

Make every program a filter.

使每个程序(方法)称为一个过滤器(筛选器)

 

  相关参考/相关阅读:
    http://wapbaike.baidu.com/view/8095.htm?uid=6EBD1BABE8B5446DAEB70E83E86460E2&ssid=&bd_page_type=1&st=1&titleid=220001&bk_fr=remaining
    http://coolshell.cn/articles/2324.html
    http://book.51cto.com/art/201012/239396.htm
    http://www.cnblogs.com/feminping/archive/2012/07/07/3feelingTheAatOfUnixProgramming.html
    http://blog.sina.com.cn/s/blog_957beae401010al0.html
    http://kongweile.iteye.com/blog/1547444
    http://wapbaike.baidu.com/view/5018.htm?ssid=&uid=C7BAA2A232DC132F84A7DED524BC1896&st=1&hold=&reforce=&bd_page_type=1&pu=&from=&ext=&statwiki=1
    http://www.ruanyifeng.com/blog/2009/06/unix_philosophy.html
    http://en.wikipedia.org/wiki/Unix_philosophy#cite_note-0
    http://blog.csdn.net/wargrey/article/details/3177756
    http://book.douban.com/review/1038939/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章