自動化法則 計算機原本就該從事簡單重復的工作。只要把任務指派給它們,它們就可以一遍又一遍毫不走樣地重復執行,而且速度很快。但卻經常看見一種奇怪的現象:人們在計算機上手工做一些簡單重復的工作,計算機則在大半夜里扎堆閑聊取笑這些可憐的用戶。
我們應該利用作為程序員的優勢,看到普通用戶無法看到的東西,培養larry所說的“懶惰,急躁和傲慢”讓計算機高效地為我們工作:命令行是如此地高效,腳本是如此地方便,銜接兩個小工具能達到如此神奇的效果。。。
古代哲人1. 亞里斯多德的“事物本質性質和附屬性質”理論:致力本質復雜性,去除附屬復雜性。你現在想解決問題A,在解決A的問題中遇到了問題B,接著你去解決問題B,戲劇性的是你遇到了很多接二連三的問題C,D,E,或者在很多年后,程序才出現問題C,D,E,可是你的最初問題是A,不是嗎?B,C,D等等都是附屬性質,當這些附屬性質越來越多,越來越復雜的時候,也是開始思考另一個解決A的辦法的時候了。(如果作為學習,可以試著去解決那些附屬性質)
2. 笛米特法則:任何一個對象或者方法,它應該只能調用下列對象:該對象本身,作為參數傳遞進來的對象,在方法內創建的對象。這么做的主要目的是信息隱藏,同時使類的耦合更加松散。
3. “古老”的軟件傳說。了解歷史才能更好地創造歷史。讀讀那些“古老”的“寶典”(如《程序員修煉之道》《人月神話》《Smalltalk Best Practice Patterns》),會學到很多有用的東西,或許你會發出一生驚嘆。“當你的老板要求你使用一個低質量的代碼庫時,不需要在崩潰中咬牙切齒,告訴他:你正“站在侏儒的肩膀”上的陷阱中,然后他就會明白不僅僅只有你才覺得那是個壞主意。”
擁抱多語言編程 “每個語言都有自己擅長的地方”(我的想法)。比如perl特別適合文本處理,用來處理網頁也很好(畢竟有些從服務器上返回的數據就是用perl返回的,所以用perl也會比較合適)。
計算機語言就像鯊魚,要是保持靜止就會死。
Java的創造都們實際上創造了兩樣東西:Java語言和Java平臺。后者就是我們擺脫歷史包袱的途徑(Java語言的特性包含了一些它本該可以忽略的東西,如Java程序初始化的順序和從0開始的數組)。讀到本文我才開始理解平臺的深刻意義。
舉兩個例子(Groovy和Jaskell)說明。
Groovy是一種開源的編程語言,它給Java帶來了動態語言的語法和功能,它會生成Java字節碼,因此可以在Java平臺上運行。在Java之后十多年里浮現出來的各種語言很大程序上影響著Groovy的語法:Groovy支持裝飾,較松散的類型系統,“理解”迭代的集合,以及很多現代編程語言的改進特性。而且它可以編譯成純正的Java字節碼。用Groovy寫成的代碼簡潔且并不比用Java寫的代碼效率低多少,而且能充分借用Java平臺的優勢。
Jaskell是運行在Java平臺上的Haskell版本。Jaskell擁有函數式程序設計語言的優勢:函數不改變外界的狀態,純粹的函數式語言壓根沒有“變量”概念;函數式語言對多線程的支持比命令式語言要強得多,用函數式語言更容易寫出強壯的線程安全的代碼,對并發支持也比較好(我想這是Erlang流行的原因)。同時Jaskell也能借用Java平臺的優勢。
Java平臺借用這些多語言特性,一定會走得更好,走得更遠。不過,在帶來好處的同時,也帶來了一個問題:多語言應用程序更難高度,解決這個問題最簡單的辦法也跟現在一樣:靠嚴格的單元測試來避免在調試器上浪費時間。
多語言開發風格會把我們帶向領域特定語言(Domain-specific Language,DSL)。我們會以一些專門的語言為基礎,創造出非常有針對性的,非常專注某一問題域的DSL。抱定一種通用語言不放的年代就快結束了,我們正在進入一個專業細分的新時代。大學時代的Haskell教材還在書架頂上蒙塵嗎?該給它撣撣灰了。
ps: 我們也可以以C++為基礎,來創造一種DSL,思考。
鏈接: 卓有成效的程序員
posted on 2010-07-10 12:40
hex108 閱讀(852)
評論(4) 編輯 收藏 引用 所屬分類:
Read the book