2018-03-01 《簡約之美 軟件設計之道》

作者:[美] Max Kanat-Alexander
翻譯:余晟
https://book.douban.com/subject/20445258/


第一章 引言

1.1 計算機出了什么問題?

計算機為什么這么容易出問題?原因是:編程寫得太糟糕。
程序太復雜了,需要 化繁為簡

1.2 程序究竟是什么?

要想改進結果,提高代碼質量最為關鍵。
所以我們最需要掌握的是,提高代碼質量的科學方法。

第二章 缺失的科學

軟件設計的科學就是為軟件做計劃、制定決策的科學,它幫助大家做出這類決定:

  • 程序的代碼應當采用什么結構?
  • 程序的速度重要,還是代碼容易閱讀重要?
  • 為滿足需求,應該選擇哪種編程語言?

軟件系統(tǒng)中任何與架構相關的技術決策,以及在開發(fā)系統(tǒng)中所做的技術決策,
都可以歸到“軟件設計”的范疇里。

2.1 程序員也是設計師

  • 每個寫代碼的人都是設計師

身為設計師,必須時時愿意聆聽建議和反饋,之后,任何決策都必須由單獨的個人而不是一群人來做出。
而如果你是資深開發(fā)人員或首席程序員,你在推翻下屬設計時,應當說明新決策為什么比原來的好。不過即便如此,軟件設計的責任也應當落實在真正寫代碼的人身上。

2.2 軟件設計的科學

書中列出了關于軟件開發(fā)的若干定義(Definition)、事實(Fact)、條例(Rule)、規(guī)則(Law)。
其中規(guī)則最為重要。它是永遠為真的事實,涵蓋了很多領域的只是。它們幫助我們發(fā)現(xiàn)其他重要的真理以及幫助我們預測未來要發(fā)生的事情。
這些定義、事實、條例、規(guī)則的時候,很多都是顯而易見的,但是我們需要問問自己:

  • 我是否知道,某些特定的說法是否經(jīng)過了證實?
  • 我是否清楚它的重要性?
  • 我是否可以向其他人清楚講解,讓對方徹底明白?
  • 我是否明白,在軟件開發(fā)領域中,它與其他部分知識的關系如何?

2.3 為什么不存在軟件設計科學

歷史原因造成缺失“軟件管理科學”和“軟件設計科學”。
而軟件復雜性的主要根源就在于缺乏科學。

第三章 軟件設計的推動力

明確一個原則

軟件的目的是為了幫助人,為了解決問題的。
明確目標后,要針對每一條功能問自己:這個功能是怎樣幫助人去做某件事的呢?
好處是:

  • 剔除沒用的功能
  • 幫助澄清該功能的描述或實現(xiàn)方式中的模糊之處
  • 確認功能的價值
  • 安排優(yōu)先級
  • 刪減價值不大的功能

軟件設計科學的目標

  • 確保軟件能提供盡可能多的幫助
  • 確保軟件能持續(xù)提供盡可能多的幫助
  • 設計程序員盡可能容易得開發(fā)和維護軟件系統(tǒng)

第四章 未來

設計軟件時,應該做怎樣的決定?

4.1 軟件設計的方程式

D = (Vn + Vf) / (Ei + Em)
D表示這個變化的合意程度(可取程度,也就是說此項工作值不值得做下去)。
Vn表示當前價值
Vf表示未來價值
Ei表示實現(xiàn)成本
Em表示維護成本
規(guī)則:

  1. 理想的解決方案:維護成本降到零
  2. 理想的實際情況:未來收益高于維護成本
  3. 通常來說:相比降低實現(xiàn)成本,降低維護成功更加重要

4.2 設計的質量

設計的質量好壞,正比于該系統(tǒng)在未來能持續(xù)幫人他人時間的長度。
使用的時間越長,越需要慎重的設計。

4.3 不可預測的結果

未來的某些事情,是我們不知道的。
程序員犯的最常見、最嚴重的錯誤,就是在其實不知道未來的時候去預測未來。

第五章 變化

程序存在的時間越久,它的某個部分需要變化的可能性就越高。
三個誤區(qū):編寫不必要的代碼;代碼難以修改;過分追求通用。
刪除不必要的代碼,未來的需求未來再寫。
根據(jù)當前的需求,而不是未來的需求。
漸進式開發(fā)及設計

第六章 缺陷與設計

在程序中新增缺陷的可能性與代碼修改量成正比。 - 改的越多,越可能出Bug
最好的設計,就是能適應外界盡可能多的變化,而軟件自身變化盡可能的少。
永遠不要“修正”任何東西,除非真的是bug,而且有證據(jù)表面問題確實存在。 - 不要手賤
避免重復

第七章 簡潔

軟件的維護難度,反比于其簡潔程度。
要簡單到傻子都能懂。
保持一致、命名、注釋都需要注意。

第八章 復雜性

新增功能、擴展軟件用途、新增程序員、做無謂的改變、困于糟糕的技術、理解錯誤、糟糕的設計、沒有設計、重新發(fā)明輪子都會增加軟件的復雜性。

8.5 應對復雜性

  • 把某個部分變簡單
  • 不可解決的復雜性:包裝一層以屏蔽復雜性,讓其他程序員更容易使用和理解。

8.6 推倒重來

前提是:

  • 完成了準確評估,新系統(tǒng)比現(xiàn)有系統(tǒng)效率更高
  • 有足夠時間
  • 設計更好(要么是你自己變牛逼了,要么是更牛逼的人來設計)
  • 設計好階段性成果,能夠獲得積極反饋
  • 有足夠資源,不光是時間,還要考慮維護兩套系統(tǒng)

第九章 測試

你對軟件行為的了解程度,等于你真正測試它的程度

讀后感

  1. 化繁為簡、提高代碼質量
  2. 不僅要明確軟件設計中的規(guī)則,能夠應用到實際軟件開發(fā)中,還要能夠給其他人清楚講解,要能夠扛得住別人的challenge,要能夠說服別人!
  3. 在軟件設計時就要考慮維護成本,降低維護成本比降低實現(xiàn)成本更重要。
  4. 維護成本正比于系統(tǒng)的復雜程度。
  5. 避免編寫不必要的代碼,要保證代碼容易修改,避免過分通用。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評論 25 708
  • 2018年就這樣無聲無息的來了,想想2008年北京奧運會的那一幕還在昨天一樣,眨眼間已經(jīng)整整過去十年了,十年前我們...
    暢睿凡閱讀 959評論 0 0
  • 11.4 減肥日記第3天 晨重:49kg 早餐:2個雞蛋 中餐:1 兩青菜,1 兩牛肉,1兩雞肉 晚餐:2個番茄...
    草木_9601閱讀 296評論 0 0
  • 有一陣子,女兒思迪有一個好朋友叫娜娜,同班。娜娜已經(jīng)請思迪去她家玩過了,我找了一天,回請娜娜來家玩。 那天,盧中瀚...
    盧璐說閱讀 3,582評論 25 197
  • 1. PChartPChart是一個令人印象深刻的PHP庫,可以以一種可視化圖表的形式生成文本數(shù)據(jù)。數(shù)據(jù)可以展示為...
    Gundy_閱讀 1,320評論 0 2

友情鏈接更多精彩內(nèi)容