不断采用构件技术是未来软件生产力提高的主要来源。
——霍克等,《软件业的成功奥秘》①
本章首先通过与传统行业的对比,回顾了软件行业的发展历程;然后探讨了互联网背景下面向构件的发展趋势。通过本章,你可以对面向构件的历史与现状有一个大致的了解。本章结尾还介绍了本书所引用的案例说明及背景。
1.1 面向构件的演变
你需要把事物追究到最早的起源,并且考察它们因何并且如何变为退化的,但是仍要向古今两个时代都去求教;向古时要问何者是最良好的;向现时要问何者是最适当的。
——培根,《培根论说文集》
面向构件实乃一种思想、一种方法,从本质上说,就是将需求分配到诸如类、包、服务等构件中。其核心思想还是来自于分割的原理,就像我们研究物质一样,自然界一切物质都由有限数量的元素组成,每种元素对应着相应的分子或原子等。所以,通过与传统行业的构件化进程的对比,也许是理解软件构件化的一个最佳起点。
1.1.1 汽车行业的构件史②
20世纪是人类进入工业化社会的世纪。制造业是工业化的龙头,它影响着整个工业化的发展进程。其中汽车工业又是20世纪对人类生活影响最大的产业之一。汽车技术已有100年以上的历史,汽车制造技术已经从手工打造一步步地发展到基于构件的大规模的生产。这里我们将与读者一起回顾这个发展过程以及构件思想对汽车制造业产生的影响。
1.从第一辆蒸汽汽车的产生到第一个汽车构件工厂的诞生
1769年,法国人N.J.居纽(Cugnot)制造了世界上第一辆蒸汽驱动三轮汽车。1879年,德国工程师卡尔.苯茨(KartBenz),首次试验成功一台二冲程试验性发动机。1885年,后者在曼海姆制成了第一辆苯茨专利机动车,此车具备了现代汽车的一些基本特点,如火花点火、水冷循环、钢管车架、钢板弹簧悬架、后轮驱动前轮转向和制动手把等。这代表着第一个汽车构件工厂的产生。
2.基于构件的组装,使大规模的快速生产成为可能
20世纪80年代,汽车模块化生产方式初露锋芒,技术实力雄厚的零配件生产商德尔福系统公司相继推出了座舱、接口盘制动、车门、前端、集成空气/燃油等模块,在现代汽车装配线上注入了新的概念。
1.1.2 软件行业的构件史
任何一个行业的发展都与当时的技术发展状况有着直接或间接的关联,汽车行业如此,软件行业也不例外。但是软件就其本身特征而言更加具有复杂性,它从一开始应用于简单计算到现在渗透到各行各业,甚至与每个人的生活都休戚相关。与传统行业相比,无论从其外延还是其解决问题的复杂性,都有其独特性。
我们将短短几十年的软件史,划分为以下几个阶段。
1.面向机器阶段
这个时期的核心是“机器”,其代表性语言“汇编语言”,要求开发者以机器的思考方式来编写程序代码。汇编语言写出来的程序与机器代码一一对应,你不仅必须要知道诸如CPU、寄存器、存储地址等计算机的内部构造,还要知道其类似加、与、或等直接运算指令。要关注这么多的细节,开发者的思维就只能局限于类似计算、控制这样狭窄的领域。
2.面向过程阶段
面向过程使得人们不用再局限于机器的思维逻辑,人们可以站在解决问题的角度来设计软件,这个时期的核心是“算法”,关心的是怎样用程序或者说数学模型来解决一个个的难题。面向过程的代表性语言是C、Fortran等语言,它们是高效的代表,也是颇受欢迎的语言,大多数操作系统的实现都离不开它们。面向过程使得人们的思维水平由“机器”上升到了“问题”的层面。
3.面向对象阶段
面向对象的出现是软件史上的一个划时代的事件,可以说它是当今软件开发的主导思想,许多的理论、工具都由此衍生,其代表性语言有C++、Java等。面向对象的核心是“系统”(在此特指“软件系统”),软件系统不再是孤立的问题,而是一个项目或产品的代名词。人们思维的水平由单一的问题上升到了整个系统。面向对象方法是一种成熟的方法:它有成熟的语言和技术的支持,具有通用的标准化的建模语言UML。即使在今天,面向对象技术依然在不断的发展。
4.面向构件阶段
早期的构件技术以CORBA、ActiveX、VCL、EJB为代表,实现了可插拔、可替换的功能,提供了分布式计算服务,甚至可视化控件,因此大大提高了开发效率。我们这里提到的面向构件技术指的是新一代的构件技术,是面向对象技术发展的升华,它体现的是粗粒度、松耦合、及更高层次上的抽象。面向构件并没有代表性语言,它可以借助之前提到的任何语言,它所需要的是构件的组装语言,可以用XML来描述。面向构件的核心是“组织”,它将人们的思维水平从软件系统上升到整个企业或者行业,它强调组织级、项目间的协作和复用关系。
上述四个阶段并无高下之分,其发展有其固有的时代背景,每个阶段较之前一个阶段在关注点和思维层次上都有一定的升华。表1.1简单地总结了这四个阶段的特点。
表1.1 软件发展的四个阶段比较
1.2 面向构件的基本特征
说到戴尔的商业模式,很多人都知道是直接模式。
如果再深究一下,什么是直接模式的核心竞争力,那么,供应链管理、按单定制、基于标准等都可能是答案。
——马文方,《你应该知道的戴尔秘密》
现在,让我们从传统行业出发,简单总结出面向构件的基本特征。
以我们上一节所引述的汽车业为代表,总结出传统行业已经具备的很多构件化特征,包括以下四点:
◆按单定做 整个生产过程是根据客户的具体要求,“在预先定义的产品框架之内”,通过“组装预先定义的零件”来提供个性化产品。
◆第三方零件市场 在一个成熟的行业里,通常存在一个繁荣的第三方零件市场,那里所有零件都按照精确定义的规格和结构制造。有一批公司专门制造高质量或低成本零件,而不做产品。例如,任何大型汽车厂商仅生产他们汽车或引擎上的某部分零件。
◆通过更换零件来维护 当零件出现故障时,更换整个零件要比修理它来得更省钱、更轻松。即使我们的消费者并不喜欢这样,但是在汽车修理行业而言,往往更换一个新的零件比修理故障零件更经济而高效。
◆供应链 生产成本与总体供应链比起来只是很少的一部分。成功的企业能降低整个供应链的成本(包括生产),但同时涵盖分销等环节。
以上四个特征也适用于软件行业。“按单定做”要求我们有一套事前定义的构件目录,可以方便地进行组装来满足具体的用户需求。每个构件都具备具体特征来对应特定的用户需求。也可能存在事前制作好的解决方案,用户可以把一个或多个零件(构件)替换成更好的零件。这种生产方式要求有事前定义的“构件框架(Component Framework)”(参见第2.2.2节“面向构件的架构”)。
“第三方零件市场”必须遵循行业标准和广为人知的构件之间的互动协议,还需要遵循标准的构件规范,该规范不仅存在而且公开。另外的必要条件是,市场可划分为解决方案供货商和构件供货商;有了面向构件的解决方案,构件供货商才有提供个体零件的对象。
“通过更换零件来维护”要求能确定问题的来源,并且能用新版本构件方便地替换问题构件,该新版本构件很有可能来自另一个供货商。抛却其他问题,我们首先要保证,和解决方案有关联的这两个构件具有相同的界面和功能(提供该保证也是第三方零件市场存在和发展的必要条件)。
最后,在谈到整个“供应链”时,我们必须理解,软件生产成本只是整个软件供应链中的一个环节。在一个成熟的软件行业中,开发软件应该只占用全部成本的一部分,而全部成本则涉及市场推广、销售、配送以及支撑性软件成本。任何一个成功支持“软件生产产业化”的方法,无论是在软件的部署、分销、市场推广,还是在销售过程中,都必须以一致的方式出现。
1.3 面向构件的必要条件
概括地说,提高软件开发效率的关键在于提高软件的复用能力和复用程度。
——黄柳青,《软件的涅磐》
当前任何一个成熟行业的主要目标都是提供高效的生产能力。对于软件来说,我们需要这样一种能够提供高效软件生产能力的平台。以成熟的面向构件的软件行业特征为基础,我们可以推断,这样的平台需要具备以下必要特征:
◆必须通过显著降低开发、部署、定制成本,以及向大规模、高性能、可扩展的系统演变,来降低软件开发的“制造成本”。换句话说,我们关注的不仅是分析-设计-开发过程,而是软件产品的整个生命周期。
◆必须能快速响应“业务需求”的变化和“技术变化”。必须能以“按单定做”的方式,响应某个垂直领域或某个特定客户的不同需求。产品和过程必须高度“可定制”和“可配置”。
◆必须能支撑构造既“高度模块化”又“高度整合”的软件。这听起来好像自我矛盾,但实际上并非如此:软件构件必须有精确定义的边界,同时归属于一个明确的结构。
◆必须存在“标准”。该标准对于构件的规范和交互,从技术和功能两方面进行了规定。
而从软件行业的发展来看,这样的一个以面向构件为核心的平台正在或已经逐渐地演变形成。
1.4 面向构件的发展趋势
这一切都在发生急剧的变化。
——尼葛洛庞帝,《数字化生存》
随着技术和时间的发展,面向构件也有了一些新的发展趋势,这些趋势受到来自软件产业内部、客户以及市场等多方面因素的影响。我们重点研究面向构件开发领域的三个趋势:模型驱动的软件开发趋势、构件服务化趋势,以及构件业务化趋势。
模型驱动的软件开发趋势
面向对象的分析与设计(OOA&D)方法的发展在20世纪90年代中期出现了一个高潮,UML是这个高潮的产物。UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它融和了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。UML提出了一套IT专业人员期待多年的统一的标准建模符号。通过使用UML,这些人员能够阅读和交流系统架构和设计规划——就像建筑工人使用的建筑设计图一样。
目前UML已经发展到UML 2.0版本,这标志着模型驱动开发时代的到来。UML 2.0增强了建模语言的可扩展性。在2.0版本中,各种图的描述功能更强(例如形式化表示算法行为的“状态机”)。在新版本中,过程和数据的各种形式化表示之间的关系也被定义得更加清晰。
MDA是“模型驱动构架(Model Driven Architecture)”的缩写,它是由OMG定义的一个软件开发框架。其关键之处在于,模型在软件开发过程中扮演了非常重要的角色。在MDA中,软件开发过程是由对软件系统的建模行为驱动的。
模型从某一个建模观点出发,抓住事物最重要的方面而简化或忽略其他方面。模型包含两个主要方面:语义方面的信息和可视化的表示法。语义方面,模型表达一种逻辑,一种业务描述。可视化的表达方式可以用方便使用者观察、浏览和编辑的形式展示语义信息。
听起来比较复杂,其实广义上讲任何编程语言都是一种模型语言,一段代码就是一节模型。只不过大家现在讲的模型,又更加抽象一步,通过图形、表格、XML,而不是代码来描述。
从现在的情况看,MDD(Model-Driven Development,模型驱动开发)的发展已日臻成熟,不仅Together、Rose等工具在不断完善,普元等国内致力于国产中间件的厂商推出的相关产品也相当成熟了。《大规模基于构件的软件开发》的作者Alan Brown总结了MDD的发展历程(参见图1.1)。
图1.1 模型驱动的发展历程 |
图片来源:IBM developerWorks网站
从图1.1可以看出,MDA是MDD发展的高级阶段,当前还处在方兴未艾的阶段。其关键在PIM(Platform Independent Model,平台独立模型),它是一个屏蔽了“平台相关技术”诸多细节的模型,但其语义必须完备,否则无法自动生成PSM(Platform Specific Model,平台相关模型)。
关于模型驱动的软件开发趋势的看法,可概括如下:模型在开发中的作用会继续增大,其应用范围会更加广泛、更加深入;模型的分工会产生分化,“隐藏细节”的理念会发展到“隐藏不应暴露的模型”;暴露给用户使用的是符合用户视图的模型。
构件服务化趋势
为了满足客户提出的越来越多的新要求,技术方面的改进也在不断地加快。企业必须快速地适应这种改变,否则就难以生存,更别提在这个动荡不安、竞争激烈的环境中取得成功,而IT基础设施必须支持企业提高适应能力。
因此,企业组织正在从20世纪80年代或更早时期的相互隔离的垂直业务部门,以及20世纪80年代和90年代关注业务流程的水平结构,向新的生态系统业务范例发展。重点是扩展供应链,支持客户和合作伙伴访问业务服务。
为了减少异构性、增强互操作性和适应不断改变的需求,这样的体系结构应该提供平台来构建具有下列特征的构件服务:
◆松散耦合
◆位置透明
◆协议独立
应用基于这样的构件服务的体系结构,服务使用者甚至不必关心与之通信的特定服务,因为底层基础设施或服务“总线”将代表使用者做出适当的选择。基础设施对请求者隐藏了尽可能多的技术细节。特别地,来自不同实现技术(如J2EE或.NET)的技术规范不应该影响构件服务的用户。通过对已有服务构件的组装又可以创造出新的服务构件。
构件服务使用户在构建企业应用时不再直接面对具体的技术细节的层次,而是通过服务构件的方式来构建应用。这种方式也使得客户的企业应用具有良好的分层架构,能够很好地分离应用的业务逻辑和IT逻辑,不但利于应用的构建,更有益于应用的更改和部署。
服务构件是面向构件的架构中的基本组成元素和基本构建单位,也是我们具体实现业务逻辑的单元。我们可以把它看成是搭建最终应用的积木。可以非常容易地把传统的POJO,无状态会话BEAN等包装成服务构件。
最近,构件服务化趋势已经取得了可喜的成果:发布了服务构件架构规范(SCA③ ,Servcie Component Architecture),它利用了一种新兴的计算趋势,即面向服务架构(SOA),它将IT资产构造为一组执行业务功能的可复用服务。例如,利用这些新标准,贷方可以基于已有的应用程序(这些应用程序将新的房屋所有者的数据——包括信用报告——连接到诸如预定房屋估价和利率锁定之类的过程中)开发出一组互联的“服务”,从而显著降低自动化借贷批准过程的复杂性。通过将应用程序构造为一组服务,IT资产将变得更为灵活,企业也能够在动态的业务环境中更好地调整投资。此外,采用这些新标准还将为企业提供更好的投资保护,因为他们可以使用各种各样的中间件技术来复用服务。
构件业务化趋势
在构件化概念应用的早期,以CORBA、微软公司的DCOM、Sun公司的EJB为构件技术的代表。当时构件的复用体现在用户界面上的构件复用,这个层次上的构件应用确实对当时的软件开发起到了促进作用。随着技术层次构件的积累和成熟,企业应用开发迫切需要的不再是细粒度的技术构件,而是粗粒度的业务构件。以业务构件为中心的面向构件的开发才能真正提升开发的速度、降低开发成本,并改善软件质量。
从面向构件到面向业务构件,企业实现了更高层次的应用积累,使应用业务功能模型与耦合度方面更加优化。面向构件技术的构件业务化强调的是粗粒度的构件,是对一个完整业务功能的实现与复用。
回书目 上一节 下一节 |