Unix哲學起源於Ken Thompson早期關於如何設計一個服務接口簡潔、小巧精干的操作系統的思考,隨著Unix文化在學習如何盡可能發掘Thompson設計思想的過程中不斷成長,同時一路上還從其它許多地方博采眾長。
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:數據壓倒一切。如果已經選擇了正確的數據結構並且把一切都組織得井井有條,正確的算法也就不言自明。編程的核心是數據結構,而不是算法。
原則6:沒有原則6。
Ken Thompson——Unix最初版本的設計者和實現者,禅宗偈語般地對Pike的原則4作了強調:
拿不准就窮舉。
Unix哲學中更多的內容不是這些先哲們口頭表述出來的,而是由他們所作的一切和Unix本身所作出的榜樣體現出來的。從整體上來說,可以概括為以下幾點:
1. 模塊原則:使用簡潔的接口拼合簡單的部件。
2. 清晰原則:清晰勝於機巧。