如标题所述。本文面向于软考高级,具体来说是系统架构师。
本来几乎是纯粹的理论知识汇总,用于应付软考,在理解基础上注意抠字眼。
软件产品从形成概念开始,经过开发、使用和维护,直到最后退役的全过程,叫软件生存周期模型,又叫软件开发方法、软件开发模型(software develop model)、软件过程模型 (software process model)
分类 | 描述 |
---|---|
结构化法 | 强调用户至上,严格区分工作阶段,每阶段都有任务和成果,强调开发过程的整体性和全局性,开发过程工程化,文档资料标准化,自顶向下逐步求精 |
原型法 | 适用需求不明确的开发,分为抛弃型原型和进化型原型 |
面向对象方法 | 更好的复用性,关键在于建立一个全面、合理、统一的模型 |
面向服务方法 | SOA方法有三个主要的抽象级别:操作、服务、业务流程。 SOA分为三个层级:底层服务构件、服务接口与协议、服务流程编排。 服务建模:分为服务发现、服务规约和服务实现三个部分 |
大体来说,有3类:
特点:
阶段间具有顺序性和依赖性,前一阶段结束后才能开始后一阶段的工作,前一阶段的输出是后一阶段的输入;推迟实现观点,尽可能推迟程序的物理实现;强调质量保证观点,每个阶段必须完成规定的文档,每个阶段结束前完成文档以便及早改正错误。
瀑布模型可以说是最早使用的软件生存周期模型之一。由于这个模型描述软件生存的一些基本过程活动,所以它被称为软件生存周期模型。这些活动从一个阶段到另一个阶段逐次下降,形式上很像瀑布。瀑布模型的特点是因果关系紧密相连,前一个阶段工作的结果是后一个阶段工作的输入。
每一个阶段都是建立在前一个阶段的正确结果之上,前一个阶段的错误和疏漏会隐蔽地带入后一个阶段。这种错误有时甚至可能是灾难性的,因此每一个阶段工作完成后,都要进行审查和确认。
优点:
缺点:
适用场合:
又称快速原型模型,是快速建立起来的可以在计算上运行的程序,是软件的一个早期可运行的版本,它的功能是最终产品的子集。用途主要是获取用户的真正的需求。
原型模型主要有两个阶段:
优点:
缺点:
适用场合:
原型是软件系统的初始版本,用来演示概念并尝试设计选择,通常用来发现更多的问题和可能的解决方案。快速迭代式的原型开发能够有效控制成本,根据原型与最终产品之间的关系,原型开发分为三类:
也叫增量模型,其实质上是分段的线性模型,是一种非整体开发模型,渐增模型把软件产品作为一系列增量构件来设计、编码、集成和测试,在项目开发过程中以一系列的增量方式来逐步开发系统。
优点:
缺点:
适用场合:
喷泉一词体现迭代和无间隙特性,迭代是指开发软件系统时,某些部分经常要重复多次,相关功能在每次迭代中随之加入演进的系统。
特点:
螺旋模型是在结合瀑布模型与快速原型模型基础上演变而成,加入风险分析。
软考很恶心的地方在于抠字眼(单选题):
其基本思想,使用原型及其它方法来尽量降低风险。沿着螺线进行若干次迭代。
两个显著特点:
在螺旋模型中,将软件过程表示为一个螺旋线,在螺旋线上的每一个循环表示过程的一个阶段。整个过程的实现按以下四个步骤完成:
适用场合:
缺点:
要求开发人员必须具有丰富的风险评估经验和专门知识
形式化方法是一种具有坚实数学基础的方法,从而允许对系统和开发过程做严格处理和论证,适用于那些系统安全级别要求极高的软件的开发。
主要优越性:能够数学(精确)地表述和研究应用问题及软件实现。
但是它要求开发人员具备良好的数学基础。用形式化语言书写的大型应用问题的软件规格说明往往过于细节化,并且难以为用户和软件设计人员所理解。由于这些缺陷,形式化方法在目前的软件开发实践中并未得到普遍应用。
Cleanroom Software Engineering,CSE。
软件开发的一种形式化方法,使用盒结构规约(或形式化方法)进行分析与设计建模,并将正确性验证作为发现和消除错误的主要机制,采用统计测试来获取验证软件可靠性所需要的信息。CSE强调在规约和设计上的严格性,以及使用基于数学的正确性来证明对设计模型的每个元素进行形式化验证。还强调统计质量控制技术,包括基于客户对软件的预期使用测试。
由三大关键技术来刻画:统计过程控制下的增量开发,基于函数的规范、设计和验证,以及统计测试和认证。
统一过程开发模型,另起一篇,参考软考高级之系统架构师系列之RUP、4+1视图、JAD、JRP、RAD。
结构化分析方法,是一种面向数据流的需求分析方法,其基本思想是自顶向下逐层分解,把一个大问题分解成若干个小问题,每个小问题再分解成若干个更小的问题。经过逐层分解,每个最低层的问题都是足够简单、容易解决。结构化方法分析模型的核心是数据字典,围绕这个核心,有三个层次的模型:数据模型、功能模型和行为模型(状态模型)。在实际工作中,一般用E-R图表示数据模型,用DFD表示功能模型,用状态转换图表示行为模型。这三个模型有着密切的关系,它们的建立不具有严格的时序性,而是一个迭代的过程。
数据流图是进行结构化分析时所使用的模型,其基本成分包括数据流、加工、数据存储和外部实体。在进行结构化设计时,通过对数据流图进行变换分析和事务分析可以导出程序结构图。
结构化分析是结构化方法的重要组成部分,一般要依次进行以下工作:
结构化设计是以结构化分析的数据模型、功能模型和行为模型为基础,完成数据设计、体系结构设计、接口设计和过程设计。
数据设计是把分析阶段创建的信息域模型转变成实现软件所需要的数据结构。可使用Jackson图来表示。
Jackson图和描绘软件结构的层次图形式相近,但是含义却有很大不同:
体系结构设计确定程序的主要结构元素(即程序构件)之间的关系
。可使用HIPO图和Yourdon提出的结构图来表示。
Hierarchy plus Input-Process-Output,层次图加输入/处理/输出图,IBM公司发明。
层次图使用矩形框表示一个模块,用框间的连线表示模块的调用关系。如下图所示:
HIPO图在层次图里把除了顶层的方框之外的每个方框都加上编号,然后再使用一张IPO图描述这个方框代表的模块的处理过程。
IPO图的基本形式是在左边的框中列出输入数据,在中间的框中列出数据处理,在右边的框中列出输出数据。如下图所示:
或者可使用IPO表来表示:
结构图和层次图类似,也是用一个方框代表一个模块,在框内注明模块的名字或主要功能,用方框之间的箭头(或直线)表示模块的调用关系。同时,在结构图中通常还用带注释的箭头表示模块调用过程中来回传递的信息,并且用注释箭头尾部的形状来区分数据信息和控制信息:尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。此外,还可以使用一些附加的符号表示模块的选择调用或循环调用。结构图示例:
接口设计的结果描述软件内部、软件与协作系统之间以及软件与使用它的人之间的沟通方式。接口用于传递数据,数据流图提供接口设计所需要的信息。
过程设计把程序体系结构中的结构元素,变换成对软件构件的过程性描述。过程设计的目标不仅仅是逻辑上正确地实现每个模块的功能,更重要的是设计出的处理过程应该尽可能简明易懂。
过程设计工具有很多种,包括图形、表格和语言3类。
程序流程图又称为程序框图,最熟悉、使用最广泛的工具。但由于程序流程图有很多缺点,如:诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构、不易表示数据结构等,所以很多专家都建议停止使用它。
Nassi和Shneiderman提出的盒图(N-S图)就是一种不允许违背结构程序设计精神的图形工具。
使用盒图可以很容易实现以下目标:
判定表能够非常清晰地表示多重嵌套的条件选择关系。
一张判定表由4部分组成,左上部列出所有条件,左下部是所有可能做的动作,右上部是表示各种条件组合的一个矩阵,右下部是和每种条件组合相对应的动作。如下图所示:
但是当条件变得更多时,判定表会显得很复杂,不够简洁。这时可以使用判定树。
判定树是判定表的变种,以树枝的形式表示复杂的条件组合与应做的动作之间的对应关系。如下图:
判定树比判定表更直观,但简洁性却不如判定表。但是当数据元素的同一个值往往要重复写很多遍,而且越接近树的叶端重复次数越多。
过程设计语言(Program Design Language,PDL)也称为伪码,它使用一种语言(通常是某种自然语言)的词汇,同时却使用另一种语言(某种结构化的程序设计语言)的语法,以表示数据和处理过程。
软件构件是软件系统中具有一定意义的、相对独立的可重用单元。与对象相比,构件可以基于对象实现,也可以不作为对象实现。构件需要在容器中管理并获取容器提供的服务;客户程序可以在运行状态下利用接口动态确定构件所支持的功能并调用。
软件构件是部署、版本控制和替换的基本单位。构件是一组通常需要同时部署的原子构件。原子构件通常成组地部署,但是它也能够被单独部署。构件与原子构件的区别在于,大多数原子构件永远都不会被单独部署,尽管它们可以被单独部署。大多数原子构件都属于一个构件家族,一次部署往往涉及整个家族。一个模块是不带单独资源的原子构件。
构件技术就是利用某种编程手段,将一些人们所关心的,但又不便于让最终用户去直接操作的细节进行封装,同时对各种业务逻辑规则进行实现,用于处理用户的内部操作细节。构件是可复用的软件组成成份,可被用来构造其他软件。它可以是被封装的对象类、类树、一些功能软件工程中的构件模块、软件框架、软件构架(或体系结构)、文档、分析件、设计模式等。
系统构件组装分为三个不同的层次:定制(Customization)、集成(Integration)、扩展(Extension)。
这三个层次对应于构件组装过程中的不同任务。
构件的特性:
一个构件可以包含多个类元素,但是一个类元素只能属于一个构件。将一个类拆分进行部署通常没什么意义。构件的部署必须能跟它所在的环境及其他构件完全分离;构件作为一个部署单元是不可拆分的;在一个特定进程中只能存在一个特定构件的拷贝;对于不影响构件功能的某些属性可以对外部可见。
对象的特性:
基于可重用构件的开发模型利用模块化方法将整个系统模块化,并在一定构件模型的支持下复用构件库中的一个或多个软件构件,通过组合手段髙效率、髙质量地构造应用软件系统的过程。基于构件的开发模型融合螺旋模型的许多特征,本质上是演化形的,开发过程是迭代的。基于构件的开发模型由软件的需求分析定义、体系结构设计、构件库建立、应用软件构建、测试和发布5个阶段组成。
在基于构件的软件开发中:
面向构件的编程(Component-Oriented Programming,COP)关注于如何支持建立面向构件的解决方案。基于一般OOP风格,面向构件的编程需要下列基本的支持:
面向构件的编程仍然缺乏完善的方法学支持。现有的方法学只关注于单个构件本身,并没有充分考虑由于构件的复杂交互而带来的诸多困难,其中的一些问题可以在编程语言和编程方法的层次上进行解决。
构件模型是对构件本质特征的抽象描述。已形成三个主要流派,分别是OMG的CORBA、Sun的EJB和Microsoft的DCOM。这些实现模型将构件的接口与实现进行有效的分离,提供构件交互的能力,从而增加重用的机会,并适应目前网络环境下大型软件系统的需要。
OMG,Object Management Group,对象管理组织,一个国际性非盈利组织,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。
CORBA,Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理架构是软件构建的一个标准。之所以称为抽象的,是因为并没有硬性规定CORBA对象的实现机制。由于独立于程序设计语言和特定ORB产品,一个CORBA对象的引用又称可互操作的对象引用(Interoperable Object Reference)。从客户程序的角度看,IOR中包含对象的标识、接口类型及其他信息以查找对象实现。
CORBA构件模型
CORBA体系结构是OMG为解决分布式处理环境中硬件和软件系统的互连而提出的一种解决方案,CORBA的核心是对象请求代理ORB(Object Request Broker,对象请求代理),它提供对象定位、对象激活和对象通讯的透明机制。客户发出要求服务的请求,而对象则提供服务,ORB把请求发送给对象、把输出值返回给客户。ORB的服务对客户而言是透明的,客户不知道对象驻留在网络中何处、对象是如何通讯、如何实现以及如何执行的,只要他持有对某对象的对象引用,就可以向该对象发出服务请求。CORBA使用IDL(Interface Description Language,接口定义语言)用于描述组件将呈现出来的接口。CORBA又规定从IDL到特定程序语言,如C++或Java,实现的映射。这个映射精确的描述CORBA资料类型是如何被用户端和服务器端实现的。标准映射的有C、C++、Java以及Python。
客户程序通过对象引用发出的请求经过ORB担当中介角色,转换为对特定的伺服对象的调用。在一个CORBA对象的生命期中,它可能与多个伺服对象相关联,因而对该对象的请求可能被发送到不同的伺服对象。
对象标识(Object ID)是一个用于在POA中标识一个CORBA对象的字符串。
它既可由程序员指派,也可由对象适配器自动分配,这两种方式都要求对象标识在创建它的对象适配器中必须具有唯一性。
POA是对象实现与ORB其他组件之间的中介,它将客户请求传送到伺服对象,按需创建子POA,提供管理伺服对象的策略。
OMG基于CORBA基础设施定义四种构件标准:
Enterprise JavaBean,企业级Java组件,EJB是SUN的服务器端组件模型,最大的用处是部署分布式应用程序。凭借Java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB是J2EE的一部分,定义一个用于开发基于组件的企业多重应用程序的标准。
EJB又可分为Session Bean,Entity Bean和Message Driven Bean。
COM:Component Object Model,组件对象模型技术;
Distribute Component Object Model,分布式构件对象模型。
Microsoft的COM定义构件和它们的客户之间互相作用的方式,使得构件和客户端无需任何中介构件就能相互联系。DCOM扩展COM,使其能够支持在局域网、广域网甚至Internet上不同计算机的对象之间的通信。使用DCOM,应用系统就可以在位置上达到分布性,从而满足客户和应用的需求。因为DCOM是COM的无缝扩展,所以可以将基于COM的应用、构件、工具和知识转移到标准化的分布式计算领域中。在做分布式计算时,DCOM处理网络协议的低层次的细节问题,从而使开发人员能够集中精力解决用户所要求的问题。DCOM具有语言无关性,任何语言都可以用来创建COM构件。DCOM具有位置独立性,即DCOM使得构件的位置对用户来说完全透明,用户无需知道构件的具体位置,无论构件是位于客户的同一个进程中,还是位于地球的另一端。在任何情况下,客户连接和调用构件的方法都是一样的。DCOM不仅无需改变源码,而且无需重新编译程序。仅仅使用一个简单的再配置动作,就可以改变构件之间相互连接的方式。
DCOM是一系列微软的概念和程序接口,利用这个接口,客户端程序对象能够请求来自网络中另一台计算机上的服务器程序对象。Microsoft的DCOM扩展COM,使其能够支持在局域网、广域网甚至Internet上不同计算机的对象之间的通讯。使用DCOM,你的应用程序就可以在位置上达到分布性,从而满足客户和应用的需求。
COM+并不是COM的新版本,可以把它理解为COM的新发展,或者为COM更高层次上的应用。COM+的底层结构仍然以COM为基础,它几乎包容COM的所有内容。COM+倡导一种新的概念,它把COM组件软件提升到应用层而不再是底层的软件结构,它通过操作系统的各种支持,使组件对象模型建立在应用层上,把所有组件的底层细节留给操作系统。COM+不再局限于COM的组件技术,它更加注重于分布式网络应用的设计和实现,已经成为Microsoft系统平台策略和软件发展策略的一部分。COM+继承COM几乎全部的优势,同时又避免COM实现方面的一些不足。COM+紧紧地与操作系统结合起来,通过系统服务为应用程序提供全面的服务。
为实现对象重用,COM支持两种形式的对象组装:
COM不支持任何形式的实现继承。COM没有定义或考虑单独的构件从内部如何去实现。构件可以由使用实现继承的类组成。无论何种情况,缺少实现继承并不意味着缺少对重用的支持。为实现对象重用,COM支持两种形式的对象组装:包含(Containment)和聚集(Aggregation)。
包含就是一种简单的对象组装技术,即一个对象拥有指向另一个对象的引用。从概念上来说,前者(称做外部对象)"包含"后者(称做内部对象)。外部对象只是把请求转发给内部对象。转发,就是调用内部对象的方法,以实现对某个外部对象方法的调用。
包含能重用内含于其他构件的实现。特别是,对于使用外部对象的客户程序,包含是完全透明的。调用接口函数的客户无法辨别调用是由提供接口的对象处理,还是被转发给另一个对象处理。如果包含层次较深,或者被转发的方法本身相对简单,包含会存在性能上的问题,晖此COM定义第二类重用形式,即聚集。聚集的基本思想很简单,直接把内部对象的接口引用传给外部对象的客户,而不再转发请求。对此接口的调用将直接到达内部对象,从而省去转发的代价。当然,只有在外部对象不希望截取调用以执行诸如过滤等额外处理时聚集。还有,保持透明性是很重要的,因为外部对象的客户无法辨别哪个特定接口是从内部对象聚集而来的。
敏捷方法是从20世纪90年代开始逐渐引起广泛关注的一些新型软件开发方法,以应对快速变化的需求。敏捷方法的核心思想主要有以下三点:
与UP/RUP相比,敏捷方法的周期可能更短。敏捷方法在几周或几个月的时间内完成相对较小的功能,强调尽早将尽量小的可用的功能交付使用,并在整个项目周期中持续改善和增强,更加强调团队中的高度协作。相对而言,敏捷方法主要适合于以下场合:
与这些相关联的关键成功因素有组织文化必须支持谈判、人员彼此信任、人少但是精干、开发人员所作的决定得到认可、环境设施满足团队成员之间快速沟通的需要。
敏捷宣言,也叫做敏捷软件开发宣言,包括四种核心价值和十二条原则,可以指导迭代的以人为中心的软件开发方法。四个核心价值:
12条原则已经应用于管理大量的业务以及与IT相关项目中,包括BI:
强调用最少纪律约束而仍能成功
eXtreme Programming,极限编程,适用于费用控制严格的公司。提供几款供开发人员模仿的最佳实践:
测试驱动开发,Test-Driven Development。
开发人员地域分布广。这使得它和其他敏捷方法不同,因为一般的敏捷方法都强调项目组成员在同一地点工作。
Feature Driven Development,特性驱动开发,功用驱动开发,将程序员分为首席程序员和类程序员(class owner),致力于短时的迭代,阶段和可见可用的功能。
动态系统开发方法,Dynamic Systems Development Method
Adaptive Software Development,自适应软件开发。三个非核心的、重叠的开发阶段:猜疑、合作和学习
敏捷数据库技术,Agile Database Techniques
精益软件开发,Lean Software Development。
开发和测试相结合,一种典型的测试模型。在V模型中测试过程被加在开发过程的后半部分,包括单元测试、集成测试、系统测试和验收测试。
主要针对事先不能完整定义需求的软件开发,是在快速开发一个原型的基础上,根据用户在调用原型的过程中提出的反馈意见和建议,对原型进行改进,获得原型的新版本,重复这一过程,直到演化成最终的软件产品。演化模型的主要优点是,任何功能一经开发就能进入测试,以便验证是否符合产品需求,可以帮助引导出高质量的产品要求。其主要缺点是,如果不控制地让用户接触开发中尚未稳定的功能,可能对开发人员及永固都会产生负面的影响。