{T}

敏捷开发

敏捷开发概念

敏捷开发有人认为:

  • 敏捷开发就是 Scrum、极限编程;
  • 敏捷开发就是每天站立会议、每两周一个Sprint(字面意思是冲刺,可以理解为迭代);
  • 敏捷开发就是把需求变成故事,把故事写在便签上贴到白板,然后根据状态移动到不同的列;
  • 敏捷开发就是用看板软件来管理项目。

要理解敏捷开发,先要了解其诞生背景。在 2001 年那会 瀑布模型还是主流,于是由瀑布模型衍生出很多模型,试图去改善瀑布模型存在的问题。在当时还有一些不怎么有名,而现在却如雷贯耳的轻量级开发方法,例如极限编程 (Extreme Programming,XP)、Scrum 等。

2001年初 17 位代表上述各种轻量级软件开发过程流派的领军人物聚集在一起,讨论替代瀑布模型这种重量级软件开发过程的新方法。但是没能达成一致,所以退而求其次,把大家都认同的理念整理出来,也就是后来的敏捷宣言。这些人还一起成立了敏捷联盟。

image-20240628141954050

敏捷不是一种方法论,也不是一种软件开发的具体方法,更不是一个框架或过程,而是一套价值观和原则。

现实中关于敏捷的讨论,更多的是在讨论各种方法论和工具。不可否认这些方法论和工具,能帮助团队“敏捷”起来,但它们和敏捷开发之间的关系,更像是“术”和“道”的关系。

各种敏捷框架、方法论和工具,就像是“术”,告诉你敏捷开发的方式,而敏捷则是“道”,是一套价值观和原则,指导你在软件项目开发中做决策。

敏捷开发中流行的站立会议,主要目的是为了保证团队成员充分的沟通,遇到困难可以及时寻求帮助。但是如果每天的站立会议流于形式,并不能起到有效的目的,则应该减少频度,甚至取消换成其他方式。

要不要在你的项目开发中使用站立会议,判断的依据就在于这样做是不是符合敏捷的价值观和原则。

当开发做决策的时候,遵守了敏捷开发的价值观和原则,不管你是不是用 Scrum 或者极限编程,那么都可以算是敏捷开发。

敏捷开发想解决的问题

仔细读了敏捷宣言,会发现宣言中右边的内容其实都是瀑布模型核心的内容:流程和工具、详尽的文档、合同谈判、遵循计划。

虽然敏捷开发并未对瀑布模型的价值进行否定,但也表明瀑布模型做的还不够好,同时提出了一套自己的价值观。

比如说 开始做一个新项目,需要从客户那里收集整理需求,如果按照传统的软件开发模式,需要在开发前获得所有需求,然后和客户签订合同,在发布前都不会轻易修改需求。

但是如果用敏捷开发模式来开发项目,那这样做显然违背敏捷的价值观:“客户合作高于合同谈判”。敏捷开发在每个迭代后,都应该向客户收集反馈,然后在后面的迭代中,酌情加入客户反馈修改的内容。

敏捷开发就是想解决瀑布模型这样的重型软件开发方法存在的问题,用一种轻量的、敏捷的方法来改善甚至是替代它。

瀑布模型的典型问题就是周期长、发布烦、变更难,敏捷开发就是快速迭代、持续集成、拥抱变化。

敏捷开发和瀑布模型差异

这些年敏捷开发,已经逐步发展出一套 “Scrum + 极限编程 + 看板” 的最佳实践,Scrum 主要用来管理项目过程,极限编程重点在工程实践,而看板将工作流可视化。

敏捷开发是怎么做需求分析的

瀑布模型的一个重要阶段就是需求分析,要有严谨的需求分析,产生详尽的需求分析文档。而敏捷开发的需求,主要是来源于一个个小的用户故事,用户故事通常是写在卡片上的一句话,在 Sprint 的开发中,再去确认需求的细节

比如一个用户登录网站的需求,在用户故事里面就是一句话:

作为用户,我想登录网站,这样可以方便浏览。

好处是减少了大量需求文档的撰写,可以早些进入开发。但这个对开发人员在需求理解和沟通的能力上要求更高

敏捷开发是怎么做架构设计的

瀑布模型在需求分析完了以后,就需要根据需求做架构设计。而在敏捷开发中,并不是基于完整的用户需求开发,每个 Sprint 只做一部分需求,所以是一种渐进式的架构设计,当前 Sprint 只做适合当前需求的架构设计。

这种渐进式的架构设计,迭代次数一多,就会出现架构满足不了需求的现象,产生不少冗余代码,通常叫它技术债务,需要定期对系统架构进行重构

敏捷开发怎么保证项目质量

瀑布模型在编码完成后,会有专门的阶段进行测试,以保证质量。在敏捷开发的 Sprint 中,并没有专门的测试阶段,这就依赖于开发功能的同时,要编写单元测试和集成测试代码,用自动化的方式辅助完成测试。

相对来说,这种以自动化测试为主的方式,质量确实是要有些影响的。

微软的 Windows 就是个很好的例子,在 Windows 10 之前,Windows 的开发模式是传统的类瀑布模型,有很长一段测试的时间,质量有很好的保障,Windows 10 开始,采用的是敏捷开发的模式,每月发布更新,稳定性要稍微差一些

敏捷开发是怎么发布部署的

