首页 > 代码库 > 敏捷软件开发和传统软件工程

敏捷软件开发和传统软件工程

一、   传统软件工程

从上个世纪60年代开始,人们开始逐渐认识到了确实存在着“软件危机” 这样一个事实软件开发人员被诸如下列问题困扰:

  •  软件生产不能满足日益增长的需要
  •  软件开发成本和开发进度估计往往不准确
  •  软件开发人员和用户之间信息交流不充分,用户对完成的软件满意度很低
  •  软件价格昂贵,软件成本在整个计算机系统中所占的比例急剧上升,软件已成为许多计算机系统中花钱最多的项目
  •  软件质量难以保证
  •  软件可维护性差,程序中的错误很难改正,适应性或完善性维护都极其困难

导致危机问题的一个重要原因,是由于软件研制和维护本身是工程性的任务,但软件人员采取的方式却未能工程化。为克服软件危机,人们开始考虑采用工程化方法和工程途径来研制和维护软件。我们以瀑布模型和螺旋模型两个模型为例进行讨论。

1、瀑布模型

在传统的软件工程模型中,其中瀑布模型是1970年W. Royce提出的最早的软件开发模型,是经典的预见性软件开发模型,直到80年代早期,它一直是唯一被广泛采用的软件开发模型。该模型严格规定各阶段的任务,上一阶段任务输出作为下一阶段工作输入。其生命周期划分为:

  • 可行性研究与计划(策划):对软件进行可行性分析,估算开发费用和时间等
  • 需求分析:向用户了解需求,解决“做什么”的问题
  • 设计:分为概要设计和详细设计。对需要解决的问题进行分析,提出解决方案,解决“怎么做”的问题
  • 实现(编码):按照设计的结果,采用某种编程语言加以实现
  • 测试:编码结束后,要用大量的数据进行测试,找出其中隐藏的错误
  • 使用和维护:软件交付用户使用后,在运行过程中仍有可能出错,而且用户的需求也有可能改变,因此,软件需要继续修改

技术分享

2、螺旋模型

螺旋模型(Spiral Model)采用一种周期性的方法来进行系统开发。该模型是快速原型法,以进化的开发方式为中心,在每个项目阶段使用瀑布模型法。这种模型的每一个周期都包括需求定义、风险分析、工程实现和评审4个阶段,由这4个阶段进行迭代。软件开发过程每迭代一次,软件开发又前进一个层次。螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,继而做出应有的反应,因此特别适用于庞大、复杂并具有高风险的系统。

技术分享

螺旋模型沿着螺线进行若干次迭代,图中的四个象限代表了以下活动:

  • 制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件;
  • 风险分析:分析评估所选方案,考虑如何识别和消除风险;
  • 实施工程:实施软件开发和验证;
  • 客户评估:评价开发工作,提出修正建议,制定下一步计划。

螺旋模型由风险驱动,强调可选方案和约束条件从而支持软件的重用,有助于将 软件质量作为特殊目标融入产品开发之中。

二、  敏捷开发

虽然传统软件工程解决了软件危机,让软件开发变得结构化体系化,但软件开发的后续依然会产生许许多多的问题,敏捷开发由此诞生。

2001年,敏捷联盟共同签署了“敏捷软件开发宣言”,该宣言声明:

  • 个体和互助高于流程和工具
  • 工作的软件高于详尽的文档
  • 客户合作高于合同谈判
  • 响应变化高于遵循计划

    敏捷开发强调有效的响应变化,而不是循规蹈矩的遵循制定的计划,这是敏捷开发与传统软件工程最主要的不同点。此外敏捷开发将客户作为开发团队的成员以消除隔阂,能够更好更快的交流合作,以期完成项目,由此敏捷开发更能适应客户的需求变化。

敏捷联盟为希望达到敏捷的人们定义了敏捷开发12条原则:

  • 我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。
  • 即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。
  • 常性的交付可以工作的软件,交付的间隔可以从几周到几个月,交付的时间间隔越短越好。
  • 在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。
  • 围绕被激励起来的个体来构建项目。给他们提供所需要的环境和支持,并且信任他们能够完成工作
  • 在团队内部,最具有效果并且富有效率的传递信息的方法,就是面对面的交谈。
  • 工作的软件是首要进度度量标准。
  • 敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度
  • 不断地关注优秀的技能和好的设计会增强敏捷能力。
  • 简单----使未完成的工作最大化的艺术----是根本的。
  • 最好的构架、需求和设计出自与自组织的团队。
  • 每隔一定时间,团队会在如何才能更有效地工作方面进行反省,然后相应地对自己的行为进行调整。

