管理軟體的複雜度有哪些方式,都適用於什麼情況?

由此問題想到。

http://www.zhihu.com/question/20275578


管理、或者說降低軟體的整體複雜度,推薦兩本書:

  • The Art of UNIX Programming
  • The Mythical Man-month, 人月神話

這兩本書對如何降低軟體的整體複雜度都給出了系統的說明。要強調的是,軟體的複雜度是非常困難的問題,這兩本書是我知道的論述軟體複雜度最系統的書,但是其中的主旨也不是一兩句就能說清楚,還是詳細全書閱讀比較好。

現在僅僅舉一兩個例子:

  • 第一是要注意數據結構的簡潔。開發者的精力是有限的。在精力不足的情況下,與其保證代碼的簡潔,不如保證數據結構的簡潔。這就是說,哪怕你的代碼再亂,對數據結構的使用一定要從概念上是清晰的。你的文檔哪怕對代碼的描述是零,對數據結構的描述一定要詳細。這樣,即使你的代碼很亂,後來人也能根據數據結構的定義判斷哪裡是好代碼、哪裡是可以工作的亂代碼、哪裡是錯誤的代碼。好的 code base 不是完美的,但一定是有簡單的標準來判斷何處是完美的。而這個標準就是對數據結構的定義。
  • 上一點在《The Art of UNIX Programming》中一再強調。而在《The Mythical Man-month》里也有呼應。那就是要不惜代價強調 conceptual integrity。能定義一個概念的地方就不維護兩個概念。
  • 第三,只有在真正遇到性能問題的時候才開始優化。能即時計算出來的數據絕不放到主要數據結構中。能使用 brutal force 的時候盡量使用。盡量避免設計 cache。
  • 此外還有很多輔助的原則。比如說,在能使用數學的地方,一定要註明數學原理。模塊之間的介面盡量採用基於文本的文件或者協議。

補充:我又看了一下問題補充中提到的那個問題。就此說明一下。

  • 源代碼級別的複雜度管理很重要。只是不能任何複雜度都依賴源代碼。最重要的源代碼級別以上的複雜度管理就是強制的模塊分割。包括:
  1. 沒有編譯依賴的庫(這樣即使沒有語言級別的訪問許可權,也可以形成封裝)。

  2. 進程隔離。
  3. 虛擬機隔離(內核和應用態,底層語言和高層語言,例如 C 和 Lua)。
  • 最複雜的單模塊軟體應屬 GUI。所以面向對象仍然是實現 WIMP 最重要的技術。


最本質的原則:Divide and Conquer

根據此原則得出的方法論:模塊劃分


推薦閱讀:

太陽能電池模擬軟體AMPS-1D?
mac下有好用的畫結構圖的軟體?
帶你逛西雅圖活電腦博物館(七)
如何給對象解釋什麼是「面向對象」?
筆記本換固態硬碟能否保留原有系統?

TAG:軟體 | 軟體開發 | 軟體工程 | 面向對象編程 | 並行編程 | 複雜度 |