• 移民专家

    威鲨移民首席专家

    添加移民专家微信,为您提供专属1V1咨询服务
  • 海房专家

    鲲洲海外置业专家

    为您提供海外最新房产投资资讯,定制专属海外置业方案

7*24小时客服热线:

4009-933-922
  • 海那边服务热线电话:
  • 深圳公司:0755-86541970(客户服务)
    地址:深圳市南山区深南大道9819号深铁金融科技大厦19A层
  • 北京公司:010-85951808(客户服务)
    地址:北京市朝阳区光华路soho2期C座C5-3
  • 上海公司:021-61769601(客户服务)
    地址:上海市浦东新区世纪大道1501号国华人寿大厦307-308室
  • 杭州公司:0571-88016401(客户服务)
    地址:浙江省杭州市上城区五星路198号瑞晶国际商务中心2205-1室

软件工程方法述评

来自:水畔网行 0 0 2019-08-29

       摘要:本文对一些流行的软件工程方法,包括结构化方法、形式化方法、面向对象方法、基于构件的方法、基于Agent的方法、基于净室技术的方法、基于敏捷技术的方法等进行了述评,并对软件工程方法的发展趋势进行了初步探讨。

 

1.引言

      软件工程方法学是软件工程学科领域研究的主要对象之一,它包括三个要素,即方法、工具和过程。其中方法是指完成软件开发的各项任务所采取的技术路线、策略及措施。经过40多年的研究与实践,人们已经成功地摸索和建立了多种软件工程方法。譬如,结构化方法、形式化方法、面向对象方法、基于构件的方法、基于Agent的方法、基于净室技术的方法、基于敏捷技术的方法等。这些方法在自身的发展过程中又不断吸收其他方法和技术的长处,导致新技术新方法层出不穷,成为现代软件工程发展过程的亮点,从而不断丰富和发展了软件工程的理论与实践。

 

2.软件工程方法

2.1 结构化方法

       结构化方法在软件工程发展中具有里程碑的意义,因为这是从无序的软件开发方法中走出的第一步。

       结构化方法是指任何包括结构设计的软件开发技术。这种技术把程序分解为不同的模块和过程,在编写各个模块时不需要了解其它模块的内部细节,从而可采用自顶向下和逐步求精的方法,将要解决的问题一步一步的分解,直到每个小问题足够简单且易于处理,最后形成原始问题的解空间。根据分析方法的不同,结构化方法又可分为面向数据流和面向数据结构这样两大类软件开发方法。

       使用适当的软件工具或环境来支持结构化技术是软件工程的一个显著特色。应用结构化方法开发软件工程时,常常采用数据流图和数据字典作为系统逻辑模型的描述工具,并以数据和信息的处理转换作为方法的主线,并且始终围绕着如何把数据源加工转换成为最终信息这个中心来构架整个方法体系。结构化分析中运用的实体关系图、数据流图、状态转换图和数据字典等就是用来分析和说明数据的加工状态及变换过程;结构化设计阶段使用的模块化方法、系统结构图,HIPO、判定表、判定树、过程设计语言(PDL)乃至Jackson图等,也是要描述系统的整体结构和构造出多个数据处理的系统模块,反映数据输入/输出的处理过程和结果,这种结果应是用户所需要的最终信息。结构化方法从数据处理观点出发构建方法体系,是该方法能够被普遍接受的主要原因。

      结构化方法经过二、三十年的发展,已经形成了一套比较成熟的理论,它对软件工程的重要意义在于:第一,使人们认识到系统分析和设计比程序编写重要;第二,模块化思想对系统的分解合成、抽象与信息隐藏,易于使系统开发的脉络清晰明确;第三,数据流图、结构图和流程图等工具使用方便、操作性强。如果是开发一个中小型信息管理系统,结构化方法无疑是合理适用的选择。

      但是,结构化方法存在一些易出错的结构元素和操作,如指针、动态内存分配、并行处理、递归、中断等。软件模块的重用性差,缺乏信息隐蔽机制。结构化方法本身的这些缺陷给它的应用带来局限性,使之不适应大型软件项目的开发。因此,人们把注意力转移到更好的软件开发方法。

 

