莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          《Unix編程藝術》重讀筆記(一)

          Posted on 2010-02-18 19:23 dennis 閱讀(7850) 評論(7)  編輯  收藏 所屬分類: 模式與架構 、涂鴉 、計算機科學與基礎

             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、開發的門坎


          評論

          # re: 《Unix編程藝術》重讀筆記(一)  回復  更多評論   

          2010-03-01 21:54 by hoorace
          發現java中的n多設計思想是從unix編程中繼承的。

          # re: 《Unix編程藝術》重讀筆記(一)  回復  更多評論   

          2010-06-30 13:36 by 今天還是再編程
          同意樓上!

          # re: 《Unix編程藝術》重讀筆記(一)  回復  更多評論   

          2010-07-01 21:48 by 明天又是編程
          應該說這種單想是通用的 ...
          一種思想,一種原理,就有它的適用范圍。

          # re: 《Unix編程藝術》重讀筆記(一)  回復  更多評論   

          2011-11-24 13:21 by nightmare23
          好高深的哲學啊。。。

          # re: 《Unix編程藝術》重讀筆記(一)  回復  更多評論   

          2012-03-23 18:07 by 開啟
          這寫得不錯

          # re: 《Unix編程藝術》重讀筆記(一)  回復  更多評論   

          2012-03-24 11:56 by 瘋狂的烤冰
          發現一個bug:第一行“失效”應該是“時效”吧?

          # re: 《Unix編程藝術》重讀筆記(一)  回復  更多評論   

          2012-03-26 09:29 by dennis
          @瘋狂的烤冰
          不是,是實效,感謝你的指正。
          主站蜘蛛池模板: 吉木萨尔县| 上虞市| 东海县| 哈巴河县| 桑植县| 新昌县| 红河县| 卓资县| 汶川县| 靖远县| 泰和县| 祁东县| 涟源市| 响水县| 兰考县| 确山县| 湄潭县| 马龙县| 理塘县| 电白县| 上饶市| 滁州市| 扶余县| 台中市| 施甸县| 娄底市| 临江市| 司法| 邵东县| 嘉善县| 贵南县| 山东省| 南开区| 卫辉市| 航空| 开化县| 安阳县| 灵寿县| 安徽省| 襄城县| 永城市|