在产品开发中“敏捷”和“精益”,是一对难分彼此的热词。讲精益产品开发离不开对敏捷软件开发的深入理解,我们的精益之旅也将从了解敏捷软件开发开始。
本篇将讲述,敏捷产品开发产生的历史,和背后的驱动力。
一. 传统软件开发方式面临的挑战
传统软件开发方法是与软件工程的概念一同诞生的。1968年由NATO召集了世界上第一次以“软件工程”命名的会议,会上提出了“软件危机”的概念。随着软件复杂度的不断提高,软件项目普遍出现预算超支、质量低、性能差、不符合实际需求和延期等问题,这就是所谓”软件危机“。
当时业界普遍认为,软件业应该借鉴工程领域的经验,”系统地应用工程方法“是应对软件危机的出路。这就是软件工程诞生的背景,在这一思路下产生的软件开发方法就是传统的开发方法,它们共同的特点是强调计划、管控和结构化的工程方法,并遵循严格生命周期的概念,把软件开发分割为顺序阶段构成的过程,瀑布式开发方法是其中的代表。
传统开发方法的产生历程
相比作坊式的开发,传统方法开发方法进步明显。它让产品开发有矩可循,让项目和产品的成功可以重复,让组织的能力可以被评估,这些当然是好的。上图是传统开发方法的的大致历程,到了90年代初,CMMI和PMI项目管理知识体系[1]成为了传统产品开发管理方法的典型代表。
然而,传统方法并没有根本上解决软件危机,软件项目的失败率依然居高不下,甚至越来越糟糕,在这方面被引用比最多的,Standish Group 定期发布的IT项目报告[2],94年第一次发布时的数据显示,项目成功比例只有16%,有31%在发布前就被取消了,剩下的53%平均超过预189%。
人们认识到,遵循严格生命周期的概念,把开发分割为顺序阶段构成的过程,这在实施上是不现实的,带来了直接的危害,例如:
另一方面,传统产品开发方法,过于强调控制,流程出现问题时,自然的应对就是进一步加强管控,流程本身有自我复杂化的趋势,对软件开发十分重要的人的能动性反而受到压制。
面对以上的问题,对传统软件开发方法的反思,几乎与传统方法本身一样悠久。比如瀑布模型的提出者Wiston Royce,1970年在他的论文[3]中,只是把瀑布模型作为一个理论模型提出,并告诉人们它绝对不适合大型软件开发。论文的后半部分,他提出了一个包含原型和各阶段之间反馈的修正模型。
遗憾的是,业界当时渴望的是一种简单的建构式工程方法,瀑布模型迎合了这一要求,反对瀑布模型的Royce反到被业界称为“瀑布模型之父”。至于Royce的忠告,也只有等到30年后敏捷运动兴起时,才又被人们重新提起。
二. 从传统到敏捷
面对传统软件工程方法在现实中的问题,一批轻量级的软件开发方法陆续涌现,它们共同的特点是遵循演进和迭代的模型。其中上世纪90年代出现Scrum和极限编程在实践上最为成功,它们都是迭代和增量的软件开发框架。两者的区别是,Scrum只包含管理实践,而极限编程则同时涵盖工程和管理实践。
敏捷产生和发展的历程
90年代另一个主要变化是,PC软件流行和第四代编程语言的出现,面向对象和设计模式运动的兴起,让小型项目的开发蓬勃发展,同时互联网应用和开源社区也在兴起,有别于传统的开发模式不断涌现,优秀个人在程序开发中的作用得到凸显。这些因素都让非传统开发方法有了实验的土壤。其结果是,一方面质量问题层出不穷,这部分促使了源自全面质量管理体系的CMM/CMMI在这一时的间繁荣和推广;另一方面也产生了许多不同于传统方法的有效实践,让业界看到了新的可能。敏捷运动这时已经呼之欲出,它既是对传统的反叛,也是对野蛮生长的规范。
敏捷宣言
2001年2月,17位轻量级软件工程方法的代表人物,其中也包括Scrum和极限编程的几位发明人,齐聚美国犹他州的雪鸟滑雪胜地,在两天的会议之后,发布了后来产生巨大影响的敏捷软件开发宣言[4],如上图所示,敏捷宣言陈述了他们共同认可的关于软件的开发方法的理念,同样重要的是他们找到了敏捷这个词来总领这些理念。
敏捷概念在2001年出现,可以说适逢其时。当时一方面,传统方法变得越来越臃肿笨重,却没有解决软件危机;另一方面,人类正在进入互联网时代,软件业对响应变化和创新的要求迅速升级,这是更根本的原因,毕竟需求才是行业发展的最好助推剂。很快,敏捷成为了一场运动,被迅速地推广和应用。
总结
本文总结了敏捷软件开发诞生的历史。传统开发模式面临问题的推动,新技术和业务环境需求的拉动,这一推一拉两个动能,到了上世纪末本世纪初,敏捷软件开发的诞生已经是水到渠成的事了,而敏捷宣言的发表则成为标志性事件。