CategoryResourceRepost/极客时间专栏/研发效率破局之道/研发流程/04 | 流程优化:怎样才能让敏捷、精益真正为我所用?.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

153 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<audio id="audio" title="04 | 流程优化:怎样才能让敏捷、精益真正为我所用?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/05/e9/051a550d3ed94d831c1a105d0eeeace9.mp3"></audio>
你好,我是葛俊。今天我们来聊聊怎样从流程方面来提高研发效能。
从这一篇文章开始我们就正式进入研发流程模块了。在第1篇文章中我与你强调了软件开发的最大特点在于它是一条非常灵活的流水线因此提高研发效能的第一步就是优化流程。
<img src="https://static001.geekbang.org/resource/image/e4/bf/e4f3216aa6a40f57fcc7356fb98838bf.png" alt="">
因为优化流程会涉及方法论所以我会先和你介绍高效实践方法论的关键要素。然后我会按照目标、原则和实践3个层次从抽象到具体给你逐步讲解如何优化流程。
需要说明的是,在这一篇文章中,我不会与你大量讨论实践细节,而是把这些内容放在了后续的文章中。
## 如何实践方法论?
其实在研发流程上最不缺的就是方法论从敏捷到精益再到看板层出不穷。但实施效果却不理想。尤其是敏捷无论在硅谷还是在国内绝大部分使用敏捷的团队实施得都不理想导致这个概念的争议很大Scrum有时甚至成了贬义词。
相比之下像Facebook、Google等高效能公司并没有强调使用Scrum、看板等工具研发效能却很高。**这是不是说敏捷、精益这些方法论本身就有问题呢?**
事实上虽然Facebook、Google这些公司没有明确提及敏捷、精益、看板这些方法论或者没有严格地去使用Scrum等框架但在开发流程中却实实在在地应用了这些方法论的精髓。所以说**方法论实施效果不好,关键在于没用好。**
在学习方法论的时候,我推荐使用类似美国著名作家、企业顾问西蒙斯 · 涅克Simon Sinek总结的Why-How-What黄金圈法则。
参见下图最中间的一个圆是Why也就是这个方法论的目标是要解决一个什么问题第二个圆是How也就是这个方法论的基本原则、指导思想最外层的圆是What也就是这个方法论的具体实践。
<img src="https://static001.geekbang.org/resource/image/b0/cb/b06e884d3988c759697a0091e2d471cb.png" alt="">
这3个圆圈从内向外是一个从抽象到具体从通用到定制的过程。
**在使用一个方法论的时候,一定要从内往外看。**
- 中心的目标一般错不了。比如,敏捷的目标就是快速应对变化。
- 原则的通用性就差一些,你需要在理解的基础上挑选适合自己的。比如,敏捷中有一条原则是“面对面交谈是最好的沟通方式”,就不一定适合你的团队。
- 具体的实践,就更要小心,切忌生搬硬套。
所以,我们必须首先深入理解这个方法论的目标和基本原则,然后根据原则因地制宜地选择具体实践。在选择具体实践时,往往需要在已有实践上做些修改才能达到效果,否则事倍功半。
以最容易出现问题的Scrum为例。敏捷的目标是快速应对变化而Scrum就是用来服务这个目标的。但是很多团队在使用的时候严格照搬Scrum的具体方法而“严格照搬”本身就已经违背了敏捷的目标。
相比起来Facebook的众多团队“严格”使用Scrum的很少却一直在大力优化管理、开发等流程来快速应对变化最快找到并满足用户的最新需求。具体来说他们很早就引入了A/B测试、灰度发布、每周定时全量代码部署等实践。这些都是和敏捷方法论相吻合的也是Facebook业务成功的关键技术支撑。
**在引入实践的时候,我的建议是逐步优化已有的开发流程和框架,甚至只给出原则,让团队成员逐步摸索并最终找到合适的方法**。比如,你可以把一个核心原则通知给团队:“流程中总是有一个核心瓶颈。找到它,并解决它”。通过这样一个基本原则的指导,让具体实践逐步形成,对现有工作的影响,以及受到的阻力都会比较小。
了解了怎样使用方法论接下来我和你一起看一组提高研发流程的目标、原则和实践。其实这些并不是一套全新的方法论而是基于Facebook、Google等高效能公司的实践并结合对精益、看板、敏捷等方法论的思考我得出来的一个总结。
## 目标一:寻找用户价值
以终为始地来看,我们最终目的是产生用户价值,生存下去。为此,我们经常需要主动去寻找最好的产品形态。只有方向找准了,流程产生的结果才能有效,才能产生用户价值。所以,**优化研发流程的第一步,就是提高寻找用户价值的效率。**
在这一点上精益创业Lean Startup系统最有效。虽然名字里面有创业二字也有较多商业模式设计和用户开发方面的内容但它有两条原则值得作为开发流程的参考。
**第一条原则是:衡量每一个时间段成果的标准,应该是价值假设方面的进展**。也就是说,你的工作应该让你学习到如何更好地给用户提供价值,而不是开发了多少功能。
举一个极端的例子。比如你的团队在一月份开发了5个功能用户反馈都一般。这时你看不出用户更喜欢什么东西更讨厌什么东西。而在二月份你们只开发了一个功能预计很有用但收到的用户反馈却是负面的被迫连夜回退了这个功能。
那么哪个月的成果更好呢显然是二月份因为它能明确告诉你这个假设是错的让你们在寻找产品符合市场吻合度Product-Market-Fit上前进了一大步。
**第二条原则是使用最小可行性产品Minium Viable ProductMVP来帮助学习**。这里的关键点是要以探索价值为出发点设计产品最快地验证你的假设功能要尽量少能够使用就可以。具体的方法有数据驱动、A/B测试、灰度发布等。
在Facebook工作的时候我们开发一个功能时都会提前计划要验证哪些假设然后设计怎样收集数据才能够验证这些假设。这样一来功能上线的时候就开始收集数据了一旦发现功能不能提供足够的用户价值就把这个功能下线从而确保每个功能都是本着提供用户价值的目的去的。
同时公司也会不断投资A/B测试等试验框架让开发人员能够尽量容易地收集和处理数据。这种开发方式有一个名字叫作度量驱动开发Metrics Driven Development。如果你想深入了解这种开发方式可以参考Uber公司的这篇[文章](https://eng.uber.com/experimentation-platform/)。
## 目标二:提高用户价值的流动效率
软件研发是一条流水线,里面流动的是一个一个给用户提供价值的功能。那怎么提高这条流水线的效率呢?也就是,如何提高用户价值的流动效率。
这里有4条比较直观的基本原则
- 第一,让功能尽快地流动;
- 第二,让节点之间的联动更加顺畅;
- 第三,节点之间的融合;
- 第四,发现整个流程中的瓶颈,并解决它们。
接下来,我们分别看看这四条基本原则。
**第一,让功能尽快地流动**,说白了就是快速开发。问题发现得越晚,修复代价越高,这已经是常识。要做到快速开发,开发人员需要**尽量把功能拆分,同时做好一个提交之后尽快提交**。要做到这一点关键原则是降低提交的交易成本Transaction Cost
提交的交易成本指的是,每一个提交都需要做的额外工作。只有把这个工作量降下来,才能让功能拆分有价值,否则就会抵消掉拆分带来的好处。
具体工程实践包括提高本地构建速度,提供方便的自测环境、测试自动化、持续集成、定位问题提交自动化等。快速开发这个话题是开发高效的关键因素,我会在下一篇文章中与你详细讲述。
**第二,让节点之间的联动更加顺畅**可以通过对关键流程的自动化、工具之间的网状互联以及节点之间的融合来实现。在具体实践上个人代码上线后在和他人的代码集成时容易出现问题这时就可以使用CI/CD持续集成/持续交付)流水线来自动化代码集成过程。
尤其是CI基本上对所有软件开发公司都很有价值。我们一定要尽量用上CI。
另外,有些公司有从需求到开发到上线的一条龙流水线,也被叫作开发者桌面。国内的公司,尤其是大公司很喜欢这种方式。它的好处是,可以把很多底层的东西隐藏起来,容易上手。但它的缺点就是灵活性不够,毕竟难以用一条流水线做到高度的定制,来满足各种各样的高效开发。
开发者桌面的全景图如下所示。开发者桌面作为核心节点,连接其他所有工具,各个工具之间也有一些连接。
<img src="https://static001.geekbang.org/resource/image/d7/76/d7f9a3e8c81bd253d4db4c9331b58076.png" alt="">
在Facebook和Google并没有一个端到端的流水线它们采取的方式是**让这些流程中使用的工具通过开放的API进行一个网状连接从而开发者可以灵活定义小范围的流程高效工作**。在这个网状结构里面,关键节点会作为重要节点大量连接其他流程中的工具,公司对这些关键的、小范围的流程进行大量优化。
比如下面这张图片一共有11个工具互相之间连接很多形成网状结构。其中工具4和工具9是关键节点与很多工具有连接。
<img src="https://static001.geekbang.org/resource/image/8c/3f/8c06ec475f9e03b170c878f9ad64733f.png" alt="">
比如在Facebook代码审查工具Phabricator是一个关键节点可以支持代码审查、代码静态检查、单元测试、集成测试、前后端联调等关键开发工作。这一组工作就是上面提到的一个关键的、小范围的流程。
最近几年由于IDE的发展Nuclide成为了一个新的重要节点。开发者可以在Nuclide里直接进行高效的代码开发以及代码审查等一系列工作。类似地Google的WebIDE也是工具链的一个重要节点。
**从我个人的经验看,这种网状结构提供的灵活性,对提高开发效率和提升开发体验,都有积极的促进作用。**
**第三,节点间的融合**,也是为了保证节点间的联动顺畅。也就是模糊节点间的边界,让功能在节点之间的流动更顺畅。在这一方面,我见到比较有效的方式是:**职能团队提供平台和工具,让全栈工程师能够自己处理端到端的工作**。比如,测试团队提供测试平台和工具,运维团队提供运维平台和工具,这些平台和工具可以通过服务化自助使用。
比如在Facebook没有专职的测试人员只有测试工具团队运维人员也很少主要是提供大量的工具让开发人员能够自己进行测试、运维的基本工作实现开发人员在“开发、测试、运维”这几个步骤上的全栈工作。因为开发人员对自己开发的功能最为熟悉所以这种端到端的全栈工作方式可以让开发和调测效率达到最高。在国内我看到阿里云效也在推荐这种方式。
**第四,发现整个流程中的瓶颈,并解决它们**。约束理论创始人艾利 · 高德拉特Eliyahu Moshe Goldratt在20世纪90年代提出了解决约束的聚焦五步法至今仍然适用软件研发这个价值流体系。具体步骤如下
- 第一步,找到系统中的瓶颈;
- 第二步最大限度地利用Exploit瓶颈尽量通过提高效能的办法解决瓶颈
- 第三步,让企业的所有其他活动都让步于瓶颈改善工作;
- 第四步打破Elevate瓶颈如果第二、三步无效就通过给瓶颈节点增加资源的方法来解决瓶颈
- 第五步重返Repeat第一步找出新的瓶颈持续改善。
**具体的实践有可视化和复盘。**
在可视化方面粘上便利贴的白板或是像Trello那样的电子看板就是很好的工具。
<img src="https://static001.geekbang.org/resource/image/d8/e0/d8903d8ab04c3ef2797af599ce699be0.png" alt="">
这里我需要强调一下,我们一般把这种任务卡片化的系统叫做看板,但它并不是真正的“看板”,只是一个任务可视化的面板而已。
**真正的“看板”是信号卡片,用来表示流水线系统可以增加新的工作项了**。后面我会详细介绍。通过任务可视化,我们可以直观地看到哪一个环节的任务特别多,卡住了,也就是瓶颈在哪儿。另外,前面文章提过的累积流程图,也是发现问题的一个有效工具。
另外统计图表和仪表板也是很不错的工具。在Facebook任务管理系统、部署系统、代码审查系统的API是开放的各个团队可以方便地查询数据制作图表。在仪表板方面2014年的时候就有4个系统可使用。大部分的统计图表和仪表板都是非工具团队自己开发出来并最终推广全公司使用定制功能也很强。
**在复盘方面Facebook做得也很好。他们有一个SEV复盘系统用来记录公司发生的重要事故进行复盘**。每个团队也会不定期地复盘,以定位瓶颈问题并提高。
举一个复盘方法的例子。我在国内某公司遇到一个问题,就是团队在协作上配合不积极,出了问题不是先去解决问题,而是先想方设法甩锅。为解决这个问题,我引入了线上事故回溯讨论会,每两周一次,对发生的事故进行讨论,重在根因分析和以后如何避免,并事前强调目的不是追责。因为,每个故障分析都能暴露出藏在深处的问题,对提高产品质量和团队间的信任效果都很好。
## 小结
优化流程,是提高研发效能的第一步。我们应该按照目标、原则和具体实践的顺序学习和使用各种方法论,选择和配置最适合自己团队的工程实践。
我基于Facebook、Google等高效能公司的实践并结合对精益、看板、敏捷等方法论的思考给你介绍了“寻找用户价值”和“提高用户价值的流动效率”两条目标以及它们对应的6条原则和若干具体实践。
从我的经验来看,高效的研发工作流,对产品质量和研发速度至关重要,同时可以提升员工的幸福感,进而保证持续的高效产出,提高研发效能。
**Facebook在流程方面的实践给我最大的一个感受就是以实用主义的态度从原则出发灵活优化流程**。在Facebook的几年时间里我并没有听到很多新方法论的时髦术语但是公司的很多实践却和这些方法论的原则是一致的甚至是超前这些方法论的。
比如在DevOps流行前的很多年Facebook就开始了打通开发和部署的工作以及推行全栈工程师的工作方式。
从实际出发、以终为始的实用主义是我从Facebook学到的高效研发的最重要原则没有之一。
## 思考题
你理解的精益看板,跟文中提到的任务可视化白板一样吗?你知道它们之间的关系吗?
感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再见!