为什么企业要做大规模敏捷?

news/2024/5/4 11:09:50/文章来源:https://blog.csdn.net/toafu/article/details/130386255

背景

软件工程里一个重要的指标就是“可用的软件”,敏捷宣言里也同样告诉我们“工作的软件高于详尽的文档”,那“可用的软件”、“工作的软件”意味着什么呢?在我的理解里,可以经历用户 “千锤百炼”的软件就是一个“可用的软件”。曾经听到过这样的说法:“一个有Bug的软件怎么能叫软件呢?”虽然这话在我们业内人士听起来有些可笑,但是这就是使用软件用户最真实的需求。所以如何在提高代码质量,最大程度地减少软件中的Bug同时,平衡软件迭代速度与交付效率是我今天想跟大家讨论的问题。

我有幸在两种完全不同风格的项目上进行过交付,让我们且称之为项目A和项目B。

项目A是一个客户为主导的巨大项目组,管理为明确纵向层级管理,横向开发团队来自于不同的供应商,并且采用瀑布式开发,由另一个事业部进行测试反馈,部门墙极其严重。


项目B则是一个由业务主导,每个敏捷团队有对应相关的业务领域,客户则是和供应商共同组成一个个敏捷团队,共同达成业务目标。

好了,完成了简单的背景介绍,我就要来说说下面的故事了。

故事

总览

首先,假设我们所需要达到的目标是由一个个大大小小功能(颜色模组)组成一个完整的软件,为了达到我们的交付目标,我们需要将每个功能进行开发,测试,将功能模块进行累加,最终获得一个完整而达标的软件。

同时两个项目都使用了大致相同的开发流程,为了保证质量,项目中都有基础的代码审计,CI/CD,应用测试,用户测试,等基本质量保证,软件开发的基础流程如下图。

在这种基础流程都相近的情况下,每个环节在不同架构下执行的的方式却有巨大的差异。

在讨论项目A的流程前,让我们先看看我们熟知的敏捷开发是怎么保证质量的:

项目B的情况

项目b的每一个小敏捷团队将业务需求从路径图(Roadmap)拆解下来,落到各大的业务功能的Epic中,再拆解成具有小的业务价值的用户故事,最后再落到每个具有开发意义的任务,注意,这里提的一直是业务价值,我们还没有开始讨论如何进入开发。

Epic 更多是独立且较大的目标,用于我们识别在关键时间点需要实现的大型业务目标。而用户故事则是一个简短的描述、一个用于表达用户或客户的需求的角色和一个用于描述需求的价值或期望结果的价值陈述,在用户故事中比较关键描述是关于此价值点的**“静态““动态”与“非常态**“,静态更多的是对价值点的描述,在To C中往往是静态设计图(UI)的描述,动态则是交互,系统间的交互或者功能的用户旅程(UX),而非常态则是描述系统在错误或者误差情况下的表现,以确保当前的价值点在绝大多数情况下得以运行(AC)。最终用户故事将被团队中的技术领导拆解成可以单独执行的开发任务,最终没个独立的开发任务可以由不同的开发人员执行。

在一个大型的价值目标被拆解成了Epic->用户故事->开发任务的过程中需要全团队的多轮确认,多轮确认确保所有人达成统一共识 ,在最大的程度上解决沟通差带来的不确定性。最终需要通过迭代计划会议在团队内部对价值达成共识后,才会进行项目开发。

进入开发任务后每个阶段,参考下图:

我们可以看到4重质量保证:

  • 结对编程:两个人的脑子总比一个人想的全。(其他好处不用赘述)
  • 团队中的代码版本差异识别:每对Pair的代码在一天结束时会被整个开发团队审核(当然可以提高代码质量了)
  • 代码审计:当对应开发任务 - PR(每笔代码)完成后,会被整个团队提意见(我听过比较离谱的就是:Our PR is waiting for more comments),修正完成后代码才会进入测试阶段。
  • 测试: 最后的最后,才会进行测试,整个测试则是由小团队内部完成,在没有测试的情况下,“非常态”的AC就是整个测试的通过条件。

再这样一轮一轮的开发任务到用户故事的价值交付后,又组成了一个Epic价值交付,最终通过Bug Bash的方式最后确认价值以达到交付标准,我们可以上线整个Epic用于用户的检验。

总结一下敏捷开发的特点:

  • 业务 -> 开发 -> 测试由一个全职能敏捷团队完成
  • 大多数内容由团队内部确定
  • 由上向下“顺时针“开发
  • 尽可能的小型功能,快速迭代
  • 小型逆时针回调细节确认
  • 业务导向:业务决定质量