2.2 面向对象方法

      面向对象的软件开发方法在20世纪60年代末期开始提出,经过近40多年发展,这种技术才逐渐为人们所认识。到了90年代前期,面向对象的软件工程方法学已经成为人们开发大型软件项目时首选的范型。

      面向对象方法学认为,客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合起来。因此,面向对象的软件系统是由对象组成的,对象是软件模块化的一种新的单位,它代替了基于功能分解方法中的所谓“模块”等传统的观点。对象将数据和过程封装在一起,这同传统的方法中将数据和过程分别对待和处理形成了鲜明的对比。

      面向对象方法有一个核心概念叫“类”。它是对具有相同数据和相同操作的一组相似对象的定义,也就是说,类是对具有相同属性和行为的一个或多个对象的描述。类表现了对于事物的抽象的逻辑过程,抽象是人们理解事物和软件设计的关键过程。面向对象技术中的关键机制是关于类的封装性、多态性和继承性。封装是把相关数据和过程封装在一起。多态指对象对同一消息可以有不同响应的能力。继承表示一种在通用类和特殊类之间散布信息的机制。对象支持封装、消息支持多态、类支持继承。封装机制支持和扩展了已被证明非常有价值的信息隐敝原则。多态机制可以缩短程序代码,减少最终程序的复杂性,执行速度更快。继承机制允许某个类继承其他类的成员函数或数据成员,允许子类直接去使用其父类的方法或重载其中某一方法,这样,可以大大节省设计和开发派生类的时间。以上三种机制是面向对象技术的基本特性。一个语言或开发环境当且仅当它实现了以上三种机制时,我们可以称其为面向对象的。

      面向对象技术比较适宜于大型软件系统的开发。除此之外,采用该技术开发的软件工程项目还具有稳定性好、可重用性高、可维护性强等优点。八十年代末以来,出现了诸如Coad/Yourdon、Booch、OMT、Jacobson、Wirfs-Brock等几十种面向对象方法。尤其值得一提的是统一建模语言UML(Unified Modeling Language)的出现,它从Booch、OMT和Jacobson等方法和工程实践中吸收了许多经过实际检验的概念和技术,统一了符号体系,给软件工程带来了新气象,是软件工程发展过程中一件具有里程碑性质的新进展。

 

2.3 形式化方法

       所谓的形式化方法是用于说明和检验基于数学的语言和工具,形式化方法通过揭示系统的不一致性、二义性及不完全性,使我们对系统形成一个更深入的理解。用于开发计算机系统的形式化方法,是描述系统性质的基于数学的技术,也就是说,如果一个方法有坚实的数学基础,那么它就是形式化的。根据形式化的程度,可以把软件工程划分为非形式化、半形式化和形式化三类。使用自然语言描述需求规格说明,是典型的非形式化方法。使用数据流图或实体关系图等图形符号建立模型,是典型的半形式化方法。

      形式化方法作为软件工程的基础性研究,在过去30多年里一直倍受关注。Samlson、Dijkstra、Hoare等专家学者提出过一些著名的方法,但这些方法能够真正进入实用的为数不多,表示方法模糊、技术规模太小和支持工具难以使用等缺陷使得形式化方法看上去前途渺茫。然而现在看到的进展又使人对形式化方法的未来发展充满了信心。譬如,在软件规范方面,软件公司开始用形式化的表示方法来严格地描述系统的属性,以消除用自然语言可能产生的不一致性或二义性。在硬件验证方面,硬件厂家已采用了定理证明、模型检验等验证技术。形式化方法还是提高软件工程可靠性的一种重要技术,其工作阶段可分为形式化分析、形式化设计和翻译。

      业界广为流传的典型的形式化方法有Z方法、Larch方法、B方法等。

      近十几年来,国外对形式化方法在软件开发中的研究与应用开展了大量的实践工作,形式化方法已不再仅限于纯学术性研究,而是已经开始被工业界接受并用于实际开发的系统。国外已经出现不少包括形式化方法、形式化语言和形式化工具在内的比较成熟的形式化系统。

 

