【操作系統】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/

 

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