用图来表示最终内建的结果,在最终快要上线时,经过团队内质量把控后仅与实际有极少差距,仅需要在日常使用中进行基础运维即可达到我们的价值目标:

项目A的情况

这时候让我们再来看项目A,系统被产品部门完成设计后,交予开发部门进行任务划分,每个开发团队承担不同的功能开发任务,每个功能点再由单独开发人员进行开发并自行测试(本地),最后由客户方进行功能验收后(功能展示+代码审核),代码合入主线进行转测。

说到这儿,举个例子,产品部门提供了本次需要交付的20个功能的设计图,开发团队把设计图分给交付团队(大多由供应商组成),团队成员小王负责对其中一张设计图(类似于一个Epic)的功能进行开发,开发完成后开验收会议,对代码和功能进行审核验证,进入测试流程。所以开发阶段归纳下来的话,如图

这样乍一看确实没有什么问题,开发流程中的各种实践也在做,那这种项目研发模式问题出在哪儿呢?这个时候我们看项目A的关键质量保证动作:测试。

项目A的测试步骤:

先抛结论,在测试阶段,80%时间用于确定问题+定位问题(标红)。所以我们可以着重讨论一下这两个阶段。

确认问题: 在确认问题阶段, 往往由测试组发起,通过层层追溯,可以追溯到开发人员(也就是小王),跟小王确认表现层的“静态”/“动态”/“非常态”问题后,测试顺利成章地建立一个问题工单,并分配给小王,宣告此单插在了小王头上,小王需要修正再找测试回归。乍一看又没什么问题,是个好流程,但是执行起来此流程会出现:

  • 因为测试标准中有较多主观的感官感受,导致在跟开发确认问题时经常出现主观问题,此时需要产品介入,并用主观感受进行判定。(缺少用户旅程细节)

    举例:(一个电话拉会)“小王,我觉得这个页面帧数好低,你要优化一下。”“啊???”(此处省略battle的10分钟)终于电话给了产品,产品一句话:“是帧数有点低啊!小王,这你得改”“…”

  • 需要产品介入的场景往往流程会变得极长。测试在做测试中,会考虑很多“非常态“问题,在非常态问题中,往往会导致”静态“”动态“的变更,然后经过工单追踪,产品组漫长的重新设计,然后再由开发进行更改。

  • 当存在“扯皮”问题,又是另外一副光景。

    举例:测试打电话给小王,小王说“这不是我的问题,你找xx团队的小李 ”,小李接上电话,“这是你小王开发的啊”…(再次省略battle时间)最终问题很有可能上升到客户方确定问题边界,这样1个小时就过去了。

  • 开发的专注思考时间被切碎。在转测后,需要大量地确认问题,也就是跟测试打电话,测试往往是发现问题第一时间就会确认问题,这样导致开发人员每天专注于代码工作的时间被切碎,效率直接下降。

定位问题: 定位问题同样占据了开发人员的大量时间,总体来说:

  • 大量追溯代码:确认问题后,有时会需要确定整个功能代码中的问题点,问题很难定位,尤其遇到比较棘手的概率,性能问题需要对整个代码进行回顾与重构。
  • 涉及他方代码:当在长时间确认问题后,问题有时会涉及他人代码,比如框架代码,他人功能代码,硬件代码,这时候需要你找到相关人(打电话),解释,最终把工单走到他人名下(当然没人愿意接单,长时间Battle在所难免)。
  • 定位到无法修改的问题:当然在这里又有专门的流程做这件事,问题就出现在因为团队间的互相的部门/信任墙,需要长流程(COC:需求变更会议)来共同确认问题,需要引入大量具有决策权的角色:另外团队的架构师,产品经理,测试经理,还有可怜的小王。最终一个无法修改的工单往往需要2周或者更多的时间进行关闭。
  • 流程反复:当出现 确认问题->定位问题->确认问题->定位问题…这个如此反复的流程时,对开发和测试的神经都是一个极大的考验。

后续的修改流程往往较为顺利,但是也会出现一个工单反复无法通过回归的问题,这毕竟是少数,也不是我们主要探讨的范畴。项目在强流程驱动下最终的结果就是:

所有人每天都在加班,所有人每天都在增加流程以确保质量,所有人都很痛苦,当然这里包括小王。

用图来表示开发结束后的状态,空隙区域代表不确定问题,空隙部分需要测试->开发->产品逆流程更改

