中国软件架构师网软件高端人才修炼系列企业级应用软件架构开发过程与实践第二章版本0.5胡协刚首席软件架构师szjinco@public.szptt.net.cn©中国软件架构师网,2006Page2of40目录第一章软件与软件的特性——从业务上下文出发的软件图景..............................................................3第二章软件工程基本原理——软件开发中的方法论..............................................................................4第一节问题解决规律与工程学方法——软件开发的方法(理)论框架基础...................................5问题解决................................................................................................................................................5解决复杂问题与方法论.........................................................................................................................7工程问题与工程学方法.......................................................................................................................10第二节软件工程与软件过程——人类迄今为止最复杂的问题解决过程.........................................14软件工程..............................................................................................................................................14软件过程..............................................................................................................................................16软件过程的表述..................................................................................................................................18软件过程的基本组成要素...................................................................................................................19软件过程科目discipline......................................................................................................................20科目下的工作流workflow..................................................................................................................20工作流明细workflowdetails...............................................................................................................21软件生命期模型..................................................................................................................................22以阶段为单位组合工作流...................................................................................................................24第三节软件过程能力成熟度模型——CMMI模型下的软件组织活动全景视图.............................27软件过程的执行步骤..........................................................................................................................27SW-CMM/CMMI过程体系................................................................................................................31CMMI的过程成熟度等级..................................................................................................................34CMMI的过程域..................................................................................................................................37本章小节..............................................................................................................................................39©中国软件架构师网,2006Page3of40第一章软件与软件的特性——从业务上下文出发的软件图景软件是人类有史以来创造的一种非常特别的制品,它具备与传统制品完全不同的特性。由于软件最初的形态只是用于科学计算的简单程序,这使得人们(特别是刚刚学习编程的初学者)往往倾向于将软件看作是一种相对独立的事物。传统软件工程也是从软件需求开始来阐述软件的生命周期,并给人一种错觉,即软件需求早就存在于用户那里,我们要做的只是去发现它们(需求获取)。这使得人们常常忽略一个简单的事实——软件是为了支持客户的业务(或解决领域问题)而被开发的(需求规格是被开发出来的,换句话说是被设计出来的),其内在特性受其上下文的制约,甚至就是上下文的一种直接反映。我们在研究软件的时候,不能脱离于它的上下文,例如软件的复杂性根本上源至其问题域的复杂性。只有从业务(问题域)上下文入手,我们才能真正看到软件的真实图景。本章试图从一个更为广泛的视角,来分析软件、还有软件的特性;而软件及其架构的开发策略与方法的研究,则始于人们对软件自身特性所引发的固有问题的一种解决努力。©中国软件架构师网,2006Page4of40第二章软件工程基本原理——软件开发中的方法论人们从事的大部分有意义活动,都可以归纳为一种问题解决的过程,软件开发也不例外。思维学家们做了大量的研究来帮助人们提高问题解决的能力,认知学、方法论等都属于这方面的成果。软件被用来解决领域问题,它实际上包含了两个“问题解决”过程。一是,如何使用软件来解决业务问题;二是,如何开发出这个能解决业务问题的软件交付。我们当然更为关注后者。当前软件的规模、复杂度已经大到迫使人们必须采用团队模式来组织开发,而人类以往的成功经验是以工程的方式来组织团队协作;另外,软件有其特殊的地方,因此我们需要改造传统工程方式来适应软件的开发——这便是软件工程的由来。要将软件交付开发出来,不是单个的方法或步骤所能办到的,这涉及到一系列的活动、方法等,而有序的软件开发活动序列便是软件过程。本章试图从人类解决复杂问题的基本途径入手,一步步来分析软件开发的基本方法,进而导出软件工程的基本框架,最后引入软件过程的体系概念。©中国软件架构师网,2006Page5of40第一节问题解决规律与工程学方法——软件开发的方法(理)论框架基础澄清了软件的上下文与本质特性,理解了软件的各种质量属性,并将它们设定为软件开发的目标;接下来,我们面临的挑战是如何去开发软件。软件被用来解决人们的业务或领域问题,开发软件的过程就是去获得解决业务问题结果的过程。人类在问题解决规律研究方面已经有大量的现成成果;传统的问题解决步骤,实际上为软件开发(解决软件问题)提供了现成的(战略级的)理论方法框架。现代的软件工程技术,其基础实际上就建立在这些问题解决规律之上。问题解决我们先从最基本的问题解决步骤入手,接下来考察复杂问题如何解决,然后将关注点转向工程类问题,并最终推导出如何解决软件问题的基本途径。问题解决是思维的一种形式;当个人或组织不知道如何从已知条件得到目标(期望结果)的时候,“解决问题”这一智力活动便开始了。对于普通的单一问题,我们可以将“解决问题”的过程简单地抽象为如下步骤:识别与澄清问题收集相关信息分析问题和评估已有信息考虑各类解决方案选项与结论选择并实施最佳解决方案如问题没能被解决,则再次尝试(下一轮解决周期)©中国软件架构师网,2006Page6of40图2.1问题解决流程示意图z识别与澄清问题——在解决问题之前必须先确定问题是什么;有时候问题并非那么显而易见,而是充满了模糊与矛盾,因此还必须去伪存真,澄清问题的实质所在。软件充满了不确定性、模糊与矛盾,而且人们对待软件的态度偏于主观;很多时候,找出正确的软件问题并不像人们想象的那么容易。例如,曾经有客户需要开发一套监控软件,用于监视其业务系统的运作状况,包括实时显示被监控系统的cpu占用率等。让开发组苦恼的是,客户要求必须采用B/S(浏览器客户端/服务器)架构,而在B/S架构下实现较为复杂的图形化界面是代价非常高昂的。本案例中的客户显然并没有搞清楚他的真正问题是什么:这套监控软件并不会被多人使用,因此不存在部署与升级的麻烦;因为安全的原因,客户也不期望能从外部跨越internet网来使用本软件。这样,在此软件上采用B/S架构将不会带来任何明显的好处,相反却要付出更大的成本。B/S架构的优势在于近乎零成本的部署与升级能力,以及使用了能穿透防火墙的http协议。z收集相关信息——对问题相关的信息了解越多,就越有助于人们认识和解决问题。一个有经验的软件工程师,在开始开发软件(包括定义需求)之前,会先去了解相关的业务领域知识,并尽力去寻找业界在此领域的通行做法和常用技术。通过收集相关信息,他甚至可能找到现成的架构方案,或者找到直接可用的开放源码。z分析问题和评估已有信息——问题本身有时并非那么简单明了,还需要进一步进行分解,并分别被深入思考;收集到的信息,则需要归纳分类,评估其准确度、相关性与可利用价值;最后,应当建立起这些信息与问题之间的关联,方便人们从中找到解决的线索。软件非常复杂,其所要解决的业务及领域问题,通常涉及到客户、用户的多