模型驅(qū)動(dòng)的數(shù)學(xué)原理
Posted on 2011-02-07 02:56 canonical 閱讀(1545) 評(píng)論(0) 編輯 收藏 所屬分類: 設(shè)計(jì)理論
一種技術(shù)思想如果確實(shí)能夠簡化編程,有效降低系統(tǒng)構(gòu)造的復(fù)雜性,那么它必然具有某種內(nèi)在的數(shù)學(xué)解釋。反之,無論一種技術(shù)機(jī)制顯得如何華麗高深,如果它沒有
清晰的數(shù)學(xué)圖象,那么就很難證明自身存在的價(jià)值。對(duì)于模型驅(qū)動(dòng)架構(gòu)(MDA),我長期以來一直都持有一種批判態(tài)度。(Physical Model
Driven http://canonical.javaeye.com/blog/29412
)。原因就在于“由工具自動(dòng)實(shí)現(xiàn)從平臺(tái)無關(guān)模型(PIM)向平臺(tái)相關(guān)模型(PSM)的轉(zhuǎn)換”這一圖景似乎只是想把系統(tǒng)從實(shí)現(xiàn)的泥沼中拯救出來,遮蔽特定語
言,特定平臺(tái)中的偶然的限制條件,并沒有觸及到系統(tǒng)復(fù)雜性這一核心問題。而所謂的可視化建模充其量不過是說明人類超強(qiáng)的視覺模式識(shí)別能力使得我們可以迅速
識(shí)別系統(tǒng)全景圖中隱含的整體結(jié)構(gòu),更快的實(shí)現(xiàn)對(duì)系統(tǒng)結(jié)構(gòu)的理解,并沒有證明系統(tǒng)復(fù)雜性有任何本質(zhì)性的降低。不過如果我們換一個(gè)視角,
不把模型局限為某種可視化的結(jié)構(gòu)圖,而將它定義為某種高度濃縮的領(lǐng)域描述,
則模型驅(qū)動(dòng)基本上等價(jià)于根據(jù)領(lǐng)域描述自動(dòng)推導(dǎo)得到最終的應(yīng)用程序。沿著這一思路,Witrix平臺(tái)中的很多設(shè)計(jì)實(shí)際上可以被解釋為模型定義,模型推導(dǎo)以及
模型嵌入等方面的探索。這些具體技術(shù)的背后需要的是比一般MDA思想更加精致的設(shè)計(jì)原理作為支撐。我們可以進(jìn)行如下抽象分析。(Witrix架構(gòu)分析 http://canonical.javaeye.com/blog/126467
)
1. 問題復(fù)雜?線性切分是削減問題規(guī)模(從而降低問題復(fù)雜性)的通用手段,例如模塊(Module)。(軟件中的分析學(xué) http://canonical.javaeye.com/blog/33885
)

