16软件工程导论 (2)每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正错误。 事实上,越是早期阶段犯下的错误,暴露出来的时间就越晚,排除故障改正错误所需付出 的代价也越高。因此,及时审查,是保证软件质量、降低软件成本的重要措施」 传统的瀑布模型过于理想化了,事实上,人在工作过程中不可能不犯错误。在设计阶 段可能发现规格说明文档中的错误,而设计上的缺陷或错误可能在实现过程中显现出来 在综合测试阶段将发现需求分析、设计或编码阶段的许多错误。因此,实际的瀑布模型是 带“反馈环”的,如图1.3所示(图中实线箭 头表示开发过程,虚线箭头表示维护过 需求分析 变化的需求 拉证 程)。当在后面阶段发现前面阶段的错误 验证 时,需要沿图中左侧的反馈线返回前面的 阶段,修正前面阶段的产品之后再回来联 续完成后面阶段的任务 瀑布模型有许多优点:可强泊开发人 员采用规范的方法(例如,结构化技术): 严格地规定了每个阶段必须提交的文档 要求每个阶段交出的所有产品都必须经过 质量保证小组的仔细验证 各个阶段产生的文档是维护软件产品 时必不可少的,没有文档的软件几乎是不 可能维护的。遵守瀑布模型的文档约束, 将使软件维护变得比较容易一些。由于绝 大部分软件预算都花费在软件维护上,因 此,使软件变得比较容易维护就能显著降 低软件预算。可以说,瀑布模型的成功在 图1.3实际的澡布模型 很大程度上是由于它基本上是一种文档驱动的模型 但是,“摆布模型是由文挡驱动的”这个事实也是它的一个主要缺点。在可运行的 软件产品交付给用户之前,用户只能通过文档来了解产品是什么样的。但是,仅仅通 过写在纸上的静态的规格说明,很难全面正确地认识动态的软件产品。而且事实证 明,一旦一个用户开始使用一个软件,在他的头脑中关于该软件应该做什么的想法就 会或多或少地发生变化,这就使得最初提出的需求变得不完全适用了。事实上,要求 用户不经过实践就提出完整准确的需求,在许多情况下都是不切实际的。总之,由于 瀑布模型几乎完全依赖于书面的规格说明,很可能导致最终开发出的软件产品不能真 正满足用户的需要 下一小节将介绍快速原型模型,它的优点是有助于保证用户的真实需要得到满足。 1.4.2快速原型模型 所谓快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往 往是最终产品能完成的功能的一个子集。如图1.4所示(图中实线箭头表示开发过程,虚 www.TopSage.com
www.TopSage.com
第1章软件工程学概述 线箭头表示维护过程),快速原型模型的第一步是快速建立一个能反映用户主要需求的原 型系统,让用户在计算机上试用它,通过实践来了解目标系统的概貌。通常,用户试用原 型系统之后会提出许多修改意见,开发人员按照用户的意见快速地修改原型系统,然 后再次请用户试用.一且用户认为这个原型系统确实能做他们所需要的工作,开发 人员便可据此书写规格说明文档,根据这份文档开发出的软件便可以满足用户的真实 需求, 从图1.4可以看出,快速原型模型是 快速原型 变化的苇求H 不带反馈环的,这正是这种过程模型的书 验证 一证 要优点:软件产品的开发基本上是线性顺 序进行的。能基本上做到线性顺序开发的 格说明 主要原因如下: (1)原型系统已经通过与用户交互而 得到验证,据此产牛的规格说明文档正确 地描述了用户需求,因此,在开发过程的后 续阶段不会因为发现了规格说明文档的错 误面进行较大的返工。 (2)开发人员通时建立原型系统已经 学到了许多东西(至少知道了“系统不应该 做什么,以及怎样不去做不该做的事情”) 综合测试 因此,在设计和编回阶段发生错误的可能 性也比较小,这自然减少了在后续阶段需 要改正前面阶段所犯错误的可能性】 软件产品一日交付给用户使用之后, 图1.4快速原型模型 维护便开始了。根据所需完成的维护工作种类的不同,可能需要返回到需求分析、规格说 明、设计或编码等不同阶段,如图1.4中虚线箭头所示。 快速原型的本质是“快速”。开发人员应该尽可能快地建造出原型系统,以加速软件 开发过程,节约软件开发成本。原型的用途是获知用户的真正需求,一旦需求确定了,原 型将被抛弃。因此,原型系统的内部结构并不重要,重要的是,必须迅速地构建原型然后 根据用户意见迅速地修改原型。UNIX Shell和超文本都是广泛使用的快速原型语言,最 近的趋势是,广泛地使用第四代语言(4GL)构建快速原型。 当快速原型的某个部分是利用软件工具由计算机自动生成的时候,可以把这部分用 到最终的软件产品中。例如,用户界面通常是快速原型的一个关键部分,当使用屏幕生成 程序和报表生成程序自动生成用户界面时,实际上可以把得到的用户界面用在最终的软 件产品中, 1.4.3增量模型 增量模型也称为渐增模型,如图1,5所示。使用增量模型开发软件时,把软件产品作 www.TopSage.com
www.TopSage.com
18】软件工程导论 为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成, 并且能够完成特定的功能。使用增量模型时,第一个增量构件往往实现软件的基本需求, 提供最核心的功能。例如,使用增量模型开发字处理软件时,第一个增量构件提供基本的 文件管理、编辑和文档生成功能:第二个增量构件提供更完善的编辑和文档生成功能:第 3个增量构件实现拼写和语法检查功能:第4个增量构件完成高级的页面排版功能。把 软件产品分解成增量构件时,应该使构件的规模适中,规模过大或过小都不好。最佳分解 方法因软件产品特点和开发人员的习惯而异。分解时唯一必须遵守的约束条件是,当把 新构件集成到现有软件中时,所形成的产品必须是可测试的。 需求分析 验订 规格说明☐ 针对每个构件,完成详细 试后交付给用户 维护 图1.5增量模型 采用澡布模型或快速原型模型开发软件时,目标都是一次就把一个满足所有需求的 产品提交给用户。增量模型则与之相反,它分批地逐步向用户提交产品,整个软件产品被 分解成许多个增量构件,开发人员一个构件接一个构件地向用户提交产品。从第一个构 件交付之日起,用户就能做一些有用的工作。显然,能在较短时间内向用户提交可完成部 分工作的产品,是增量模型的一个优点。 增量模型的另一个优点是,逐步增加产品功能可以使用户有较充裕的时间学习和适 应新产品,从而减少一个全新的软件可能给客户组织带来的冲击。 使用增量模型的困难是,在把每个新的增量构件集成到现有软件体系结构中时,必须 不破坏原来已经开发出的产品。此外,必须把软件的体系结构设计得便于按这种方式进 行扩充,向现有产品中加入新构件的过程必须简单、方便,也就是说,软件体系结构必须是 开放的。但是,从长远观点看,具有开放结构的软件拥有真正的优势,这样的软件的可维 护性明显好于封闭结构的软件。因此,尽管采用增量模型比采用瀑布模型和快速原型模 型需要更精心的设计,但在设计阶段多付出的劳动将在维护阶段获得回报。如果一个设 计非常灵活而目足够开放,足以支持增量模型,那么,这样的设计格允许在不破坏品的 情况下进行维护,事实上,使用增量模型时开发软件和扩充软件功能(完善性维护)并没 有本质区别,都是向现有产品中加入新构件的过程 从某种意义上说,增量模型本身是自相矛盾的。它一方面要求开发人员把软件看作 www.TopSage.com
www.TopSage.com
第1章软件工程学概述19 L 一个整体,另一方面又要求开发人员把软件看作构件序列,每个构件本质上都独立料另 个构件。除非开发人员有足够的技术能力协调好这一明显的矛盾,否则用增量模型开发 出的产品可能并不令人满意。 如图1.5所示的增量模型表明,必须在开始实现各个构件之前就全部完成需求分析 规格说明和概要设计的工作。由于在开始构建第一个构件之前已经有了总体设计,因此 风险较小。图1,6描绘了一种风险更大的增量模型:一旦确定了用户需求之后,就着手拟 定第一个构件的规格说明文档,完成后规格说明组将转向第二个构件的规格说明,与此同 时设计组开始设计第一个构件.用这种方式开发软件,不同的构件将并行地构建,因此 有可能加快工程进度。但是,使用这种方法将冒构件无法集成到一起的风险,除非密切地 监控整个开发过程,否则整个工程可能毁于一旦。 构件1:度格悦明一一设计☐一编码和集皮一一交付客户 构件2:规格说明啊一一设计☐一一编码和集成 一一交付客户 构件:规格说明一设计一编码和集成一一交付客户 图1,.6风险更大的增量模型 1.4.4螺旋模型 软件开发几乎平总要冒一定风险,例如,产品交付给用户之后用户可能不满意,到了预 定的交付日期软件可能还未开发出来,实际的开发成本可能超过预算,产品完成前一些关 健的开发人员可能“跳槽”了,产品投入市场之前竞争对手发布了一个功能相近、价格更低 的软件等。软件风险是任何软件开发项目中都普遍存在的实际问题,项目越大,软件越复 杂,承担该项目所冒的风险也越大。软件风险可能在不同程度上损害软件开发过程和软 件产品质量。因此,在软件开发过程中必须及时识别和分析风险,并且采取适当措施以消 除或减少风险的危害。 构建原型是一种能使某些类型的风险降至最低的方法。正如1.4.2节所述,为了降 低交付给用户的产品不能满足用户需要的风险,一种行之有效的方法是在需求分析阶段 快速地构建一个原型。在后续的阶段中也可以通过构造适当的原型来降低某些技术风 险。当然,原型并不能“包治百病”,对于某些类型的风险(例如,聘请不到需要的专业人员 或关键的技术人员在项目完成前“跳槽”),原型方法是无能为力的。 螺旋模型的基本思想是,使用原型及其他方法来尽量降低风险。理解这种模型的 个简便方法,是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型,如 图1.7所示。 www.TopSage.com
www.TopSage.com
0软件工程导论 险分析 风险分析 风验分析 会分析 风险分析 综合测试 图1,?简化的螺旋模型 完整的螺旋模型如图1.8所示。图中带箭头的点划线的长度代表当前累计的开发费 用,螺旋线的角度值代表开发进度。螺旋线每个周期对应于一个开发阶段。每个阶段开 始时(左上象限)的任务是,确定该阶段的目标、为完成这些目标选择方案及设定这些方案 的约束条件。接下来的任务是,从风险角度分析上一步的工作结果,努力排除各种潜在的 风险,通常用建造原型的方法来排除风险。如果风险不能排除,则停止开发工作或大幅度 地削减项目规模。如果成功地排除了所有风险,则启动下一个开发步骤(右下象限),在这 个步骤的工作过程相当于纯粹的瀑布模型。最后是评价该阶段的工作成果并计划下一个 阶段的工作。 螺旋模型有许多优点:对可选方案和约束条件的强调有利于已有软件的重用,也有助 于把软件质量作为软件开发的一个重要目标;减少了过多测试(浪费资金)或测试不足(产 品故障多)所带来的风险;更重要的是,在螺旋模型中维护只是模型的另一个周期,在维护 和开发之间并没有本质区别。 螺旋模型主要适用于内部开发的大规模软件项目。如果进行风险分析的费用接近整 个项目的经费预算,则风险分析是不可行的。事实上,项目越大,风险也越大,因此,进行 风险分析的必要性也越大。此外,只有内部开发的项目,才能在风险过大时方便地中止 项目。 螺旋模型的主要优势在于,它是风险驱动的,但是,这也可能是它的一个弱点。除非 www.TopSage.com
www.TopSage.com