总结

说了这么多细节,我想现在跳出来问“为什么会出现这样的问题?”这个问题我也想留个大家做一点思考,我做了一些简单而又主观的总结,放在这里:

  • 共识缺失:当大家都在自己的职能部门做自己的工作时,往往会主观地做这件事儿,当这件事儿在后续流转时,没有通过一个整体共识的话,往往需要从底端流程不断向上确认达成共识。
  • 大规模“逆时针”回调:因为整体共识由测试发起,加上部门墙重,往往导致从测试->开发->产品的逆时针开发流程,代码重构与返工的工作量极大。
  • 价值产出慢:当最终功能在大量回调时,价值产出很慢,导致验证慢,最终导致逆向反馈增加。
  • 流程决定质量:还是由测试流程来确定质量的情况下,在产品只进行Happy Pass的情况下,所有人的弥合质量的成本都在成倍增加。

看完了项目A和项目B的整体, 我们最后再来聊聊效率,我们发现,在同等的质量要求下,敏捷效率反而高很多,在流程更短的情况下却交付出了同样质量很高的产品,最后我们通过对比总结一下,为什么敏捷在保证质量的同时还能有更高的效率?

敏捷团队 职能团队
业务决定质量 流程决定质量
回调(重构)路径短 回调(重构)路径长
快速产出价值并验证价值 慢速产出价值验证价值慢
团队成员共同决策->快速达成共识 单一角色决策->长流程确认共识
专注手头工作 分散精力处理流程
团队凝聚力强 职能部门间不信任
开心 痛苦

图片来源:SAFe

我们暂且停在这儿,我要引用SAFe中的一张图来结束我今天的阐述,也在用实例回答:“为什么企业要做大规模敏捷?”

我想答案是:质量高,效率快,大家都开心。

参考资料:

SAFe:How the Scaled Agile Framework® Benefits Organizations

SAFe for Lean Enterprises - Scaled Agile Framework

SAFe Lean-Agile Principles - Scaled Agile Framework

A Complete Guide About Scaled Agile Framework (SAFe)? - DZone


文/Thoughtworks 曾雪松
原文链接:https://insights.thoughtworks.cn/large-scale-agile-ensures-quality-and-efficiency/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103960.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统上C程序的编译与调试

gcc分布编译链接: 预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking) gcc -E hello.c -o hello.i #预处理 gcc -S hello.i -o hello.s #编译 gcc -c…

Android App 架构 面试专题,你可能会被问到的 20 个问题

iveData 是否已经被弃用? 没有被弃用。在可以预见的未来也没有废弃的计划。 LiveData 可以使用简单的方式获取一个易于观察、状态安全的对象。虽然其缺少一些丰富的操作符,但是对于一些简单的 UI 业务场景已经足够。 Flow 有 LiveData 相同的功能,其…

Hadoop2.x集群搭建(centos7、VMware、finalshell)

第一章 Hadoop集群安装 1.1 集群规划 集群规划规划操作系统Mac、Windows虚拟软件Parallels Desktop(Mac)、VMWare(Windows)虚拟机主机名: c1, IP地址: 192.168.10.101主机名: c2, IP地址: 192.168.10.102主机名: c3, IP地址: 192.168.10.103软件包上传路径/root/softwares软件…

一维卷积与一维平均池化的时间复杂度

看Pytorch官方文档就懂了: 1维卷积 1维平均池化 参考资料 Conv1d — PyTorch 2.0 documentation AvgPool1d — PyTorch 2.0 documentation

【软件测试面试】面试技巧,让面试官记住的自我介绍,疯狂收割offer.....

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在讨论如何自我介…

python基于轻量级YOLOv5的生猪检测+状态识别分析系统

在我之前的一篇文章中有过生猪检测盒状态识别相关的项目实践,如下: 《Python基于yolov4实现生猪检测及状态识》 感兴趣的话可以自行移步阅读,这里主要是基于同样的技术思想,将原始体积较大的yolov4模型做无缝替换,使…

大数据之入门开发流程介绍

目录: 1、大数据的开发大致流程2、技术导图 1、大数据的开发大致流程 1.1 数据收集 大数据处理的第一步是数据的收集。现在的中大型项目通常采用微服务架构进行分布式部署,所以数据的采集需要在多台服务器上进行,且采集过程不能影响正常业务的…

Tpflow V7.0.2 PHP 工作流引擎新版发布

