提煉出一門語言或技術的 Good Parts, 使用該子集去構造健壯穩固的應用。
我們總是傾向於去學習和使用所有的語言特性,好像凡是新的,凡是提供了的, 就有必要去使用; 這本書告訴我們, 要有選擇性地學習和使用。
不是所有的語言特性都需要學習和使用。 學習和使用那些設計不良的特性,不僅耗費大量時間和精力,而且有損項目的可維護性,得不償失;反之,學習那些優良的部分,不僅可以節省時間,騰出更多時間和精力去做更重要的事情,而且有助於將事情做好,提高收益/學習比。
富有技巧性的HACKER可以欣賞其精巧的構思和利用漏洞的能力,但不適宜用在實際開發中。
Javascript 的優良子集:
1. 簡單鬆散的類型系統,主要是 布爾、字串和數值 三種類型,undefined, null 兩個特殊值;
2. 函數是Javascript 的樞紐對象, 函數型編程範式; 值得重點學習和探討;
3. 基於原型繼承的動態對象機制,值得重點學習和探討;
4. 容易建立和操作對象和數組, JSON 資料交換格式, 便於使用;
引申一下, 同樣可以定義自己的開發子集, 依靠這些元素實現高效可靠的開發活動。
1. 程式設計語言: 至少熟悉六種程式設計語言,掌握兩種程式設計語言。 “熟悉”是指大量學習和使用過,“掌握”是指能夠使用該語言 構建大型可靠的軟體系統。
一種過程式,一種對象式,一種函數式, 一種聲明式, 一種用戶端語言,一種指令碼語言。 例如, C / Java / Clisp / SQL / JavaScript / Python
2. 編程工具: 至少一種編輯器,一種IDE, 一種項目構建工具, 一種版本控制工具, 一種控制台。 例如 Vim / Eclipse / Maven / Svn / Shell (cygwin)
3. 編程方法: 自頂向下,意圖導引,自底向上; First Right, then Good ; 預先設計, 及早動手; 迭代式開發、發布、反饋和改進 ; 預估時間;
4. 編程風格: K&R C , Java 編程規範, 排版整潔,代碼簡潔無冗餘, 一致, 使用地道表達範式
5. 編程模型: 串列, 並發, 多進程, 多線程, MapReduce , B/S , 非同步, 回調,阻塞, 非阻塞
6 編程思想: 過程式, 對象式, 函數式,聲明式, 原語, 集合, 組合, 抽象, 分治,
7. 常用演算法: 分治, 遞迴,動態規劃, 時空權衡; 優先順序演算法;問題轉化;
8. 排序: 插入排序, 快速排序, 堆排序, 歸併排序;
9. 搜尋: 順序搜尋, 二分搜尋, 雜湊搜尋, 分段並行搜尋;
10. 資料結構: 【一維或二維】數組, 鏈表,棧,隊列, 樹, 字串, 雜湊表; mysql
11. 文本處理: find , grep, awk, sed, Regex;
12. 設計模式: Factory 方法, 單例,原型, 模板方法,策略, 觀察者, 責任鏈, 組合, 命令, 代理,外觀,適配器,裝飾器,迭代器
13. 進程與網路: ps, top, 工作管理員 ; netstat, ssh, scp, socket , http,
14. 開發架構: Servlet, Spring, Struts, ibatis , Jquery , Extjs, 等
15. 常用組件: 日誌(common-logging) , 工具 + 生產力庫 (字串、日期函數或工具類) ,
16. 運行容器: apacheHttp , tomcat, jetty, nginx , 瀏覽器,
17. 軟體架構: MVC ; view-controller- service - dao (api) - db ;工廠、管道與過濾器 ; 事件驅動;
18. 單元測試: 參數組合自動產生, 等價劃分類, 邊界測試, 空測試, 交叉檢驗, 逆向檢驗,
19. 程式碼群組織: 標頭檔, 類檔案,包機制,名字空間,
20. 軟體工程: 模組化, 對象, 封裝,實現隱藏, 約定介面,
21. 測量技術: 效能測量,time
22. 學習網站: Csdn , iteye, infoq, stackoverflow , 開源專案網站,個人部落格, google , baidu,
23. 經典書籍: 電腦程式設計藝術, 編程珠璣, SICP , 深入理解電腦系統, 程式設計實踐 , Linux/Unix設計思想, 設計模式等