1.3 软件开发规律认识

软件开发的规律——这是任何开发软件的人不能不研究和不能不解决的问题;中国软件开发的规律——这是任何中国开发软件的人不能不研究和不能不解决的问题。应该研究一般软件开发的规律,也应该研究中国软件开发的规律,最后,还应该研究中国商业软件(Commercial Software)的开发规律。

软件和软件开发方法都是发展的,各个历史阶段有各个历史阶段的特点,要求基层程序员了解某种程度上的软件开发的方法,真的有必要吗?因为懂得了全局性的东西,就更会使用局部性的东西;软件测试选择的方法和重点,要按照当时的项目进度、资源、受众、团队水平、人员能力、人员数量去规定。在测试已经相当充分的领域注意不要过分追求100%自动化;学习软件开发的方法,是要用心去想一想才行的。不用心思去想,就不会懂得,一切带原则性的开发方法,都是前人开发过的项目的总结。

1.3.1 软件开发本质

从某种角度来说,软件开发的本质就是要实现“高层概念”到“低层概念”的映射,实现“高层处理逻辑”到“低层处理逻辑”的映射。对于大型软件系统的开发,这一映射是相当复杂的,涉及有关人员、使用的技术、采取的途径,以及成本和进度的约束,因此,可以把软件工程定义为:软件工程(Software Engineering)是应用计算机科学理论和技术及工程管理原则和方法,按照预算和进度,实现满足用户要求的软件产品的定义、开发、发布和维护的工程或以之为研究对象的学科。

软件工程框架可以概括为如图1-5所示的内容。

图1-5 软件工程框架

1.3.2 软件工程活动

软件工程活动是“生产一个最终满足用户需求且达到工程目标的软件产品所需要的步骤”,主要包括需求、设计、实现、确认及支持等活动。需求活动是在一个抽象层上建立系统模型的活动,该活动的主要产品是需求规约,是软件开发人员和客户之间契约的基础,是设计的基本输入。设计活动定义实现需求规约所需的结构,该活动的主要产品包括软件体系结构、详细的处理算法等。实现活动是设计规约到代码转换的活动。验证/确认是一项评估活动,贯穿于整个开发过程,包括动态分析和静态分析。主要技术有模型评审、代码“走查”及程序测试等。维护活动是软件发布之后所进行的修改,包括对发现错误的修正、对环境变化所进行的必要调整等。

软件工程学科所研究的内容主要包括:软件开发范型、软件设计方法、工程支持技术和工程管理技术。其中,软件开发范型涉及软件工程的“方向”问题,研究正确的求解软件的计算逻辑;软件设计方法涉及软件工程的“途径”问题,研究“高层概念模型和处理逻辑”到“低层概念模型和处理逻辑”的映射;工程支持技术和过程管理技术涉及工程过程质量和产品质量问题,研究管理学理论在软件工程中的应用。

综上所述,软件开发就是实施了一个从“高层概念模型”到“低层概念模型”的映射,从“高层处理逻辑”到“低层处理逻辑”的映射,而且在这一映射中还涉及人员、技术、成本、进度等要素,那么就必须研究映射模式即软件生产模式问题。

1.3.3 软件构造特性

分析传统产业的发展,其基本模式均是符合标准的零部件(构件)生产,以及基于标准构件的产品生产(组装),其中,构件是核心和基础,“复用”是必须的手段。实践表明,这种模式是软件开发工程化、软件生产工业化的必由之路。因此,软件产业的发展并形成规模经济,标准构件的生产和构件的复用是关键因素。

实现软件复用的关键因素(技术和非技术因素),如图1-6所示,主要包括:软件构件技术(Software Component Technology)、领域工程(Domain Engineering)、软件构架(Software Architecture)、软件再工程(Software Reengineering)、开放系统(Open System)、软件过程(Software Process)、CASE技术等,以及各种非技术因素,且各种因素是相互联系、相互影响的。

图1-6 实现软件复用的关键因素

近年来人们认识到,要提高软件开发效率,提高软件产品质量,必须改变手工作坊式的开发方法,采取工程化的开发方法和工业化的生产技术。