2.4 基于构件的方法

      基于构件的软件工程(CBSE:Component-Based Software Engineering)出现,给软件生产工厂化和自动化提供了可能。构件是可用来构成软件系统的即插即用(plug and play)的软件成分,是可以独立地制造、分发、销售和装配的二进制软件单元,是可执行软件的一个物理封装,它有定义良好的接口。应用构件技术来开发软件项目是20世纪90年代开始出现在软件工程领域的热点。CBSE具有标准化程度高、以接口为核心、即插即用、重用性和可扩展性好、容易实现商品化和市场化等特点。

      基于构件的软件工程过程涉及三个主要子过程:构件开发、构件管理、基于构件的应用组装。构件开发包括构件建模、制作、获取和测试等过程。构件管理涉及到构件库数据模型、构件的分类检索策略及构件broker等工作。基于构件的应用组装所要研究的内容包括:软件体系结构、源代码级的组装技术、运行级的组装技术、支持即插即用的技术、面向corba、ole、javabean的辅助开发工具、应用系统演化及构件的灵活替换和升级。

      构件技术是在面向对象技术基础上发展起来的,两者之间有着密切的联系和明显的差异。首先,应该肯定,面向对象技术对构建技术来说具有适用性和方便性。但是,面向对象技术没有表达构件技术的全部内涵。也就是说,构件技术的涵盖面要广于面向对象技术。它包括了系统分析、系统的设计与建模、项目组织、构件开发与管理等各个方面,而面向对象技术主要包含OOA、OOD、OOP这三个方面。一些人倾向于把对象技术作为底层框架的“管件”,而把构件作为不同构件之间的更大范围的抽象和实现。第二,构件技术对面向对象技术既有继承又有扬弃。例如,面向对象技术的三个重要特性,构件技术扬弃了多态性和继承性,引用了封装性。同时特别强调重用性。因为对象之间的继承性有可能造成系统间的级联影响,即基类的改动会引起相应的子类或派生类的性质发生变化,这种变化对于构件显然是不利的。构件技术更重视对象的封装性,它希望修改模块引起的影响严格限制在构件的内部。第三,面向对象技术对于构件技术既不是必要条件,也不是充分条件。构件不一定用面向对象语言编写,任何一种可以实现构件标准接口和所需功能的语言都可用来编写构件,尽管大多数人认为面向对象语言是编写构件的最合适语言之一。国外一些专家认为面向对象技术如Java、Corba和ActiveX不够稳定和成熟,并非最佳选择。许多人都在寻找办法使他们的构件技术实践与对象技术脱钩。

      构件技术对于软件工程的发展有着重要意义,它从根本上改变了软件生产方式,提高了软件生产的效率和质量,提高了软件重用率和开发大型软件系统的成功率。开发者可以摆脱编程的细节问题,将更多的注意力放到业务流程和业务规则上去。同时,用构件技术开发的系统灵活,便于维护和升级,进一步降低了对系统开发者的要求。目前,CBSE的应用日益广泛,发展前景看好。

 

