<audio id="audio" title="01 | 效能模型：如何系统地理解研发效能？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/65/93/65974b88cd7ad1d8f788f889a3baad93.mp3"></audio>

你好，我是葛俊。今天，我来和你聊聊什么是研发效能，以及研发效能的模型，这些内容是理解整个专栏的基础。

今年的3月26日，一位昵称为996icu的用户，在GitHub上创建了996.ICU项目，自此996这个话题被推上了风口浪尖。目前，这个项目已经拿到了24万多颗星。朋友们也常常问我：硅谷的公司有没有996？

其实，在硅谷，很少有公司要求996。不过，在初创公司，因为业务紧张、同事间的竞争，加班也很常见。但是，硅谷和国内的公司有一个很大的区别，就是硅谷的公司一般是任务驱动，只要完成任务就行，不管你花了多少时间。而国内很多实行996的公司不仅仅是要求完成任务，更强调工作时长。但其实，专注时长的这种操作在软件开发行业是不合理的，因为长期加班不能保证持续的高效产出。

从我以及身边许多开发者的经验来看，每天能够高效地产出代码五六个小时，已经相当不错了。短期突击加班会有效果，但如果长期加班，通常效率、质量会下降，产生了Bug就要花费更多的精力去修复。如果这些Bug发布到了用户手上，损失就会更大，得不偿失。

长期加班还会出现无效加班的结果。比如，有个朋友在一家国内一流的互联网公司工作，据他反馈，公司实行996，很多人加班其实是磨洋工，低效加班非常明显。可想而知，其他推行996工作制的公司，大概率也会存在这种问题。

**那么，长期加班效果不好，面对激烈竞争，我们到底应该怎么办呢？**在我看来，这个问题还是要从软件开发本身的特点来解决。

## 为什么要关注研发效能？

软件开发是一个创造性很高的过程，开发者之间的效率相差很大。就比如，10x程序员的生产效率可以达到普通开发者的10倍。其实，不仅是个人，团队间的效率相差也很大。**所以，相比工作时长而言，公司更应该关注的是研发效能**。

接下来，我们再回顾一下我在开篇词中给研发效能的定义：

> 
研发效能，是团队能够持续为用户产生有效价值的效率，包括有效性（Effectiveness）、效率（Efficiency）和可持续性（Sustainability）三方面。简单来说，就是开发者是否能够长期既快又准地产生用户价值。


硅谷的很多知名公司，比如Google、Facebook、Netflix等，在研发效能上做得很好，是研发效能的标杆。这，也是它们业务成功的重要因素。

以我在开篇词中提到的Facebook的部署上线流程为例。Facebook在2012年达到10亿月活的时候，部署人员只有3个，达到平均每个人支撑3.3亿用户的惊人效率。举个形象的例子，如果全中国每一个人都使用Facebook，那最多只要5个部署人员就够了。

Facebook做到这一点的基础，就是不断提高研发效能。还是以上面的部署流程为例，原来的部署已经非常高效，但是在2017年，Facebook又引入了持续部署，做了进一步的优化，实现了更高效率的部署上线。试想一下，如果Facebook选择堆人、堆时间的话，那需要增加多少人、多少加班才能做到呢？

**所以在我看来，如果研发效能提不上去，单靠加人、加班根本不可能解决问题。**

**注重研发效能的另一个巨大好处**，是开发者能够聚焦产出价值，更容易精进自己的技术。于是，团队容易建立起好的氛围，进而又能促进生产效率的提高，形成良性循环，支撑持续的高效开发。

所以，国内公司近一两年越来越注重提高研发效能，许多公司甚至专门成立了工程效率部门。但是，在真正开展研发效能提升工作时，它们却常常因为**头绪太多无从下手，或者对方法了解不够，导致画虎不成反类犬的效果**。这，又和软件研发的高度创造性和灵活性紧密相关。

自软件行业诞生起，开发者们就发挥聪明才智，不断创造新的方法、流程和工具来适应和提高生产效率。互联网产业爆发以来，这一趋势更是明显：从最初的瀑布研发流程到敏捷到精益，从持续集成到持续发布到持续部署，从实体机到虚拟机到Docker，从本地机器到数据中心再到云上部署，从单体应用到微服务再到无服务应用。新的工具、方法，可谓层出不穷。

面对如此多的选择，如果能处理好，则开发体验好，产品发布速度快，研发过程处于一个持续的良性发展情况。但处理不好，就会事倍功半，出现扯皮、重复劳动、产品质量不好、不可维护的情况。

微服务的不合理引入就是一个典型的例子。自从亚马逊成功大规模地应用后，微服务逐渐形成风潮，很多公司在不清楚适用场景的情况下盲目采用，结果是踩了很多坑。

