Files
CategoryResourceRepost/极客时间专栏/研发效率破局之道/研发流程/10 | 答疑篇:反对996并不是反对奋斗.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

114 lines
13 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="10 | 答疑篇反对996并不是反对奋斗" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/a8/1a/a84c85a74daa6aede13efcf6c583821a.mp3"></audio>
你好,我是葛俊。
这篇答疑文章已经是我们“研发效率破局之道”专栏的第10篇文章了。很多同学在这些文章下面留下了精彩的留言阐述了自己对研发效能的认识、遇到的问题以及解决方案。
比如,@囧囧冰淇淋,基本每节课都会整理详细的学习笔记,并结合自己的经验进行思考、提炼和总结;又比如,@Geek_93f953@Geek_1988@Robert小七@Johnson@李双@许童童@寒光等同学,提出了高质量的问题。还有很多其他同学留下了非常精彩的留言,这里我就不一一提及了。
这些留言活跃了专栏气氛,帮助其他同学进一步思考,也激励着我要把专栏写得更好。所以,在这里我首先要对你表示感谢,感谢你对我的信任,也感谢你的积极参与。
这9篇文章涉及的问题我基本都在评论区直接回复过了。在今天这篇文章中我会挑选4个大家普遍关注的问题再详细展开一下也算是研发效能综述和研发流程这两个模块的一次总结与复习打好基础以应对接下来的工程方法、个人效能、管理和文化模块的内容。
现在我们就正式开始今天的4个问题吧。
## 反对996并不是反对奋斗
在专栏第1篇文章“[效能模型:如何系统地理解研发效能](https://time.geekbang.org/column/article/125840)”中我谈到了996的话题。从留言来看关于我对996的态度有些同学还存在些误解。所以我们再来讨论下这个问题。
### 第1个误解是硅谷的互联网公司加班不太多工作生活间的平衡做得很好
事实是,硅谷的互联网公司,加班也比较常见。这一点,在创业初期的公司尤其明显。
比如我在2010年加入Facebook的时候Facebook已经比较成熟了有接近800名开发人员。但由于业务的高速发展和同事间的竞争我们的加班都很严重。我每个周末去办公室加班的时候都能看到大概百分之三四十的同事在加班。
所以,工作和生活的平衡,完全要靠自己来调节。而我看到的是,很多开发人员实际上调节的都不是特别好,基本上只有工作没有生活。
另外这样的加班是自愿的没有加班工资。只有在一些特殊时期比如和竞争对手拼速度的时候公司会要求大家Lock down类似于国内的封闭开发才会有加班工资。
### 第2个误解是反对996是在反对奋斗
正如上面所说,硅谷的互联网公司也有很多人在加班,我个人也是大量的主动、自愿加班。因为,我热爱软件开发这个行业,愿意花费大量的时间、精力为之奋斗。
所以我反对996并不是反对奋斗而是反对用工作时长尤其是强制上下班时间来衡量工作效率。
在第2篇文章“[效能度量:效果不好甚至有副作用,怎么回事?](https://time.geekbang.org/column/article/126447)”中,我提到研发效能度量困难的一个原因就是,度量数据的收集难易程度不同,人们倾向拿容易收集的数据去关联效率。因此,管理者使用时长这种很直观、很容易度量的指标去衡量研发效能,结果就是事倍功半。
相比之下,硅谷的很多高效能公司,都是任务驱动型的,也就是说只要你完成任务了,工作时长无所谓。当然了,因为任务量大以及同事间的竞争,很多人会主动加班。但需要注意的是,这些公司并不会强制要求工作时长。更进一步地,它们会提供非常灵活的工作时间安排,方便大家提高工作效率。
比如Facebook默认每周三是没有会议的工作日也就是尽量不安排会议大家可以选择在家工作。另外Facebook的上下班时间很灵活这对于需要接送孩子的员工来说就很方便了。
**总而言之反对996是反对不科学地使用工作时长来提高研发效能。**
## 如何优化移动端开发的流程?
有同学在第7篇文章“[分支管理Facebook的策略适合我的团队吗](https://time.geekbang.org/column/article/132499)”后留言反馈研发流程模块的这几篇文章针对的都是后端开发想了解下移动端开发的内容。在这里我要和你澄清一下我前边描述的各种概念和原则比如持续开发、持续集成、持续交付对前端包括Web前端、移动前端等和后端来说都是一致的。
以Facebook iOS应用开发为例。他们采用的也是单主干的开发分支模式也要求代码提交的原子性以及master分支上线性的代码提交历史。在持续集成方面他们也是使用Phabricator作为流程和质量控制中心进行各种各样的代码入库前检查。在持续交付方面他们也是采用了和后端类似的方式每隔一定时间进行一次全量的构建和验证。
当然,前、后端的开发也有些区别,比如:
- iOS的App Store的发布周期是两周一次所以他们采用了两周一次全量部署的方式取消了日部署和热修复部署。不过后来Facebook采用在原生App中实时加载JavaScript的方式在一定程度上绕过了App Store的发布周期限制于是之后也引入了热修复部署流程。
- 后端代码在持续交付过程中每次构建的结果直接部署到一个网站大家通过特定网址去访问即可进行验证。而移动端开发的情况要复杂一些Facebook的方式是提供App安装服务让大家可以在自己的手机上安装不同版本的App包括master分支版本、周部署测试版本以及线上版本等并提供自动更新的功能。通过这些自动化使得移动开发的流程更顺畅。
- 在测试移动端App的时候需要测试大量的手机硬件和操作系统版本的组合。针对这一需求Facebook进行了大量的自动化能够让测试在各种不同的环境中自动运行。同时Facebook还研发了一个服务化的手机池让开发人员自助式地把自己的App部署到某一个特定的硬件和操作系统上并使用远程控制进行检验。
这里我再和你扩展一下前、后端配合的内容。前、后端团队有各自的部署日程即版本火车由功能开发团队决定后端和前端分别搭乘哪一辆版本火车上线。一般采用的方式是后端先上线同时使用功能开关让这个API对用户不可见然后前端上线最后打开功能开关完成整个功能。
总的来说,研发流程这个模块中提到的各种原则,在前端和后端都同样适用。在理解这些原则之后,你可以针对具体的情况,去设计适合的流程和方法。
## 关于环境获取的具体建议
有同学留言反馈,环境问题是他们研发过程中的最大痛点。具体来说,联调环境、测试环境的获取,常常需要排队。这里,我再提供些具体的解决方法吧。
从我的经验来看,**使用云的架构尤其是在Docker和Kubernetes的支持下把这些环境做成自助化服务是个比较好的解决办法。**
比如虽然Kubernetes没有提供“环境”这一概念但我们可以在它上面添加一层封装通过Infrastructure as CodeIaC的方式来自动化环境的获取和释放。这是一个比较通用的办法。具体来说实现环境服务化的思路是
- 首先把环境模板化并把模板作为代码进行存储。这个模板系统需要支持环境中的资源设置以及服务间的依赖。同时需要提供设定变量的能力来支持用户在环境生成时指定参数处理诸如数据库、MQ等服务在环境上的差异。
- 然后,结合集群资源权限做发布管道编排,这样就可以给不同的流水线的运行结果,也就是软件包,自动按照模板生成环境。
- 最后,可以选择把生成环境的权限开放给开发者,让他们可以通过模板生成联调环境使用。
事实上这样的环境生成、管理系统作用很大。比如可以通过发布管道编排来实现开发、运维、测试整体变更追踪。而且随着业务增长可以扩展到任何应用程序都能按需部署到任何规模的任何环境中。还有如果QA可以将测试数据和测试用例也服务化编排到管道中就可以实现安全高效的一站式发布。
在下一篇文章中,我会与你更系统地讨论如何给团队配置、提供高效的研发环境。希望这样的内容安排,可以最大程度地帮助你解决环境问题。
## 哪几个效能度量指标比较实用?
在第3篇文章“[效能度量:如何选对指标与方法,真正提升效能?](https://time.geekbang.org/column/article/128151)”中,我对常用的度量指标给出了分类方法,以及选用的基本原则。有同学反馈,希望我能给出一些更具体的实施和使用建议。
所以,在今天这篇文章中,我会**基于不同的改进目标**,分别从**提供用户价值、流程高效和质量**这3个角度再给出几个具体建议。
从**提供用户价值**的角度来看,可以选择以下几个指标。
- 净推荐值NPS
- 系统 /App 宕机时间和严重线上事故数;
- 热修复上线时间;
- 核心服务SLA可用性指标也就是我们常说的服务能达到几个9。这个指标尤其适用于需要提供服务给外部客户的组织涉及一些服务的性能和可用性的指标契约直接反映是否达成了对客户的承诺。
从**流程高效**的角度来看,可以选择以下几个指标。
- **WIP在制品数量**,是看板理论的核心思想之一。它指的是,已经开始但没有完成的工作,详见[第3篇文章](https://time.geekbang.org/column/article/128151)对累积流程图的描述。一个非常有效的提高研发流程顺畅度的办法是限制WIP。也就是说每个环节不能同时有超过一定数量的任务。如果你想了解具体细节的话可以参考[《看板方法:科技企业渐进变革成功之道》](https://book.douban.com/subject/25788807/)这本书。
- **发布频率**。如果系统发布没有交易成本发布频率越高越好因为它可以更快地提供用户的反馈。发布的交易成本指的是每次部署需要的流程工作比如拉分支、代码合并、运行测试用例等。考虑到发布的交易成本对很多互联网产品来说1~2周通常是比较合适的发布频率。
- **构建时长**指的是个人构建以及CI/CD构建时长等指标。它们对持续开发和CI/CD顺利执行影响很大。
- **环境获取时长**,指的是开发机器环境、沙盒环境、测试环境的获取需要多长时间。这几个指标,对持续开发影响很大。
从质量的角度来看,可以选择以下几个指标。
- **工单返工率**反映的是开发团队的代码质量和自测程度以及QA的压力和能力。
- **持续交付通过率**:执行构建-&gt;部署-&gt;测试-&gt;发布全流程的成功率,反映的是开发自测质量,以及自动化验收的稳定性。
- **高优先级安全漏洞产生率,安全漏洞修补速度**:这两个安全相关的指标反映的是,团队在安全方面的风险和处理能力。
## 小结
好了,以上就是今天的主要内容了。如果有哪些你希望深入了解的话题还未涉及到,希望你可以留言给我。
最后我想再和你强调一下第4篇文章“[流程优化:怎样才能让敏捷、精益真正为我所用?](https://time.geekbang.org/column/article/128867)”中提到的Why-How-What黄金圈法则和“实用主义”原则。
我觉得,这是提高研发效率的关键所在。因为软件研发是一个非常灵活、非常有创造性的活动,所以我们一定要抓住根本,了解我们到底需要达到什么目的,有哪些基本原则,然后才是学习一些可供我们参考的最佳实践。这样,我们才能灵活运用这些原则、最佳实践,真正提升团队的研发效能。
所以,在整个专栏的写作中,我也会着重系统化地讲解研发效能的基本原则。让我备受鼓舞的是,很多同学在留言中表示会支持这个思路。这里,我衷心希望你可以通过实用主义的方式,去寻找合适自己的最佳实践。
感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再见!