
1.2 软件工程的兴起
软件工程是用工程、科学和数学的原则与方法研制、维护计算机软件的相关技术及管理方法。简单地说,软件工程利用工程化的思想和管理手段对软件的过程进行管理和监控。
工程实践是利用前人的经验,采用规范、确定的方法进行实施的过程。工程实践使得平凡的操作者创造出复杂的系统。每个操作者甚至不用了解整个系统的全貌,只需完成自身的工作即可配合搭建整个系统。例如,在建筑工地中瓦工只需了解如何砌砖,油工只需了解如何涂抹墙壁,通过各个工种的贡献最终完成整个建筑的搭建。对工程规范性强的公司而言,更需要每个公司员工如同螺丝钉般完成自身本职工作,而无需具备太多的个性。
软件工程的思想,即希望在软件公司中各个开发人员可以各司其职,每个人完成自身的各个模块,通过工程化的方式构架软件,并保证软件的质量。为保障软件能像建筑工程一样顺利实施,软件工程一般包含以下三要素。
• 方法:为软件开发提供了“如何做”的技术,是完成软件工程项目的技术手段。
• 工具:是人类在开发软件的活动中智力和体力的扩展和延伸,为软件工程方法提供了自动的或半自动的软件支撑环境。
• 过程:是将软件工程的方法和工具综合起来以达到合理、及时地进行软件开发的目的。
软件工程的方法,包括结构化方法、面向对象方法和形式化方法。结构化方法也称为生命周期方法学或结构化范型。将软件生命周期的全过程依次划分为若干个阶段,采用结构化技术来完成每个阶段的任务。结构化方法具有两个特点:一是强调自顶向下顺序地完成软件开发的各阶段任务;二是结构化方法要么面向行为,要么面向数据,缺乏使两者有机结合的机制。面向对象方法是将数据和对数据的操作紧密地结合起来的方法。软件开发过程是多次反复迭代的演化过程。面向对象方法在概念和表示方法上的一致性,保证了各项开发活动之间的平滑过渡。对于大型、复杂及交互性比较强的系统,使用面向对象方法更有优势。形式化方法是一种基于形式化数学变换的软件开发方法,它可将系统的规格说明转换为可执行的程序。
软件工程的工具包括各种软件开发工具、项目管理工具、项目维护工具等,一般也统称为软件开发工具。常见的软件开发工具分为以下几种。
• 软件需求工具,包括需求建模工具和需求追踪工具。
• 软件设计工具,用于创建和检查软件设计。因为软件设计方法的多样性,这类工具的种类很多。
• 软件构造工具,包括程序编辑器、编译器和代码生成器、解释器和调试器等。
• 软件测试工具,包括测试生成器、测试执行框架、测试评价工具、测试管理工具和性能分析工具。
• 软件维护工具,包括理解工具(如可视化工具)和再造工具(如重构工具)。
• 软件配置管理工具,包括追踪工具、版本管理工具和发布工具。
• 软件工程管理工具,包括项目计划与追踪工具、风险管理工具和度量工具。
• 软件工程过程工具,包括建模工具、管理工具和软件开发环境。
• 软件质量工具,包括检查工具和分析工具。
常见的软件需求工具包括Rational Rose、Visio等,软件构造工具包括大家熟悉的Visual Studio、Eclipse等,软件测试工具包括性能测试工具、单元测试工具Junit等,这些工具在形式上不见得一定以GUI呈现,也可能以软件包形式存在。有些软件开发工具如Eclipse也具备软件重构等功能,这种工具在意义上也称为软件维护工具。软件配置管理工具,如常见的SVN、CVS、GIT等。软件工程管理工具,包括微软的Proect、在线甘特图等。软件过程管理工具包括Maven等。
典型的软件过程有RUP的开发过程、敏捷开发过程等,软件过程是用于规范和开发软件的各个过程。ISO 9000定义软件工程过程是把输入转化为输出的一组彼此相关的资源和活动,该定义支持了软件工程过程的两方面内涵。
第一,软件工程过程是指为获得软件产品,在软件工具支持下由软件工程师完成的一系列软件工程活动。基于这个方面,软件工程过程通常包含以下4种基本活动。
• 软件规划、规格说明。规定软件的功能及其运行时的限制。
• 软件开发活动。用于产生满足规格说明的软件。
• 软件确认活动。确认软件能够满足客户提出的要求,此处的要求包括功能要求与质量要求。
• 软件演进。为满足客户的变更要求,软件需要在使用过程中进行演进,演进的内容包括软件的功能、非功能要求。例如,在原有软件基础上增加新功能,或者使原来的软件满足更高的性能要求。
事实上,软件工程过程是一个软件开发机构针对某类软件产品为自己规定的工作步骤,它应当是科学的、合理的,否则必将影响软件产品的质量。
第二,从软件开发的观点看,它就是使用适当的资源(包括人员、硬软件工具、时间等)为开发软件进行的一组开发活动。因此需要结合实际软件开发需求,对资源进行调度。最终,在过程结束时将输入(用户要求)转化为输出(软件产品)。软件开发过程中,如何合理地调配资源是圆满完成软件的必要条件。
综上所述,软件工程的过程是将软件工程的方法和工具综合起来,以达到合理、及时地进行计算机软件开发的目的。软件工程过程应确定方法使用的顺序、要求交付的文档资料、为保证质量和适应变化所需要的管理、软件开发各个阶段完成的任务。
以RUP的软件开发过程为例,RUP是Rational软件公司(Rational公司被IBM并购)创造的软件工程方法。RUP描述了如何有效地利用商业的可靠的方法开发和部署软件,是一种重量级过程(也被称作厚方法学),因此特别适用于大型软件团队开发大型项目。
RUP可为大多数程序的开发提供指导方针、模板等。RUP把开发过程中面向过程的方面,如定义的阶段,技术、实践和其他开发的组件(如代码、文档、手册等)整合在一个统一的框架内。因此,RUP首先明确了软件开发过程中的软件过程。
最重要的是,RUP有下述三大特点。
① 软件开发是一个迭代过程,正如刚才描述的四个阶段,这四个阶段可在项目开发过程中多次迭代出现。一般情况下,一个以RUP过程规范的软件开发过程,都将经历原型、原型迭代、最终版迭代等几次迭代过程。第1次迭代一般将系统的骨架及主要功能完成,用于验证系统的可行性,同时为用户提供直观的系统使用界面,便于获得相应的反馈。通过第2次迭代将新的需求反馈到系统之中。
② 软件开发是由Use Case驱动的。在RUP软件过程中,特别强调用例。采用用例的方式有助于对系统进行分解,从而降低系统的难度,便于开发人员开发以及分工。例如,一个复杂的软件系统可能由上百个用例组成,每个用例涉及的功能点很小,这样有助于根据用例的功能分派给开发小组、开发人员。
③ 软件开发是以架构设计(Architectural Design)为中心的。在RUP的开发过程中,开发人员首先建立统一的架构,在该架构中划分模块,通过各个独立的模块来支撑各个功能。所有模块间的交互、关系都由架构规定。这样便于开发人员并行开发,同时便于第1次迭代中系统骨架的形成。
一个典型的RUP软件开发过程包括:初始阶段(Inception)、细化阶段(Elaboration)、构造阶段(Construction)和交付阶段(Transition)。同时规定了每个阶段的完成形式,一般称为里程碑,通过检查里程碑可以对每个阶段的结果进行确认。
RUP在明确了每个阶段之后,对于每个阶段需要完成的任务也做了一定的规范,例如在细化阶段包括对相关需求的细化,而在描述需求的时候可能需要用例图的方式对每个用例进行分析,最后形成需求规格说明书。而在构造阶段,相应的设计文档、代码等需要被完成。因此,RUP的规范包括了过程与过程中的各个组件。
RUP的几个阶段说明如下。
• 初始阶段:初始阶段的目标是为系统建立商业案例并确定项目的边界。为了达到该目的必须识别所有与系统交互的外部实体,在较高层次上定义交互的特性。本阶段具有非常重要的意义,在这个阶段中所关注的是整个项目进行中的业务和需求方面的主要风险。对于建立在原有系统基础上的开发项目来讲,初始阶段可能很短。初始阶段结束时是第1个重要的里程碑——生命周期目标(Lifecycle Objective)里程碑。生命周期目标里程碑评价项目基本的生存能力。
• 细化阶段:细化阶段的目标是分析问题领域,建立健全的体系结构基础,编制项目计划,淘汰项目中最高风险的元素。为了达到该目的,必须在理解整个系统的基础上,对体系结构作出决策,包括其范围、主要功能和诸如性能等非功能需求。同时为项目建立支持环境,包括创建开发案例,创建模板、准则和准备工具。细化阶段结束时是第2个重要的里程碑——生命周期结构(Lifecycle Architecture)里程碑。生命周期结构里程碑为系统的结构建立了管理基准并使项目小组能够在构建阶段中进行衡量。此刻,要检验详细的系统目标和范围、结构的选择以及主要风险的解决方案。
• 构造阶段:在构造阶段,所有剩余的构件和应用程序功能被开发并集成为产品,所有的功能被详细测试。从某种意义上说,构造阶段是一个制造过程,其重点放在管理资源及控制运作以优化成本、进度和质量。构造阶段结束时是第3个重要的里程碑——初始功能(Initial Operational)里程碑。初始功能里程碑决定了产品是否可以在测试环境中进行部署。此刻,要确定软件、环境、用户是否可以开始系统的运作。此时的产品版本也常被称为“beta”版。
• 交付阶段:交付阶段的重点是确保软件对最终用户是可用的。交付阶段可以跨越几次迭代,包括为发布做准备的产品测试,以及基于用户反馈的少量的调整。在生命周期的这一点上,用户反馈应主要集中在产品调整,设置、安装和可用性问题,所有主要的结构问题应该在项目生命周期的早期阶段就解决了。在交付阶段的终点是第4个里程碑——产品发布(Product Release)里程碑。此时,要确定目标是否实现,是否应该开始另一个开发周期。在一些情况下这个里程碑可能与下一个周期的初始阶段的结束重合。