传统的生产模式越来越难以满足飞速增长的软件需求。提高软件生产效率,必须研究软件生产模式。本文对当前提出的新的软件生产模式(MDA、软件工厂)进行了剖析,提出了进行改进软件生产模式实践的要点。
引言
?在过去20多年中,软件成为推动世界经济发展的一支不可缺少的动力。而软件产业本身也得到飞速的发展,成为全球范围内投资回报率最高的产业之一。而在我国,软件产业的发展更可谓迅猛。据2004年3季度的分析报告,2004年1~9月的软件销售额已经达到1800亿元,同比增长32.5%。目前,我国的软件企业已超过10000家,从业人员超过40万。在此高需求、高投入、高竞争的环境下,软件生产的规模和效率成为软件企业最需要解决的问题之一。同时,这也是关系到整个软件行业的发展,乃至软件所支持的行业发展的一个重要问题。
随着软件工程理论和CASE工具的发展,突破传统软件开发方式的方法论逐步被提了出来。OMG在UML的基础上提出了MDA这一软件开发框架,为从软件抽象模型到软件代码的自动生成指出了一个方向。这个概念很快就得到工具厂商的响应,目前大多数主流UML工具都支持MDA的部分功能。而在Microsoft即将发布的VisualStudio.Net 2005中更是加入支持软件工厂的工具Team System。 Sergey Dmitriev更是大胆提出面向语言编程这一方法,试图统一意图编程、MDA、产生式编程这些概念。可以预见,软件生产方式的革命即将来临。
软件生产自动化将给我们的软件企业注入更强的竞争力。然而要对软件生产方式进行革新,并不是一件轻而易举的事情。它不是简单的软件工具使用的问题,它还涉及到企业的技术积累、管理水平,乃至心理状态的问题。研究如何实践软件生产自动化将为我们解决这些问题。
传统软件生产方式
软件的最终形式是代码。到目前为止,大多数软件代码的生产仍然是依靠程序员的大脑生产并手工键入的。这种软件生产方式在过去的20年中并没有发生了根本性的变化。我们可以把这种方式称为传统的软件生产方式。传统的软件生产方式为软件产业带来了许多问题。
首先,软件生产的效率低下,项目延期率极高。程序代码处在一个较低的抽象层次上。为了完成代码,程序员需要处理大量和软件应用的问题域无关的技术细节。同时,软件应用的抽象层次和程序代码的抽象层次相距较远。程序代码对应用需求的反映的准确程度难于测量。这往往使软件开发出来以后又不断地修改,造成了项目进度延期,极大地增加了软件开发的成本。
其次,软件产品的质量没有保证。由于软件代码基本上是程序员手工编写的,程序员的个人能力成为制约软件产品质量的关键。现在人们需求的软件动辄数十万行代码、包含大量图形化界面,网络化、分布式的软件也非常常见。开发一个软件需要众多程序员的协同工作。代码的一致性、程序员能力的不平均,给软件的稳定性带来极大负面影响。虽然,软件测试已经越来越多地为开发团队所采用。但这种亡羊补牢的方式并没有对准软件缺陷产生的根源。
再次,软件开发团队的规模受到局限。软件开发一般来说都是小团队工作。因为软件开发所涉及的知识领域跨度大,而这些知识又大量仅保存在程序员的大脑中。如果团队太大,势必带来难以承受的沟通开销。而且,团队成员的代码规范更难于一致。
最后,软件产品难于修改和维护。软件产品的核心是代码,它直接决定了产品的行为。对产品进行修改,必须涉及代码的修改。但是,面对数十万行代码,维护人员要理解软件相当困难。尽管,编码前的文档工作越来越受到重视,甚至是必不可少。但文档却几乎总是和代码不一致。代码才真正反映到最终产品,因此人们总是首先修改代码。其结果是文档和代码渐行渐远。
MDA开发过程
MDA全称是模型驱动架构,它不仅仅是一种标准,更是一种重要的开发方法学。2002年,国际权威的对象建模标准化组织OMG将MDA作为其战略方向。短短3年过去,几乎所有的主流UML建模工具都融入了MDA功能。
?MDA的目标就是将程序开发工作的抽象层次提高。软件技术发展史,也是开发抽象层次逐步提高的历史。例如在语言方面,我们从机器语言开始,经历了汇编语言、高级语言、4GL的发展历程,高级语言也从结构化语言发展到面向对象语言,现在有出现了基于模式的编程。每一次转变都是一次抽象层次的提高。Smith和Scotts总结道,“编程的历史是在体系结构抽象方面的一种锻炼。在每个时代,语言设计人员通过总结上一代的经验教训创造出结构,然后体系结构设计师使用这些结构创造出更复杂,更强大的抽象。”
MDA定义了平台无关模型(PIM)和平台相关模型(PSM)这两个概念。此两者和代码一起构成了MDA核心的三种模型。PIM是具有高抽象层次、独立于任何实现技术的模型。它描述软件系统如何支撑业务,但并不关心软件是在哪个平台上实现的。PSM是使用特定平台的术语描述如何实现业务的模型。例如,关系数据库模型使用表、视图、外键约束等描述业务对象及其之间的关系。一个PIM可以变换成一个或多个PSM,这一步骤是MDA最核心、最复杂的变换。
MDA的最大特点就是这些变换是自动进行的。如果用MDA的概念套入传统的开发生命周期,传统的开发也可以看作是模型的变换。然而,传统的变换是需要程序员手工进行的,唯一的自动变换是高级语言代码到可执行目标代码的变换。由于从PIM到代码的变换可以自动进行,MDA过程迭代时,开发人员就可以从PIM模型开始,而非从代码开始。这样,分析设计文档就不会和代码相分离,整个软件也就更容易理解了。
目前,我们已经有了许多可以部分实现从PSM到代码的变换工具,但是PIM到PSM自动变换的成功尝试还不多。要实现PIM到PSM的自动变换,还需要解决以下一些问题,
1.PIM的描述
构成PIM的语言必须具有足够的描述能力以应付各种业务需求;同时这种语言能够被计算机理解,并能精确变换成PSM;另外,它有必须足够简单,以便开发人员能容易理解和学习。OMG把这一重任放在UML2.0的身上。这一点受到了许多专家学者的质疑。Martin
Fowler就认为对UML的扩展没有考虑到使用UML画草图者。将UML扩展成一个过于复杂的语言,会使UML变成Unwanted
?Modeling
Language。MDA并没有限制使用其他语言作为PIM的描述。但设计这样一种通用的具有精确性、完备性、一致性,同时又具有简单性的语言,确实是困难的。另一方面,PIM描述是否能实现平台无关性也是一个受关注的问题。Martin
?Fowler就质疑构成MDA使用的UML、MOF、XMI等标准是否构成了OMG平台。
? 2.变换的构造
软件开发平台技术丰富多彩,对平台各项技术细节的运用很大程度上决定产品的质量。即使使用相同的平台,每个开发团队都会有应用不尽相同的技术。例如,对于相同对象模型,不同开发人员可能会使用不同的关系模型,如加入冗余字段以达到优化效果。这就对通用的变换工具提出了很高的灵活性要求。如何根据自身需求构造变换,而构造过程又足够简单。这也是一个难题,否则平台无关性就会成为空话。
尽管要真正应用MDA还非常困难,MDA的思想还是给我们的开发模式的转变指出了一个方向。更为重要的是,它促使人们去思考提高编程抽象程度的方法。
软件工厂
提高软件的生产效率,改变软件生产的模式,目标就是使软件产业化,使其形成规模。这种规模化、产业化的软件企业,我们可以称之为软件工厂。
提高企业软件开发能力的解决方案有两个,一是投入更多的合格的开发人员,二是改变软件开发的方式。许多人认为,我们可以参照我国改革开发以来最成功的制造业的模式,以劳动力密集的方式建立大型加工厂。然而,优秀开发人员和蹩脚开发人员的工作效率和工作质量的差距是巨大的。传统的开发方式中分工难以细分,“软件蓝领”事实上难以发挥人数上的优势。而项目人手的增加也使得软件项目的边际收益下降。因此,解决问题的办法应该是改变软件开发的过程和实践。
MDA是实现软件工厂的重要方法论。但是,面对现实,MDA暂时仍无法很有效地实施。今年初,Forrester研究中心发布了一份MDA的发展报告。这篇题为《“模型驱动”比MDA更有用》的报告指出,众多IT组织都对OMG的MDA很感兴趣,但在实践中他们往往选择更实际可行的方法,例如模型驱动的开发。
?在争论声中,微软公司提出了自己的软件工厂概念。微软的软件工厂的定义是:一个使用基于软件架构(Software? Schema)的软件模板来配置的可扩展的工具,从而为产品系列提供生产设备的软件产品系列。
微软在这里使用了一个新的术语——软件架构。所谓软件架构实际上就是一个对软件开发过程中产品和半成品(包括文档、模型、源代码、测试用例、部署清单等)进行分类和概括的文档,这个文档还定义了这些制品间的关系。软件架构是可以自定义的。这个自定义的软件架构,就构成了我们软件工厂中的生产流程。接着为了生产物化的产品,我们还需要有原材料,这就是微软软件工厂概念中的另一个核心构件——软件模板。软件模板是根据软件架构的要求预先实现好的DSL、模式、框架和工具。使用模板进行代码生成并不是新的东西,但微软的软件模板包含了更丰富的元素。其中DSL是一个新的概念。DSL的全称是领域特定语言(Domain? Specific Language),它是为用于描述某个特定问题领域而设计的语言。例如,SQL就是一种DSL。DSL可以抽象某个特定领域的复杂度,它描述要在这个问题领域上要解决何种问题,而不关心内部如何运作。对照MDA术语,我们可以认为DSL实际是一种PIM的描述方式。但是,微软采取了更现实的态度,认为描述平台无关的抽象模型脱离不开具体的领域,而且只有这样描述及描述方法本身才能简化和易于理解。
?软件工厂的概念体现了微软的务实态度。它体现了先进的自动化编码概念,提高了开发人员工作的抽象层次,同时也给开发人员的手工加工提供了空间。而且,软件工厂概念包含的不仅仅是软件开发方式,更重要的是软件产品的开发方式。随着Visual? Studio 2005的推出,我们将真正目睹微软软件工厂的庐山真面。???
软件自动化生产模式的实践策略
?虽然MDA远未成熟,微软的软件工厂也在开发当中,这并不意味着我们应该等待。改变我们的生产模式,提高软件生产的效率,是每个软件项目管理人员和开发人员必须要做的努力。到目前为止,我们已经有了一定的概念和理论基础,也可以获得大量的现成工具。尽管这些东西还不完善,但是足够我们开始软件自动化生产的实践。在进行软件自动化实践的时候,我们需要主要以下几点。
?1.在先进的理论指导下,运用各种行之有效的模式先进的理论给我们指明了发展的方向。无论是MDA、软件工厂、产生式编程还是面向语言编程,都使我们对软件生产方法有了抽象层次更高、更为深刻的认识。然而,还没有一种理论能够占据统治地位,没有哪种理论能够为我们解决所有问题。软件开发是一项内涵丰富的活动,我们必须以务实的态度看待这些新理论。应该根据软件团队本身所面向的行业、所采用的技术架构、文化特点出发,运用各种证明有效的模式,探索适合自身发展的生产模式。
?2.重视软件开发团体自身的技术积累
先进的生产模式为我们解决了生产流程和工具的问题,但并不能为我们解决原料和工艺的问题。要生产出高品质的软件产品,归根结底还是在于开发团队的技术能力。生产有本企业特色的产品的软件企业才有生命力。不能期待软件自动化生产工具能为我们生成一切。同时,技术积累也是我们更好运用软件自动化生产工具的条件。否则,就会出现巧妇难为无米之炊的窘境。
3.转换开发人员的心态和习惯
使用软件自动化生产工具后,开发的过程会和开发人员的习惯相抵触。作为项目管理人员必须重视这一点,及时培训开发人员、解除开发人员的疑虑。在作者的公司刚开始实施根据数据库模式生成代码时,曾出现过这么一些情况。首先是开发人员对生成工具不熟悉,认为不如手工编码方便;其次是开发人员认为使用生成工具不灵活,限制了他们的创造力;最后是开发人员不愿意修改软件工具生成的代码。这使得项目管理人员不得不反复讲解软件生成工具的原理,强调在当前条件下生成工具只是生成毛坯,还需要精加工过程。软件自动化生产模式需要逐步完善。而软件生产模式的成功实践也不是一朝一夕能够取得的。它考验的是开发人员的智慧和意志力。
结语
随着软件工程技术的发展,软件自动化生产模式的探索已不仅仅是停留在理论上。软件生产模式的革新将为我们带来更高的软件生产力。无论我们在观念上更倾向于MDA、微软软件工厂、面向语言编程,进行软件生产模式创新都是势在必行的。这不仅仅是软件企业竞争发展的需要,也是中国软件产业走向强大的必由之路。