2.5 基于Agent的方法

       Agent是近年来计算机科学领域中出现的一个新概念。中文译名有“智能体”、“智体”“代理”、“主体”等。面向Agent的观点认为现实世界是由许多自主的或非自主的实体组成的,它们按照各种关系组织起来,彼此间进行各种交互(协作、协调、协商等)与通信,完成各种复杂的任务。它们可由多个Agent来模拟,合作、交互实现一些高级的功能。相对于面向对象方法来说,面向Agent的观点对现实世界的模拟更自然、更直观、更容易为一般人所理解,因此采用面向Agent技术时,对软件的需求分析简单,更容易理解,系统设计更方便,更简单。

      与其他方法相比,面向Agent的软件工程更适合用来解决复杂的、分布式的现实问题。首先,大型软件开发大多处于动态的、不确定环境中,传统的软件工程方法对系统各部件间的交互定义太紧密,缺乏足够的机制来表示系统内在的组织结构。因而难以解决复杂问题,甚至无法解决系统的开放性,如松散耦合的网络等问题。Agent具有高级的社交能力(劝说、协商、协调能力等),有助于这些问题的解决。第二,对于复杂的系统开发,传统软件工程常采取“分而治之”,而面向Agent系统能以灵活的、上下文有关的方式来解决。第三,对于数据、控制、专家知识或资源的分布,当需要协作以解决公共问题时,Agent技术提供了有效、非常自然的建模方法。譬如,通过添加“Agent外壳”,使得基于Agent的系统与现有遗留的软件系统集成。第四,在软件工程方法的发展过程中,系统的基本构成模块有越来越高的局部化和封装化的趋势。Agent恰好符合了这个趋势,每个Agent都描述了局部的目标、自己的控制流程和被封装的行为决策。

      近几年来,业界已相继推出面向Agent的系统设计所采用的语言,如Agent0、Placa、Congolog等。面向Agent技术已大量用于网络信息处理、电子商务、交通控制、生产过程控制等领域,信息技术发达国家及公司都着手Agent技术的产品开发,成功研制出一些具有Agent特性的产品。

      从软件工程发展过程来看,面向Agent软件工程,无疑是当代软件工程思想(面向对象、构件等)的一种进步。人们由OOA方法提出AOA(Agent-Oriented Analysis),由OOD提出了AOD(Agent-Oriented Design),由OOP提出AOP(Agent-Oriented Programming)。随着网络技术的发展,尤其Internet的应用及其固有的开放、复杂、异质、动态、分布等特性,为Agent技术的应用和发展提供了更好的平台。

 

2.6 基于净室技术的方法

      净室技术是一种实现软件生产低成本和高质量的工程方法,它的最大特点是将软件质量的控制贯穿于整个软件工程过程中,尽早和尽可能地预防软件开发失败,以保证软件的可靠性和软件生产的高效率。

      净室理论基础建立于20世纪70年代末80年代初。Harlan Mills受Edsger Dijkstra关于结构化编程、Nicholas Wirth关于逐步求精、David Parnas关于模块化设计的影响,提出将数学、统计学及工程学上的基本概念应用到软件的设想。后来IBM、NASA等机构在实践中使用净室技术开发的产品,显示出了卓越的质量水平及可靠性,使得净室方法在计算机工程领域得到了初步确认。

      净室理论基础源于数学。Harlan Mills敏锐地看出计算机程序可以执行一个数学函数,从而为软件开发确立了合适的科学基础。Mills在软件测试的统计特性方面同样敏锐地确立了相应的科学基础,也就是说,软件测试只是从无限的可能使用中抽取的样本。这使得净室软件工程成为一个真正的工程学科。

      净室软件工程包涵三个关键技术:增量开发、严格的开发规范与设计、基于统计学的可靠性测量。其中增量开发(Incremental Development)技术是实现开发过程控制的基础和保证。增量开发的技术基础是引用透明性原理,这种原理在软件开发中表现为函数的调用不必关心其内部实现的细节,而只要确认其返回值的正确性。所以软件开发可采用自顶向下、逐步细化的方法,上层函数严格定义其调用函数的功能规范,由于引用透明性,在底层函数被细化之前即可对当前的系统进行验证。从目前的实际情况看,国内在引入净室软件工程上所做的工作远远不够,还必须在加强理论研究的同时,多进行工程实践的探索。

 

