软件体系结构(一)

 软件体系结构(一)

  近年来,软件产品越来越复杂,规模更大,相互之间的依赖性更强,分工也愈加细化。回想十年以前,如果你告诉开发人员需要一个软件,可以让你方便地出版各种媒体,并让数万名用户同时浏览这些出版物。可以想象可怜的开发者会瞪大眼睛,张大嘴巴,然后表示需要数万个工时来完成这个软件(或者更有可能的是:只完成一半)。但是在今天,他会轻松的耸耸肩膀,然后说:“没问题。BTW,你需要给这个web site增加一些交互功能吗?“

 

       相同的情况也出现在软件设计领域,也许几年以前你需要这样说,“一个客户端(用户界面),提供用户与系统的友好访问;以及应用服务,专司业务逻辑的实现;最后是数据服务器,负责数据信息的存储、访问及其优化。“现在你只要说“三层结构“,人们就会明白你的意思。与之类似的词语还有MVCPipeline,甚至某些商标,比如著名的J2EE.Net.

也许你还不太了解前者,MVC是指“模型-视图-控制器“,而不是索尼的数码相机。Pipeline也不是下水管道,尽管它们的确有些相似的地方。

 

       随着软件系统越来越复杂和庞大,对数据结构和算法的选择在许多情况下成为较次要的部分。而对整个系统的设计和描述变得越来越重要。人们编写软件的方式和使用的开发语言及工具有一个显着的发展特点,即他们的抽象程度有规律的提高,也许这句话本身也有一点抽象。这里的抽象程度,指的是软件开发者进行设计时考虑问题的粒度,又是一句抽象的话。再继续下去,我们会得到无数抽象的概念,所以还是回头看看活生生的历史,看看过去的五十年里,软件开发技术是怎样发展的。

 

       在上个世纪五十年代,第一批数字计算机诞生时,人们使用机器指令编程,用打孔卡片代表二进制的01串。工程师们直接在内存中读写指令和数据,安排和维护内存的分配。即使增加一行代码,也必须重新考虑所有指令和数据在内存中的分配。编制的程序完全像天书一样,全由01组成。很快,人们开始使用有意义的符号来代替机器指令和内存地址,内存的分配和更新也交由系统完成,这便诞生了汇编语言。1952年,MIT(美国麻省理工学院)Whirlwind 系统上使用了符号地址,开始使用汇编语言编写程序,可以说是最早的软件抽象。

 

       到了五十年代后期,人们逐渐提炼出一些最常用的编码方式,像算术表达式,逻辑运算,过程调用,循环和条件等等。一些较高级的语言(相对汇编语言来说),实现了对这些常用方式的语言级支持,使得开发者得以在更高级别的抽象上工作,大大地提高了效率。1954年,IBM公司的John Backus和他领导的研究组开始开发Fortran (Formula translation)语言,这是一种用于科学计算的程序设计语言。开发任务到1957年完成。Fortran是这些语言的杰出代表者。IBM公司在IBM704机上开发了用Fortran编写的监控程序系统,是操作系统的雏形,也是最早的对硬件的软件抽象。

 

       Fortran更高级的语言,开始提供对自定义数据类型和模块化的支持。1960年,来自丹麦、英国、法国、德国、荷兰、瑞士和美国的13名代表举行了一次国际会议,会后在计算机权威刊物CACM上发表了“关于算法语言Algol60的报告”。Algol是一种用日常英语和与常用数学表达式相近的形式表现算法的语言,没有输入输出语句,全部以过程的形式进行,以块结构为基础。瑞士的Njklaus Wirth Algol的基础上开始开发Pascal语言,于1971年完成。同年,美国的贝尔实验室的Dennis Ritche(Unix操作系统的开发者之一)开发出 C 语言。PascalC 语言到现在仍然广泛使用,有许多大型系统是用这两种语言开发的。这一时期还诞生了建立在操作系统上的第一个通用的平台,1968年,IBM公司研究开发了世界上第一个数据库管理系统IMS,它具有管理复杂数据库的能力,支持层次结构的数据库和联机事务处理。这一时期的软件开发,集中在对算法与数据结构的探讨上。还是那个Wirth,提出了程序=算法+数据结构,这一概念流行到现在。这时的软件的结构与抽象层次,也集中在数据结构上。

 

       渐渐地,人们开始希望把算法与数据结构结合起来,也就是说,人们在开发软件时,已经从等号右边转移到了等号左边,在更高的层次上进行考虑。于是抽象数据类型(ADT)的概念被引入,1968年,挪威计算中心的O.J.DahlK.Nygard发表了Simula 67 该语言在Algol60的基础上将系统整体模块化,这是第一个面向对象的语言。但在相当一段时期内几乎处于停滞状态。60年代后期,人们在挑选有用的数据结构的同时,也逐渐认识到一些优秀的系统组织方法。其中一些就是基于抽象数据类型的。

      

       这一过程导致了对一种表示法的强烈需求,这种表示法必须可以描述如何将由编程语言开发的子系统连接以构成更大的系统。1975年,DeRemerKron发明了MIL (Module Interconnection Languages模块互连语言), MIL提供了描述模块之间的相互关系以及模块如何调用的静态方法。所谓静态是指模块之间的互联是通过某些隐式的约定,如过程调用和数据共享。这使得模块互连语言有很大的局限性,通常对于特定的程序开发语言,必须构造一个特定的MIL(例如:AdaMIL),也就是说,MIL是基于程序开发语言的。用模块互连语言定义的模块如下图所示:

