研发效能是什么?为什么现在都在谈如何提高研发效能?研发效能对于一个企业到底有多重要?本文按照Why、What、How三步走沉淀梳理了研发效能相关的知识点。
一. 为什么要提升研发效能
- 传统的职能部门组织架构带来的效率竖井问题
- 人力的增加没有让项目进度加快
- 长久加班导致团队士气低落,后续的效率降低
- 上线前加班、熬夜,压力大
- 上线后Bug、事故频发,实现效果与需求不匹配
- 各种重复低效工作,疲于应付业务
- 想要有限的人力做更多的产出
二. 什么是研发效能
对于一个企业来说,追求的是企业效能的最大化,包括:利润、用户规模、客户满意度、运营效率等。而对于需要研发自有产品的互联网公司来说,研发效能则是服务于企业效能的至关重要的因素。
一个软件研发的完整流程如下图所示:
此流程交付期望产品的效率和能力,即研发效能。更进一步的《研发效率破局之道》中将研发效能定义为团队能够持续地为用户产生有效价值的效率,包括 有效性(Effectiveness)、效率(Efficiency)和可持续性(Sustainability) 三个方面。其增加的可持续性指出研发效能应该着眼于长期效果。
一句话来讲,研发效能就是持续快速交付价值的能力。
三. 如何提升研发效能
对应于第一部分中讲述的软件开发流程,如果想要提升研发效能,那么需要落实到研发流程(组织结构、项目管理、持续交付)、工程方法、个人效能以管理和文化的实践上。本文重点从研发流程、工程方法两方面来讲。
3.1 衡量指标
评估一个组织持续快速交付价值的能力,需要一组可量化的数据或参数,用来跟踪和评估开发过程的“健康”状况。
3.1.1 指标分类
- 持续发布能力
- 发布频率:单位时间内的有效发布次数
- 发布前置时间:从代码提交到功能上线花费的时间
- 需求响应周期
- 交付周期时间:从确认用户提出的需求开始,到需求上线经历的平均时长。
- 开发周期时间:从开发团队理解需求开始,到需求可以上线所经历的平均时长。
- 交付吞吐率
- 单位时间交付用户需求数量:单个团队的对比
- 交付过程质量:质量内建
- 缺陷创建和修复时间分布:缺陷能够持续和及时地被发现,并在发现后尽快修复。
- 缺陷库存:开发过程控制缺陷库存量,让产品始终处于接近可发布状态,是持续交付的基础
- 交付质量:系统的可用性
- 单位时间问题数目
- 线上问题解决时长
3.1.2 通用目标
- 2:2周交付周期。从想法提出并确认到上线的时间。【跨职能、组织的协调一致和紧密协作】
- 1:1周开发周期。从需求设计完成(对开发就绪)到达到可上线的时间。【需求的拆分和管理,开发团队的分工协作模式,持续交付实践】
- 1:1小时的发布前置时间。代码提交后可以在1小时内完成发布。【持续交付流水线】
3.1.3 选择优化指标
流程中总是有一个核心瓶颈。分析关键路径、定位瓶颈,针对优化
- 使用指标来发现问题而不是做绩效考核
- 使用指标来检验优化效果
- 使用价值流图/累积流程图发现全局瓶颈,从而确定需要提升的度量指标
3.2 组织结构&&项目管理
3.2.1 组织结构
避免“效率竖井”: 采用以业务为单位的组织架构,保证业务线全栈配齐,目标一致。并从全局定位瓶颈进而进行优化工作。
3.2.2 项目管理
使用敏捷开发来提升研发效率
- 敏捷 = 价值观 + 原则 + 一系列符合价值观和原则的方法。
- 软件应该一直处于可工作状态
- 每个迭代都能将软件部署到一个类生产环境中,并向用户演示
- 迭代长度不超过两周
- 透明性、协作性、纪律性和持续改进
- 使用MVP,度量驱动开发
- 流程尽快流动:工程方法支撑
- 发现整个流程中的瓶颈,并解决:可视化工作流、事故复盘
- 避免“小瀑布”
- 价值排序
- 满足客户需要
- 需求拆分成能够独立测试的需求!!!
- 看板
- 从个人转变到关注价值流动:待开发->设计->开发->开发自测->代码评审->测试->完成
- 明确的“完成的定义”DoD,明确了状态迁移必须完成的活动
- 从实际出发、以终为始:以实用主义的态度,从原则出发,灵活优化流程
一个可供参考的项目管理标准动作可见:项目管理标准模板
3.3 持续交付
持续交付指的是在短周期内完成软件产品,以保证软件保持在随时可以发布的状态。让每一个变更都经过一条自动化的检验流水线,来检查每一个变更的质量,通过就进入下一个阶段。其不是一种工具,而是一种实践!
- 不要阻塞开发人员
- 每个团队指定构建负责人或者发布工程师:优化交付流水线,提升交付效率
- 项目状态,应该对参与整个过程(包括构建、部署、测试和发布)的所有人都是可见的
- 风险管理
- 迭代增量式交付是有效风险管理的关键
- 手工测试环境、试运行环境和生产环境总是需要严格的访问控制
- 让风险识别成为每日立会的一部分
- 审计
- 手工测试环境、试运行环境和生产环境总是需要严格的访问控制:指定谁能够访问“特权”环境。
- 要求每次部署都要进行审计,以确切知道到底修改了哪些内容。
- 文档自动化、自文档
具体可见:持续交付这点事
3.3 工程方法
3.3.1 技术债
在开发产品或者功能的过程中,没有使用最佳的实现方法而引入的技术问题。需要持续关注业务和技术债。对业务机会敏感,敢放手一搏大量借贷,也知道什么时候必须偿还技术债。
- 利用技术债的好处,必要时要大胆“举债前行”
- 控制技术债,在适当的时候偿还适当部分的技术债。
3.4.2 云计算
利用好云计算带来的服务化、自助化和弹性伸缩三大优势。初创公司在业务刚起步时,使用 SaaS 或者 PaaS 快速开发业务;业务成长到一定规模之后,再逐步转到 IaaS 以及私有云降低成本。
- 细节抽象得越多,云服务商负责的部分就越多,我们就越能够聚焦自己的业务,从而提高研发效能
- 使用云资源时,通过工具或者 API 调用来完成工作,减少人工参与,达到自动化
- 资源共享、弹性伸缩
- 容器:不可变基础设施;基于K8S建设PaaS
在使用云计算时,要妥善处理它带来的挑战,比如分布式系统带来的安全和控制方面的问题。
- 自治和集中管理相结合:信息可视化(系统整体的质量看板、调用链追踪)
- 错误处理
3.4.3 测试机制
上文持续交付一部分中最关键的其实就是测试部分,只有具有完善、可靠的测试机制,才能保证研发质量和交付效果,才能从根本上提高研发效能。
- 测试左移:质量内建,即持续交付中的测试机制。
- 按照功能的维度管理团队,让整个功能团队对产品负责;改变团队成员对测试工作的认知
- 把测试添加到开发和产品需求步骤中
- 频繁测试,快速测试:提升测试运行的速度,并行运行、提高构建速度、精准测试、分层测试、减少不必要的用例
- 测试右移
- 利用线上的真实环境测试:需要有完备的数据隔离机制
- 测试人员介入线上监控和预警,及时发现问题并跟进解决
- 混沌工程:即在真实环境中通过模拟各种不可预期的故障来验证系统稳定性
3.4.4 平台化
通过抽象共性组件、功能,达到代码、功能复用,从而减少重复开发,提高研发效能。
- 技术平台:技术设施的复用
- 数据中台:数据沉淀和输出能力
- 移动中台:前端组件、跨平台开发、插件化、热加载
- 业务中台
- 业务能力的复用
- 赋能业务
相关资料可见:中台简谈
3.5 个人效能
如何提高开发人员自身的开发效率,除了每个人自身的天赋能力外,也有一些可以刻意使用的高效工具和方法。
- 高效工作方法
- 抽象和分而治之
- 快速迭代
- DRY
- 番茄工作法
- 高效开发工具
- 好的IDE
- 操作系统快捷键
- 思维导图软件
- 学习笔记软件
- 文档撰写工具
- 持续学习:不断地学习新的开发技能,从而提升自己的开发效率
此外,还可以通过技术管理从外部驱动个人效能的提升,这在下面的技术管理部分会讲。
3.6 管理和文化
3.6.1 技术管理
管理包括:看方向、管人、管事。做好技术管理是提高研发效能的关键部分。其中,3.4节个人效能部分的数字驱动也是技术管理的一部分。主要步骤包括:
- 制定目标:兼顾业务目标和技术目标
- 目标管理:使用OKR等目标管理方案
- 计划并执行去实现目标
此外,技术管理中一个很难的问题是如何进行考核。这里可以使用数字化的方式,以驱动个人效能的提升。
- 选择个人效能度量指标
- 根据代码提交日志自动生成工作日报和周报、个人贡献值
- 综合多维数据构建个人的数据画像
- 社会地位:用排名、榜单来实现;
- 工作本身:用复合型报告去综合评价,告知员工究竟做得好不好
- 自我改变:通过雷达图,进行多维度的数据分析,精准提炼员工的优点与不足,员工可以有针对性的取长补短。
需要说明的是,如果指标不能全方面的衡量,就不要做为考核指标,仅仅用于发现问题,解决问题!
一个可参考的技术管理标准动作模板见:技术管理标准模板
3.6.2 团队文化
团队文化是团队成员共同认可的价值观和行为准则,良好且有效的文化是保障团队高效产出的关键部分。很多互联网公司都是工程师文化主导的,包括Facebook、Google、百度等。他们也都具有自己独特的企业文化价值观,如百度的简单可依赖、谷歌的不作恶、Netflix的自由和责任。建立团队文化的步骤如下:
- 定义:总结、明确自己团队的文化,提炼出简单易记的文字。
- 主张:各种形式的传播。从我自己的经历来看,不断地念经是其中最有效的方式。
- 追求:在奖惩中体现出文化价值观的作用。如对于文化价值观贯彻优秀的同学给与公开的肯定与奖励。