posts - 176, comments - 240, trackbacks - 0, articles - 7

              一種技術(shù)思想如果確實(shí)能夠簡(jiǎn)化編程,有效降低系統(tǒng)構(gòu)造的復(fù)雜性,那么它必然具有某種內(nèi)在的數(shù)學(xué)解釋。反之,無(wú)論一種技術(shù)機(jī)制顯得如何華麗高深,如果它沒(méi)有 清晰的數(shù)學(xué)圖象,那么就很難證明自身存在的價(jià)值。對(duì)于模型驅(qū)動(dòng)架構(gòu)(MDA),我長(zhǎng)期以來(lái)一直都持有一種批判態(tài)度。(Physical Model Driven http://canonical.javaeye.com/blog/29412 )。原因就在于“由工具自動(dòng)實(shí)現(xiàn)從平臺(tái)無(wú)關(guān)模型(PIM)向平臺(tái)相關(guān)模型(PSM)的轉(zhuǎn)換”這一圖景似乎只是想把系統(tǒng)從實(shí)現(xiàn)的泥沼中拯救出來(lái),遮蔽特定語(yǔ) 言,特定平臺(tái)中的偶然的限制條件,并沒(méi)有觸及到系統(tǒng)復(fù)雜性這一核心問(wèn)題。而所謂的可視化建模充其量不過(guò)是說(shuō)明人類超強(qiáng)的視覺(jué)模式識(shí)別能力使得我們可以迅速 識(shí)別系統(tǒng)全景圖中隱含的整體結(jié)構(gòu),更快的實(shí)現(xiàn)對(duì)系統(tǒng)結(jié)構(gòu)的理解,并沒(méi)有證明系統(tǒng)復(fù)雜性有任何本質(zhì)性的降低。不過(guò)如果我們換一個(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. 問(wèn)題復(fù)雜?線性切分是削減問(wèn)題規(guī)模(從而降低問(wèn)題復(fù)雜性)的通用手段,例如模塊(Module)。(軟件中的分析學(xué) http://canonical.javaeye.com/blog/33885

          App = M1 + M2 + M3 +    


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

          (abc,abb,ade,-> [a],   (bbb, bcd,bab,-> [b]


          3. 遞歸使用以上兩種方法,將分分合合的游戲進(jìn)行到底,推向極致。

          4. 以少控多的終極形態(tài)?如果存在,則構(gòu)成輸入與輸出之間的非線性變換(輸入中局部微小變化將導(dǎo)致輸出中大范圍明顯的變化)。

          App = F(M)


          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)造出來(lái)呢?

          App ~ M


          6. 另外一種更加開(kāi)放的觀點(diǎn)是將變換函數(shù)F看作是生成器(Generator)或者推理機(jī)。F將根據(jù)輸入的信息,結(jié)合其他知識(shí),推理生成一系列新的命題和斷 言。模型的力量源于推導(dǎo)。變換函數(shù)F本身在系統(tǒng)構(gòu)造過(guò)程中處于核心地位,M僅僅是觸發(fā)其推理過(guò)程的信息源而已。F將榨干M的最后一點(diǎn)剩余價(jià)值,所有根據(jù)M 能夠確定的事實(shí)將被自動(dòng)實(shí)現(xiàn),而大量單靠M自身的信息無(wú)法判定的命題也可以結(jié)合F內(nèi)在的知識(shí)作出判斷。生成器自身的構(gòu)造過(guò)程非常簡(jiǎn)單--只要不斷向推理系 統(tǒng)中增加新的推理規(guī)則即可。語(yǔ)言內(nèi)置的模板機(jī)制(template)及元編程技術(shù)(meta programming),或者跨越語(yǔ)言邊界的代碼生成工具都可以看作是生成器的具體實(shí)例。(關(guān)于代碼生成和DSL http://canonical.javaeye.com/blog/275015 )

          App = G<M>


          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

          G<M> ==> G = {m => m.x(a,b,c);m.y();  }


          8. 現(xiàn)實(shí)世界的不完美,就在于現(xiàn)實(shí)決不按照我們?yōu)槠渲付ǖ睦硐肼肪€前進(jìn)。具體場(chǎng)景中總是存在著大量我們無(wú)法預(yù)知的“噪聲”,它們使得任何在“過(guò)去”確立的方程 都無(wú)法在“未來(lái)”保持持久的平衡。傳統(tǒng)模型驅(qū)動(dòng)架構(gòu)的困境就在于此。我們可以選擇將模型M和生成器G不斷復(fù)雜化,容納越來(lái)越多的偶然性,直至失去對(duì)模型整 體結(jié)構(gòu)的控制力。另外一種選擇是模型在不斷膨脹,不斷提高覆蓋能力的過(guò)程中,不斷的空洞化,產(chǎn)生大量可插入(plugin)的接入點(diǎn),最終喪失模型的推理 能力,退化成為一種編碼規(guī)范。Witrix平臺(tái)中采用的是第三種選擇:模型嵌入--模型中的多余信息被不斷清洗掉,模型通過(guò)精煉化來(lái)突出自身存在的合理 性,成為更廣泛的運(yùn)行環(huán)境中的支撐骨架。(結(jié)構(gòu)的自足性 http://canonical.javaeye.com/blog/482620

          App != G0<M0>  , App != G0<M1>, App = G1<M1>


          9. 現(xiàn)在的問(wèn)題是:如何基于一個(gè)已經(jīng)被完美解決的重大問(wèn)題,來(lái)更有效率的搞定不斷出現(xiàn)但又不是重復(fù)出現(xiàn)的小問(wèn)題。現(xiàn)在我們所需要的不是沿著某個(gè)維度進(jìn)行均勻的 切分,而必須是某種有效的降維手段。如果我們可以定義一種投影算子P, 將待解決的問(wèn)題投射到已經(jīng)被解決的問(wèn)題域中,則剩下的補(bǔ)集往往可以被簡(jiǎn)化。(主從分解而不是正交分解 http://canonical.javaeye.com/blog/196826

          dA = App - P[App]  = App - G0<M0>


          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

          App = A + D + B = (A + B + C) - C + D = App0 + (-+ D) = G0<M0> + dA


          11. 模型驅(qū)動(dòng)并不意味著一個(gè)應(yīng)用只能由唯一的一個(gè)模型來(lái)驅(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

          App = Ga<Ma> + Gb<Mb> + dA


          12. 系統(tǒng)的開(kāi)發(fā)時(shí)刻t0和實(shí)施時(shí)刻t1一般是明確分離的,因此如果我們要建立一個(gè)包含開(kāi)發(fā)與實(shí)施時(shí)刻信息的模型,則這一模型必須是含時(shí)的,多階段的。關(guān)于時(shí) 間,我們所知道的最重要的事實(shí)之一是“未來(lái)是不可預(yù)知的”。在t0時(shí)刻建立的模型如果要涵蓋t1時(shí)刻的所有變化,則必須做出大量猜測(cè),而且t1時(shí)刻距離 t0時(shí)刻越遠(yuǎn),猜測(cè)的量越大,“猜測(cè)有效”這一集合的測(cè)度越小,直至為0。延遲選擇是實(shí)現(xiàn)含時(shí)系統(tǒng)控制的不二法門(mén)。
             在Witrix平臺(tái)中,所有功能特性的實(shí)現(xiàn)都包含某種元數(shù)據(jù)描述或者定制模板,因此結(jié)合配置機(jī)制以及動(dòng)態(tài)編譯技術(shù)既可實(shí)現(xiàn)多階段模型。例如對(duì)于一個(gè)在未來(lái) 才能確定的常量數(shù)組,我們可以定義一個(gè)Excel文件來(lái)允許實(shí)施人員錄入具體的值,然后通過(guò)動(dòng)態(tài)編譯技術(shù)在編譯期解析Excel文件,并完成一系列數(shù)值映 射運(yùn)算,最終將其轉(zhuǎn)化為編譯期存在的一個(gè)常量。這一過(guò)程不會(huì)引入任何額外的運(yùn)行成本,也不要求任何特定的緩存機(jī)制,最終的運(yùn)行結(jié)構(gòu)與在未來(lái)當(dāng)所有信息都在 位之后再手寫(xiě)代碼沒(méi)有任何區(qū)別。(D語(yǔ)言與tpl之編譯期動(dòng)作 http://canonical.javaeye.com/blog/57244

          App(t1) = G(t0,t1)<M(t0,t1)> + dA(t0,t1)


          13. 級(jí)列理論提供了一個(gè)演化框架,它指出孤立的模型必須被放在模型級(jí)列中被定義,被解釋。(關(guān)于級(jí)列設(shè)計(jì)理論 http://canonical.javaeye.com/blog/33824

          M[n] = G<M[n-1]> + dMn


          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ì)靈活性的追求完全沒(méi)有搞清楚信息是對(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)。組件式開(kāi)發(fā)意味著服從現(xiàn)有規(guī)律,熟練應(yīng)用,而原理性生產(chǎn)則意味著不斷創(chuàng)造新的規(guī)律。功能模 塊越多,維護(hù)的成本越高,是負(fù)擔(dān),而推理機(jī)制越多,生產(chǎn)的成本越低,是財(cái)富。只有恢復(fù)軟件的抽象性,明確把握軟件構(gòu)造過(guò)程內(nèi)在的數(shù)學(xué)原理,才能真正釋放軟 件研發(fā)的生產(chǎn)力。(從編寫(xiě)代碼到制造代碼 http://canonical.javaeye.com/blog/333167


          注解1:很多設(shè)計(jì)原則其實(shí)是在強(qiáng)調(diào)軟件由人構(gòu)造由人理解,軟件開(kāi)發(fā)本質(zhì)上是人類工程學(xué),需要關(guān)注人類的理解力與協(xié)作能力。例如共同的建模語(yǔ)言減少交互成本,基于模型減少設(shè)計(jì)與實(shí)現(xiàn)的分離,易讀的代碼比高性能的代碼更重要,做一件事只有唯一的一種方式等。

          注解2:生成系統(tǒng)的演繹遠(yuǎn)比我們想象的要深刻與復(fù)雜得多。例如生命的成長(zhǎng)可以被看作是在外界反饋下不斷調(diào)整的生成過(guò)程。

          注解3:領(lǐng)域描述是更緊致但卻未必是更本質(zhì)的表達(dá)。人類的DNA如果表達(dá)為ATGC序列完全可以拷貝到U盤(pán)中帶走,只要對(duì)DNA做少量增刪,就可以實(shí)現(xiàn)老 鼠到人類的變換(人類和老鼠都有大約30000條基因,其中約有80%的基因是“完全一樣的”,大約共享有99%的類似基因),但是很難認(rèn)為人類所有智慧 的本質(zhì)都體現(xiàn)在DNA中,DNA看起來(lái)更像是某種序列化保存形式而已。

          注解4:模型轉(zhuǎn)換這一提法似乎是在強(qiáng)調(diào)模型之間的同構(gòu)對(duì)應(yīng),轉(zhuǎn)換似乎總是可以雙向進(jìn)行的,僅僅是實(shí)現(xiàn)難度限制了反向轉(zhuǎn)換而已。但是大量有用的模型變換卻是單向的,變換過(guò)程要求不斷補(bǔ)充新的信息。

          注解5:模型驅(qū)動(dòng)在很多人看來(lái)就是數(shù)據(jù)庫(kù)模型或者對(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ǔ)充一大段文字說(shuō)明,我們對(duì)于系統(tǒng)如何運(yùn)作仍然一知半解。數(shù)學(xué)分析其實(shí)是將領(lǐng)域內(nèi)在的意義抽空,僅余下通用的形式化符號(hào)。

          主站蜘蛛池模板: 府谷县| 晋城| 灵宝市| 隆回县| 通榆县| 陆丰市| 土默特右旗| 吴川市| 延长县| 宁河县| 砀山县| 达拉特旗| 广昌县| 广州市| 新密市| 阜宁县| 长春市| 澄江县| 龙山县| 南京市| 天气| 南江县| 响水县| 剑川县| 乐平市| 新源县| 肥西县| 罗平县| 保德县| 鱼台县| 长治县| 邵东县| 织金县| 静宁县| 蒙阴县| 临洮县| 泽库县| 哈密市| 新源县| 西乡县| 麻栗坡县|