从瀑布到敏捷:那些年我们一起敏捷过

简介: 本文回顾了技术团队从几人小团队发展到百人规模的过程,重点讲述了从传统瀑布模式转向敏捷开发模式的转型阵痛与解决方案。通过引入TAPD等工具规范敏捷流程,解决了发版频率提高带来的协同挑战。同时,通过集成Junit、SonarQube等工具,提升了单元测试覆盖率和代码质量,实现了自动化构建与测试,最终提高了整体研发效率和产品质量。

一、前言

回想自己在技术团队里的这些年,真可谓是见证了公司从一个只有2、3个人的小团队,发展到如今百人规模的技术团队。技术栈和系统架构也从最初的简陋,逐步演进到了如今的高可用、可扩展的现代架构。团队的技术、架构和运维模式更是经历了翻天覆地的变化。今天,我想复盘一下自己走过的路,分享一些经验和教训,特别是那些年我们在研发团队从传统瀑布模式转向敏捷开发模式过程中遇到的一些问题,以及我们是如何一步步解决它们的。


添加图片注释,不超过 140 字(可选)


二、转型阵痛:从瀑布到敏捷

敏捷开发模式的引入,无疑是公司发展过程中的一个重大变革。它带来的最直接的变化就是发版频率的大幅提高。从前项目2~3个月才发布一个版本,现在变成了2周甚至1周一版本。这种变化对团队的协同能力和快速发版能力提出了极大的挑战。

记得当时,我们团队刚刚转型敏捷开发,大家对新的开发模式还处于摸索阶段。项目组使用的是TAPD,腾讯出品的协作平台,号称“王者荣耀”使用的平台,主打敏捷开发。


添加图片注释,不超过 140 字(可选)


在使用TAPD之后,团队逐渐规范了敏捷开发的全生命周期,方便了每个需求的分配与跟踪。产品的需求在敏捷开发中被称为“故事”,以用户的视角用故事的方式描述需求。这种方式强调从用户的实际使用场景和价值出发,使团队成员更易理解用户的期望。


添加图片注释,不超过 140 字(可选)


然而,转型过程中也暴露出不少问题:

  • 研发组长的抱怨:
  • “我们这个功能还没开发完,按计划下一个迭代又开始了。”
  • “单元测试不追着开发,基本不写。”
  • “哪有时间来管编码风格与规范。”
  • 测试组长的抱怨:
  • “动不动就得回归测试。”
  • “你们的代码能不能靠谱点,各种冒烟不通过。”

这些问题让我们意识到,敏捷开发不仅仅是改变开发流程,更是一次团队文化和工作习惯的变革。

三、工具赋能:团队规范化

面对转型过程中的种种问题,我们开始思考如何通过工具来解决这些问题,提升团队的效率和质量。

项目管理:从混乱到有序


添加图片注释,不超过 140 字(可选)


项目管理工具的使用,是团队转型敏捷开发的重要一步。TAPD帮助我们规范了敏捷开发的流程,但也有一些团队成员不适应这种新的工作方式。为此,我们开始探索其他项目管理工具,如Jira、Redmine、PingCode、禅道等,最终选择了最适合我们团队的工具。

通过项目管理工具,我们实现了需求的透明化管理,每个成员都能清晰地了解自己的任务和进度,减少了沟通成本,提升了协作效率。

单元测试:从被动到主动

