理論物理的優美在于從少量基本原理(如最小作用量原理)出發推導出整個理論大廈。而在軟件設計領域卻充斥著林林總總的"最佳實踐".
太多的規則只會意味著沒有規則。軟件設計領域的現狀說明這個領域還處于非常稚嫩的階段,應該從其他領域借鑒更多的知識。在我前面的blog中已經說明了在
軟件中的一些具體的分析技術。但如何有效的應用這些分析技術,我們還需要一些指導性的理論框架。如果把軟件設計放在更加廣泛的系統工程的背景下,一個合適
的支配性原理應該是最小復雜性原理。即在軟件分析過程中我們所作的一切,無論是面向對象分析,基于工作流的分析等等,其目的都是盡量降低系統構建的復雜
性。只要能夠有效降低系統構建的復雜性,那所采用的方法和所建立的模型就是好的。復雜性是唯一的度量,而不是是否符合某人的觀點,是否采用流行的技術等
(當然,采用流行技術往往意味著降低了和其它系統交互的復雜性)。
李小龍說:簡單是美。但是否最簡單的就是最好的?科學界對此卻有著否定的結論。關于復雜性的一個很深刻的基本事實是,復雜性是分級的,不同復雜性層次的事
物有著本質的差異,不能期待一個較低復雜性的方法能夠解決一個更高復雜性層次上的問題。所以Einstein說:make everything as
simple as possible, but not
simpler。復雜性級列的存在意味著,隨著我們獲取到更多的信息量或者因為系統自身的發展,當我們所建立的系統的模型沿著復雜性級列演化的時候,我們
所提出的解決問題的方案也必須作相應的演化。即我們提供的不是一些固定的解決方案(solution),
而必須是一個完整的策略(strategy)。這樣我們就不是孤立的看待一個問題, 而是要看到它的過去,現在和未來。
在作分析的時候,我們都知道"從一般到特殊,從特殊到一般",但如何科學的,有步驟的去做呢? 我從等離子體物理的BBGKY
Hierarchy中學到了一個基本的分析框架: 級列理論.這個理論首先定義了一個最普適的模型:氣體由N個完全相同的原子組成,
其動力學由N個互相耦合的Newton力學方程來描述。理論的第二步是從最極端的簡化開始,假設所有的原子之間不存在相互作用,即假定原子之間是相互獨立
的。則得到Vlasov方程。理論的第三步考慮系統的復雜性逐漸增加,當氣體密度較高,必須考慮分子之間兩兩碰撞的時候,得到Boltzman方程。當需
要考慮更高階的相互作用的時候,我們得到關聯動理學方程,如此繼續下去建立一個無窮級列。
抽象一些地說,該理論包含如下內容:
. 建立能夠描述所有情況的最廣泛的模型M0, 該模型定義系統的邊界
. 建立一個包含最少假設的最簡單的模型Mn,該模型作為求解的基礎和基本的參照。
. 建立一個從Mn到M0的復雜性逐漸增加的模型級列,確保在每一個復雜性的層次上,都存在著對系統有效的建模,而且在求解高階問題的時候,可以參考較低階問題的解。
如何從這種無窮級列中做出選擇,必須根據具體應用情景而定,Vapnik在其統計學習理論中詳細描述了這種求解策略:
綜合代價 = 訓練數據與模型預測之間的偏差 + 模型自身的復雜性
學習 = minimize[綜合代價]
即在能夠解決問題的方案中選擇最簡單的一個。
建立級列理論,首先需要建立最廣泛的模型。在量子力學中,確立了如下基本概念:
1. 確定性的態。
2. 所有態構成完備的態空間。
3. 系綜(即態的集合)的動力學。
首先,狀態的確定性非常重要。即使在量子力學中,量子態存在幾率詮釋,態函數本身在數學上仍然是確定性的,即在任一時刻,任一地點存在唯一的值。如果我們
的討論沒有一個確定性的基礎,那所有的推演都將變得極為困難(模糊數學目前提供的幫助很少)。而且確定狀態本身就是一個極為重要的簡化過程。因為一般我們
可以建立Markov模型,使得系統的演化只與系統當前的狀態有關,而與系統的歷史狀態無關,因此大大減少系統模型的參數。
其次,狀態演化的結果必須仍然處在態空間中,否則我們在該空間中建立的理論就存在著"盲點",存在著失效的可能。
第三,我們研究的不是單個狀態的演化,而是綜合考慮相鄰的狀態。
在軟件世界,理論物理的這些真知灼見依然有效,只是在所有的概念前加上了"有限"這個修飾語。有限狀態機(Finite State
Machine)正是理論計算機科學研究的基本模型。所有的計算機都可以看作是有限狀態的,因為所有的內存和硬盤能夠表示的狀態數是有限的。目前計算機科
學中幾乎所有重要的理論成果都和有限自動機理論相關。在軟件編制的過程中,我們第一步所要做的也是確定系統的狀態。與物理系統所不同的是,我們認為物理系
統的狀態及其演化規律是客觀存在的,而軟件系統中的規則是由開發者確立的,我們必須盡一切可能使得系統的狀態能夠被確定下來。例如,我們編制getXX
()和toString()等函數來暴露系統的狀態,以確保系統狀態的可觀測性;使用assert斷言來確保函數執行時的狀態;盡量減少函數的副作用來避
免依賴函數調用歷史。軟件世界中態空間不完備的例子最著名的就是Y2K問題。所以很多人說,軟件中最大的bug就是地址空間不足,因為這是任何技術手段都
無法解決的問題。