若是在我目前的職業生涯中要選出一本對我影響最大的書籍,我必定會選擇ESR的《UNIX編程藝術》。第一次讀此書時資歷尚淺,更多的是當作一本課外讀物來看,可是隨着職業中接觸了更多不一樣的操做系統,完成了更多項目產品的設計、架構、實現,對書中所講內容產生了更大的共鳴。在第三次讀此書之際,把書中不少有價值的思想提取出來給本身一個總結,但願也能給你們帶來一次分享。程序員
本書關注的重點:不止於方法,更重乎理念。知識(方法)和專能(理念)差別巨大,憑藉知識能夠推斷出該作什麼,而專能讓你甚至在無心之間,條件反射似的把事情作好。編程
看看UNIX的生命力:今天,化生爲Linux、BSD、Solaris、MacOS X以及好幾個其它變種的Unix,使其史無前例的強大。UNIX這種穩定並且強大的生命力會讓你的知識投資更趨穩定。windows
UNIX的設計理念:最終用戶永遠比操做系統設計人員更清楚他們究竟須要什麼。它提供的是機制,而非策略。,雖然這種自由放縱主義風格會讓它失去不少非技術型用戶。但從長遠來看,這是個優點,由於策略相對短壽,而機制纔會長存。架構
對windows的批評:在這樣的操做系統中,完成操做系統預見的任務很容易,可是完成其沒有預料到的任務,用戶不是機關用盡就是痛苦不堪。但UNIX卻具備很是完全的靈活性。ide
UNIX的hack之趣:對於程序員和開發人員來講,若是完成某項任務所需付出的努力對他們是個挑戰卻又剛好又在力所能及的範圍內,他們就會以爲頗有樂趣。所以,趣味性是一個峯值效率的標誌。充滿痛苦的開發環境只會浪費勞動力和創造力;只會在無形中耗費大量時間、資金、機會。性能
Unix哲學是自下而上的,而不是自上而下的。Unix哲學注重實效,立足於豐富的經驗。你不會在正規方法學和標準中找到它,它更接近於隱形的半本能的知識,即UNIX文化所傳播的專業經驗。學習
模塊原則:使用簡潔的接口拼合簡單的部件優化
計算機編程的本質就是控制複雜度。操作系統
用清晰的接口把若干簡單的模塊組合成一個複雜軟件。如此一來,多數問題只會侷限於某個局部,那麼就還有但願對局部進行改進而不至牽動全身。設計
清晰原則:清晰勝於機巧
維護如此重要而成本如此高昂;在寫程序時,要想到你不是寫給執行代碼的計算機看的,而是給人——未來閱讀維護源碼的人,包括你本身——看的。
組合原則:設計時考慮拼接組合
在輸入輸出方面,Unix傳統極力提倡採用簡單化、文本化、面向流、設備無關的格式。
分離原則:策略同機制分離,接口同引擎分離
簡潔原則:設計要簡潔,複雜度能低則低
來自多方面的壓力經常會使程序變得複雜,其中一種就是來自技術上的虛榮心理。
過分的複雜性每每來自項目的要求,而這些要求經常基於當月的推銷熱點,而不是給予顧客的需求和軟件實際能提供的功能。
要避免這些陷阱,惟一的辦法就是鼓勵另外一種軟件文化,以簡潔爲美,人人對龐大複雜的東西羣起而攻之——這是一個很是看重簡單解決方案的工程傳統,老是設法將程序系統分解爲幾個可以協做的小部分,並本能的抵制任何用過多噱頭來粉飾程序的企圖。
吝嗇原則:除非別無他法,不要編寫龐大的程序
透明性原則:設計要可見,以便審查和調試
由於調試一般會佔用四分之三甚至更多的開發時間,因此一開始就多作點工做以減小往後調試的工做量會很划算。一個特別有效的減小調試工做量的方法就是設計時充分考慮透明性和顯見性。
健壯性:健壯源於透明和簡潔
表示原則:把知識疊入數據以求邏輯質樸而健壯
數據要比編程邏輯更容易駕馭。因此接下來,若是要在複雜數據和複雜代碼中選擇一個,寧願選擇前者。更進一步:在設計中,你應該主動將代碼的複雜度轉移到數據之中去。
通俗原則:接口設計避免標新立異
最易用的程序就是用戶須要學習新東西最少的程序——或者,換句話說,最易用的程序就是最切合用戶已有知識的程序。
緘默原則:若是一個程序沒有什麼好說的,就保持沉默
補救原則:出現異常時,立刻退出並給出足量錯誤信息
軟件要儘量從容的應付各類錯誤輸入和自身的運行錯誤。可是,若是作不到這一點,就讓程序儘量以一種容易診斷錯誤的方式終止。
經濟原則:寧花機器一分,不花程序員一秒
生成原則:避免手工hack,儘可能編寫程序去生成程序
優化原則:雕琢前先得有原型,跑以前先學會走
90%的功能如今能實現,比100%的功能永遠實現不了強。作好原型設計能夠幫助你避免爲蠅頭小利而投入過多的時間。
先製做原型,再精雕細琢。優化以前先確保能用。
先給你的設計作個未優化的、運行緩慢、很耗內存可是正確的實現,而後進行系統地調整,尋找那些能夠經過犧牲最小局部簡潔性而得到較大性能提高的地方。
多樣原則:決不相信所謂的「不二法門」的斷言
擴展原則:設計着眼將來,將來總比預想快
要爲數據格式和代碼留下擴展的空間。
設計協議或者文件格式時,應使其具備充分的自描述性以即可以擴展。
全部的Unix哲學濃縮爲一條鐵律