2.7 基于敏捷技术的方法

      如果将拥有大量Artifact(软件开发过程中的中间产物,如需求规约、设计模型等)和复杂控制的软件开发方法称为重型(Heavy Weight)方法,而把Artifact较少的方法称为轻型(Light Weight)方法的话,敏捷方法(Agile Methodologies)则是在众多轻量级方法基础上形成的软件工程的新方法。敏捷方法给中国的软件开发者们带来了巨大的心理冲击,那种张扬个性的主张是任何一个软件开发者都无法抵抗的诱惑。当为数不少的中小软件企业在尝试了重型方法并遇到了困难之后,敏捷方法学将给这些企业提供新的思路,这种新方法将在更多的地方发挥作用。

      敏捷软件开发,特别是敏捷建模,对大多数的软件组织来说都是新生事物,是一种新的工作方式。敏捷方法汲取了众多轻型方法的“精华”,恰当地表达了这些轻型方法的最根本之处。首先,敏捷方法强调适应,而非预测。重型方法花费大量的人力物力,试图对一个软件开发项目在很长的时间跨度内作出详细周密的计划来指导长期的工作,而一旦情况变化,计划就不再适用。因此重型方法本质上是抵制变化的,而敏捷方法则强调适应变化,它能够适应变化的过程,甚至能允许改变自身来适应变化。其次,敏捷方法以人为中心,是“面向人”的(People-Oriented)而非“面向过程”的(Process-Oriented)。它强调对人性的关注。实施敏捷过程的一个关键之处是让开发人员选择并接受一个适应性过程而非强加给他一个过程。这一点在极端编程XP(Extreme Programming)中特别明显,因为这需要很强的自律性来运行这个过程。

       比较著名的敏捷方法有:XP、Cockburn的水晶系列方法、Highsmith的适配性软件开发方法ASD(Adaptive Software Development)、SCRUM、Coad的功用驱动开发方法FDD(Feature Driven Development)、动态系统开发方法DSDM(Dynamic System Development Methods)等,它们有许多的共同特征,但也有一些重要的不同之处。其中最常用的为XP,它规定了一组核心价值和方法,消除了大多数重量型过程的不必要产物,建立了一个渐进型的开发过程,它依赖于每次迭代时对源码的重组(refastening)。所有的设计都是围绕着当前这次迭代,而不管将来的需求。这种设计过程的结果是"纪律性"与"适配性"的高度统一,使得XP在适配性方法中成为发展的最好的一种方法。

      同其他方法一样,敏捷方法也需要建模。不同的是,敏捷建模(AM,Agile Modeling)是一组软件建模阶段的指导性原则,是针对基于软件系统的有效建模和编写文档的一个混乱而有序的、基于实践的方法,是Scott W.Ambler在众多敏捷方法学的基础上发展起来的实践的抽象和总结。

 

3.结语

       综上所述,软件工程技术和方法在不断发展。就软件开发方法而言,早已从面向数据流、面向数据结构和面向过程的设计方法过渡到面向对象的设计方法。为了设计出大规模、复杂度高的软件,必须有更高水准的结构设计技术。因此,90年代以来又提出了一种能够对软件的所有结构进行设计的“软件机能构造”技术(即面向角色程序设计技术)。为了提高“软件机能构造”方法的可操作性,人们进一步提出了基于“软件机能构造”的开发体系和局部设计模型。基于此,把对象群作为角色、将各种角色进行拼装组合的技术,目前正越来越受到软件工程研究者的关注。

       不管是已经出现的技术,还是行将推出的方法,十全十美的软件开发方法是难以寻觅的,真正实用的技术或方法往往是多种开发方法的结合。我们面临的任务是,一方面要根据所开发系统的规模、复杂程度以及所处的计算机软硬件环境等诸多因素来综合应用已有的技术和方法;另一方面要适应社会经济发展的需要,总结前人的经验教训,把注意力集中在空白领域的开拓性劳动上,研究新的开发工具和开发过程,创造新的技术与方法。

       网络技术、开发平台技术、中间件技术和人工智能技术的发展有力地带动了计算机软件、硬件的更新和升级,给软件工程方法的研究也带来了更多的机遇和发展空间。


喜欢 0
收藏 0
0条评论
查看更多评论

移民工具箱

海那边公众号

新时代移民内参,为您开启 海外优质生活

微信 扫一扫

海那边移民

无需下载看项目,专家答疑

微信 扫一扫