青鸟工程于“七五”期间,已提出了软件生产线的概念和思想,其中将软件的生产过程分成3类不同的生产车间,即应用构架生产车间、构件生产车间和基于构件、构架复用的应用集成组装车间。

由上述软件生产线概念模式图中可以看出,在软件生产线中,软件开发人员被划分为3类:构件生产者、构件库管理者和构件复用者。这3种角色所需完成的任务是不同的,构件复用者负责进行基于构件的软件开发,包括构件查询、构件理解、适应性修改、构件组装及系统演化等。

在青鸟软件生产线中,软件的生产过程(如图1-7所示)划分为三类不同的生产车间,即应用构架生产车间、构件生产车间和基于构件、构架复用的应用集成(组装)车间,从而形成软件产业内部的合理分工,实现软件的工业化生产。软件开发人员被划分成三类:构件生产者、构件库管理者和构件复用者。这三种角色所需完成的任务是不同的,构件生产者负责构件的生产、描述;构件库管理者负责构件分类及构件库的管理工作;构件复用者负责进行基于构件的软件开发,包括构件查询、构件理解、适应性修改、构件组装及系统演化。

图1-7 软件生产线生产过程模型

软件生产线以软件构件/构架技术为核心,其中的主要活动体现在传统的领域工程和应用工程中,但赋予了它们新的内容,并且通过构件管理、再工程等环节将它们有机地衔接起来。另外,软件生产线中的每个活动皆有相应的方法和工具与之对应,并结合项目管理、组织管理等问题,形成完整的软件生产流程。

1.3.4 软件开发质量与效率

软件质量,是指软件系统或系统中的软件部分的质量,即满足用户需求,包括功能需求和性能需求的程度。

在实际的项目质量管理中,质量管理总是围绕着质量保证(QualityAssurance)过程和质量控制(Quality Control)过程两方面。这两个过程相互作用,在实际应用中还可能会发生交叉。

软件质量保证(SQA)是建立一套有计划,有系统的方法,来向管理层保证拟定出的标准、步骤、实践和方法能够正确地被所有项目所采用。

软件质量保证的目的是使软件过程对于管理人员来说是可见的。它通过对软件产品和活动进行评审和审计来验证软件是合乎标准的。软件质量保证组在项目开始时就一起参与建立计划、标准和过程。这些将使软件项目满足机构方针的要求。

国外很多的大公司中,QA的职责就是测试(主要是系统测试),如IBM,CA,PeopleSoft等。其实在最初,几乎所有的公司都是这样的。后来,由于缺乏有效的项目计划和项目管理,留给系统测试的时间很少。另外,需求变化太快,没有完整的需求文档,测试人员就只能根据自己的想象来测试。这样一来,测试就很难保障产品的质量,事先预防的QA职能就应运而生。事先预防其实是借鉴了TQM的思想,而且也符合软件工程“缺陷越早发现越早修改越经济”的原则。

目前,实施CMM的企业越来越多了。CMM模型就要求建立QA角色。这里的QA类似于过程警察,主要职责是,检查开发和管理活动是否与已定的过程策略、标准和流程一致,检查工作产品是否遵循模板规定的内容和格式。在这些企业中,一般还要求QA独立于项目组,以保障评价的客观性。

从某种程度上说,独立的QA审查机制是瀑布模型的产物。随着现代软件开发技术的演变,螺旋模型和迭代模型的兴起,QA机制正在悄然发生变化。这种变化就是从独立专职的QA向贯穿过程的兼职QA演变。在CMMI模型中,这种兼职的QA也是被允许的。为什么会发生这种改变呢?无论是XP,RUP还是其他先进的方法论,都是先产生架构,然后再增量开发,直到完成。这种模式中,需求和设计缺陷在各个迭代周期被所尽早发现和修复,质量也内建于架构和过程中,项目的成本和进度也得到保障。到以后,是不是独立的QA就不复存在了呢?有些成熟度较低的企业还是需要的,主要是保证过程执行的有效性和评价的客观性。

选择和确定SQA活动这一过程的目的是策划在整个项目开发过程中所需要进行的质量保证活动。质量保证活动应与整个项目的开发计划和配置管理计划相一致。一般把该活动分为以下5类。