2. 分塊過多?同態(tài)映射是系統(tǒng)約化的一般化策略,例如多態(tài)(polymorphism)。(同構(gòu)與同態(tài):認(rèn)識(shí)同一性 http://canonical.javaeye.com/admin/blogs/340704 )


3. 遞歸使用以上兩種方法,將分分合合的游戲進(jìn)行到底,推向極致。
4. 以少控多的終極形態(tài)?如果存在,則構(gòu)成輸入與輸出之間的非線性變換(輸入中局部微小變化將導(dǎo)致輸出中大范圍明顯的變化)。
5. 變換函數(shù)F可以被詮釋為解釋器(Interpreter)或者翻譯機(jī),例如工作流引擎將工作流描述信息翻譯為一步步的具體操作,工作流描述可以看作是由底 層引擎支撐的,在更高的抽象層面上運(yùn)行的領(lǐng)域模型。但是在這種觀點(diǎn)下,變換函數(shù)F似乎是針對(duì)某種特定模型構(gòu)造的,引擎內(nèi)部信息傳導(dǎo)的途徑是確定的,關(guān)注的 重點(diǎn)始終在模型上,那么解釋器自身應(yīng)該如何被構(gòu)造出來呢?
6. 另外一種更加開放的觀點(diǎn)是將變換函數(shù)F看作是生成器(Generator)或者推理機(jī)。F將根據(jù)輸入的信息,結(jié)合其他知識(shí),推理生成一系列新的命題和斷 言。模型的力量源于推導(dǎo)。變換函數(shù)F本身在系統(tǒng)構(gòu)造過程中處于核心地位,M僅僅是觸發(fā)其推理過程的信息源而已。F將榨干M的最后一點(diǎn)剩余價(jià)值,所有根據(jù)M 能夠確定的事實(shí)將被自動(dòng)實(shí)現(xiàn),而大量單靠M自身的信息無法判定的命題也可以結(jié)合F內(nèi)在的知識(shí)作出判斷。生成器自身的構(gòu)造過程非常簡單--只要不斷向推理系 統(tǒng)中增加新的推理規(guī)則即可。語言內(nèi)置的模板機(jī)制(template)及元編程技術(shù)(meta programming),或者跨越語言邊界的代碼生成工具都可以看作是生成器的具體實(shí)例。(關(guān)于代碼生成和DSL http://canonical.javaeye.com/blog/275015 )
7. 生成器G之所以可以被獨(dú)立實(shí)現(xiàn),是因?yàn)槲覀兛梢詫?shí)現(xiàn)相對(duì)知識(shí)與絕對(duì)知識(shí)的分離, 這也正是面向?qū)ο蠹夹g(shù)的本質(zhì)所在。(面向?qū)ο笾问较到y(tǒng) http://canonical.javaeye.com/blog/37064 )