比如，我见过一个初创公司，在业务还没开展起来的时候，一上来就采用微服务，因为没有要求一致的技术栈，也没有限制服务的大小，于是开发人员怎么方便怎么做，只考虑局部优化而忽视了全局优化。半年下来，20人的开发团队搞出了30多个服务和5种开发语言。服务之间的调用依赖和部署上线越来越复杂，难以维护，每次上线问题不断，经常搞通宵才能让服务稳定下来。同时，知识的共享非常有限，有好几个服务只有一个人了解情况，一旦这个人不在的时候这个服务出现问题，解决起来就基本上成了“不可能的任务”。这样的错误使用微服务的公司非常普遍。

那，到底怎样才能有效地提高研发效能呢？硅谷的业界标杆公司又是怎么做到高效能的呢？

## 只有深入研发活动的本质，才能提高效能

我的建议是，提高研发效能，需要**深入了解研发活动的本质，从纷乱的表象和层出不穷的方法中，看到隐藏的模型，找到根本原则**，然后从这些原则出发，具体问题具体分析，找到合适的方法。这样做的原因是，软件研发很灵活，在实践的时候总会遇见各种不同的情况。越是灵活的东西，就越需要理解其本质，这样才能做到随机应变。

在Facebook的时候，我们做事时都遵循一些基本原则。比如，有一个原则是“**不要阻塞开发人员**”，贯穿在公司的很多研发和管理实践中。接下来，我给你举两个具体的应用场景，来帮助你理解这个原则。

**第一个应用场景是，本地构建脚本的运行速度要足够快**。开发人员在自己的开发机器上写完代码之后，都要运行这个脚本进行构建，把新做的改动在自己的开发机器沙盒环境上运行起来，以方便做一些基本检查。

这个操作非常频繁，所以如果它的运行时间太长，就会阻塞开发。因此，确保这个脚本的快速运行就是内部工具团队的一个超高优先级的任务。我们对每次脚本的运行进行埋点跟踪，当运行时长超过1.5分钟后，就会停下手中的工作，想尽一切办法给这个本地构建加速。

**第二个应用场景是，商用软件的采购**。对一定数额下的软件购买，开发人员可以自行决定，先斩后奏。而且那个数额还蛮高的，覆盖一般的软件完全没问题。

我个人就经历过两次在晚上加班时，要购买一个商业软件的情况。如果等主管审批，就需要到第二天。但，公司信任工程师能够在这样的情况下做出利于公司的决定，所以我可以直接购买并使用。这样一来，除了能提高这几个小时的开发效率外，更重要的是，我觉得自己拥有信任和权力，工作积极性更加高涨。

这两个应用场景差别很大，却都是基于“不要阻塞开发人员”这个原则。Facebook之所以会有这个原则，正是因为它认识到了，**开发流程的顺畅是生产优质软件的关键因素，只有这样才能最大程度地释放开发者的创造性和积极性**。相比之下，很多公司更注重强管理下的流程和制度，而忽略了开发的顺畅，结果是开发人员工作起来磕磕绊绊，又谈何高效率呢。

看到这里你会说，我已经很清楚地知道，要想提高研发效能，就必须理解软件开发的本质。那么，软件开发的本质到底什么呢？

接下来，**我就和你探讨一下软件开发的本质特点，然后基于这些特点，搭建出一个研发效能的模型，希望你可以灵活运用，找到提高研发效能的主要着力点。这个思路，将是贯穿整个专栏的主线索。**

## 研发效能的模型是什么？

在我看来，**软件开发本质上就是一条超级灵活的流水线**。这个流水线从产品需求出发，经过开发、测试、发布、运维等环节，每一个环节的产出流动到下一个环节进行处理，最后交付给用户。

<img src="https://static001.geekbang.org/resource/image/3a/b7/3afb132da674578627c30272dd8504b7.png" alt="">

另外，这条流水线的每个环节都还可以细分。比如，本地开发环节可以细分为下面几个部分：

<img src="https://static001.geekbang.org/resource/image/44/28/44e048f968b603e49136b10f5dbdf728.png" alt="">

这种流水线工作方式，在传统的制造业中很普遍，也已经有了很多经验和成功实践。最典型的就是汽车生产中使用的丰田生产体系（Toyota Production System，TPS）。所以，**我们可以参考传统制造行业的经验来提高效能**。

事实上，瀑布模式就类似于传统流水线的处理方法：它强调每个环节之间界限分明，尽量清晰地定义每一个环节的输入和输出，保证每一个环节产出的质量。但，**和传统制造业相比，软件开发又具有超强的灵活性，<strong>体现在以下4个方面**。</strong>