(1)评审软件产品、工具与设施

软件产品常被称为“无形”的产品。评审时难度更大。在此要注意的一点是:在评审时不能只对最终的软件代码进行评审,还要对软件开发计划、标准、过程、软件需求、软件设计、数据库、手册及测试信息等进行评审。评估软件工具主要是为了保证项目组采用合适的技术和工具。评估项目设施的目的是保证项目组有充足设备和资源进行软件开发工作。这也为规划今后软件项目的设备购置、资源扩充、资源共享等提供依据。

(2)SQA活动审查的软件开发过程

SQA活动审查的软件开发过程主要有:软件产品的评审过程、项目的计划和跟踪过程、软件需求分析过程、软件设计过程、软件实现和单元测试过程、集成和系统测试过程、项目交付过程、子承包商控制过程、配置管理过程。特别要强调的是,为保证软件质量,应赋予SQA阻止交付某些不符合项目需求和标准产品的权利。

(3)参与技术和管理评审

参与技术和管理评审的目的是为了保证此类评审满足项目要求,便于监督问题的解决。

(4)做SQA报告

SQA活动的一个重要内容就是报告对软件产品或软件过程评估的结果,提出改进建议,并将其评估的结果文档化。

(5)做SQA度量

SQA度量即记录花费在SQA活动上时间、人力等数据。通过大量数据的积累、分析,可以使企业领导对质量管理的重要性有定量的认识,有利于质量管理活动的进一步开展。

并不是每个项目的质量保证过程都必须包含上述这些活动或仅限于这些活动,要根据项目的具体情况来定。

SQA计划中必须明确定义在软件开发的各个阶段是如何进行质量保证活动的。它通常包含以下内容:质量目标;定义每个开发阶段的开始和结束边界;详细策划要进行的质量保证活动;明确质量活动的职责;SQA组的职责和权限;SQA组的资源需求,包括人员、工具和设施;定义由SQA组执行的评估;定义由SQA组负责组织的评审;SQA组进行评审和检查时所参见的项目标准和过程,需要SQA组产生文档。

选择合适的SQA工具并不是试图通过选择SQA工具来保证软件产品的质量,而是用以支持SQA的活动。在选定SQA工具时,首先需要明确质量保证目标。根据目标制定选择SQA工具的需求并文档化,包括对平台、操作系统,以及SQA工具与软件工程平台接口的要求等。

软件质量控制主要为发现和消除软件产品的缺陷。对于高质量的软件来讲,最终产品应该尽可能达到零缺陷。而软件开发是一个以人为中心的活动,所以出现缺陷是不可避免的。因此,要想交付一个高质量的软件,消除缺陷的活动就变得很重要。缺陷消除是通过“评审”和“测试”这类质量控制活动来实现的。

缺陷在软件开发的任何阶段都可能会被引入。项目质量管理过程包含了许多可以识别缺陷、消除缺陷的过程。“识别缺陷”和“消除缺陷”本来是两个不同的过程,但在这里为了简便统一用“消除”来代表它们。潜在的缺陷越大,用来消除它所花的费用越高。因此成熟的软件开发过程在每一个可能会引入潜在缺陷的阶段完成之后都会开展质量控制活动。这些为了消除缺陷的活动包括:需求评审、设计评审、代码走查、单元测试、集成测试、系统测试及验收测试等。

质量控制的任务就是策划可行的质量管理活动,然后正确地执行和控制这些活动以保证绝大多数的缺陷可以在开发过程中被发现。

正如前面提到的,在进行评审和测试时可检测到缺陷。评审是面向人的过程,测试是运行软件(或部分软件)以便发现缺陷。在一个项目里,评审和测试活动是预先策划好的(计划书中确定执行哪些质量控制活动和何时执行这些活动)。在执行过程中,根据已定义好的过程来执行这些活动。通过执行这些活动来识别缺陷,然后消除这些缺陷。例如,系统测试过程一般包括制定测试计划,测试计划中应列出在测试执行过程中所有的测试用例,评审测试计划,并且最终执行测试计划。

1.3.5 软件项目管理