8. 現(xiàn)實(shí)世界的不完美,就在于現(xiàn)實(shí)決不按照我們?yōu)槠渲付ǖ睦硐肼肪€前進(jìn)。具體場景中總是存在著大量我們無法預(yù)知的“噪聲”,它們使得任何在“過去”確立的方程 都無法在“未來”保持持久的平衡。傳統(tǒng)模型驅(qū)動(dòng)架構(gòu)的困境就在于此。我們可以選擇將模型M和生成器G不斷復(fù)雜化,容納越來越多的偶然性,直至失去對(duì)模型整 體結(jié)構(gòu)的控制力。另外一種選擇是模型在不斷膨脹,不斷提高覆蓋能力的過程中,不斷的空洞化,產(chǎn)生大量可插入(plugin)的接入點(diǎn),最終喪失模型的推理 能力,退化成為一種編碼規(guī)范。Witrix平臺(tái)中采用的是第三種選擇:模型嵌入--模型中的多余信息被不斷清洗掉,模型通過精煉化來突出自身存在的合理 性,成為更廣泛的運(yùn)行環(huán)境中的支撐骨架。(結(jié)構(gòu)的自足性 http://canonical.javaeye.com/blog/482620 )
9. 現(xiàn)在的問題是:如何基于一個(gè)已經(jīng)被完美解決的重大問題,來更有效率的搞定不斷出現(xiàn)但又不是重復(fù)出現(xiàn)的小問題。現(xiàn)在我們所需要的不是沿著某個(gè)維度進(jìn)行均勻的 切分,而必須是某種有效的降維手段。如果我們可以定義一種投影算子P, 將待解決的問題投射到已經(jīng)被解決的問題域中,則剩下的補(bǔ)集往往可以被簡化。(主從分解而不是正交分解 http://canonical.javaeye.com/blog/196826 )
10. 要實(shí)現(xiàn)以上微擾分析策略,前提條件是可以定義逆元,并且需要定義一種精細(xì)的粘結(jié)操作,可以將分散的擾動(dòng)量極為精確的應(yīng)用到基礎(chǔ)系統(tǒng)的各處。Witrix平臺(tái)的具體實(shí)現(xiàn)類似于某種AOP(面向切面編程)技術(shù)。(逆元:不存在的真實(shí)存在 http://canonical.javaeye.com/blog/325051 )
11. 模型驅(qū)動(dòng)并不意味著一個(gè)應(yīng)用只能由唯一的一個(gè)模型來驅(qū)動(dòng),但是如果引入多個(gè)不同形式的模型,則必須為如下推理提供具體的技術(shù)路徑:
A. 將多個(gè)模型變換到共同的描述域
B. 實(shí)現(xiàn)多個(gè)模型的加和
C. 處理模型之間的沖突并填補(bǔ)模型之間的空白
在Witrix平臺(tái)中模型嵌入/組合主要依賴于文本化及編譯期運(yùn)行等機(jī)制。(文本化 http://canonical.javaeye.com/blog/309395
)
12.
系統(tǒng)的開發(fā)時(shí)刻t0和實(shí)施時(shí)刻t1一般是明確分離的,因此如果我們要建立一個(gè)包含開發(fā)與實(shí)施時(shí)刻信息的模型,則這一模型必須是含時(shí)的,多階段的。關(guān)于時(shí)
間,我們所知道的最重要的事實(shí)之一是“未來是不可預(yù)知的”。在t0時(shí)刻建立的模型如果要涵蓋t1時(shí)刻的所有變化,則必須做出大量猜測,而且t1時(shí)刻距離
t0時(shí)刻越遠(yuǎn),猜測的量越大,“猜測有效”這一集合的測度越小,直至為0。延遲選擇是實(shí)現(xiàn)含時(shí)系統(tǒng)控制的不二法門。
在Witrix平臺(tái)中,所有功能特性的實(shí)現(xiàn)都包含某種元數(shù)據(jù)描述或者定制模板,因此結(jié)合配置機(jī)制以及動(dòng)態(tài)編譯技術(shù)既可實(shí)現(xiàn)多階段模型。例如對(duì)于一個(gè)在未來
才能確定的常量數(shù)組,我們可以定義一個(gè)Excel文件來允許實(shí)施人員錄入具體的值,然后通過動(dòng)態(tài)編譯技術(shù)在編譯期解析Excel文件,并完成一系列數(shù)值映
射運(yùn)算,最終將其轉(zhuǎn)化為編譯期存在的一個(gè)常量。這一過程不會(huì)引入任何額外的運(yùn)行成本,也不要求任何特定的緩存機(jī)制,最終的運(yùn)行結(jié)構(gòu)與在未來當(dāng)所有信息都在
位之后再手寫代碼沒有任何區(qū)別。(D語言與tpl之編譯期動(dòng)作 http://canonical.javaeye.com/blog/57244
)
13. 級(jí)列理論提供了一個(gè)演化框架,它指出孤立的模型必須被放在模型級(jí)列中被定義,被解釋。(關(guān)于級(jí)列設(shè)計(jì)理論 http://canonical.javaeye.com/blog/33824 )
14.
推理的鏈條會(huì)因?yàn)槿魏尉植糠蠢某霈F(xiàn)而中斷。在任意時(shí)空點(diǎn)上,我們能夠斷言的事實(shí)有哪些?信息越少,我們能夠確定的事實(shí)越少,能夠做出的推論也就越少。現(xiàn)
在流行的很多設(shè)計(jì)實(shí)質(zhì)上是在破壞系統(tǒng)的對(duì)稱性,破壞系統(tǒng)大范圍的結(jié)構(gòu)。比如明明ORM容器已經(jīng)實(shí)現(xiàn)所有數(shù)據(jù)對(duì)象的統(tǒng)一管理,非要將其拆分為每個(gè)業(yè)務(wù)表一個(gè)
的DAO接口。很多對(duì)靈活性的追求完全沒有搞清楚信息是對(duì)不確定性的消除,而不確定性的減少意味著限制的增加,約束的增加。(From Local To
Global http://canonical.javaeye.com/blog/42874
)
組件/構(gòu)件技術(shù)的宣言是生產(chǎn)即組裝,但是組裝有成本,有后遺癥(例如需要額外的膠水或者螺釘)。軟件的本質(zhì)并不是物質(zhì),而是信息,而信息的本質(zhì)是抽象的規(guī)
律。在抽象世界中最有效的生產(chǎn)方式是抽象的運(yùn)算,運(yùn)算即生產(chǎn)。組件式開發(fā)意味著服從現(xiàn)有規(guī)律,熟練應(yīng)用,而原理性生產(chǎn)則意味著不斷創(chuàng)造新的規(guī)律。功能模
塊越多,維護(hù)的成本越高,是負(fù)擔(dān),而推理機(jī)制越多,生產(chǎn)的成本越低,是財(cái)富。只有恢復(fù)軟件的抽象性,明確把握軟件構(gòu)造過程內(nèi)在的數(shù)學(xué)原理,才能真正釋放軟
件研發(fā)的生產(chǎn)力。(從編寫代碼到制造代碼 http://canonical.javaeye.com/blog/333167
)
注解1:很多設(shè)計(jì)原則其實(shí)是在強(qiáng)調(diào)軟件由人構(gòu)造由人理解,軟件開發(fā)本質(zhì)上是人類工程學(xué),需要關(guān)注人類的理解力與協(xié)作能力。例如共同的建模語言減少交互成本,基于模型減少設(shè)計(jì)與實(shí)現(xiàn)的分離,易讀的代碼比高性能的代碼更重要,做一件事只有唯一的一種方式等。
注解2:生成系統(tǒng)的演繹遠(yuǎn)比我們想象的要深刻與復(fù)雜得多。例如生命的成長可以被看作是在外界反饋下不斷調(diào)整的生成過程。
注解3:領(lǐng)域描述是更緊致但卻未必是更本質(zhì)的表達(dá)。人類的DNA如果表達(dá)為ATGC序列完全可以拷貝到U盤中帶走,只要對(duì)DNA做少量增刪,就可以實(shí)現(xiàn)老
鼠到人類的變換(人類和老鼠都有大約30000條基因,其中約有80%的基因是“完全一樣的”,大約共享有99%的類似基因),但是很難認(rèn)為人類所有智慧
的本質(zhì)都體現(xiàn)在DNA中,DNA看起來更像是某種序列化保存形式而已。
注解4:模型轉(zhuǎn)換這一提法似乎是在強(qiáng)調(diào)模型之間的同構(gòu)對(duì)應(yīng),轉(zhuǎn)換似乎總是可以雙向進(jìn)行的,僅僅是實(shí)現(xiàn)難度限制了反向轉(zhuǎn)換而已。但是大量有用的模型變換卻是單向的,變換過程要求不斷補(bǔ)充新的信息。
注解5:模型驅(qū)動(dòng)在很多人看來就是數(shù)據(jù)庫模型或者對(duì)象模型驅(qū)動(dòng)系統(tǒng)界面運(yùn)行,但實(shí)際上模型可以意指任意抽象知識(shí)。雖然在目前業(yè)內(nèi)廣泛流行的對(duì)象范式下,所
有知識(shí)都可以表達(dá)為對(duì)象之間的關(guān)聯(lián),但是對(duì)象關(guān)系(名詞之間的關(guān)聯(lián)關(guān)系)對(duì)運(yùn)算結(jié)構(gòu)的揭示是遠(yuǎn)遠(yuǎn)不夠充分的。很多時(shí)候所謂的領(lǐng)域模型僅僅是表明概念之間具
有相關(guān)性,但是如果不補(bǔ)充一大段文字說明,我們對(duì)于系統(tǒng)如何運(yùn)作仍然一知半解。數(shù)學(xué)分析其實(shí)是將領(lǐng)域內(nèi)在的意義抽空,僅余下通用的形式化符號(hào)。