1. 传统软件工程概述
1.1 产生背景
随着计算机技术的飞速发展,计算机技术的广泛应用,社会对计算机软件的需求也越来越大。早期计算机软件开发采用类似“软件作坊”的形态,软件开发流程不规范,标准不统一。随着软件规模的不断扩大,软件结构越来越复杂。这种小作坊的生产方式很快暴露出了它缺乏系统性、管理混乱、维护难等诸多问题。在这个“软件危机”的背景下,现代软件工程运用而生。软件工程用工程化的方法构建和维护高质量的软件,用一套完整而严密的流程概括了软件开发过程的方方面面,暂时解决了“软件危机”,下面简单介绍现代软件工程中最为经典的开发模式——瀑布模式。
1.2 瀑布模型
瀑布模型是软件工程中最经典的软件开发模式,因其开发流程似瀑布一贯而下而得名。瀑布模型分为制定计划、需求分析、系统设计、系统代码实现、系统测试和运行维护6个阶段。每个阶段都必须在上一阶段完成之后才能开始,是一种线性开发模式。
图1:瀑布模式开发流程图
在瀑布模型中,软件开发的各项活动严格按照线性方式进行,当前活动接受上一项活动的工作结果,实施完成所需的工作内容。当前活动的工作结果需要进行验证,如果验证通过,则该结果作为下一项活动的输入,继续进行下一项活动,否则返回修改。由于瀑布模式在软件开发开始阶段就全部确定了软件所需功能和设计,这使得软件开发过程有很强的针对性,但这种特性也使得瀑布模式无法适应软件需求变化比较快速的项目。同时瀑布模式开发过程始终围绕既定目标,这就使得软件开发过程更具严密性,整体逻辑严谨,系统的稳定性和可靠性当然也更强。
1.3 其他模式
瀑布模式虽然在一定意义上提升了软件开发过程的效率,但其开发流程过于固定、无法适应快速变化的需求的缺点也使人们难以接受。所以当今软件开发已经很少使用瀑布模式,但其线性流程开发的思想依然活在现代软件工程中。例如增量模型实际上就是分段的线性模型,螺旋模型则是连接的弯曲了的线性模型,在其他很多模型中也能找到线性模型的影子。
2. 敏捷软件开发
2.1 敏捷开发
如上文所述,传统软件开发模式虽然暂时解决了软件开发难得问题,但其开发流程冗长、适应性差的特点使得它根本无法在现代软件开发上被广泛使用,于是,人们又提出了一种强调快速、灵活的敏捷软件开发方法。
敏捷软件开发通过迭代的开发手段解决了应对变化的问题,满足了对需求变化的快速响应。简单来讲,敏捷开发不同于瀑布模式,敏捷开发更像是一种模块化的开发。开发者不用在系统设计之初就设计好所有的需求,而可以先针对某一功能进行开发,开发完成后可以单独就这一功能向客户展示,这时如果客户提出其他需求,我们可以及时添加相应的功能,而无需对系统的基础设计结构进行改动。
在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
图2:敏捷开发流程图
这张图很好地展现了敏捷开发的迭代流程。首先通过初期基本分析和设计,开发出相应软件产品,此时的工作不是做大量周密的软件测试,而是产品基本合格之时就将其投放市场,通过用户反馈这个大的“测试器”反映出软件产品当前存在的问题,问题包括但不局限于:软件功能改进、软件故障、用户体验改进等。通过这样一次次循环,敏捷软件开发能及时捕捉并响应用户的需求,同时还能做到软件一直保持可用状态。
2.2 开发准则
1,最重要的是通过尽早和不断交付有价值的软件满足客户需求。
敏捷开发中,不必等到项目开发完成后再给用户进行展示,每当实现一个功能,就可以及时展现给客户,这种反馈更为及时。
2,欢迎需求的变化,即使在开发后期。驾驭变化,保持客户竞争优势。
敏捷开发是一个迭代的过程,在开发过程中任何的需求变化,可以及时回到软件设计层进行功能的添加或改变,针对需求变化做出及时的响应。
3,经常交付可以工作的软件,从几星期到几个月,时间尺度越短越好。
迭代的开发流程保证了可以及时产生成果展示给客户,这一条和第一条类似。
4,业务人员和开发者应该在整个项目过程中始终朝夕在一起工作。
针对其快速响应需求变化的特点,业务人员与开发者一起工作可以使开发出的软件更加符合客户的需求。
5,给开发者提供适宜的环境,满足他们的需求并相信他们可以完成任务。
信任在开发过程中也尤为重要。
6,在开发小组中最有效率也最有效的信息传达方式是面对面的交流。
面对面交流对信息的传递更为准确,开发者可以更准确的了解客户的需求。
7,可以工作的软件是进度的主要度量标准。
每次迭代的过程都会产生一个可以展示的功能反馈给客户,让客户了解项目进展情况,并且及时给出反馈意见。
8,敏捷过程提倡可持续开发。出资方,开发人员和用户应该能够保持恒久稳定的进展速度。
9,对卓越技术与良好设计的不断追求将有助于提高敏捷性。
10,要做到简洁即尽最大可能减少不必要的工作。
11,最好的架构,需求和设计都源自自我组织的团队。
12,每个一段时间,团队都要总结如何更有效率,然后相应的调整自己的行为。
3. 敏捷开发与传统软件工程对比
一般来说,敏捷开发强调快速迭代,灵活开发,而传统软件工程强调严格周密,步步为营,那两者的具体区别究竟在哪?下面具体分析一下两种软件开发方法的区别。
(1)基本理念
传统软件工程:所要开发的系统需求基本固定,项目计划明确。
敏捷软件开发:软件需求变更快,通过迭代逐步完善软件。
(2)软件要素
传统软件工程:在文档中逐条明确规定。
敏捷软件开发:开发团队不断调整,是集体共识而非明文规定。
(3)开发模式
传统软件工程:瀑布模型、生命周期模型
敏捷软件开发:循环迭代模式
(4)质量控制
传统软件开发:项目计划和测试要求
敏捷软件开发:迭代测试,基本框架设计
(5)开发方向
传统软件开发:开发前规定
敏捷软件开发:迭代中随时变更
(6)软件测试
传统软件开发:系统开发完成后整体测试
敏捷软件开发:迭代循环测试
(7)适用项目
传统软件开发:大项目,需求相对固定
敏捷软件开发:中小项目,需求变动灵活
4. 结语
软件开发方法产生于实际需求,为需求服务。无论是传统软件开发方法还是敏捷软件开发,都是基于当前软件开发中遇到的问题所提出的解决方案,就解决问题的角度上,没有孰优孰劣之分,只能说现在这个时代是否是它的时代,人们难道会因为蒸汽机远远落后于现代燃机而否定它在工业革命时代的巨大意义吗? “软件危机”时期,软件工程思想无疑是软件开发领域的救星,而随着时代的脚步继续向前,人们对软件的需求和使用方式都大大灵活的今天,传统软件开发方法在有些方面已经不再适用,所以敏捷软件开发登上了历史的舞台。
但无论软件需求怎样变化,开发方法怎样变化,我觉得作为软件工程人员,找出现有问题的关键,适时加以改进,这种解决问题的核心思想永远不变。不管以后的软件如何变化,只要能紧跟时代需求,把握软件开发的目标和方法,任何软件的开发都不在话下。