模型在軟件開發(fā)中的角色
當(dāng)今信息系統(tǒng)的開發(fā)越來(lái)越復(fù)雜,而且所涉及到的領(lǐng)域也越來(lái)越廣,開發(fā)者必須掌握許多不同的技術(shù),包括流行的面向?qū)ο蠹夹g(shù),XML,腳本語(yǔ)言,接口定義語(yǔ)言,過程定義語(yǔ)言,數(shù)據(jù)庫(kù)定義和查詢等等。要把來(lái)自于問題領(lǐng)域的需求轉(zhuǎn)換成解決方案需要對(duì)許多架構(gòu)和協(xié)議的深刻理解。再者,最終用戶常常期望結(jié)果是高運(yùn)行效率的,易用的,易擴(kuò)展的,而且對(duì)于不可知且不可靠的網(wǎng)絡(luò)連接是安全的,這可是件苦差事。
在軟件開發(fā)之外的一些領(lǐng)域,例如電子產(chǎn)品(電視機(jī),HiFi音響,照相機(jī))等等,我們可以看到低成本和高可靠性的情況。在過去的幾十年里,制造行業(yè)一直采用這樣的流程:通過一連串復(fù)雜的步驟來(lái)制造一臺(tái)電視機(jī)或汽車,其中有很多步驟是完全自動(dòng)化的。
我們會(huì)喜歡使用相同的原理來(lái)構(gòu)筑軟件,不同的是我們沒有開發(fā)出能夠允許有效分離軟件中關(guān)注點(diǎn)的軟件說明語(yǔ)言。盡管我們使用不同的程序開發(fā)語(yǔ)言來(lái)書寫應(yīng)用邏輯,來(lái)完成不同的開發(fā)任務(wù)。例如:使用XML在應(yīng)用組件中傳遞數(shù)據(jù),使用SQL存取數(shù)據(jù),使用WSDL來(lái)說明面向Web應(yīng)用的組件的接口等等,但是它們中沒有一個(gè)直接針對(duì)最終用戶所面對(duì)的業(yè)務(wù)問題。
本文將要介紹的軟件構(gòu)筑技術(shù)是domain-specific languages(領(lǐng)域定義語(yǔ)言,簡(jiǎn)稱DSL)的開發(fā)。DSL被設(shè)計(jì)為直接面向它所要解決的問題領(lǐng)域。在某種程度上,它能夠代替編碼,數(shù)據(jù)交換,配置等工作,我們常把這類語(yǔ)言稱為建模語(yǔ)言。我們使用這些語(yǔ)言來(lái)針對(duì)問題領(lǐng)域進(jìn)行建模。
模型里的每個(gè)元素都映射到現(xiàn)實(shí)領(lǐng)域中的一個(gè)概念,很多年以來(lái),模型對(duì)于定義IT系統(tǒng)如何來(lái)保存數(shù)據(jù)一直是很重要的,現(xiàn)在,模型的應(yīng)用更廣泛,例如對(duì)業(yè)務(wù)過程建模,服務(wù)的部署,數(shù)據(jù)中心等等。模型受歡迎是因?yàn)樗軌蚝芎玫乇硎鰡栴}從而避免陷入技術(shù)細(xì)節(jié)中。當(dāng)技術(shù)變得越來(lái)越復(fù)雜的時(shí)候,模型是提高生產(chǎn)力的必須手段。模型的另一個(gè)好處是可以讓程序員和問題領(lǐng)域的專家使用同樣的表述方法,這有助于團(tuán)隊(duì)成員間的溝通。我們也可以把使用模型看作彌合技術(shù)和業(yè)務(wù)之間縫隙的方法。 來(lái)源:www.examda.com
在過去的幾年里,新的建模方法開始合并,特別是在MDA的旗幟和能夠提高軟件開發(fā)生產(chǎn)力及軟件可移植性的承諾下,OMG對(duì)UML和一些相關(guān)技術(shù)進(jìn)行了大力的推廣。但是我們必須看到80年代的CASE工具的結(jié)果,顯然,CASE已經(jīng)無(wú)法兌現(xiàn)當(dāng)初的諾言,對(duì)于MDA我們?nèi)匀皇謶岩?,除非能夠證明它對(duì)于我們所面對(duì)的問題找到了新的道路,不再重蹈CASE工具的覆轍。在我看來(lái)只有模型,模式,框架等技術(shù)結(jié)合在一起才能夠避免象CASE工具那樣的失敗。
Domain-Specific Languages
如果我們想通過運(yùn)用模型來(lái)使領(lǐng)域?qū)<夷芨菀椎亟鉀Q問題,那么模型就必須能夠清晰地描述問題領(lǐng)域。對(duì)于建模語(yǔ)言,就是指用來(lái)針對(duì)問題領(lǐng)域建模的標(biāo)記和關(guān)系的定義。典型的,但不是必須的,建模語(yǔ)言可以是一組圖釋,一組由線條連接起來(lái)的節(jié)點(diǎn),也可以是流程圖或者實(shí)體-關(guān)系圖。
模型通常被標(biāo)記和文本元素所修飾,開發(fā)者需要細(xì)心地審視,理解掩蓋在這些修飾下的模型真正要表達(dá)的信息。所以要能夠進(jìn)行建模就必須明白每個(gè)元素相關(guān)細(xì)節(jié)。這意味著一旦成為具有專門的建模技能的人才就會(huì)帶來(lái)豐厚的回報(bào)。
有些人可能會(huì)認(rèn)為正確的觀點(diǎn)是應(yīng)該定義一個(gè)通用的建模語(yǔ)言,使用它來(lái)對(duì)所有的問題領(lǐng)域建模,同時(shí)要教會(huì)那些領(lǐng)域?qū)<覀儗W(xué)會(huì)使用這個(gè)通用建模語(yǔ)言。從UML得到的經(jīng)驗(yàn)來(lái)看,這樣作并不成功,后面我們將會(huì)討論UML。
現(xiàn)在,我們把那些被設(shè)計(jì)成用來(lái)對(duì)特定問題領(lǐng)域建模的建模語(yǔ)言稱作domain-specific languages(領(lǐng)域建模語(yǔ)言)。領(lǐng)域建模語(yǔ)言可以針對(duì)很多問題領(lǐng)域創(chuàng)建,例如:通訊,銀行業(yè)務(wù),空間勘測(cè)等等。
無(wú)論如何,設(shè)計(jì)和使用領(lǐng)域建模語(yǔ)言只是模型被用作輔助軟件開發(fā)的很小一部分。模型可以被分析和驗(yàn)證,轉(zhuǎn)換,通過很多步驟,被部署并執(zhí)行軟件。這個(gè)過程包括開發(fā),分析,驗(yàn)證模型,在很多不同領(lǐng)域中,通過工具將模型進(jìn)行轉(zhuǎn)換,直到部署系統(tǒng)完成。
在軟件系統(tǒng)的構(gòu)筑中,模型的一個(gè)對(duì)應(yīng)物是框架,框架是適用于整個(gè)領(lǐng)域的代碼實(shí)現(xiàn)框架,并且給多個(gè)系統(tǒng)間在相同領(lǐng)域的不同元素提供了擴(kuò)展點(diǎn)。有很多框架的例子:從GUI到ERP的基礎(chǔ)結(jié)構(gòu)和算法。在所有的情況下,模型的角色是使用框架,給特定的應(yīng)用定義擴(kuò)展點(diǎn)。在這個(gè)層面上,我們可以認(rèn)為建模語(yǔ)言是定義擴(kuò)展點(diǎn),使其契合到框架上,來(lái)適應(yīng)用戶對(duì)問題的理解的一種方法。
另一個(gè)重要的對(duì)應(yīng)物是模式,一個(gè)模式本質(zhì)上是一個(gè)有很多小孔的模型,和如何將這些小孔用其他模型來(lái)填充的規(guī)則。有一種高效使用模式的方法:使用一個(gè)由許多小的模型組成的大的模型,或一個(gè)由其他類型的模型組裝起來(lái)的模型。
在軟件開發(fā)過程中運(yùn)用模型,模式,框架,代碼的至關(guān)重要的一點(diǎn)就是最終的結(jié)果必須是“敏捷“的。在代碼和模型間必須不存在任何不可逆性和不連續(xù)性,在整個(gè)開發(fā)過程中必須能夠?qū)梢姷母鞣N因素作出快速的反映,變化后重新產(chǎn)生最終結(jié)果。CASE的錯(cuò)誤在于沒有針對(duì)問題領(lǐng)域使用框架,而是使用了龐大的,不可逆的代碼生成過程,這樣使得開發(fā)者無(wú)法修改生成的代碼,從而使整個(gè)方法完全失效。只有將模型,模式,框架結(jié)合在一起,并使它們無(wú)縫的整合進(jìn)一個(gè)敏捷的開發(fā)過程中,才可以避免出現(xiàn)CASE方法那樣的缺陷。
運(yùn)用模型,模式,框架的過程從整體上看起來(lái)制造業(yè)的很相似,我們可以把軟件開發(fā)看成一個(gè)價(jià)值鏈的概念:從供應(yīng)商那里取得輸入,利用自己的專業(yè)經(jīng)驗(yàn)為這些輸入增加價(jià)值,到鏈條的最后產(chǎn)生輸出。迄今為止,軟件的構(gòu)造過程很少被看作這樣的一個(gè)鏈條,根本原因在于表述軟件的方式的限制,當(dāng)代碼成為表述軟件的惟一的手段時(shí),惟一和產(chǎn)品密切相關(guān)的人就是程序員。領(lǐng)域定義模型、模式和框架的開發(fā)應(yīng)被納入軟件價(jià)值鏈,也就是產(chǎn)品線中。
在微軟,我們堅(jiān)信建模將對(duì)軟件開發(fā)越來(lái)越重要,我們將在即將發(fā)布的Visual Studio中整合建模功能,我們相信認(rèn)真地根據(jù)目標(biāo)客戶的技能來(lái)設(shè)計(jì)領(lǐng)域定義語(yǔ)言的本質(zhì)是:我們要給客戶直觀的,敏捷,高效,無(wú)縫的建模體驗(yàn)。我們的第一個(gè)建模產(chǎn)品的目標(biāo)是能夠立即為我們的客戶提供高收益。在最近的微軟開發(fā)者大會(huì)上,我們展示了幫助開發(fā)者進(jìn)行SOA的開發(fā)和部署的建模工具,關(guān)于這次展示的細(xì)節(jié),可以在http://msdn.microsoft.com/vstudio/enterprise 找到。
隨著時(shí)間的推移,我們將繼續(xù)擴(kuò)充我們的建模工具來(lái)面向更多的領(lǐng)域,例如:代碼可視化、業(yè)務(wù)建模,還會(huì)把支持更多領(lǐng)域的工具整合進(jìn)Visual Studio。更長(zhǎng)遠(yuǎn)的計(jì)劃是通過多個(gè)產(chǎn)品線,包括模型,框架,模式,工具,來(lái)整合完整的軟件開發(fā)過程。
當(dāng)今信息系統(tǒng)的開發(fā)越來(lái)越復(fù)雜,而且所涉及到的領(lǐng)域也越來(lái)越廣,開發(fā)者必須掌握許多不同的技術(shù),包括流行的面向?qū)ο蠹夹g(shù),XML,腳本語(yǔ)言,接口定義語(yǔ)言,過程定義語(yǔ)言,數(shù)據(jù)庫(kù)定義和查詢等等。要把來(lái)自于問題領(lǐng)域的需求轉(zhuǎn)換成解決方案需要對(duì)許多架構(gòu)和協(xié)議的深刻理解。再者,最終用戶常常期望結(jié)果是高運(yùn)行效率的,易用的,易擴(kuò)展的,而且對(duì)于不可知且不可靠的網(wǎng)絡(luò)連接是安全的,這可是件苦差事。
在軟件開發(fā)之外的一些領(lǐng)域,例如電子產(chǎn)品(電視機(jī),HiFi音響,照相機(jī))等等,我們可以看到低成本和高可靠性的情況。在過去的幾十年里,制造行業(yè)一直采用這樣的流程:通過一連串復(fù)雜的步驟來(lái)制造一臺(tái)電視機(jī)或汽車,其中有很多步驟是完全自動(dòng)化的。
我們會(huì)喜歡使用相同的原理來(lái)構(gòu)筑軟件,不同的是我們沒有開發(fā)出能夠允許有效分離軟件中關(guān)注點(diǎn)的軟件說明語(yǔ)言。盡管我們使用不同的程序開發(fā)語(yǔ)言來(lái)書寫應(yīng)用邏輯,來(lái)完成不同的開發(fā)任務(wù)。例如:使用XML在應(yīng)用組件中傳遞數(shù)據(jù),使用SQL存取數(shù)據(jù),使用WSDL來(lái)說明面向Web應(yīng)用的組件的接口等等,但是它們中沒有一個(gè)直接針對(duì)最終用戶所面對(duì)的業(yè)務(wù)問題。
本文將要介紹的軟件構(gòu)筑技術(shù)是domain-specific languages(領(lǐng)域定義語(yǔ)言,簡(jiǎn)稱DSL)的開發(fā)。DSL被設(shè)計(jì)為直接面向它所要解決的問題領(lǐng)域。在某種程度上,它能夠代替編碼,數(shù)據(jù)交換,配置等工作,我們常把這類語(yǔ)言稱為建模語(yǔ)言。我們使用這些語(yǔ)言來(lái)針對(duì)問題領(lǐng)域進(jìn)行建模。
模型里的每個(gè)元素都映射到現(xiàn)實(shí)領(lǐng)域中的一個(gè)概念,很多年以來(lái),模型對(duì)于定義IT系統(tǒng)如何來(lái)保存數(shù)據(jù)一直是很重要的,現(xiàn)在,模型的應(yīng)用更廣泛,例如對(duì)業(yè)務(wù)過程建模,服務(wù)的部署,數(shù)據(jù)中心等等。模型受歡迎是因?yàn)樗軌蚝芎玫乇硎鰡栴}從而避免陷入技術(shù)細(xì)節(jié)中。當(dāng)技術(shù)變得越來(lái)越復(fù)雜的時(shí)候,模型是提高生產(chǎn)力的必須手段。模型的另一個(gè)好處是可以讓程序員和問題領(lǐng)域的專家使用同樣的表述方法,這有助于團(tuán)隊(duì)成員間的溝通。我們也可以把使用模型看作彌合技術(shù)和業(yè)務(wù)之間縫隙的方法。 來(lái)源:www.examda.com
在過去的幾年里,新的建模方法開始合并,特別是在MDA的旗幟和能夠提高軟件開發(fā)生產(chǎn)力及軟件可移植性的承諾下,OMG對(duì)UML和一些相關(guān)技術(shù)進(jìn)行了大力的推廣。但是我們必須看到80年代的CASE工具的結(jié)果,顯然,CASE已經(jīng)無(wú)法兌現(xiàn)當(dāng)初的諾言,對(duì)于MDA我們?nèi)匀皇謶岩?,除非能夠證明它對(duì)于我們所面對(duì)的問題找到了新的道路,不再重蹈CASE工具的覆轍。在我看來(lái)只有模型,模式,框架等技術(shù)結(jié)合在一起才能夠避免象CASE工具那樣的失敗。
Domain-Specific Languages
如果我們想通過運(yùn)用模型來(lái)使領(lǐng)域?qū)<夷芨菀椎亟鉀Q問題,那么模型就必須能夠清晰地描述問題領(lǐng)域。對(duì)于建模語(yǔ)言,就是指用來(lái)針對(duì)問題領(lǐng)域建模的標(biāo)記和關(guān)系的定義。典型的,但不是必須的,建模語(yǔ)言可以是一組圖釋,一組由線條連接起來(lái)的節(jié)點(diǎn),也可以是流程圖或者實(shí)體-關(guān)系圖。
模型通常被標(biāo)記和文本元素所修飾,開發(fā)者需要細(xì)心地審視,理解掩蓋在這些修飾下的模型真正要表達(dá)的信息。所以要能夠進(jìn)行建模就必須明白每個(gè)元素相關(guān)細(xì)節(jié)。這意味著一旦成為具有專門的建模技能的人才就會(huì)帶來(lái)豐厚的回報(bào)。
有些人可能會(huì)認(rèn)為正確的觀點(diǎn)是應(yīng)該定義一個(gè)通用的建模語(yǔ)言,使用它來(lái)對(duì)所有的問題領(lǐng)域建模,同時(shí)要教會(huì)那些領(lǐng)域?qū)<覀儗W(xué)會(huì)使用這個(gè)通用建模語(yǔ)言。從UML得到的經(jīng)驗(yàn)來(lái)看,這樣作并不成功,后面我們將會(huì)討論UML。
現(xiàn)在,我們把那些被設(shè)計(jì)成用來(lái)對(duì)特定問題領(lǐng)域建模的建模語(yǔ)言稱作domain-specific languages(領(lǐng)域建模語(yǔ)言)。領(lǐng)域建模語(yǔ)言可以針對(duì)很多問題領(lǐng)域創(chuàng)建,例如:通訊,銀行業(yè)務(wù),空間勘測(cè)等等。
無(wú)論如何,設(shè)計(jì)和使用領(lǐng)域建模語(yǔ)言只是模型被用作輔助軟件開發(fā)的很小一部分。模型可以被分析和驗(yàn)證,轉(zhuǎn)換,通過很多步驟,被部署并執(zhí)行軟件。這個(gè)過程包括開發(fā),分析,驗(yàn)證模型,在很多不同領(lǐng)域中,通過工具將模型進(jìn)行轉(zhuǎn)換,直到部署系統(tǒng)完成。
在軟件系統(tǒng)的構(gòu)筑中,模型的一個(gè)對(duì)應(yīng)物是框架,框架是適用于整個(gè)領(lǐng)域的代碼實(shí)現(xiàn)框架,并且給多個(gè)系統(tǒng)間在相同領(lǐng)域的不同元素提供了擴(kuò)展點(diǎn)。有很多框架的例子:從GUI到ERP的基礎(chǔ)結(jié)構(gòu)和算法。在所有的情況下,模型的角色是使用框架,給特定的應(yīng)用定義擴(kuò)展點(diǎn)。在這個(gè)層面上,我們可以認(rèn)為建模語(yǔ)言是定義擴(kuò)展點(diǎn),使其契合到框架上,來(lái)適應(yīng)用戶對(duì)問題的理解的一種方法。
另一個(gè)重要的對(duì)應(yīng)物是模式,一個(gè)模式本質(zhì)上是一個(gè)有很多小孔的模型,和如何將這些小孔用其他模型來(lái)填充的規(guī)則。有一種高效使用模式的方法:使用一個(gè)由許多小的模型組成的大的模型,或一個(gè)由其他類型的模型組裝起來(lái)的模型。
在軟件開發(fā)過程中運(yùn)用模型,模式,框架,代碼的至關(guān)重要的一點(diǎn)就是最終的結(jié)果必須是“敏捷“的。在代碼和模型間必須不存在任何不可逆性和不連續(xù)性,在整個(gè)開發(fā)過程中必須能夠?qū)梢姷母鞣N因素作出快速的反映,變化后重新產(chǎn)生最終結(jié)果。CASE的錯(cuò)誤在于沒有針對(duì)問題領(lǐng)域使用框架,而是使用了龐大的,不可逆的代碼生成過程,這樣使得開發(fā)者無(wú)法修改生成的代碼,從而使整個(gè)方法完全失效。只有將模型,模式,框架結(jié)合在一起,并使它們無(wú)縫的整合進(jìn)一個(gè)敏捷的開發(fā)過程中,才可以避免出現(xiàn)CASE方法那樣的缺陷。
運(yùn)用模型,模式,框架的過程從整體上看起來(lái)制造業(yè)的很相似,我們可以把軟件開發(fā)看成一個(gè)價(jià)值鏈的概念:從供應(yīng)商那里取得輸入,利用自己的專業(yè)經(jīng)驗(yàn)為這些輸入增加價(jià)值,到鏈條的最后產(chǎn)生輸出。迄今為止,軟件的構(gòu)造過程很少被看作這樣的一個(gè)鏈條,根本原因在于表述軟件的方式的限制,當(dāng)代碼成為表述軟件的惟一的手段時(shí),惟一和產(chǎn)品密切相關(guān)的人就是程序員。領(lǐng)域定義模型、模式和框架的開發(fā)應(yīng)被納入軟件價(jià)值鏈,也就是產(chǎn)品線中。
在微軟,我們堅(jiān)信建模將對(duì)軟件開發(fā)越來(lái)越重要,我們將在即將發(fā)布的Visual Studio中整合建模功能,我們相信認(rèn)真地根據(jù)目標(biāo)客戶的技能來(lái)設(shè)計(jì)領(lǐng)域定義語(yǔ)言的本質(zhì)是:我們要給客戶直觀的,敏捷,高效,無(wú)縫的建模體驗(yàn)。我們的第一個(gè)建模產(chǎn)品的目標(biāo)是能夠立即為我們的客戶提供高收益。在最近的微軟開發(fā)者大會(huì)上,我們展示了幫助開發(fā)者進(jìn)行SOA的開發(fā)和部署的建模工具,關(guān)于這次展示的細(xì)節(jié),可以在http://msdn.microsoft.com/vstudio/enterprise 找到。
隨著時(shí)間的推移,我們將繼續(xù)擴(kuò)充我們的建模工具來(lái)面向更多的領(lǐng)域,例如:代碼可視化、業(yè)務(wù)建模,還會(huì)把支持更多領(lǐng)域的工具整合進(jìn)Visual Studio。更長(zhǎng)遠(yuǎn)的計(jì)劃是通過多個(gè)產(chǎn)品線,包括模型,框架,模式,工具,來(lái)整合完整的軟件開發(fā)過程。