瀑布模型通常在编码结束后,开始部署测试环境,然后在测试阶段定期部署测试环境。测试验收通过后,发布部署到生产环境。

在敏捷开发中,这种持续构建、持续发布的概念叫持续集成,因为整个过程都是全自动化的,每次完成一个任务,提交代码后都可以触发一次构建部署操作,脚本会拿最新的代码做一次全新的构建,然后运行所有的单元测试和集成测试代码,测试通过后部署到测试环境。

持续集成是一个非常好的实践,极大的缩短和简化了部署的流程,而且自动化测试的加入也很好的保证了部署产品的质量。前期搭建整个持续集成环境需要一定技术要求

敏捷开发的Sprint和迭代模型的迭代的区别

假设有两个团队,都要实现一个简单的用户系统,一个团队用迭代模型,一个团队用敏捷开发(Scrum),一个迭代 / Sprint 的时间周期都是2周(10个工作日)。

  • 迭代模型所在的团队,产品经理会先花 2 天时间去分析需求,写成需求分析文档,架构师会花 3 天时间来做设计,程序员会花 3 天时间编码,测试再花 2 天时间去测试,最后上线用户系统。

  • 敏捷开发的团队,Product Owner(类似于产品经理)会把需求拆分成了几个简单的用户故事:用户登录、用户注册、找回密码、修改资料,然后放到当前 Sprint 的 Backlog(任务清单),Team(开发团队)成员开始从 Backlog 选择用户故事

    • 程序员A选了“用户登录”这个用户故事,他会去找 Product Owner 确认需求细节,之后动手实现这个用户故事
    • 功能完成后,同时程序员 A 还写了单元测试代码和集成测试代码,对登录的功能写了自动化测试。完成后,通过持续集成工具测试和部署到测试环境。部署完成后,用户登录功能就可以进行使用了
    • 这个过程程序员 A 可能花了 4 天时间,做完“用户登录”这个用户故事之后,他又开始继续选取“找回密码”的用户故事来做,4 天时间也完成了
    • 其他程序员也和程序员 A 一样,也会从 Backlog 选择一些用户故事来做。
    • 当团队中第 1 个用户故事部署完之后,测试人员就开始帮助测试,发现的 Bug 都提交到了 Backlog,程序员们在完成用户故事后,开始着手修复这些Bug,正好在最后2天都修复完成。

迭代模型本质上是一个小瀑布模型,所以在一个迭代里面,需要完整的经历从需求分析,到设计、编码、测试这几个完整的阶段。所以像瀑布模型一样,刚开始测试的时候是不稳定的,到测试后期才逐步稳定下来,一般迭代前期也会相对轻松一点,而后期测试阶段可能会时间很紧张。

敏捷开发的 Sprint 中,没有像瀑布模型那样严格的开发阶段划分,而是一个个循环迭代的 Sprint。举例来说,一个瀑布模型的项目,可能会按照阶段分成:2周需求分析,2周设计,4周编码,2周测试,然后上线发布,一共10周。如果用敏捷开发的方式来进行,那么可能会是每 2 周一个 Sprint,每个 Sprint 结束后,都会发布上线,每次发布的可能只是完整功能的一部分,但是每次发布的都是一个可用的版本,通过多个 Sprint 的迭代,最终完成项目开发。

具体到每一个 Sprint 的开发周期中,在一个 Sprint 中会有多个小的开发任务,这些开发任务主要是新功能的开发和 Bug 的修复。由于每个 Sprint 周期很短,所以不能像瀑布模型那样有充足的时间去做需求分析、设计和测试,那么敏捷开发中怎么保证质量呢?

在敏捷开发中通常用“用户故事”这样的方式来代替传统的需求分析,也就是以用户故事的形式,对一个需求进行简单的描述,配合关键的测试用例,并且和需求方的紧密沟通,让开发人员可以理清楚需求;通过“只做刚刚好的设计”来节约设计上的时间;通过“自动化测试”、“持续集成”来提升测试效率。

相对来说,敏捷开发中整个 Sprint 的节奏是比较恒定,产品也是相对稳定的,即使用户故事没有完成,也不影响版本的发布。

因此,敏捷开发更注重软件开发中人的作用,需要团队成员以及客户之间的紧密协作。

该不该选择敏捷开发

敏捷开发无论国内还是国外,大厂还是小厂,都已经有无数成功案例。软件工程中一些好的实践,像持续集成、测试驱动开发、结对编程、看板等都来自于敏捷开发。可以肯定,敏捷开发是一种非常好的软件开发模式。

但在应用上,也确实需要满足一些条件才能用好,例如:

  • 团队要小,人数超过一定规模就要分拆
  • 团队成员之间要紧密协作,客户也要自始至终深度配合
  • 领导们的支持。敏捷需要扁平化的组织结构,更少的控制,更多的发挥项目组成员的主动性
  • 写代码时要有一定比例的自动化测试代码,要花时间搭建好源码管理和持续集成环境

敏捷开发对项目成员综合素质要求更高,做计划要相对难一些。如果团队大、客户不配合、领导不支持,再好的敏捷方法也很难有效实践起来。

要实践敏捷开发,建议先找个小项目进行试点,能证明可行了,再进一步推广。有条件的话,可以和一些顾问公司合作,请人做专门的培训和指导。

如果不具备条件,应该考虑先把其中一些好的实践用起来,比如说持续集成、每日站会、自动化测试等