import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assumptions.assumeTrue; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; class StandardTests {     @BeforeEach     void init() {     }     @Test     void failingTest() {         fail("a failing test");     }     @Test     @Disabled("for demonstration purposes")     void skippedTest() {         // not executed     }     @Test     void abortedTest() {         assumeTrue("abc".contains("Z"));         fail("test should have been aborted");     } }

单元测试是保证代码质量的重要手段,但在实际开发中,往往因为时间紧张或习惯问题,被开发人员忽视。

当时,我们的团队也经历过同样的问题。后来,我们将Junit集成到Jenkins中,实现了代码提交自动触发Junit,统计Junit的覆盖率及成功率,通过后才算完成。这种强制性的措施,虽然一开始遭到了开发人员的抵触,但最终还是让大家养成了写单元测试的好习惯。


添加图片注释,不超过 140 字(可选)


代码质量检查:从散漫到标准化

代码规范与单元测试、静态代码分析工具的使用以及代码审查,这些内容不仅有助于提高代码质量,也帮助我们养成良好的编程习惯。


添加图片注释,不超过 140 字(可选)


我们引入了静态代码质量分析工具,如Checkstyle、FindBugs、阿里的P3C等,以及SonarQube这样的代码质量管理平台。通过这些工具,我们实现了代码规范的自动化检查,减少了代码评审的工作量,提升了代码质量。

自动化构建与测试:从手动到自动


添加图片注释,不超过 140 字(可选)


随着发版频率的提高,手动构建和测试已经无法满足需求。我们开始引入自动化构建和自动化测试工具,如Jenkins、Selenium等,实现了从代码提交到构建、测试、发布的全流程自动化。

自动化构建和测试的引入,大大减少了人为错误,提升了发版效率,也让我们有更多的时间和精力去关注代码质量和功能实现。

目录
相关文章
|
机器学习/深度学习 自然语言处理 达摩院
Modelscope 工程介绍及实战演示| 学习笔记
快速学习 Modelscope 工程介绍及实战演示
Modelscope 工程介绍及实战演示| 学习笔记
|
1月前
|
数据采集 人工智能 算法
大模型竞赛——从参数膨胀到效能革命的转折
2023年至2025年,全球人工智能领域经历了一场前所未有的“大模型军备竞赛”。
302 0
|
4月前
|
人工智能 安全 物联网
告别数据泄露:三步构建企业级AI的隐私保护盾
企业微调大模型面临数据不出域与合规强监管的双重挑战。本文详解差分隐私(加噪声)、联邦学习(数据不动模型动)和LoRA(仅调0.1%参数)三重防护技术,覆盖脱敏、训练、部署全链路,并提供可运行代码与ε值选型指南,助你安全打造专属AI。(239字)
460 1
|
人工智能 自然语言处理 程序员
无编程经验小白如何玩转通义灵码 AI 程序员,让写代码像聊天一样简单
没有编程经验的小白如何玩转通义灵码 AI 程序员,让写代码像聊天一样简单
3766 24
|
12月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于PSO(粒子群优化)改进TCN(时间卷积神经网络)的时间序列预测方法。使用Matlab2022a运行,完整程序无水印,附带核心代码中文注释及操作视频。TCN通过因果卷积层与残差连接处理序列数据,PSO优化其卷积核权重等参数以降低预测误差。算法中,粒子根据个体与全局最优位置更新速度和位置,逐步逼近最佳参数组合,提升预测性能。
|
存储 算法 索引
从菜鸟到大神:一文带你彻底搞懂Python中的后缀树Suffix Tree奥秘!
在Python编程中,后缀树是一种高效的数据结构,特别适用于处理复杂的字符串问题,如搜索、最长公共前缀查询及最长重复子串查找等。本文通过问答形式介绍后缀树的基本概念、重要性及其实现方法。后缀树能显著提高字符串处理效率,将传统方法的时间复杂度从O(nm)降至接近O(m)。尽管其构建过程较复杂,但通过手动编写代码或使用第三方库,我们可以在Python中实现这一强大工具。后缀树的应用广泛,涵盖字符串搜索、压缩、生物信息学等多个领域,学习它不仅能帮助解决实际问题,更能提升算法思维和数据结构设计能力。
591 1
|
存储 搜索推荐 JavaScript
Java如何获取Cookie里的指定值
【9月更文挑战8天】
542 2
|
Java 数据库 微服务
Seata常见问题之Seata的jdk17启动seata1.7.0报错如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
|
存储 缓存 安全
|
运维 监控 安全
ops有多个,ops1或2等等,这些ops作用和定义是什么,只是跳转用的么?上限有多少个?
ops有多个,ops1或2等等,这些ops作用和定义是什么,只是跳转用的么?上限有多少个?
1261 0