欢迎使用 Tpflow V7.0.1 工作流引擎 TpFlow 工作流引擎是一套规范化的流程管理系统,基于业务而驱动系统生命力的一套引擎。彻底释放整个信息管理系统的的活力,让系统更具可用性,智能应用型,便捷设计性。Tpflow 团队致力于打造中国…

ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析

第一章、生态系统服务讲解 1.生态系统服务概念和基本理论 ​ 2.生态系统服务评估方法与模型讲解 ​ ​ 3.生态系统服务权衡与协同研究方法与意义 ​ 4.文献可视化分析 ​ ​ 第二章、平台基础 一、ArcGIS Pro介绍1. ArcGIS Pro简介2. ArcGIS Pro基础3. ArcGIS Pro数据预处理4…

kafka_2.13-2.8.1环境搭建

本次kafka环境主要针对kafka2.x版本,运行kafka服务之前,需要先搭建zookeeper服务,因为kafka服务依赖zookeeper,kafka3.x版本后可以不需要手动搭建zookeeper了。 本文主要是介绍怎样搭建kafka2.8.1,关于kafka的操作&am…

每天一道算法练习题--Day13 第一章 --算法专题 --- ----------动态规划(重置版)

动态规划是一个从其他行业借鉴过来的词语。 它的大概意思先将一件事情分成若干阶段,然后通过阶段之间的转移达到目标。由于转移的方向通常是多个,因此这个时候就需要决策选择具体哪一个转移方向。 动态规划所要解决的事情通常是完成一个具体的目标&…

问卷中多选题如何分析?

一、案例与问卷 本研究选取大学生作为研究对象,旨在通过理财认知、理财现状、理财偏好三个方面,对大学生理财产品了解情况、使用需求进行调查。本次问卷共分为四个部分:第一部分共5道题,为基本信息题;第二部分共3道题…

dubbogo如何实现远程配置管理 -- 阅读官方文档

dubbo-go 中如何实现远程配置管理? 之前在 Apache/dubbo-go(以下简称 dubbo-go )社区中,有同学希望配置文件不仅可以放于本地,还可以放于配置管理中心里。那么,放在本地和配置管理中心究竟有哪些不一样呢&…

【browserify】一步步教你学会browserify

https://www.cnblogs.com/fsg6/p/13139627.html Browserify browserify的官网是http://browserify.org/,他的用途是将前端用到的众多资源(css,img,js,…) 打包成一个js文件的技术。 比如在html中引用外部资源的时候,原来我们可能这样写 &l…

从0搭建Vue3组件库(九):VitePress 搭建部署组件库文档

VitePress 搭建组件库文档 当我们组件库完成的时候,一个详细的使用文档是必不可少的。本篇文章将介绍如何使用 VitePress 快速搭建一个组件库文档站点并部署到GitHub上 安装 首先新建 site 文件夹,并执行pnpm init,然后安装vitepress和vue pnpm install -D vitepress vue安…

年轻不乏野心,想做年薪40万+的软件测试工程师?写给长途漫漫中的你...

本人从事自动化测试10年多,之前在猪场工作,年薪突破40W,算是一个生活过得去的码农。(仅代表本人) 目前从事自动化测试的薪资待遇还是很不错的,所以如果朋友们真的对自动化感兴趣的话可以坚持学下去&#xf…

一种视频算法插件流水线执行架构

目的 将视频接入进来以后,使用算法对图像进行处理并且输出 1 各种接入 2 解码 3 解码后图像算法 如矫正算法 4 共享输出 方式 使用动态库的方式进行扫描底层,每个动态库为一个插件,每个插件包含特定的函数,通过扫描的方式加载所…

基于springboot的大学生租房系统源码论文数据库

3.1系统功能 现在无论是在PC上还是在手机上,相信全国所有地方都在进行大学生租房管理。随着经济的不断发展,系统管理也在不断增多,大学生租房系统就是其中一种,很多人会登录到相关的租房系统查看租房信息,还能查看房屋…

11.java程序员必知必会类库之word处理库

前言 正常业务中,可能涉及到和合作方签约电子合同,此时,我们需要先设计合同模板,维护固定内容,将可变的内容通过占位符替代,等签章的时候,生成pdf,然后可以根据设计的合同章的坐标,…

Linux基础命令和程序部署

Linux基础命令 ls 可以查看当前目录内容ls 后面跟上一个具体路径可以查看指定目录内容ls -l 可以以列表的形式查看,缩写llpwd 查看当前目录的绝对路径cd 切换目录(就是window界面的鼠标双击目录进入动作),cd在切换目录时后面可以…