软件项目管理是为了使软件项目能够按照预定的成本、进度、质量顺利完成,而对人员(People)、产品(Product)、过程(Process)和项目(Project)进行分析和管理的活动。

软件项目管理的根本目的是为了让软件项目尤其是大型项目的整个软件生命周期(从分析、设计、编码到测试、维护全过程)都能在管理者的控制之下,以预定成本按期、按质地完成软件交付用户使用。而研究软件项目管理为了从已有的成功或失败的案例中总结出能够指导今后开发的通用原则、方法,同时避免前人的失误。

软件项目管理的提出是在20世纪70年代中期的美国,当时美国国防部专门研究了软件开发不能按时提交,预算超支和质量达不到用户要求的原因,结果发现70%的项目是因为管理不善引起的,而非技术原因。于是软件开发者开始逐渐重视起软件开发中的各项管理。到了20世纪90年代中期,软件研发项目管理不善的问题仍然存在。据美国软件工程实施现状的调查,软件研发的情况仍然很难预测,大约只有10%的项目能够在预定的费用和进度下交付。

1995年,据统计,美国共取消了810亿美元的商业软件项目,其中31%的项目未做完就被取消,53%的软件项目进度通常要延长50%的时间,只有9%的软件项目能够及时交付,并且费用也控制在预算之内。

软件项目管理和其他的项目管理相比有相当的特殊性。首先,软件是纯知识产品,其开发进度和质量很难估计和度量,生产效率也难以预测和保证。其次,软件系统的复杂性也导致了开发过程中各种风险的难以预见和控制。Windows这样的操作系统有1500 万行以上的代码,同时有数千个程序员在进行开发,项目经理都有上百个。这样庞大的系统如果没有很好的管理,其软件质量是难以想象的。

软件项目管理的内容主要包括如下几个方面:人员的组织与管理、软件度量、软件项目计划、风险管理、软件质量保证、软件过程能力评估、软件配置管理等。这几个方面都是贯穿、交织于整个软件开发过程中的,其中人员的组织与管理把注意力集中在项目组人员的构成、优化;软件度量把关注用量化的方法评测软件开发中的费用、生产率、进度和产品质量等要素是否符合期望值,包括过程度量和产品度量两个方面;软件项目计划主要包括工作量、成本、开发时间的估计,并根据估计值制定和调整项目组的工作;风险管理预测未来可能出现的各种危害到软件产品质量的潜在因素并由此采取措施进行预防;质量保证是保证产品和服务充分满足消费者要求的质量而进行的有计划,有组织的活动;软件过程能力评估是对软件开发能力的高低进行衡量;软件配置管理针对开发过程中人员、工具的配置、使用提出管理策略。

1.3.6 软件过程管理

软件过程(Software Process)是指一套关于项目的阶段、状态、方法、技术和开发、维护软件的人员及相关Artifacts(计划、文档、模型、编码、测试、手册等)组成。目前有3种方法:UP(The Unified Process),The OPEN Process,OOSP(The Object-Oriented Software Process)。

软件过程(Software Procedure)是指软件生存周期所涉及的一系列相关过程。过程是活动的集合;活动是任务的集合;任务要起着把输入进行加工然后输出的作用。活动的执行可以是顺序的、重复的、并行的、嵌套的或是有条件地引发的。

软件过程可概括为3类:基本过程类、支持过程类和组织过程类。基本过程类包括获取过程、供应过程、开发过程、运作过程、维护过程和管理过程。支持过程类包括文档过程、配置管理过程、质量保证过程、验证过程、确认过程、联合评审过程、审计过程及问题解决过程。组织过程类包括基础设施过程、改进过程及培训过程。

软件过程主要针对软件生产和管理进行研究。为了获得满足工程目标的软件,不仅涉及工程开发,而且还涉及工程支持和工程管理。对于一个特定的项目,可以通过剪裁过程定义所需的活动和任务,并可使活动并发执行。与软件有关的单位,根据需要和目标,可采用不同的过程、活动和任务。

有效的软件过程可以提高组织的生产能力:

① 理解软件开发的基本原则,可以帮人们做出明智的决定;

② 可以标准化你的工作,提高软件的可重用性和Team间的协作;

