天天看點

三讀《UNIX程式設計藝術》——UNIX哲學

如果在我目前的職業生涯中要選出一本對我影響最大的書籍,我一定會選擇ESR的《UNIX程式設計藝術》。第一次讀此書時資曆尚淺,更多的是當做一本課外讀物來看,但是随着職業中接觸了更多不同的作業系統,完成了更多項目産品的設計、架構、實作,對書中所講内容産生了更大的共鳴。在第三次讀此書之際,把書中很多有價值的思想提取出來給自己一個總結,希望也能給大家帶來一次分享。

本書關注的重點:不止于方法,更重乎理念。知識(方法)和專能(理念)差異巨大,憑借知識可以推斷出該做什麼,而專能讓你甚至在無意之間,條件反射似的把事情做好。

  • 看看UNIX的生命力:今天,化生為Linux、BSD、Solaris、MacOS X以及好幾個其它變種的Unix,使其前所未有的強大。UNIX這種穩定而且強大的生命力會讓你的知識投資更趨穩定。
  • UNIX的設計理念:最終使用者永遠比作業系統設計人員更清楚他們究竟需要什麼。它提供的是機制,而非政策。,雖然這種自由放縱主義風格會讓它失去很多非技術型使用者。但從長遠來看,這是個優勢,因為政策相對短壽,而機制才會長存。
  • 對windows的批評:在這樣的作業系統中,完成作業系統預見的任務很容易,但是完成其沒有預料到的任務,使用者不是無計可施就是痛苦不堪。但UNIX卻具有非常徹底的靈活性。
  • UNIX的hack之趣:對于程式員和開發人員來說,如果完成某項任務所需付出的努力對他們是個挑戰卻又恰好又在力所能及的範圍内,他們就會覺得很有樂趣。是以,趣味性是一個峰值效率的标志。充滿痛苦的開發環境隻會浪費勞動力和創造力;隻會在無形中耗費大量時間、資金、機會。

UNIX哲學

Unix哲學是自下而上的,而不是自上而下的。Unix哲學注重實效,立足于豐富的經驗。你不會在正規方法學和标準中找到它,它更接近于隐形的半本能的知識,即UNIX文化所傳播的專業經驗。

  1. 子產品原則:使用簡潔的接口拼合簡單的部件
    • 計算機程式設計的本質就是控制複雜度。
    • 用清晰的接口把若幹簡單的子產品組合成一個複雜軟體。如此一來,多數問題隻會局限于某個局部,那麼就還有希望對局部進行改進而不至牽動全身。
  2. 清晰原則:清晰勝于機巧
    • 維護如此重要而成本如此高昂;在寫程式時,要想到你不是寫給執行代碼的計算機看的,而是給人——将來閱讀維護源碼的人,包括你自己——看的。
  3. 組合原則:設計時考慮拼接組合
    • 在輸入輸出方面,Unix傳統極力提倡采用簡單化、文本化、面向流、裝置無關的格式。
  4. 分離原則:政策同機制分離,接口同引擎分離
  5. 簡潔原則:設計要簡潔,複雜度能低則低
    • 來自多方面的壓力常常會使程式變得複雜,其中一種就是來自技術上的虛榮心理。
    • 過度的複雜性往往來自項目的要求,而這些要求常常基于當月的推銷熱點,而不是給予顧客的需求和軟體實際能提供的功能。
    • 要避免這些陷阱,唯一的辦法就是鼓勵另一種軟體文化,以簡潔為美,人人對龐大複雜的東西群起而攻之——這是一個非常看重簡單解決方案的工程傳統,總是設法将程式系統分解為幾個能夠協作的小部分,并本能的抵制任何用過多噱頭來粉飾程式的企圖。
  6. 吝啬原則:除非别無他法,不要編寫龐大的程式
  7. 透明性原則:設計要可見,以便審查和調試
    • 因為調試通常會占用四分之三甚至更多的開發時間,是以一開始就多做點工作以減少日後調試的工作量會很劃算。一個特别有效的減少調試工作量的方法就是設計時充分考慮透明性和顯見性。
  8. 健壯性:健壯源于透明和簡潔
  9. 表示原則:把知識疊入資料以求邏輯質樸而健壯
    • 資料要比程式設計邏輯更容易駕馭。是以接下來,如果要在複雜資料和複雜代碼中選擇一個,甯願選擇前者。更進一步:在設計中,你應該主動将代碼的複雜度轉移到資料之中去。
  10. 通俗原則:接口設計避免标新立異
    • 最易用的程式就是使用者需要學習新東西最少的程式——或者,換句話說,最易用的程式就是最切合使用者已有知識的程式。
  11. 緘默原則:如果一個程式沒有什麼好說的,就保持沉默
  12. 補救原則:出現異常時,馬上退出并給出足量錯誤資訊
    • 軟體要盡可能從容的應付各種錯誤輸入和自身的運作錯誤。但是,如果做不到這一點,就讓程式盡可能以一種容易診斷錯誤的方式終止。
  13. 經濟原則:甯花機器一分,不花程式員一秒
  14. 生成原則:避免手工hack,盡量編寫程式去生成程式
  15. 優化原則:雕琢前先得有原型,跑之前先學會走
    • 90%的功能現在能實作,比100%的功能永遠實作不了強。做好原型設計可以幫助你避免為蠅頭小利而投入過多的時間。
    • 先制作原型,再精雕細琢。優化之前先確定能用。
    • 先給你的設計做個未優化的、運作緩慢、很耗記憶體但是正确的實作,然後進行系統地調整,尋找那些可以通過犧牲最小局部簡潔性而獲得較大性能提升的地方。
  16. 多樣原則:決不相信所謂的“不二法門”的斷言
  17. 擴充原則:設計着眼未來,未來總比預想快
    • 要為資料格式和代碼留下擴充的空間。

KISS——Keep It Simple,Stupid!