Unix哲學是自下而上,而不是自上而下的,注重實效,立足于豐富的經驗,你不會在正規方法學和標準中找到它。
Unix管道的發明人Doug
McIlroy曾經說過:
1、讓每個程序就做好一件事,如果有新任務就重新開始,不要往新程序中加入功能而搞的復雜。
2、假定每個程序的輸出都會成為另一個程序的輸入,哪怕那個程序是未知的。輸出中不要有無關的信息干擾,避免使用嚴格的分欄格式和二進制格式輸入。不要堅持使用交互式輸入。
3、盡可能早將設計和編譯的軟件投入試用,哪怕是操作系統也不例外,理想情況下應該是幾星期內,對抽劣的代碼別猶豫,扔掉重寫。
4、優先使用工具,而非拙劣的幫助來減輕編程任務的負擔,工欲善其事,必先利其器。
Rob
Pike在《Notes on C
programming》中提到:
原則1:你無法斷行程序會在什么地方耗費運行時間。瓶頸經常出現在想不到的地方,所以別急于胡亂找個地方改代碼,除非你已經證實那兒就是瓶頸所在。
原則2:估量。在你沒對代碼進行估量,特別是沒找到最耗時的那部分之前,別去優化速度。
原則3:花哨的算法,在n很小的適合通常很慢,而n通常很小。花哨算法的常數復雜度很大,除非你確定n一直很大,否則不要用花哨算法(即使n很大,也要優先考慮原則2)。
原則4:花哨的算法比簡單的算法更容易出bug
,更難實現。盡量使用簡單的算法配合簡單的數據結構。
原則5:數據壓倒一切。如果已經選擇了正確的數據結構并且把一切組織得井井有條,正確的算法也就不言自明,編程的核心是數據結構,而不是算法。
原則6:沒有原則6.
Ken
Thompson對原則4做了強調:
拿不準就窮舉。
Unix哲學的17條原則:
1、模塊原則:簡潔的接口拼合簡單的部件。
2、清晰原則:清晰勝于機巧。
3、組合原則:設計時考慮拼接組合。
4、分離原則:策略同機制分離,接口同引擎分離。
5、簡潔原則:設計要簡潔,復雜度能低則低。
6、吝嗇原則:除非卻無他法,不要編寫龐大的程序。
7、透明性原則:設計要可見,以便審查和調試。
8、健壯原則:健壯源于透明與簡潔。
9、表示原則:把知識疊入數據,以求邏輯質樸而健壯。
10、通俗原則:接口設計避免標新立異。
11、緘默原則:如果一個程序沒什么好說的,就沉默。
12、補救原則:出現異常時,馬上退出,并給出足夠錯誤信息。
13、經濟原則:寧花機器一分,不花程序員一秒。
14、生成原則:避免手工hack,盡量編寫程序去生成程序。
15、優化原則:雕琢前先要有原型,跑之前先學會走。
16、多樣原則:絕不相信所謂“不二法門”的斷言。
17、擴展原則:設計著眼未來,未來總是比預想來得快。
Unix哲學之一言以蔽之:KISS
Keep
it simple,stupid!
應用unix哲學:
1、只要可行,一切都應該做成與來源和目標無關的過濾器。
2、數據流應盡可能的文本化(這樣可以用標準工具來查看和過濾)。
3、數據庫部署和應用協議應盡可能文本化(讓人閱讀和編輯)。
4、復雜的前端(用戶界面)和后端應該涇渭分明。
5、如果可能,用c編寫前,先用解釋性語言搭建原型。
6、當且僅當只用一門編程語言會提高程序復雜度時,混用語言編程才比單一語言編程來得好。
7、寬收嚴發(對接收的東西要包容,對輸出的東西要嚴格)
8、過濾時,不需要丟棄的消息絕不丟。
9、小就是美。在確保完成任務的基礎上,程序功能盡可能的少。
最后強調的是態度:
要良好地運用unix哲學,你就應該不斷地追求卓越,你必須相信,程序設計是一門技藝,值得你付出所有的智慧、創造力和激情。否則,你的視線就不會超越那些簡單、老套的設計和實現;你就會在應該思考的時候急急忙忙跑去編程。你就會在該無情刪繁就簡的時候反而把問題復雜化——然后你還會反過來奇怪你的代碼怎么會那么臃腫,那么難以調試。
要良好地運用unix哲學,你應該珍惜你的時間絕不浪費。一旦某人已經解決了某個問題,就直接拿來利用,不要讓驕傲或偏見拽住你又去重做一遍。永遠不要蠻干;要多用巧勁,省下力氣在需要的時候用,好鋼用到刀刃上。善用工具,盡可能將一切自動化。
軟件設計和實現是一門充滿快樂的藝術,一種高水平的游戲。如果這種態度對你來說聽起來有些荒謬,或者令你隱約感到有些困窘,那么請停下來,想一想,問問自己是不是已經把什么給遺忘了。如果只是為了賺錢或者打發時間,你為什么要搞軟件設計,而不是別的什么呢?你肯定曾經也認為軟件設計值得你付出激情……
要良好地運用unix哲學,你需要具備(或者找回)這種態度。你需要用心。你需要去游戲。你需要樂于探索。
操作系統的風格元素:
1、什么是操作系統的統一性理念
2、多任務能力
3、協作進程(IPC)
4、內部邊界
5、文件屬性和記錄結構
6、二進制文件格式
7、首選用戶界面風格
8、目標受眾
9、開發的門坎