卓有成效的程式設計師 讀書筆記

flydream發表於2011-08-26

一.機制
1、加速法則 :使用各種工具或技巧,使自己工作效率最優化
關注本質,而非形式
鍵盤輸入總比導航快 簡化啟動皮膚,將最常用功能最優先化
花點時間來學習你手邊所有隱藏的快捷鍵
環境切換會消耗時間,儘量減少環境切換
記住操作的歷史,忘記歷史就意味著你得重新再輸入一遍
嵌入圖形化工具的命令提示符讓你魚與熊掌兼得
在資源管理器中嵌入命令提示符使環境切換更容易
開發時優先使用鍵盤而非滑鼠
在上下文中學習IDE快捷鍵,而不要出背長長的列表
當你第二次輸入一個複雜結構時,將它做成模板
在工具中使用查詢手段來導航
如果要對多行文字做同樣的事情,就應該找出其中的模式,並把它記錄為一個巨集
在一個文字上執行某個特定操作的次數越多,就越有可能會再次重複他
不要總是重複輸入相同的命令,使用鍵盤巨集功能
每天花一點時間來使每天都更高效

2、專注法則:想辦法改變環境以減少打擾,減少來自電腦的干擾以及藉助工具保持專注
排除干擾
精力越集中,思維越縝密
策略:隔離策略、關掉不需要的提示、創造安靜時間
搜尋優於導航
草堆越大,從中找到一根針就越難
不要檔案樹,要搜尋
在訴諸高階搜尋之前,先嚐試簡單的搜尋
使用有根檢視,有根檢視把資源管理器變成了專案管理工具
充分利用內建的機制(例如顏色)來幫助你集中注意力
使用基於專案的快捷方式,用連結來建立虛擬的專案管理目錄
虛擬桌面可以讓原本雜亂無章的一大推視窗變整潔

3、自動化法則:自動化每天重複的工作或任務,留住寶貴的時間做更有價值的事情
不要重新發明輪子,給合適的任務尋找合適的工具
即便不是工具最初的設計意圖,只要是合適的場合,同樣可以使用這些工具
不要浪費時間動手去做可以被自動化的事情
做簡單重複的事情實在浪費注意力
以創造性的方式解決問題,有助於在將來解決類似的問題
是否應該自動化的關鍵在於投資回報率和緩解風險
研究型的工作應該放在時間盒裡做
別讓自動化的努力變成剪犛牛毛(注意你的解決的核心問題)
建立本地快取
自動訪問網站(cUrl工具)
與RSS源互動|Yahoo!pipes、automator
在構建之外使用ant,
用Rake執行常見任務
用Selenimu瀏覽網頁
用Bash統計異常數

4、規範性法則:消除重複,保持規範化
DRY-Don’t repeat yourself!
對於任何你不自己去構建的東西,只在版本控制中儲存一份副本
使用間接機制建立友善的工作空間
使用間接機制來保持穩健同步
通過複製貼上來複用是邪惡的,不論你複製貼上到是什麼
利用虛擬平臺使專案以來標準化
始終保持程式碼和資料庫結構的同步
使用遷移為資料庫結構的改動建立可重複的快照
過時的文件比沒有文件更糟,因為它會自動誤導你
對管理者來說,文件意味著緩解風險
始終保持“活”的文件,最好是能自動生成svn2wiki
任何需要費勁創造的東西,都讓它的創造者欲罷不能
白板+資料相機強過任何的CASE工具
儘量生成所有的技術文件
重複是軟體開發中最大的阻力

二.實踐
1、測試驅動設計
測試代表著軟體開發行為中工程式的嚴謹部分
把註釋重構成方法
程式碼需要進行度量
程式碼需要統計程式碼測試覆蓋率

2、靜態分析:通過軟體工具對程式程式碼進行驗證
靜態分析工具提供了便宜實惠的驗證手段
動態語言分析
3、當個好公民
4、YAGNI – You Ain’t Gonna Need It!你不會需要它
如無必要,勿增複雜度
軟體開發首先是一場溝通博弈
5、古代哲人 – 哲學思想對構建高質量軟體有直接的影響
亞里士多德 “事物本質性質和附屬性質” -> 致力本質複雜度,去除附屬複雜性
奧姆剃刀原理 -> 如果對一個現象有好幾種解釋,那麼最簡單的解釋往往是最正確的
Dietzler定律:即使是通用目的變成語言也逃不出“80-10-10準則”(80%的需求可以很快完成,下一個10%需要花很大的努力才能完成,而最後的10%卻幾乎是不可能完成的)的魔咒。
迪米特法則 -> 任何物件都不需要知道與之互動的那些物件的任何內部細節
關注那些“古老的”軟體技術學說。理解已存在的軟體學說,能給你提供很好的資源
6、質疑權威 -> 推行標準是一件好事,但不能盲從標準
7、超程式設計 -> 編寫“會寫程式”的程式
超程式設計改變了你的語法詞典,給你提供了更多表達自己的方式
超程式設計的語言允許開發者使用額外的能力,由開發者決定什麼時候使用這些額外的能力
java與反射
groovy
編寫連貫介面
8、組合方法和SLAP(Single Level of Abstraction Principle,單一抽象層次原則)
重構成組合方法能暴露出隱藏的可複用程式碼
TDD實踐推動組合方法模式
9、多語言程式設計
10、尋找完美工具
尋找屬於你的完美編輯器,並從裡到外去了解它
你可以使用巨集來記錄所有重複的文字操作
可以從命令列呼叫的
掌握好正規表示式將為我們節省大量的精力
如果能夠批量處理,就不要來回做重複的工作
用“真正的”指令碼語言去完成自動化任務
將行為保留在可測試的程式碼中。xml不應該帶有行為特性,行為特性由動態語言來完成
關注每個小工具的演化
丟棄錯誤的工具,儘量少交複雜稅

一些比較實用的工具或軟體:
windows工具:Windows PowerToys、Tweak UI、Virtual Desktop manager
快速啟動軟體:launchy、Colibri、Enso。QuickSilver(MacOSX),個人推薦TypeAndRun或AltRun
Command Prompt Explorer Bar 兼有圖形和命令列(ctrl+m)。path Finder(Mac OSX)
cygwin
強制快捷鍵工具:Key Prompter(eclipse、IntelliJ).http://www.mousefeed.com
鍵盤巨集工具:AutoHotKey
集中注意力工具:jediconcentrate
搜尋工具:google desktop serch,外掛Any Text FileIndexer(可搜尋文字內容),UNIX下的find命令,個人推薦Everything
檔案管理工具:subversion、git
持續整合:CruiseControl、Bamboo、Hudson、TeamCity、LuntBuild
問題跟蹤和WIKI:Trac
敏捷專案管理:Mingle
Ant、Gant、Groovy
UML圖生成工具:yDoc
資料庫結構生成工具:SchemaSpy
程式碼度量工具:McCabe的圈複雜度(邊數-節點數 +2 | 邊代表執行路徑,節點代表程式碼的行數)、javaNCSS、Saikuro
靜態分析工具:Findbugs、PMD、CheckStyle、CPD
統計資料生成工具:Panopticode(包括emma、jdepend、javaNcss、simian、Panopticode Aggregator)
Jaskell

個人經驗和實踐:
自動化一切可以自動化的任務和日常工作,不能自動化的也要想盡辦法自動化,儘量不要做重複性的工作 保持簡單和優美,簡單即是美
學會一種動態語言,比如ruby,python,在工作中會有很大的幫助
善用工具,創造工具

相關文章