我们以极限编程和scrum为例进行讨论。

1、极限编程(XP)

极限编程是敏捷软件开发中应用最为广泛的一个方法,是一个轻量级的、灵巧的软件开发方法,是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。

极限编程的过程分为4步:

  • 策划:倾听用户故事,确定软件需要的输入输出及功能特征并判断其优先级。
  • 设计:严格遵守KIS(keep it simple)原则,使用简单的描述。
  • 编码:团队开发一系列用于检测本次发布的包括所有故事的单元测试,一旦编码完成立即进行测试来向开发者提供反馈。
  • 测试:将个人的测试组织到一个通用测试集,每天进行集成和确认测试,最后进行验收测试。

 

2、Scrum

Scrum 是当今被广泛应用的敏捷开发模式之一。

Scrum 开发过程是以Sprint 为增量的迭代开发过程。Sprint 开始时,团队从已按优先级顺序排列好的产品订单中选择适合本团队的项目,与PO 澄清需求并生成同样按优先级顺序排列好的Sprint 订单,并且保证在本次Sprint 结束前做完。每个工作日团队都要收集汇报彼此的任务进程和余下的任务量。Sprint 结束时小组展示最终的项目果并收集来自团队之外的反馈,用以下一个Sprint 的自我提升。

技术分享

三、  二者对比

传统软件工程产生于软件危机,它使得软件的开发结构化工程化,起初的确给软件开发带来很大收益,但随着时间的增加,传统软件工程循规蹈矩的特点给软件开发带来了很大的麻烦:

  • 各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量。
  • 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。
  • 通过过多的强制完成日期和里程碑来跟踪各个项目阶段。
  • 不适应用户需求的变化。这也是瀑布模型最核心的缺点。

 

由此为了避免传统软件工程的弊端,也出现了诸如螺旋模型等软件开发模型,降低开发风险,增强灵活性。

  • 相对于传统软件开发,再来看看敏捷开发的优点
  • 客户成为开发团队的一部分;
  • 能够频繁提交可以工作的中间增量产品;
  • 可以不断更改项目的需求以适应用户需求的变化;
  • 不需制定详尽的不切实际的计划和编写冗长的文档使得团队更加灵活自如
  • 强调可应用的软件,开发周期短

敏捷开发与传统软件工程在成本费用方面区别很大,,传统软件开发变更成本费随机化的进展呈现非线性增长,随时间的增加增长速率也在变快,而敏捷开发而不同,其变更成本费用前期随着时间的增加,增长速率变慢,但某时间节点过后也会增长变快,但远小于传统软件工程。

敏捷开发能够带来多方面的好处但是它并不适用于所有的项目,所有的产品,所有的人和所有的情况,也不是完全对立与传统软件工程实践。敏捷开发也有其缺点:

  • 需求易变。太过重视客户需求,可能会导致为实现一个需求从而打乱整个软件工程的计划。
  • 矛盾的客户需求。客户需求量过大可能会导致需求的矛盾。
  • 需求的非正规表示。需求很多是口头的非正式的,不能及时发现遗漏或不一致的错误
  • 正规设计的缺乏。开发复杂系统时不能保证软件体系结构的质量和可维护性。

综上所述,敏捷开发的确能够在响应用户需求上比传统软件工程更加合适,但并不是软件开发的万金油,而传统软件开发由于其结构化正规化的设计是的其依然能够有一席之地。

参考资料

1、《软件工程:实践者的研究方法(第七版)》Roger S.Pressman

2、Scrum敏捷软件开发方法实践中的改进和应用

     陈国栋,罗省贤 计算机技术与发展 第21卷 第12期 2011年12月

3、百度百科 瀑布模型

http://baike.baidu.com/link?url=kfptsC14xgQbv-hojxqBCp6nzel0njgl8waMDUr4E0FI27tDM0cnWS96aZFAOdj9n3KhKU51aFSCVI5j3riFRqhVcnezRUXtUkLaCN3q-blfT59btSlZ2Jb4VUPK-8zk

4、百度百科 螺旋模型

http://baike.baidu.com/link?url=Fo9hNjpfVbhGPXqGsawygcXpk97pqrmHXIth4e1SXeYqLq5FiSF-6qPEwoaXvWMfBCEDTXRYbWLhM0YJm0NVxvibwMgx86uZDAJm6Vnwnx4I0UhIkzfS1A1SmoHZ4_DV

敏捷软件开发和传统软件工程