程序員眼中的UML
UML自1997年誕生以來(lái),受到無(wú)數(shù)廠商、組織、專(zhuān)家學(xué)者的追捧和擁護(hù),短短幾年時(shí)間,便有一統(tǒng)天下之勢(shì)。提起建模語(yǔ)言,舍UML其誰(shuí)?
UML相關(guān)標(biāo)準(zhǔn)
OMG組織作為影響力最大的面向?qū)ο蠹夹g(shù)的機(jī)構(gòu),早早便將UML收入囊中,力捧其為標(biāo)準(zhǔn)建模語(yǔ)言。OMG在CORBA取得成功之后,最大的著力點(diǎn)便是MDA架構(gòu),而MDA架構(gòu)的四大標(biāo)準(zhǔn)UML、MOF、XMI和CWM中,圍繞著UML的技術(shù)便有三種:UML本身自不必說(shuō),版本已經(jīng)到了2.0;MOF作為“建模語(yǔ)言的語(yǔ)言”,似乎就是為UML量身定做的,雖說(shuō)MOF有能力創(chuàng)建出與UML并駕齊驅(qū)的建模語(yǔ)言,但是似乎沒(méi)有看到誰(shuí)這么干,大家只是在努力的發(fā)展UML的“方言”,例如UML Profile for CORBA,UML Profile for EJB等等;XMI是“模型的標(biāo)準(zhǔn)存儲(chǔ)交換格式”,為了解決不同的建模工具創(chuàng)建的模型不能互用的問(wèn)題,OMG創(chuàng)建了XMI作為模型的存儲(chǔ)交換標(biāo)準(zhǔn)。這樣一來(lái),UML工具更加可以大行其道,使用不同的建模工具創(chuàng)建的UML模型可以互相交流,只要它們都基于XMI。
UML相關(guān)工具
工具的多寡與優(yōu)劣可以看出某個(gè)技術(shù)的受歡迎程度,在建模工具中,不說(shuō)100%,大概也有90%支持了UML語(yǔ)言。最出名的UML工具Rational Rose,被IBM收購(gòu)了;Eclipse下面的UML工具EclipseUML讓開(kāi)發(fā)它的小公司Omondo也出名了;國(guó)內(nèi)也有一個(gè)UML工具,聽(tīng)說(shuō)效果也不錯(cuò),就是楚凡科技的Trufun Plato 2005。至于其他國(guó)際上有點(diǎn)名氣的UML工具,更是不勝枚舉,幾乎有點(diǎn)軟件實(shí)力的國(guó)家,都有自己的UML工具。
當(dāng)然,UML不僅僅出現(xiàn)在專(zhuān)用的UML工具中,它也頻繁出現(xiàn)在最新的各種開(kāi)發(fā)環(huán)境中。例如編程開(kāi)發(fā)環(huán)境JBuilder,具有將代碼轉(zhuǎn)換為UML類(lèi)圖的功能;Together就更進(jìn)一步,直接實(shí)現(xiàn)了代碼和類(lèi)圖的同步轉(zhuǎn)換;Eclipse作為最優(yōu)秀的開(kāi)放式開(kāi)發(fā)平臺(tái),擁有眾多的UML相關(guān)插件,除了前面提到的EclipseUML,比較有名的還有EMF和UML2。
UML在MDA出現(xiàn)之后,在OMG的概念中,成為了MDA的一個(gè)子集(雖然UML的名氣遠(yuǎn)遠(yuǎn)大于MDA)。因此眾多的MDA工具中,幾乎都少不了UML功能。我認(rèn)為很多MDA工具就是從UML工具直接改過(guò)來(lái)的。
UML使用現(xiàn)狀
照理說(shuō)來(lái),如火如荼的標(biāo)準(zhǔn)和工具應(yīng)該催生出如火如荼的應(yīng)用才對(duì),可是UML的使用狀況實(shí)在不盡如人意。無(wú)論是身邊的還是網(wǎng)絡(luò)上的朋友,在項(xiàng)目中使用UML的都是鳳毛麟角,即便使用了UML,也是在很小的范圍內(nèi),完全沒(méi)有發(fā)揮出1%的功效。現(xiàn)在總結(jié)一下目前我所知道的UML使用現(xiàn)狀:
l 讀代碼時(shí),用UML工具進(jìn)行逆向工程,可以清晰的觀察代碼結(jié)構(gòu),方便理解代碼。
l 寫(xiě)代碼時(shí),由于開(kāi)發(fā)平臺(tái)可以自動(dòng)生成UML類(lèi)圖,因此有時(shí)觀察UML類(lèi)圖得到比較清晰的代碼結(jié)構(gòu)。例如Together或者JBuilder等工具。當(dāng)然,如果沒(méi)有自動(dòng)生成的UML圖,大部分人也不會(huì)尋找其他工具去生成UML類(lèi)圖的。
l 撰寫(xiě)科技論文時(shí),使用UML來(lái)表達(dá)系統(tǒng)架構(gòu)或者系統(tǒng)流程等。
l 部分對(duì)UML非常熟悉的程序員,在開(kāi)始寫(xiě)代碼時(shí),先畫(huà)UML類(lèi)圖,然后利用工具生成代碼,最后對(duì)代碼進(jìn)行擴(kuò)展。
從上面的使用現(xiàn)狀可以看出,很多人把UML當(dāng)成一種可有可無(wú)的技術(shù)。即使使用了UML,也只是圍繞著UML中的類(lèi)圖,其他的UML圖都拋到一邊去了。造成這種狀況的原因,一方面固然是因?yàn)閲?guó)內(nèi)的正規(guī)大型軟件項(xiàng)目比較少,軟件工程技術(shù)起步很晚;另一方面是由于國(guó)內(nèi)不管是架構(gòu)師、系統(tǒng)分析員、軟件工程師、程序員、測(cè)試人員等等實(shí)質(zhì)上都是程序員而已,很多人是趕著鴨子上架成了架構(gòu)師或者系統(tǒng)分析員的。這種狀況下,軟件工程的概念難以深入人心,UML更加成了一個(gè)國(guó)內(nèi)項(xiàng)目的雞肋。
看看國(guó)外的架構(gòu)師、UML專(zhuān)家們,往往都是滿(mǎn)臉大胡子,在計(jì)算機(jī)領(lǐng)域中浸淫了3,40年;而中國(guó)最古老的程序員,也只有十幾年經(jīng)驗(yàn),除去在黑暗中摸索的幾年,有十年以上開(kāi)發(fā)經(jīng)驗(yàn)的程序員少之又少。不經(jīng)歷幾個(gè)大型項(xiàng)目,要使用軟件工程技術(shù)是不可能的,也是不能起到什么效果的。因此,有人堂而皇之的撰文“UML的三大硬傷”,將UML駁斥得一無(wú)是處。高喊口號(hào)打倒某東西是很容易的,關(guān)鍵是打倒了UML何以取而代之?
程序員眼中的UML
既然國(guó)內(nèi)90%以上的軟件開(kāi)發(fā)人員都是程序員,那么程序員眼中的UML到底應(yīng)該是什么樣子的呢?我很期望有一本好書(shū)能夠讓程序員們快速的掌握自己所需的UML知識(shí),遺憾的是目前還沒(méi)有看到這樣的一本書(shū)。無(wú)論是“三友”的UML經(jīng)典教材還是國(guó)內(nèi)的一些“xx天精通UML”都不符合這樣的要求。沒(méi)有一本是“有中國(guó)特色的UML教材――一本寫(xiě)給程序員的UML入門(mén)書(shū)”。
作為一個(gè)程序員,我很了解其他同僚的心理,如果拿到一本書(shū),翻了一個(gè)小時(shí)還沒(méi)有找到可以run的HelloWorld,90%的人會(huì)大叫一聲“去nmd”,然后把書(shū)扔進(jìn)廢紙堆。不能怪我們急功近利,在這個(gè)技術(shù)術(shù)語(yǔ)滿(mǎn)天飛,連底層平臺(tái)都動(dòng)蕩不安的年代,誰(shuí)還有時(shí)間和興趣看一些與自己無(wú)關(guān)的東西呢?
我很能想象一個(gè)程序員,好不容易空出時(shí)間來(lái)看看最近很熱的UML技術(shù),當(dāng)他拿到一本UML入門(mén)以后,開(kāi)始尋找對(duì)自己有用的東西。在開(kāi)始的一個(gè)小時(shí),滿(mǎn)篇都是需求分析,use case,甚至?xí)淖髡哌€在饒有興趣的介紹use case有六種譯法:用例、用況、用案……對(duì)不起,老子一百年都沒(méi)做過(guò)需求分析了,也不想知道這個(gè)狗屁的use case到底叫什么。于是開(kāi)始后悔在china-pub上又白花了這么多銀子。
還有些書(shū)上信誓旦旦的說(shuō)“學(xué)好UML,走遍天下都不怕”,如果你做需求分析,你可以用UML和客戶(hù)交流;如果你做系統(tǒng)分析員,你可以用UML設(shè)計(jì)系統(tǒng);如果你做程序員,你可以用UML生成程序;如果你做測(cè)試員,你可以基于UML設(shè)計(jì)測(cè)試用例。而實(shí)際情況是什么呢?國(guó)內(nèi)的客戶(hù)有幾個(gè)懂UML?懂UML的人差不多自己都可以把軟件寫(xiě)出來(lái)了,還需要請(qǐng)你做需求分析么?別說(shuō)客戶(hù)了,上次聽(tīng)同學(xué)說(shuō)和北京某大科研所的工程師們交流,無(wú)意中說(shuō)起了UML,在場(chǎng)的竟然只有一個(gè)稍微了解,而且堅(jiān)持認(rèn)為那是一種畫(huà)圖工具(那位仁兄其實(shí)也沒(méi)錯(cuò),Visio不就是一個(gè)畫(huà)圖工具么)。
雖然狀況如此不堪,但是UML確實(shí)是一個(gè)很優(yōu)秀的“交流語(yǔ)言”、“代碼生成工具”和“系統(tǒng)設(shè)計(jì)工具”。讓我們擦干身上的獻(xiàn)血,掩埋戰(zhàn)友的尸體,睜大迷蒙的雙眼來(lái)看清UML對(duì)程序員的作用。UML有九種圖,作用各自不同,基本上涵蓋了軟件工程的各個(gè)方面,很多人就是不堪于忍受知識(shí)不足的困惑與“侮辱”(很多程序員認(rèn)為一種技術(shù)自己看不懂就是對(duì)自己的侮辱),從而放棄了整片UML森林。他們怕的不是在UML這棵樹(shù)上吊死,而是怕在UML森林里面迷路。但是我想說(shuō),知識(shí)學(xué)習(xí)的過(guò)程就是去蕪存精,找出對(duì)自己有用的東西,然后掌握之。對(duì)于程序員來(lái)說(shuō),UML的價(jià)值就體現(xiàn)在三個(gè)方面:
一、UML是最好的交流語(yǔ)言,無(wú)論是與其他程序員交流,還是與領(lǐng)域?qū)<摇y(cè)試員或者用戶(hù)交流。原因只有一點(diǎn),UML是標(biāo)準(zhǔn)的,就像英語(yǔ)一樣,無(wú)論多么該死,大家還是忙著把自己的論文改成英文的。當(dāng)然,在小的領(lǐng)域可能有更好的交流方言,但是在大而長(zhǎng)遠(yuǎn)的交流中,使用標(biāo)準(zhǔn)的交流語(yǔ)言是穩(wěn)妥的。
二、UML是很好的代碼生成工具,其實(shí)代碼生成功能并不是由UML語(yǔ)言和規(guī)范提供的,而是由UML工具提供的,而且不同的UML工具提供的代碼生成功能還不盡相同。例如Rose提供簡(jiǎn)單的代碼框架生成,而Eclipse插件EMF可以生成功能豐富,提供了各種設(shè)計(jì)模式的代碼包。無(wú)論如何,如果程序員可以從UML入手來(lái)寫(xiě)程序,比直接敲代碼要高級(jí)那么一點(diǎn)點(diǎn)。從文檔、版本控制、維護(hù)、測(cè)試等各方面來(lái)說(shuō),畫(huà)UML類(lèi)圖比直接寫(xiě)代碼都要高那么一點(diǎn)點(diǎn)。
三、UML是很好的系統(tǒng)設(shè)計(jì)工具。對(duì)于程序員來(lái)說(shuō),很少用到“設(shè)計(jì)”這個(gè)詞,大部分時(shí)候我們都是在“編寫(xiě)”或者“實(shí)現(xiàn)”。但是勿庸置疑,程序員的許多工作中還是需要“設(shè)計(jì)”的。包和組件之間的依賴(lài)關(guān)系、復(fù)雜操作的流程、對(duì)象之間的關(guān)聯(lián)和狀態(tài)、程序的部署等等,都經(jīng)常是程序員的工作。那么上面的四種情況可以用UML的組件圖、序列圖、對(duì)象圖和部署圖來(lái)設(shè)計(jì)。雖然,不同的程序員有不同的設(shè)計(jì)方法或者設(shè)計(jì)圖例,不過(guò),UML是標(biāo)準(zhǔn)的。不要忽視標(biāo)準(zhǔn)的力量,標(biāo)準(zhǔn)的東西意味著在全世界范圍內(nèi)都有可能會(huì)被看懂,不標(biāo)準(zhǔn)的東西可能出了你的辦公室就沒(méi)人能夠清晰、準(zhǔn)確的理解了。
后記
Blog好久沒(méi)有更新,因?yàn)樽罱恢泵τ谝恍┧孜铮谑窍雽?xiě)點(diǎn)清高的東西。但是寫(xiě)完之后再看,好像也不怎么清高,反而更俗了。
前段時(shí)間寫(xiě)論文時(shí),需要用到UML2.0的類(lèi)圖元模型,在UML2.0的規(guī)范中尋覓了好久,發(fā)現(xiàn)類(lèi)圖元模型已經(jīng)被拆分到三個(gè)包里面了,因?yàn)?/SPAN>UML2.0的規(guī)范實(shí)在是太大太繁瑣了。于是有感于UML之博大精深,說(shuō)好聽(tīng)是博大精深,難聽(tīng)點(diǎn)就是亂七八糟。不過(guò)OMG歷來(lái)如此,當(dāng)初的CORBA如果更簡(jiǎn)約一點(diǎn),也許J2EE根本就沒(méi)有立足之地。
感慨之后就是想把UML中對(duì)自己有用的部分整理出來(lái),在整理之前免不了到處翻資料,這篇文檔就是翻資料的一些感觸了。希望能夠?qū)?/SPAN>UML的有用部分都整理出來(lái),形成一個(gè)系列的文檔。