MIL的一个副产品是提供了版本控制。由于MIL可以描述一个模块提供了哪些资源(模块互连语言的资源是指程序开发语言中经过标示的类型,常量,变量以及函数等等),依赖于哪些资源,以及包含函数和模块,这些描述可用于构建一个大的系统。这正是版本控制的主要目标之一,基线(baseline)管理。

 

       1970年,美国贝尔实验室的Ken Thompson Dennis M.Ritchie开始开发Unix操作系统。这是一种通用交互式分时操作系统,属于多道程序操作系统,是当前国际上公认的相当成功的操作系统之一。同年,IBM公司的E.F.Codd在美国计算机协会的刊物上提出关系数据库理论和方法,为关系数据库的发展奠定了理论基础。次年,Dennis Ritche开发出 C 语言,对于系统程序设计非常有用,人们开始对操作系统的编程。接下来的三十年,是操作系统和数据库的大发展时期。操作系统由大型机发展到微机,数据库历经层次,网状,关系,分布式,面向对象等等发展,操作系统和数据库成为程序开发的两大平台。

 

       1978年,美国CODASYL(数据系统语言协会)发表了有关分布式数据库的报告,提出了分布式数据库的结构和基本概念,以与发展中的分布式计算机系统相配合。现在已有许多实用的分布式数据库并在继续发展中。

 

1980年,为配合IBM公司开放式个人计算机 (IBM PC) 的开发,Microsoft 公司承担了设计操作系统的任务,后来成了Microsoft公司的MSDOS

 

1983年,美国国防部完成了ARPANET(Advanced Research Project Agency Network),后来发展为InternetTCP/IP逐渐成为Internet核心协议。与Internet有关的硬件制造和软件开发都要遵守这一标准。注意一下TCP/IP,在之后的岁月里,他将成为大多数分布式构件通讯的基础。

 

