作者:[美] Max Kanat-Alexander
翻譯:余晟
https://book.douban.com/subject/20445258/
第一章 引言
1.1 計算機出了什么問題?
計算機為什么這么容易出問題?原因是:編程寫得太糟糕。
程序太復雜了,需要 化繁為簡
1.2 程序究竟是什么?
要想改進結果,提高代碼質量最為關鍵。
所以我們最需要掌握的是,提高代碼質量的科學方法。
第二章 缺失的科學
軟件設計的科學就是為軟件做計劃、制定決策的科學,它幫助大家做出這類決定:
- 程序的代碼應當采用什么結構?
- 程序的速度重要,還是代碼容易閱讀重要?
- 為滿足需求,應該選擇哪種編程語言?
軟件系統中任何與架構相關的技術決策,以及在開發系統中所做的技術決策,
都可以歸到“軟件設計”的范疇里。
2.1 程序員也是設計師
- 每個寫代碼的人都是設計師
身為設計師,必須時時愿意聆聽建議和反饋,之后,任何決策都必須由單獨的個人而不是一群人來做出。
而如果你是資深開發人員或首席程序員,你在推翻下屬設計時,應當說明新決策為什么比原來的好。不過即便如此,軟件設計的責任也應當落實在真正寫代碼的人身上。
2.2 軟件設計的科學
書中列出了關于軟件開發的若干定義(Definition)、事實(Fact)、條例(Rule)、規則(Law)。
其中規則最為重要。它是永遠為真的事實,涵蓋了很多領域的只是。它們幫助我們發現其他重要的真理以及幫助我們預測未來要發生的事情。
這些定義、事實、條例、規則的時候,很多都是顯而易見的,但是我們需要問問自己:
- 我是否知道,某些特定的說法是否經過了證實?
- 我是否清楚它的重要性?
- 我是否可以向其他人清楚講解,讓對方徹底明白?
- 我是否明白,在軟件開發領域中,它與其他部分知識的關系如何?
2.3 為什么不存在軟件設計科學
歷史原因造成缺失“軟件管理科學”和“軟件設計科學”。
而軟件復雜性的主要根源就在于缺乏科學。
第三章 軟件設計的推動力
明確一個原則
軟件的目的是為了幫助人,為了解決問題的。
明確目標后,要針對每一條功能問自己:這個功能是怎樣幫助人去做某件事的呢?
好處是:
- 剔除沒用的功能
- 幫助澄清該功能的描述或實現方式中的模糊之處
- 確認功能的價值
- 安排優先級
- 刪減價值不大的功能
軟件設計科學的目標
- 確保軟件能提供盡可能多的幫助
- 確保軟件能持續提供盡可能多的幫助
- 設計程序員盡可能容易得開發和維護軟件系統
第四章 未來
設計軟件時,應該做怎樣的決定?
4.1 軟件設計的方程式
D = (Vn + Vf) / (Ei + Em)
D表示這個變化的合意程度(可取程度,也就是說此項工作值不值得做下去)。
Vn表示當前價值
Vf表示未來價值
Ei表示實現成本
Em表示維護成本
規則:
- 理想的解決方案:維護成本降到零
- 理想的實際情況:未來收益高于維護成本
- 通常來說:相比降低實現成本,降低維護成功更加重要
4.2 設計的質量
設計的質量好壞,正比于該系統在未來能持續幫人他人時間的長度。
使用的時間越長,越需要慎重的設計。
4.3 不可預測的結果
未來的某些事情,是我們不知道的。
程序員犯的最常見、最嚴重的錯誤,就是在其實不知道未來的時候去預測未來。
第五章 變化
程序存在的時間越久,它的某個部分需要變化的可能性就越高。
三個誤區:編寫不必要的代碼;代碼難以修改;過分追求通用。
刪除不必要的代碼,未來的需求未來再寫。
根據當前的需求,而不是未來的需求。
漸進式開發及設計
第六章 缺陷與設計
在程序中新增缺陷的可能性與代碼修改量成正比。 - 改的越多,越可能出Bug
最好的設計,就是能適應外界盡可能多的變化,而軟件自身變化盡可能的少。
永遠不要“修正”任何東西,除非真的是bug,而且有證據表面問題確實存在。 - 不要手賤
避免重復
第七章 簡潔
軟件的維護難度,反比于其簡潔程度。
要簡單到傻子都能懂。
保持一致、命名、注釋都需要注意。
第八章 復雜性
新增功能、擴展軟件用途、新增程序員、做無謂的改變、困于糟糕的技術、理解錯誤、糟糕的設計、沒有設計、重新發明輪子都會增加軟件的復雜性。
8.5 應對復雜性
- 把某個部分變簡單
- 不可解決的復雜性:包裝一層以屏蔽復雜性,讓其他程序員更容易使用和理解。
8.6 推倒重來
前提是:
- 完成了準確評估,新系統比現有系統效率更高
- 有足夠時間
- 設計更好(要么是你自己變牛逼了,要么是更牛逼的人來設計)
- 設計好階段性成果,能夠獲得積極反饋
- 有足夠資源,不光是時間,還要考慮維護兩套系統
第九章 測試
你對軟件行為的了解程度,等于你真正測試它的程度
讀后感
- 化繁為簡、提高代碼質量
- 不僅要明確軟件設計中的規則,能夠應用到實際軟件開發中,還要能夠給其他人清楚講解,要能夠扛得住別人的challenge,要能夠說服別人!
- 在軟件設計時就要考慮維護成本,降低維護成本比降低實現成本更重要。
- 維護成本正比于系統的復雜程度。
- 避免編寫不必要的代碼,要保證代碼容易修改,避免過分通用。