软件的“生命周期”一般分为6个阶段,即制定计划、需求分析、设计、编码、测试、运行和维护。在软件工程中,这个复杂的过程一般用软件开发模型来描述和表示。常见的软件开发模型有:以软件需求为前提的瀑布模型,渐进式开发模型(如螺旋模型、增量模型等),以形式化开发方法为基础的变换模型,敏捷开发方法等。
▶1.瀑布模型
瀑布模型的核心思想是:使用系统化的方法将复杂的软件开发问题化简,将软件功能的实现与设计分开。将开发划分为一些基本活动,如制定计划、需求分析、软件设计、程序编写、程序测试、软件运行和维护等基本活动。如图2-30所示,瀑布模型的软件开发过程自上而下,相互衔接,如同瀑布流水,逐级下落。
瀑布模型是最早出现的软件开发模型,在软件工程中占有重要的地位。瀑布模型的本质是一次通过,即每个活动只执行一次,最后得到软件产品。
瀑布模型有利于大型软件开发过程中人员的组织和管理,有利于软件开发方法和工具的研究与使用,从而提高了大型软件项目开发的质量和效率。然而软件开发的实践表明,瀑布模型存在以下严重缺陷。
一是开发模型呈线性,当开发成果未经测试时,用户无法看到软件效果,这样软件与用户见面的时间较长,增加了一定的风险;二是软件开发前期没有发现的错误,传到后面开发活动中时,错误会扩散,进而可能造成整个项目开发失败;三是在软件需求分析阶段,完全确定用户的所有需求非常困难,甚至可以说是难以达到的目标。
互联网硅谷创业权威保罗·格雷厄姆(Paul Graham)指出:有些创业者希望软件第一版就能推出功能齐全的产品,满足所有的用户需求,这种想法存在致命的错误。美国硅谷创业者最忌讳的就是“完美”。因为,一方面用户需求是多样的,不同人群有不同的需求;另一方面开发者想象的需求往往和真实的用户需求有偏差。在美国硅谷,Shipping it是一个流行词汇,意思是把你的产品从仓库里拿出来给客户;除了字面上的意思,其实还有一种精神层面的意义:你的东西要到客户手中才会有价值,而这是你一直以来追求的目标。
▶2.增量模型
使用增量模型时,第一个增量往往是产品的核心,即它实现了系统的基本需求,但很多补充的特征还有待发布。客户对每一个增量功能的使用和评估,都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生了最终的完善产品。增量模型本质上是迭代的,它强调每一个增量均是一个可操作的产品。
增量模型是刚开始不用投入大量人力资源。它先推出产品的核心部分,如果产品很受欢迎,则增加人员实现下一个增量。此外,增量能够有计划地管理技术风险。
增量模型的缺点是:如果增量包之间的关系没有处理好,就会导致系统的全盘分析和重新建立。这种模型较适应于需求经常改变的软件开发过程。
▶3.敏捷开发方法
敏捷开发是近年兴起的一种轻量级软件开发方法,它的价值观是:沟通、简单、反馈、勇气、谦逊。它强调适应性而非预测性,强调以人为中心而不是以流程为中心,强调对变化的适应和对人性的关注。皱捷方法强调程序员团队与业务专家之间的紧密协作,面对面的沟通,频繁交付新的软件版本,很好地适应需求变化,更加注重软件开发中人的作用。敏捷开发借鉴了软件工程中的迭代与增量开发,敏捷开发方法包括极限编程(XP)、Scrum(短距离赛跑的意思,一种达代式增量开发)、Crystal(频繁交付和紧密沟通)、上下文驱动测试、精益开发、统一过程等。
敏捷开发遵循以下基本原则:
(1)最重要的是通过尽早和不断交付有价值的软件满足客户需要。
(2)即使在开发后期,也欢迎用户改变需求,利用变化来为客户创造竞争优势。
(3)经常交付可以工作的软件,从几星期到几个月,时间尺度越短越好。
(4)敏捷方法要求尽可能少的文档,最根本的文档应该是程序代码。
(5)在项目开发期间,业务人员和开发人员必须天天在一起工作。
(6)文档的作用是记录和备忘,最有效率的信息传达方式是面对面地交谈。
(7)每隔一定时间,团队需要对开发工作进行反省,并相应地调整自己的行为。
(8)确定开发中的瓶颈,对于瓶颈处的工作应该尽量加快,减少重复。
敏捷开发也有局限性,如对那些需求不明确,优先权不清楚,或者在“较快、较便宜、较优”三角结构中不能确定优先级的项目,采用敏捷开发方法很困难。