研发效率破局
2021-02-20 14:08:56 6 举报
AI智能生成
本文档从研发效能综述、研发流程模块、工程方法模块、个人效能模块、管理和文化模块五个方面讲清楚如何做到研发的高效能。
作者其他创作
大纲/内容
研发效率破局
研发困扰
1、研发团队看起来人也不少,大家也很辛苦,加班也不少了,但是产品发布还是常常延期,上线后产品问题频发
2、用户需求从需求分析、产品设计、开发、测试最终流到部署,但最终发布的产品与用户需求偏差却很大
3、产品发布上线时出现大量提交、合并,导致最后时刻出现很多问题,团队成员集体熬夜加班,却将大把的时间花在了等待环境、等待验证上
4、开发提测质量不好,大量压力聚集到测试这一步,导致代码返工率很高。引入单元测试、代码审查,效果却都不明显
5、开发人员疲于应付业务,没有精力或者兴趣去精进技术,对 Git、命令行等强大工具的使用仅限于皮毛,士气低迷、工作效率低下
研发效能
定义
团队能够持续地为用户产生有效价值的效率
有效 性(Effectiveness)
效率(Efficiency)
可持续性(Sustainability)
能否长期、高效地开发出有价值的产品
本质
提高研发效能,需要深入了解研发活动的本质,从纷乱的表象和层出不穷的方 法中,看到隐藏的模型,找到根本原则,然后从这些原则出发,具体问题具体分析,找到合适的方法。
原则
不要阻塞开发人员
开发流程的顺畅是生产优质软件的关键因素,只有这 样才能最大程度地释放开发者的创造性和积极性
模型
软件开发本质上就是一条超级灵活的流水线。这个流水线从产品需求出发,经过 开发、测试、发布、运维等环节,每一个环节的产出流动到下一个环节进行处理,最后交付给用户
整体流水线
需求分析 --> 软件设计 --> 本地开发 --> 构建 --> 测试 --> 发布 --> 部署 --> 运维
本地开发流水线
瀑布模式
编码 --> 调测调试 --> 静态检查 --> 自动化测试 --> 代码审查
软件开发具有超强的灵活性
最终产品目标的灵活性
传统流水线的目标确定,而互联网产品的最终形态通常是在不 断地迭代中逐步明确,相当于是一个移动的标靶
节点之间关系的灵活性
比如流水线上的多个节点可以互相融合。DevOps 就是在模糊节点之间的边界,甚至有一些实践会直接去掉某些环节,或者融入到其他环节当中
每个节点的灵活性
每一个生产环节都会不断涌现出新的生产方式 / 方法。比如测试,最近十多年就产生了测试驱动开发、Dogfood(狗粮测试)、测试前移等方法;最近又出现的测试右移,开始强调在生产环境中进行测试
每个节点上的开发人员的灵活性
跟传统制造业不同,流水线上的每一个工作人员,也就是开发者,都有很强的灵活性,主要表现在对一个相同的功能,可以选择很多不同的 方式、不同的工具来实现
研发效能模型
优化流程
主要针对特点 1 和 2,也就是最终产品目标的灵活性和节点间关系的灵活性,进行优化
具体来说,针对最终产品目标的灵活性,主要是提高流程的灵活性,让 它能聚焦最终产生的用户价值,以终为始地指导工作,击中移动的标靶
而针对节点之 间关系的灵活性,则主要聚焦流水线的顺畅,以保证用户价值的流动受到的阻力最小
团队工程实践
主是针对特点 3,也就是每个节点的灵活性进行优化,聚焦每一个生 产环节的工程实践进行提高
个人工程实践
主是针对特点4,也就是每个节点上开发人员的灵活性,来提高个人 研发效能
争取让每个开发人员都能适当地关注业务、以终为始,同时从方法和工具上 提高开发效率,实现 1+1>2 的效果
文化和管理
任何流程、实践的引入和推广,都必须有合理的管理方法来支撑
同时,文化是一个团队工作的基本价值观和潜规则
只有建立好文化,才能让团队持续学习,从而应对新的挑战
所以,要提高效能,我们还需要文化和管理这个引擎
度量
从应用程序开发的生命周期中获取数据,并使用这些数据来衡 量软件开发人员的工作效率
目标
跟踪团队的表现、提高团队的绩效
通过确定研发效率指标,公司可以明确团队和成员的工作预期,从而使得开发人员能够目标性更清晰地投入研发
同时,这些生产指标可以作为“晴雨表”,帮助团队定位影响工作效率的不良因素,从而帮助团队消除这些因 素,最终达到团队更快乐、绩效更高的目的
提高项目计划的精确度
团队负责人可以通过度量来估算一个需求端到端的成本,包括 收集成本、设计系统成本、开发测试成本,以及运维成本等,来了解每项活动在项目总 成本中的占比,从而更好地确定这些活动的优先级
同时,我们可以了解哪些步骤有较 大风险和不确定性,从而提高预测项目进展的精准度
了解流程是否高效,寻找需要改进的关键领域
我们可以衡量进行每项研发活动所需的 时间,并估算其对质量和生产效率的影响,然后比较成本和收益,最终确定哪些步骤是 高效的,以及哪些步骤是需要改善的
我们还可以对不同的实践进行 A/B 测试,以此 来选择更好的方法
总结
提高团队绩效、提高计划精确度,以及寻找关键的待改进领域,这三个因素的结合有助于简 化工作流程,发现瓶颈,帮助团队持续改善现有产品的生命周期,从而更高效地生产出质量更好的产品
方法
困难
软件开发的灵活性决定了研发效能提升的困难性
可以关注的点太多
可以使用的方法也很多
不可生搬硬套
研发流程
一、优化研发流程
提高寻找用户价值的效率
以终为始地来看,我们最终目的是产生用户价值,生存下去
找准方向,流程产生的结果才能有效,才能产生用户价值
提高用户价值的流动效率
第一,让功能尽快地流动;
快速开发
降低提交的交易成本
每一个提交都需要做的额外工作。只有把这个工作量降下来,才能 让功能拆分有价值,否则就会抵消掉拆分带来的好处
开发人员需要尽量把功能拆分,同时做好一个提交之后尽快提 交
风险
问题发现得越晚,修复代价越高
工程实践
提高本地构建速度
提供方便的自测环境
测试自动化
持续集成
定位问题提交自动化
第二,让节点之间的联动更加顺畅;
可以通过对关键流程的自动化、工具之间的网状互联, 以及节点之间的融合来实现
个人代码上线后,在和他人的代码集成时容易 出现问题,这时就可以使用 CI/CD(持续集成 / 持续交付)流水线来自动化代码集成过程
尤其是 CI,基本上对所有软件开发公司都很有价值。我们一定要尽量用上 CI
开发者桌面(Web版)
有些公司有从需求到开发到上线的一条龙流水线
第三,节点之间的融合;
为了保证节点间的联动顺畅。也就是模糊节点间的边界,让功能 在节点之间的流动更顺畅
通过服务化自助使用
职能团队提供平台和工具,让全栈工程师能够自己处理端到端的工作
测试团队提供测试平台和工具
运维 团队提供运维平台和工具
第四,发现整个流程中的瓶颈,并解决它们;
具体步骤
第一步,找到系统中的瓶颈;
第二步,最大限度地利用(Exploit)瓶颈,尽量通过提高效能的办法解决瓶颈;
第三步,让企业的所有其他活动都让步于瓶颈改善工作;
第四步,打破(Elevate)瓶颈,如果第二、三步无效,就通过给瓶颈节点增加资源的方 法来解决瓶颈;
第五步,重返(Repeat)第一步,找出新的瓶颈,持续改善
可视化
粘上便利贴的白板,任务可视化面板
分支主题
复盘
事前强调目的不是追责
重在根因分析和以后如何避免
高效研发的重要原则
从实际出发、以终为始
以实用主义的态度,从原则出发,灵活优化流程
高效的研发工作流,对产品质量和研发速度至关重要,同时可以提升员工 的幸福感,进而保证持续的高效产出,提高研发效能
二、代码入库前流程
开发活动
包括编码、调测调优、静态检查、自动化测试、代码审查等
代码效能
提高开发者编写代码的效能,关键在于让开发者不受阻塞、不受不必要的干扰,从而全身心地聚焦在产品开发上
持续开发
1、规范化、自动化核心步骤
要让开发者聚焦于开发,就必须把研发流程中可以自动化的步骤尽量自动化
分析关键路径上的活动,以及耗时较长的 活动,然后投入精力优化这些步骤
开发步骤
1、获取开发环境,包括获取开发机器、配置环境、获取代码等
2、在本地开发机器上进行开发,包括本地的编码、调测、单元测试等
3、代码入库前,把改动提交到检查中心(比如 Gerrit),再进行一轮系统检查,主要包括代码检查、单元测试、代码审查等,通过之后再入库
提高开发环境的获取效率
把整个开发环境的获取,进行服务化、自助化
开发者可以自助地申请获取环境,不需要 IT 部门的人员介入,从而既节省了开发者的时 间,又降低了 IT 部门的人力成本
规范化、自动化本地检查
建设并自动化代码入库前的检查流程
2、快速反馈,增量开发
二、信息流通
问题
最终产品背离用户需求
前后端沟通不顺畅
后端修改 API 阻塞了前端的工作,或者后端实现了新的 API 前端不 知道,继续使用旧的 API 造成浪费
信息孤岛
在公司内部找信息反而比在互联网上找信息还要难,需要到处找人问,还不一 定能问到
信息难以溯源
团队成员不知道怎么寻找问题的源头,也不知道软件包发布了哪些功能
工作干扰大
开发工作常被实时聊天工具、电话等打断,刚整理好的思路又得重新梳理
怎么破
首先,从“人”入手,建设共享文化,鼓励共享行为,使信息共享与团队成员利益一致, 从而让大家愿意共享
然后,在流程和工具方面,针对与研发相关的信息,设计并实现对应代码、文档的共享, 以及信息在流水线上的自动化流动
最后,在沟通技巧上下功夫,掌握高效沟通的原则,根据场景选择合适的沟通方式和工 具
如何做
团队成员愿意共享是有效沟通的前提
人的意愿很重要
团队成员愿意共享,是有效沟通的前提
如何调动团队成员共享消息的意愿?
首先,要让团队成员了解信息的重要性
软件开发本来就需要多人协作,沟通的重要性不言 而喻
在对需求有疑问时提醒自 己,如果现在花一小时的时间去沟通,很可能会节省自己后面三天的时间
作为团队管理 者,我们更要在团队内强调沟通的重要性
重要性
在团队内部 建设机制,来鼓励共享的行为,从而形成共享的文化
让信息共享和每个成员的利益紧密联系起来,才会主动去沟通
按照产品或者功能划分团队,让团队成员直接对产品或者功能负责
改变公司的组织架构往往阻力大、推进缓慢;组件虚拟团队更为有效
信息沟通顺畅的基础
设计流程和使用工具,推动研发信息高效沟通
关键点
确认研发流程中的重要信息,然后针对性地设计合适的流程,并选用恰当的工具
对提高研发效能起到关键作用的信息
第 1 种信息是,战略目标相关的信息
处理原则
尽量公开
只有当团队成员清楚公司以及团队目标时,才能更容易 地把自己的目标与之对齐
召开员工大会
详细列举公司的战略目标
Q&A 会议
回答员工提出的各种问题
促进员工对公司战略和目标的深入理解
第 2 种信息是,代码相关的信息
建议在不泄露核心机密、不影响核心业务的前提下, 尽量扩大代码公开的范围以及受众人群
选择共享代码的工具和方式,基本原则是方便查找,并在进行开发工作的主要入口(比如 IDE、命令行工具、Web 浏览器)提供接口
高效的代码浏览和搜索对研发顺畅很重要
第 3 种信息是,研发过程中用到的各种文档
包括产品设计文档、开发设计文档、测试文档、部署流程文档等
确保这一类信 息的高效流通,比较有效的原则是,通过统一的工具,方便大家添加、修改、查询这些文档
文档管理
第一,文档的管理流程,由每个小的功能团队决定,主动寻找一种适合自己团队的 文档管理方式和工具
第二,绝大部分 Wiki 和 Quip 管理的文档都是全公司公开的,所以团队之间也可以很方 便地找到其他团队的相关文档,避免信息孤岛的问题
第 4 种信息是,各种标识信息
整个研发流程中,在各种工具之间流动着多种标识信息,包括任务工单、代码提交号、版本 号、代码审查 ID、测试用例 ID、Bug ID 等
通过对研发流程中重要信息的管理,以及对应的高效沟通方式,我们就实现了研发信息流通 的顺畅性,从而实现了团队的高效协作
管理这一类信息的有效方法是, 各种工具通过提供 API,做到服务化,形成工具之间的网状连接
沟通方式技巧
高效沟通的首要原则
根据沟通需要达成的任务的实时性、方便追溯性,以及对别人 的干扰程度,选择合适的沟通工具
沟通方式.png
附件
使用聊天工具和电话
优点
实时性好、立马能得到反馈
缺点
问题难以追踪。在聊天群里讨论问题时,问题只要一多马上就乱了,很难找到之前的相关内容
对他人干扰巨大。一个极端情况是,我见过一个公司,有数据显示开发人员平均每 8 分 钟就会被打断一次。可想而知,这种情况下的开发效率自然很低。
就是针对不同的情况,要求大家使用合适的工具去沟通,并逐 渐形成习惯
沟通过程
对某个任务进行讨论时
直接使用任务工具中的讨论功能,同时通过 @的方式来告知相关人员。而一般的工具都可以配置出现 @时,自动发邮件通知对方。 所以,如果不是紧急任务,都可以采用这种方式
其次,在询问问题的时候
如果问题不紧急,尽量使用邮件,避免使用即时聊天工具和电话
为了确保大家能够及时 回复邮件,可以在团队内制定一个规定,要求检查邮件的频率,比如说每天至少检查一次 或者两次
如果问题紧急,则直接使用即时聊天工具、电话
如果要讨论的问题比较复杂,或者是非常紧急,则直接选择电话,或者面对面沟通
选择合适的沟通方式及工具,不仅可以大大减少员工间的互相干扰,还可以提高 问题的可追溯性,对团队以及个人的研发效能提升帮助非常大
1、实现高效沟通首先要解决的,就是团队成员的意愿问题,让他们愿意沟通
我们可以将沟通 与团队成员的利益挂钩,在团队内部建设机制,来鼓励共享的行为,从而形成共享的文化
2、针对研发流程中流动的各种信息,我们要做好分类,针对性地设计合适的流程,并选 用恰当的工具,最大程度地共享给团队成员
比如,公司的代码、战略目标、文档、流程等 信息,尽量公开;再比如,使用统一的工具,方便团队成员添加、查询有效信息
3、在平时的沟通中,要权衡实时性、可追溯性以及对其他成员的干扰程度。根据场景, 选择合适的沟通方式和工具,提升团队和个人的研发效能
开发者大多在沟通上有所欠缺,有时甚至认识不到沟通的重要性。事实上,信息的缺失,对研发效能影响非常大。试想一下,如果没有搜索引擎的帮助,你写代码的效率会下降多少 呢。所以,在信息沟通上多花些时间、精力,对团队和个人效能的提升都大有裨益。
工程方法
研发环境
代码审查
工具
Phabricator
可以支持代码审查、代码静态检查、单元测试、集成测试、前后端联调等关键开发工作
质量与速度的均衡
问题:开发过程 越快越好,越快越有竞争力?
快速开发可以快速得到用户反馈,更快地验证用户价值假设。无疑,这是高效开发的重要原则
我们在实际工作中,往往会为了快而选择各种“捷径”
要开发已有功能的一个相似功能,因为时间很紧就先 copy & paste,保证功能按时上线
需要在一个函数里增加功能,这个函数已经有 800 行了,加上新功能后会有 1000 行。 重构这个函数是来不及了,先把功能加上去再说
投机取巧
个人效能
高效工作
深度工作
效率工具
管理和文化
业务目标和技术目标两手抓
0 条评论
下一页