![]() |
|
|
“今天,我比以往更加确信,概念的完整性是产品质量的核心。……这个原理决不仅限于软件系统,它适合于所有的复杂事物。” ——Brooks《人月神话》 “模型可以澄清相互间的关系,识别出关键元素,有意识地减少可能引起的混淆。” ——Forsberg,K.《可视化项目管理》 软件工程内容广泛,新技术新热点层出不穷。如何快速掌握软件工程新技术,以及如何对众多软件工程技术综合运用,以取得最佳的实践效果,已经成为很现实的问题。本文认为,通盘把握软件工程概念模型,将对解决上述问题大有裨益。 一、什么是软件工程概念模型 模型就是抽象,就是有意识地忽略事物的某些特征。抽象带来的好处是能够反映模型中元素之间的关系,清晰把握大局。 概念模型是模型的一种,简单说就是抽象程度极高的一种模型。 软件工程概念模型是对软件工程领域进行抽象描述的模型,它能够使我们对软件工程有一个完整把握。 二、一个精简的软件工程概念模型 《软件工程——技术、方法与环境》一书中,有一个极为精简的软件工程概念模型:
· 任何目标,都要依照特定方法,由特定活动实现; · 任何方法,都是指导特定活动,来完成某种目标;
其实图中还包含了其它一些信息。比如,“方法”和“工具”是多对多关系:一种“方法”可以采用多种“工具”(比如画Use Case图可以采用Visio、Rose等多种工具),一种“工具”也可支持多种“方法”(比如Visio可以画流程图、UML图等多种图)。 又比如,“方法”和“过程”是多对多关系:一种“方法”可以被多种“过程”采用(比如CRC卡方法可以被RUP、XP等多种过程采用),一种“过程”也可采用多种“方法”(比如RUP可以采用OO建模、结构化建模等多种方法)。 篇幅所限,恕不一一列举。 四、软件工程概念模型的具体应用 下面再举几个具体的例子,以说明软件工程概念模型在快速学习、正确理解和深入掌握软件工程技术方面的作用。 1、搞清楚Agile是过程还是方法论 当前,“Agile过程”和“Agile方法论”的说法都很流行,令初学者相当迷惑。下面根据软件工程概念模型的知识,来弄清这个问题。 好的开始是成功的一半,我要做的第一步就是先推翻“Agile是过程还是方法论”这个问法,改问“Agile是过程、开发方法论还是过程方法论”。 第二步,分析《Agile Software Development》一书中给出的Agile模型: 通过对模型的分析,可以看出它是对过程建模: ·如果去掉人和团队的因素,上面的模型最主要的要素就是过程(Process)、活动(Activities)、产品(Products)和技术(Techniques)了,这显然是个过程的模型。 · 上面的模型中有相当多的和人相关的要素,包括角色(Roles)、技能(Skills)、个性(Personality)、团队(Teams),对人的因素的极其重视,正是Agile过程的显著特点。 · Agile过程是面向人的(people-oriented)过程,实施Agile过程的一个关键之处是让人“接受”一个过程而非“强加”一个过程。 我准备提前下结论了——谈过程哪能不谈它背后的方法论呢——Agile是有它自己的过程方法论的过程。 2、为CMM定位 CMM是一个大家关注已久的话题,CMM标准的提法颇为流行,下面笔者换个角度,根据软件工程概念模型的探讨,将CMM定位为“过程开发与改进的需求和测试方案”。 CMM是软件过程开发的需求: · 关键实践描述了应当“做什么”,而不是强制规定“如何做”;关键实践的描述就是过程开发的需求项。 · 关键实践被分组,成为一些关键过程域。相当于需求项的分组,便于管理。 · 关键过程域的实施都是为了达到一定的目的,从需求的层次角度(请参考Wiegers著陆丽娜译《软件需求》一书),可将“目的”理解为“业务需求”,将关键过程域理解为“用户需求”,前者由后者来实现。 · CMM通过定义的这些关键实践和关键过程域,覆盖了我们要开发的软件过程的主要目的(比如需求管理、产品工程)。 CMM是软件过程开发的测试方案: · 从原理上,需求就是测试依据。软件工程中的一条基本原理就是:依据需求进行测试。 · 从实施上,我们通常依据需求来编写测试用例,然后执行这些测试用例。 · Brain Marick更是表述了他的具有革命性的观点:“我并不想写出一套用于捕捉用户愿望的需求,取而代之的是,我要写出一套测试,一旦这些测试能够通过,产品就能使她满意。”尽显大师风范。 · CMM提供的大量提问单,和测试用例的概念对应得很完美,我们通过这些提问单就可以轻松测试出每一个关键实践进行得怎么样,进一步测试出每个关键过程域完成得如何,该组织的软件过程的能力成熟度有多高。 3、理解RUP定制 RUP是著名的软件过程产品,包含了相当优秀的思想,比如: · 为了使风险最小化,RUP引入阶段概念和迭代开发模型,以便给开发者足够多的机会,在付出太多代价之前放弃或调整开发。 · 为了使并行最大化,RUP引入工作流的概念,工作流是相关活动的集合,不仅工作流之间也是并行,工作流内部的活动也是可以并行的。 然而,根据具体的实践情况不同,使用RUP前应当对其进行适当定制。 “RUP定制”属于“过程开发与改进”中的“过程开发”,而且严格来讲,是“过程开发的再工程”。再工程(reengineering)是对现有软件系统或软件过程的重新开发过程,包括逆向工程、新需求的考虑和正向工程三个步骤。 值得一提的是,“RUP定制”既可以是“RUP剪裁”,也可以是“RUP扩充”。RUP剪裁大家讨论的比较多了,有兴趣的读者可以阅读本文参考文献中所列的《RUP的剪裁原理和剪裁过程》一文。 著名的RUP扩充的例子有: · Ronin International公司将RUP扩充成为EUP。 · 再比如爱立信在RUP的基础上进行扩充,开发出ERUP作为公司范围内的框架结构。 五、软件工程概念模型的启示 1、软件工程,一门实践的科学 通过对软件工程概念模型的研究,强烈地感觉到,软件工程是一门实践的科学——它的出发点和最终目的是指导实践。基于此,我们至少应当注意2点: · 从时间上,实践是发展的,基于实践的软件工程学科也必然是发展的,比如近几年,软件工程领域的发展就相当大。我们必须意识到这一点,不断学习新知识,才能适应软件实践的需要。Roger S. Pressman说:“软件工程将发生变化——对此我们可以肯定。” · 从内容上,软件实践的差异是巨大的,我们不能生搬硬套。正如Alistair Cockburn所说:“不同的项目需要不同的方法”。 2、软件过程,合适的才是最好的 据我所知,好的软件过程在不少人的脑子里,是一个“越……越……”的答案。比如,文档越多越好,分工越细越好,控制粒度越小越好,等等。还有,人们认为好的软件过程是可以照搬使用的,我听到过类似“我在某某大公司都是……”的抱怨。 其实通过软件工程概念模型的探讨,我们可以看到,软件过程是整个模型很多节点中的一个而已,这意味着软件过程和很多因素有着影响、被影响的关系: · 软件类型、软件规模、软件重要程度、开发人员素质、管理和支持人员素质、合作单位素质等,都是影响软件过程制定的因素。 · 而且,且不可单纯认为软件过程仅仅涉及到开发人员,用户、合同确定者、投标者、项目管理者等,都可以成为软件过程的“涉众”;也就是说,他们都可能是待开发的软件过程的用户,应当收集他们对软件过程的要求。 3、对个人的启示 分析了软件工程概念模型,可以看出,从某种角度,可以认为软件产品是多种技术协作的结果。技术的协作最终表现为个人的协作,软件工程概念模型对个人有何启示呢? · 明了自己知道的和不知道的,尊重他人,是一个团队的必要基础。 · 注重团队成员间技术的互补性和全面性。 4、呼唤高层次人才 看着模型,想着近年来国际上软件工程的巨大发展,深感国内在软件工程领域的落后,“透过变化看趋势、透过技术抓原理、把握软件工程发展脉搏”的高层次人才太少。 我辈尚需努力。
上一篇:CMMI模型对软件测试技术的扩充 下一篇:软件工程辩证法
|