③ 人们所采用的这种机制本身是不断提高的,可以跟上潮流,使自己不断接收新的、最好的软件开发经验。

有效的软件过程可以改善人们对软件的维护:

① 有效地定义如何管理需求变更,在未来的版本中恰当分配变更部分,使之平滑过渡;② 首先在具体操作和相关支持中定义如何平滑地改造软件,并且这种具体操作和支持是可实施的,不可实施的软件过程将很快被束之高阁。

CMM(Capability Maturity Modeling)对实施软件过程的必要条件做出了明确的定义,并划分了5个成熟等级。

(1)第一级:初始级

在初始级,企业一般不具备稳定的软件开发与维护的环境。常常在遇到问题的时候,就放弃原定的计划而只专注于编程与测试。处于这一等级的企业,成功与否在很大程度上决定于有杰出的项目经理与经验丰富的开发团队。因此,能否雇到能干的员工成了关键问题。项目成功与否非常不确定。虽然产品一般来说是可用的,但是往往有超经费与不能按期完成的问题。

(2)第二级:可重复级

在这一级,建立了管理软件项目的政策,以及为贯彻执行这些政策而定的措施。基于以往的项目的经验来计划与管理新的项目。企业实行了基本的管理控制。符合实际的项目承诺是基于以往项目及新项目的具体要求而做出的。项目经理不断监视成本、进度和产品功能,及时发现及解决问题以便实现所做的各项承诺。

通过具体地实施这一级的各个关键过程领域的要求,企业实现了过程的规范化、稳定化。因而,曾经取得过的成功成为可重复达到的目标。

(3)第三级:定义级

在这一级,有关软件工程与管理工程的一个特定的,面对整个企业的软件开发与维护过程的文件将被制订出来。同时,这些过程是集成到一个协调的整体。这就称为企业的标准软件过程。这些标准的过程是用于帮助管理人员与一般成员工作得更有效率。如果有适当的需要,也可以加以修改。在这个把过程标准化的努力当中,企业开发出有效的软件工程的各种实践活动。同时,一个在整个企业内施行的培训方案将确保工作人员与管理人员都具备他们所需要的知识与技能。

非常重要的一点是,项目小组要根据该项目的特点去改编企业的标准软件过程来制订出为本项目而定义的过程。

一个定义得很清楚的过程应当包括:准备妥当的判据、输入、完成工作的标准和步骤、审核的方法、输出和完成的判据。因为过程被定义得很清楚,因此管理层就能对所有项目的技术过程有透彻的了解。

(4)第四级:定量管理级

在这一级,企业对产品与过程建立起定量的质量目标,同时在过程中加入规定得很清楚的连续的度量。作为企业的度量方案,要对所有项目的重要的过程活动进行生产率和质量的度量。软件产品因此具有可预期的高质量。

一个企业范围的数据库被用于收集与分析来自各项目的过程的数据。这些度量建立起了一个评价项目的过程与产品的定量的依据。项目小组可以通过缩小他们的效能表现的偏差使之处于可接受的定量界限之内,从而达到对过程与产品进行控制的目的。

因为过程是稳定的和经过度量,所以在有意外情况发生时,企业能够很快辨别出特殊的原因并加以处理。

(5)第五级:(不断)优化级

在这个等级,整个企业将会把重点放在对过程进行不断的优化。企业会采取主动去找出过程的弱点与长处,以达到预防缺陷的目标。同时,分析有关过程的有效性的资料,做出对新技术的成本与收益的分析,以及提出对过程进行修改的建议。整个企业都致力于探索最佳软件工程实践的创新。

项目小组分析引起缺陷的原因,对过程进行评鉴与改进,以便预防已发生的缺陷再度发生。同时,也把从中学到的经验教训传授给其他项目。

降低浪费与消耗也是这个等级的一个重点。

处于这一等级的企业的软件过程能力可被归纳为不断的改进与优化。它们以两种形式进行。一种是逐渐地提升现存过程,另一种是对技术与方法的创新。虽然在其他的能力成熟度等级之中,这些活动也可能发生,但是在优化级,技术与过程的改进是作为常规的工作一样,有计划地在管理之下实行的。