C语言花费了二十年从蛮荒之中杀出一条血路,Java苦心耕耘了近十年方成大气,C#在Beta版本推出两年前就开始通过各种途径营造气氛,砸下了数不清的美金,直到现在还未被主流应用所完全接受。而MDA(Model Driven Architecture 模型驱动架构)自从2002年被OMG(Object Management Group 国际对象管理集团)提出以后,"随风潜入夜,润物细无声",未见轰轰烈烈宣传,各大厂商却惊人一致地争相跟进,关于MDA的话题转眼之间在网络上也如火如荼地繁荣起来了。
然而MDA是什么?究竟是什么带来了MDA?究竟MDA为IT业带来了什么?MDA又揭开了一个怎样激动人心的大时代的序幕呢?
挑灯看剑
Michael Guttman,CORBA的创始人,他在为《应用MDA》(国内第一本关于MDA技术的译著)写的序言中说道:
"是什么使得MDA同其它无数泛滥于软件社区的三字母缩写相比显得如此与众不同?第一个理由,MDA是由OMG推动的,OMG是软件产业界最大的联盟,OMG拥有令人羡慕的光辉的过去--它发布并维护了业界一些最成功的标准,比如CORBA和UML。"
OMG是一个独立于各厂商的非盈利性组织,其主要宗旨是要统一不同的商业产品和标准之间的数据交换及相互操作,从而改善各厂商的软件产品之间不兼容的情况。CORBA是OMG在中间件层次上一个显著的工作成果,然而,这个技术上的成功的作品在商业应用上却称不上成功,数年之间,J2EE和DotNet相继在中间件的层面上异军突起。OMG的工程师们开始把眼光放到更远的地方,他们希望在更高的层面上一统这兵荒马乱的局面,因此,基于OMG另外一个非常成功的作品--UML,他们提出了MDA的概念。
OMG的构想是将目前的开发行为提升到更高的抽象层级--分析模型级,把针对特定计算平台的编码工作交由机器自动完成,这样的情况下,业务逻辑与实现技术被成功地解耦,二者相对独立变化,因此模型的价值在包容已有技术的条件下被最大化。这种目的根源于软件开发的现状,在传统的软件开发方法中,随着项目的进展,设计阶段产生的UML模型和代码之间的同步变得越来越困难--代码为了应付新增加的需求和新产生的想法而不断变化,模型却一直停留在原地不动,这是的模型在一段时间之后就失去了它的价值。OMG提出了一个最根本的解决方案--在MDA中,模型不再是一种辅助工具,而是开发过程的产品。一个完整的MDA应用程序包含:
一个权威的PIM;
一个或者多个PSM;
一个或者多个完整的实现 - 开发人员决定支持的所有平台上的应用程序实现。
MDA在目前技术的基础上,分离出了两个抽象级别的模型:PIM(Platform Independent Model 平台无关模型)和(Platform Specialize Mode 平台相关模型),PIM是一个纯粹的不考虑实现技术的分析模型,而PSM可以视为一个基于特定实现技术,比如J2EE的设计模型。工程师们只需要建立表达业务逻辑的PIM,剩下的工作都将由MDA引擎自动完成。描述业务逻辑的PIM将具有长久的价值,而针对特定平台的PSM则可能会随着平台技术的进步而快速地迁移。在MDA开发过程中,系统的开发工作的最终产品是PIM,从PIM到PSM及至代码实现都是由第三方的自动化工具来完成的。
为了实现MDA这一宏大构想,OMG制定了一系列的标准:
UML:UML被MDA用来描述各种模型。它并不是为MDA而生,但是作为目前最为风行的建模语言,UML已经占据了全球建模语言领域90%的市场份额,成为了建模语言事实上的标准,因此OMG将它作为MDA技术的基础是自然而然的明智选择。它是MDA的基础,也是MDA最有力的武器。
MOF:MOF(Meta Object Facility 元对象机制)是比UML更高层次的抽象,它的目的是为了描述UML的扩展或者其它未来可能出现的类UML的建模语言。由此我们可以看到OMG的"野心",虽然MOF也不是为MDA而生的,但是我们可以体味到OMG的工程师们良苦的用心和长远的目光。
XMI:XMI(XML-based metadata Interchange)是基于XML的元数据交换。它通过标准化的XML文档格式和DTDs(Document Type Definitions)为各种模型定义了一种基于XML的数据交换格式。这使得作为最终产品的模型可以在各种不同的工具中传递,这一点是非常重要的,它保证了MDA不会在打破了一种束缚之后再被加上一层新的束缚。
CWM:CWM(Common Warehouse Metamodel 公共仓库元模型)提供了一种数据格式变换的手段,在任意级别的模型上都可以使用CWM来描述两种数据模型之间的映射规则,比如将数据实体从关系数据库变换为XML格式。在MOF的框架下,CWM使得通用的数据模型变换引擎成为可能。
在OMG的蓝图中,UML、MOF、XMI、CWM等一系列标准分别解决了MDA的模型建立、模型扩展、模型交换、模型变换这几个方面的问题。OMG试图通过标准化的定义,扩大MDA的应用范围。同时通过这样一个可扩展的建模语言环境,IT厂商可以自由实现自己的建模语言,以及语言到可执行代码的映射,然而不管怎么样,都必须处于OMG的标准化框架之下。 烽烟再起
"中间件战争已经结束,下一个战场是模型转换!"
--来自于中国第一个MDA研究组织MDAChina.net的这条标语明确地阐释了软件开发的下一个重心。
嗅觉灵敏的IT巨头们比谁都先看到这一点,OMG的MDA思想推出不久,IBM、Oracle、IONA等等都急忙宣称将在自己的企业级软件解决方案中融入MDA的思想,两大建模工具厂商Rotional和Together也声明自己的产品开始加入对MDA的支持,甚至连国内ERP软件领袖企业之一的金蝶软件也不甘寂寞,在其BOS基础平台的发布会上说BOS系统成功实现了MDA。且不管各位巧舌如簧的发言人是如何滔滔不绝的,单从MDA这个词越来越频繁地从他们口中出现这一点,就可以看出MDA已经成为了引发下一轮竞争的导火线,下一个战场的制高点。
对于计算市场的商业个体来说,技术领域的竞争就是没有硝烟的战场,从计算机被发明IT产业兴起以来就从来没有停止过激烈的竞争,时至今日,人们已经在计算的战场上征战了五十多年。
50年前,计算机的历史还停留在石器时代的时候,人们用把指令和数据以0/1序列的形式输入计算机,因为那些真空管组成的庞然大物只能识别原始的机器码。不但如此,人们还不得不为每个字节的内存绞尽脑汁,为每个时钟周期冥思苦想--高昂的硬件成本使得机器成为计算的重心。
随后,汇编语言的出现把人们从0和1的比特流中解放了出来,简单的指令集代码却彻底地避免了人脑的思维方式二进制化。但是,不得不承认在这同时,它也延续了以机器为中心的计算方法的寿命。
20世纪60年代到70年代,硬件技术的巨大进步带来的晶体管、超大规模集成电路、随机存储技术使得人们不需要再为了几个字节的内存空间和几个周期的时间片而花费大量精力,这使得第三代编程语言(3GL)的出现成为可能,程序员们放下了手工敲入汇编代码这个庞大的包袱,开始花费更多的精力在应用逻辑上,之后结构化程序设计几乎完全统治了第二次计算机浪潮后软件开发的黄金时代。
结构化编程带给人集中于创造性思考的快感的同时,也带给程序员们松散凌乱的代码和难循其踪的复杂流程,人们还是不得不更多地从计算机的角度考虑问题,直到面向对象技术的出现。OO思想使得人们终于可以从尽可能自然的角度计算这个世界,直到现在,OO思想依然是整个程序开发行业的支柱。
最近的十年,企业级的分布式应用飞速成为主流,带来了对系统性能、可伸缩性的严格要求,大量分布式系统的出现,大量异构平台的整合需求,引发了中间件战争的爆发,过去的十年,是企业应用系统和中间件技术的十年。人们不再像汇编的时代那样关心一点一滴的内存得失,而开始把更多的精力用于搭建灵巧的架构、实现变化多端的业务逻辑,因此Java得以大行其道,设计模式、AOP等等更高抽象层级的软件理论方兴未艾。
五十年的计算之路写满了这样的事实,那就是人所需要考虑的计算的层面越来越抽象,越来越集中于业务逻辑而非在计算平台上的实现细节,从另一方面来说,借用《应用MDA》一书的观点:计算渐渐地从打孔机和汇编时代的以机器为中心转移到现在的以人为中心。
抽象的根本原因是软件越来越复杂,复杂到人脑已经不能同时把握原有抽象层面上所有的细节,而软件的复杂性根源于软件所解决的问题的复杂性,而且随着计算机越来越多地应用,这种问题也将越来越复杂,因此软件的复杂化是计算机的自然趋势,抽象也渐渐成为不可逆转的方向,甚至连停滞都不可能,五十年的计算之路就是这样走过来的,MDA思想只是迈出了新的一步而已。
就MDA本身来说,虽然MDA正朝气蓬勃地走来,但是冷静的人们还是会很快看出它所存在的问题。MDA最大的好处就是业务模型的持久价值,但是付出的代价是增加了抽象层,而目前看来,层之间的转换并不是我们所期待的那样顺畅,至少,从PIM到PSM,从PSM到代码,这个实现的过程要远比从3GL生成机器代码来得困难,我们要面对比指令集复杂得多得东西,而MDA的终极梦想--可直接执行模型的虚拟机,虽然已有厂商号称推出了可执行UML模型的平台,但是实际上看来炒作的成分居多。在建模技术方面,UML正在暴露其固有的缺陷,它需要扩展更多的机制来支持精确建模和分析模型,虽然目前OCL为精确建模提供了一定的支持,但是这种支持离可执行模型的理想还很遥远。此外,不得不考虑的是性能问题,每当我们工作的抽象层级提高的同时,必然要求硬件技术的巨大进步,这样才能保证增加抽象层所带来的更复杂的计算的顺利执行,而现在的硬件速度能保证执行模型的虚拟机所需要的开销么?Java虚拟机已经足以搞砸目前的主流配置的机器,更惶论UML虚拟机。
但是站在历史的高度看来,MDA所面临的问题,或许只应该被称为"成长的烦恼"罢了。对于程序员来说,新的思想意味着新的机遇,新的思想也意味着新的挑战。MDA将帮助新一代的程序员摆脱编码的桎梏,多少年来的软件理想已经近在眼前。对于IT厂商,为中间件市场的硝烟都还没有熄灭,一个新的战场已经出现在地平线了,不管是否有人觉得残酷,新一轮征战都是不可避免的,从中将会站起下一个二十年的巨人。
跃马扬鞭
数风流人物,还看今朝!
MDA预示着下一个软件开发黄金时代的到来,传统的手工代码将如同现今的汇编语言一样,只是在极少数特别场合才有其用武之地,模型驱动架构会遍及从客户端到服务器端的每一个角落。大浪淘沙,如同以前的每一次变革,MDA带来的全新的机遇将会造就一批新的领袖,今天跟随人后亦步亦趋的毛头小伙,也许就将在未来二十年里引领潮流。而你,是不是准备好了呢?
工业进步的历史就是机器代替人工的历史,机械重复的工作是计算机的擅长,而人的最重要在于其创造性的活动。MDA将威胁那些只会将设计模型翻译为代码的Coder,下一个黄金时代的IT人,只有从事创造性工作的那一部分才不会被淘汰。
在MDA开创的时代,代码将被认为是重复而机械的工件,各种各样的模型翻译工具将会层出不穷,它们可以在极短的时间内产生大量的代码。在即将过去的3GL的时代,年轻的Coder们快速穿梭于层出不穷的各种平台和语言当中,他们得意洋洋地在"老家伙"面前宣称自己又掌握了多少种语言,又在项目中使用了多少个新出现的框架,然而Coder的盛世即将就此终结--代码生成器的成本将比Coder便宜万倍,市场将根本上抛弃Coder。曾经尘嚣日上的"软件蓝领论",在MDA面前自然而然地成为了无稽之谈。
至此你是否找到了你的方向呢?
你可以努力成为一名领域专家。深入学习某一个领域的业务知识,牢固地掌握业务分析方法,你也许不需要设计太多的程序,但是模型设计者会从你的工作成果中获益。
你可以深入钻研系统分析和建模技术,在当前计算机理论框架下,现实中的系统不可能无偏差地实现在计算机系统上,通过对系统的分析,在计算机上建立其运行模型是用计算机来解决问题的一个必不可少的步骤。建立标准形式的系统模型之后,代码生成器可以从你的模型中生成代码,虚拟机甚至可以直接执行你的模型。
你也许还可以看出,MDA技术本身并不是编码工作的终结者,它的架构中包含了PIM(平台独立模型)和PSM(平台相关模型)两个重要的部分,对于实际的应用来说,从PIM生成PSM的工作是必不可少的,因此你可以致力于平台技术,制定其转换规则,顺便还可以继续享受一点编码的乐趣。
也许最后你还可以尝试一下另类的职业--"传教士"。MDA提升了软件开发的抽象层次,软件工业的最终产品将不再是代码,而是独立于计算平台的模型。产品的变化必然带来工程化方法的变化,你可以努力尝试新的开发方法和流程,你的成果将会影响其它人的工作,因为你就是新方法论的"传教士"。
但是无论如何,最根本的一点就是:机遇只垂青于有准备的人!
大时代
你以为MDA本身就是终极之道么?
本文的前面就说过,MDA只不过是已经延续了50年之久的计算之路上的一小步而已,它只是战场上的一声冲锋号,远不是出鞘的军刀、前进的马蹄和冷兵器的碰撞。它开创了一个时代,在这个令人激动的时代里,人们关注分析胜过关注编码,关注模型胜过关注实现,关注业务胜过关注平台,关注模型转换胜过关注平台迁移。借用敏捷联盟的宣言,"虽然后者也具有价值,但是我们认为前者更有价值"。
"这是最好的时代,这是最坏的时代,我们就要上天堂了,我们就要下地狱了!"
大作家狄根斯的这句话用来描述MDA所开创的时代是最合适不过了。MDA带来了新的变革,而MDA远远不是变革的终点,它开创了一个新时代,却还无法摆脱旧时代的影子。MDA最重要的意义是向人们昭示了这样一个方向,沿着这个方向走下去,就是软件工业的伊甸园。
大幕已经拉开,或为舞者,或为看客,身为程序员的你会怎么办呢?