1. 最终产品目标的灵活性。传统流水线的目标确定，而互联网产品的最终形态通常是在不断地迭代中逐步明确，相当于是一个移动的标靶。尤其是最近几年，这一灵活性愈发明显。比如，在精益开发实践中，常常使用MVP（最小可行性产品，Minimal Viable Product）来不断验证产品假设，经过不断调整最终形成产品。
1. 节点之间关系的灵活性，比如流水线上的多个节点可以互相融合。DevOps就是在模糊节点之间的边界，甚至有一些实践会直接去掉某些环节，或者融入到其他环节当中。
1. 每个节点的灵活性。每一个生产环节都会不断涌现出新的生产方式/方法。比如测试，最近十多年就产生了测试驱动开发、Dogfood（狗粮测试）、测试前移等方法；最近又出现的测试右移，开始强调在生产环境中进行测试。
<li>每个节点上的开发人员的灵活性。跟传统制造业不同，流水线上的每一个工作人员，也就是每个开发者，都有很强的灵活性，主要表现在对一个相同的功能，可以选择很多不同的方式、不同的工具来实现。<br>
比如，之前我在Facebook做后端开发的时候，同样一个代码仓，有的同事使用命令行的编辑环境VIM/Emacs，有的使用图形界面IDE，有的使用WebIDE；在实现一个工具的时候，大家可以自己选择使用Python、Ruby或者PHP。这其中的每一个选择，都很可能影响效能。</li>

基于这些特点，我们可以从以下4个方面去提高研发效能。

<img src="https://static001.geekbang.org/resource/image/68/51/68f278d53b0441413842539ed8919c51.png" alt="">

1. 优化流程，主要针对特点1和2，也就是最终产品目标的灵活性和节点间关系的灵活性，进行优化。具体来说，针对最终产品目标的灵活性，主要是提高流程的灵活性，让它能聚焦最终产生的用户价值，以终为始地指导工作，击中移动的标靶。而针对节点之间关系的灵活性，则主要聚焦流水线的顺畅，以保证用户价值的流动受到的阻力最小。
1. 团队工程实践，主是针对特点3，也就是每个节点的灵活性进行优化，聚焦每一个生产环节的工程实践进行提高。
1. 个人工程实践，主是针对特点4，也就是每个节点上开发人员的灵活性，来提高个人研发效能。争取让每个开发人员都能适当地关注业务、以终为始，同时从方法和工具上提高开发效率，实现1+1&gt;2的效果。
1. 文化与管理。任何流程、实践的引入和推广，都必须有合理的管理方法来支撑。同时，文化是一个团队工作的基本价值观和潜规则。只有建立好文化，才能让团队持续学习，从而应对新的挑战。所以，要提高效能，我们还需要文化和管理这个引擎。

优化流程、团队工程实践、个人工程实践，以及文化和管理，就是我们提高研发效能需要关注的4个方面，也就是我们所说的研发效能模型。

在接下来的文章中，我会以这个模型为基础，从以上这4个方向与你介绍硅谷公司，尤其是我最熟悉的Facebook的成功实践，并着重向你讲述这些实践背后的原理。因为只有理解了这些原理和原则，我们才有可能在这个超级灵活和高速发展的软件开发行业里见招拆招，立于不败之地。

## 总结

在今天这篇文章中，我和你再次强调了研发效能是团队能够持续为用户产生有效价值的效率，包括有效性、效率和可持续性3个方面。

而关于如何提高效能，我的建议是深入了解研发活动的本质，从纷乱的表象和层出不穷的方法中，看到隐藏的模型，找到根本原则，然后从这些原则出发，具体问题具体分析，找到合适的方法。

最后，我借鉴传统制造业流水线的形式，并结合软件开发的特定灵活性，总结出了研发效能的模型，主要包括优化流程、团队工程实践、个人工程实践、管理与文化。专栏的后续内容，我将分为这4大模块，帮助你提高团队和个人的研发效能。

其实，研发效能对于硅谷的公司和个人来说，已经是常识，而我在美国工作的10多年，也已经习惯了这种工作方式。回国之后，我深入了解了国内的开发情况，对效能关注不到位的现状颇为吃惊。因为这不符合软件开发这个行业的基本特性，也限制了国内软件行业的发展。

同时，我也对国内开发人员的生存环境，感到些许遗憾。本来软件开发是一个可以充分发挥创造性的、有趣的行业，技术的发展有无尽的空间。但是，开发人员却常常被业务拖着跑，技术发展和创造性都被限制住了。另外，因为拼时长的做法，也伤害了开发者的身体健康和家庭关系。

正是因为这些惊讶和遗憾，我将这十几年对研发效能的理解与实践，做了一次系统梳理，于是就有了今天提到的研发效能模型。我希望这种系统化的模型方法，能够为国内软件团队的效能提升提供一些参考和引导，也希望能够提升开发者个人的技能，以节省出时间来体会研发的快乐，提高生活的幸福感。

## 思考题

你有见过996对团队和产品造成伤害的具体事例吗？

感谢你的收听，欢迎你在评论区给我留言分享你的观点，也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再见！


