天天看點

Unix哲學

unix哲學起源于ken thompson早期關于如何設計一個服務接口簡潔、小巧精幹的作業系統的思考,随着unix文化在學習如何盡可能發掘thompson設計思想的過程中不斷成長,同時一路上還從其它許多地方博采衆長。

 1  unix哲學說來不算是一種正規設計方法。它并不打算從計算機科學的理論高度來産生理論上完美的軟體。那些毫無動力、松松垮垮而且薪水微薄的程式員們,能在短短期限内,如同神靈附體般造出穩定而新穎的軟體——這隻不過是經理人永遠的夢呓罷了。 

  unix哲學(同其它工程領域的民間傳統一樣)是自下而上的,而不是自上而下的。unix哲學注重實效,立足于豐富的經驗。你不會在正規方法學和标準中找到它,它更接近于隐性的半本能的知識,即unix文化所傳播的專業經驗。它鼓勵那種厘清輕重緩急的感覺,以及懷疑一切的态度,并鼓勵你以幽默達觀的态度對待這些。  

 unix管道的發明人、unix傳統的創始者之一doug mcilroy在[mcilroy78]中曾經說過: 

  (i)讓每個程式就做好一件事。如果有新任務,就重新開始,不要往原程式中加入新功能而搞得複雜。   

(ii)假定每個程式的輸出都會成為另一個程式的輸入,哪怕那個程式還是未知的。輸出中不要有無關的資訊幹擾。避免使用嚴格的分欄格式和二進制格式輸入。不要堅持使用互動式輸入。   

(ⅲ)盡可能早地将設計和編譯的軟體投入試用, 哪怕是作業系統也不例外,理想情況下, 應該是在幾星期内。對拙劣的代碼别猶豫,扔掉重寫。   

(iv)優先使用工具而不是拙劣的幫助來減輕程式設計任務的負擔。工欲善其事,必先利其器。   後來他這樣總結道(引自《unix的四分之一世紀》(a quarter century of unix [salus])): 

  unix哲學是這樣的:一個程式隻做一件事,并做好。程式要能協作。程式要能處理文本流,因為這是最通用的接口。 

  rob pike, 最偉大的c語言大師之一, 在《notes on c programming》中從另一個稍微不同的角度表述了unix的哲學[pike]:  

 原則1:你無法斷定程式會在什麼地方耗費運作時間。瓶頸經常出現在想不到的地方,是以别急于胡亂找個地方改代碼,除非你已經證明那兒就是瓶頸所在。 

  原則2:估量。在你沒對代碼進行估量,特别是沒找到最耗時的那部分之前,别去優化速度。 

  原則3:花哨的算法在n很小時通常很慢,而n通常很小。花哨算法的常數複雜度很大。除非你确定n總是很大,否則不要用花哨算法(即使n很大,也優先考慮原則2)。 

  原則4:花哨的算法比簡單算法更容易出bug、更難實作。盡量使用簡單的算法配合簡單的 資料結構。 

  原則5:資料壓倒一切。如果已經選擇了正确的資料結構并且把一切都組織得井井有條,正确的算法也就不言自明。程式設計的核心是資料結構,而不是算法。  

   ken thompson——unix最初版本的設計者和實作者,禅宗偈語般地對pike的原則4作了強調:   拿不準就窮舉。   unix哲學中更多的内容不是這些先哲們口頭表述出來的,而是由他們所作的一切和unix本身所作出的榜樣展現出來的。從整體上來說,可以概括為以下幾點:

   1. 子產品原則:使用簡潔的接口拼合簡單的部件。

   2. 清晰原則:清晰勝于機巧。  

 3. 組合原則:設計時考慮拼接組合。  

 4. 分離原則:政策同機制分離,接口同引擎分離。  

 5. 簡潔原則:設計要簡潔,複雜度能低則低。

   6. 吝啬原則:除非确無它法,不要編寫龐大的程式。 

  7. 透明性原則:設計要可見,以便審查和調試。  

 8. 健壯原則:健壯源于透明與簡潔。

   9. 表示原則:把知識疊入資料以求邏輯質樸而健壯。   

10. 通俗原則:接口設計避免标新立異。  

 11. 緘默原則:如果一個程式沒什麼好說的,就沉默。  

 12. 補救原則:出現異常時,馬上退出并給出足夠錯誤資訊。   

13. 經濟原則:甯花機器一分,不花程式員一秒。 

  14. 生成原則:避免手工hack,盡量編寫程式去生成程式。  

 15. 優化原則:雕琢前先要有原型,跑之前先學會走。  

  16. 多樣原則:決不相信所謂“不二法門”的斷言。  

 17. 擴充原則:設計着眼未來,未來總比預想來得快。