1985年,Microsoft 公司开始研究开发用于微型计算机的Windows操作系统。它使用图形界面,Windows 的第一版(1985)和第二版 (1987)存在很多问题,所以它们没有成为商业化产品,但Microsoft公司仍然坚持努力,在V3.x取得了成功。从1995年推出的Windows 系列成为独立的操作系统。在Windows 的基础上,Microsoft 公司对以前的开发工具进行了大规模的更新,先后推出了Visual Basic Visual C++等,并发布了最流行的应用程序开发框架(FrameworkMFC,使Windows应用程序的结构标准化,成为新一代开发应用软件的工具。

 

九十年代,人们逐渐认识到软件体系结构的重要性,软件工程师在描述和理解软件系统是逐渐谈论到软件的体系结构。但这些交流通常都是用一些非正式的,特定于某些小团体的描述方式。这种方式有其明显的弱点:

 

体系结构的设计很难被充分理解,也很难进行正式的分析和设计;

 

有关体系结构的决定通常是取决于个人的决定,而不是基于一组成熟的工程化的原理和规则;

 

在系统演进时,有关于体系结构的设计难于保持和验证。

 

可用于体系结构设计的工具非常少。

 

九十年代中期,一些统称为ADLArchitecture Description Languages体系结构描述语言)的工具被提出,这些语言致力于提高体系结构设计的可读性,可重用性和可分析性。可用来在系统实现(implementation)之前对体系结构进行定义和建模。相对于模块互连语言的模块,体系结构描述语言更加侧重于构件(component,除了确定构件及其互连之外,体系结构描述语言还着重描述了以下三个方面:构件行为规范,既包括功能性,也包括非功能的特征。后者是体系结构描述的重点:包括可用性,可靠性,可维护性等等;构件通讯规范;以及构件连接规范。ADL的确部分地解决了上述问题,但它是一种相对较新的技术,目前尚未有成功的商业应用案例。这种情况,部分是由于其本身的不完备性,部分是由于尚无迫切的工业需求。

 

尽管ADL发展缓慢,但它的一个替代工具,对象建模语言却在过去的十年中获得了飞速的发展。其重要的成果是OMGObject Management Group对象管理组织)发布的UMLUnified Modeling Language统一建模语言)这是一套标准化的面向对象的分析与设计的表示法,作为一种图形化的语言,它包括一组图表,用于需求采集的用例图和活动图,用于设计的类图和对象图,用于配置的包图和子系统图等等。它使得体系结构师和分析人员可以用一种标准化的方式来可视化地说明,构造应用程序及其文档。就像一种分析与设计领域的世界语一样。

 

      今天的UML已经逐渐开始统一的过程,但还未能一统天下,不过对于我们来说已经足够了,毕竟也不是所有的人都说英语。UML自身也包括了足够的灵活性,大多数UML开发工具都支持一种称为“构造型“(stereotype)的表示法,它允许定制专有的符号和词汇。这是一个崭新的特性,意味着UML可以被裁减和定制已用于极其广泛的范围,正向其发明者所说的那样,虽然UML是一种面向对象的建模语言,但它完全可用于非面向对象的建模。事实也的确如此,就我个人而言,在换上40G的硬盘之前,我的硬盘只有可怜的8G,在安装了必需的工具之后,已经没有多余的空间来安装Visio,于是我常常用Rational Rose来画办公室布局图。

 

       之所以会有这些发展,是由于前面所提的,软件开发自身的变化.

 

第一个原因是自从1968年第一个数据库出现以后,软件的规模越来越庞大(事实上,在这之前那些用COBOL和ISAM文件建立起来的商业系统也已经非常大了),人们最早是对硬件编程,然后对操作系统编程,接下来在数据库平台上编程,软件开发在这一阶段充分发展了三十多年。而现在,人们在AS(Application Sevrer应用服务器)上编程,1995年,Bill Coleman, Ed Scott, 和Alfred Chuang创立了BEA公司,开始发售他们著名的Weblogic服务器,而在今年,应用服务器市场已达到数十亿美元的规模。与之共同发展的是中间件市场,因特网上名列前茅的三大商业组件供应商 Flashline.comComponentSource ComponentPlanet ,不但买卖软件组件,还向买方和卖方提供从测试和支持到组件管理工具等各种其它服务和资源。CBDComponent Based Develop基于组件开发)已经成为一种先进软件开发方法。如果您在使用 Visual BasicC++C# Java,则您本质上在做 CBD。这部分得益于ASSPApplication Server Software Platform应用程序服务器软件平台)的日益流行。如 IBM WebSphereSun Microsystem iPlanetBEA System WebLogic 以及 Oracle iAS 这样的 ASSP 正将 CBD 推向市场。大家第一次采用并接受了如 SOAP XML 这样的工业标准。这种应用和接受将有助于刺激集中于 Web 服务应用的组件开发。这股潮流在涌向 Java J2EE这一边,但是随着微软的 .NET 变得更普及,也许这个钟摆会摆回微软。人们把应用程序服务器称作企业计算的操作系统,微软在这里落后了,但多少次我们看到它超越对手。

 

       第二个原因是对分布式的需求。越来越多的应用程序是运行在Internet上,所有这些程序都提出了对分布式的要求。为了支持来自Internet的访问,服务器的负载大大增加了,使用多个并行的服务器,而不是使用一个强大的主机,变得越来越普通,因为后者通常意味着更为昂贵和专有的开发队伍。对安全的需要也要求分布式,就好像“不要把所有的鸡蛋放在一个篮子里“一样。

 

待续 . . .

 

ximenes[email protected])版权所有,欢迎交流,保留所有权利。

你可能感兴趣的:(软件体系结构(一))