你好,我是葛俊。
这篇答疑文章,已经是我们“研发效率破局之道”专栏的第10篇文章了。很多同学在这些文章下面留下了精彩的留言,阐述了自己对研发效能的认识、遇到的问题以及解决方案。
比如,@囧囧冰淇淋,基本每节课都会整理详细的学习笔记,并结合自己的经验进行思考、提炼和总结;又比如,@Geek_93f953、@Geek_1988,@Robert小七、@Johnson、@李双、@许童童、@寒光等同学,提出了高质量的问题。还有很多其他同学留下了非常精彩的留言,这里我就不一一提及了。
这些留言活跃了专栏气氛,帮助其他同学进一步思考,也激励着我要把专栏写得更好。所以,在这里我首先要对你表示感谢,感谢你对我的信任,也感谢你的积极参与。
这9篇文章涉及的问题,我基本都在评论区直接回复过了。在今天这篇文章中,我会挑选4个大家普遍关注的问题再详细展开一下,也算是研发效能综述和研发流程这两个模块的一次总结与复习,打好基础以应对接下来的工程方法、个人效能、管理和文化模块的内容。
现在,我们就正式开始今天的4个问题吧。
在专栏第1篇文章“效能模型:如何系统地理解研发效能”中,我谈到了996的话题。从留言来看,关于我对996的态度,有些同学还存在些误解。所以,我们再来讨论下这个问题。
事实是,硅谷的互联网公司,加班也比较常见。这一点,在创业初期的公司尤其明显。
比如,我在2010年加入Facebook的时候,Facebook已经比较成熟了,有接近800名开发人员。但由于业务的高速发展和同事间的竞争,我们的加班都很严重。我每个周末去办公室加班的时候,都能看到大概百分之三四十的同事在加班。
所以,工作和生活的平衡,完全要靠自己来调节。而我看到的是,很多开发人员实际上调节的都不是特别好,基本上只有工作没有生活。
另外,这样的加班是自愿的,没有加班工资。只有在一些特殊时期,比如和竞争对手拼速度的时候,公司会要求大家Lock down(类似于国内的封闭开发),才会有加班工资。
正如上面所说,硅谷的互联网公司也有很多人在加班,我个人也是大量的主动、自愿加班。因为,我热爱软件开发这个行业,愿意花费大量的时间、精力为之奋斗。
所以,我反对996,并不是反对奋斗,而是反对用工作时长,尤其是强制上下班时间,来衡量工作效率。
在第2篇文章“效能度量:效果不好甚至有副作用,怎么回事?”中,我提到研发效能度量困难的一个原因就是,度量数据的收集难易程度不同,人们倾向拿容易收集的数据去关联效率。因此,管理者使用时长这种很直观、很容易度量的指标去衡量研发效能,结果就是事倍功半。
相比之下,硅谷的很多高效能公司,都是任务驱动型的,也就是说只要你完成任务了,工作时长无所谓。当然了,因为任务量大以及同事间的竞争,很多人会主动加班。但需要注意的是,这些公司并不会强制要求工作时长。更进一步地,它们会提供非常灵活的工作时间安排,方便大家提高工作效率。
比如,Facebook默认每周三是没有会议的工作日,也就是尽量不安排会议,大家可以选择在家工作。另外,Facebook的上下班时间很灵活,这对于需要接送孩子的员工来说,就很方便了。
总而言之,反对996,是反对不科学地使用工作时长来提高研发效能。
有同学在第7篇文章“分支管理:Facebook的策略,适合我的团队吗?”后留言反馈,研发流程模块的这几篇文章针对的都是后端开发,想了解下移动端开发的内容。在这里,我要和你澄清一下,我前边描述的各种概念和原则,比如持续开发、持续集成、持续交付,对前端(包括Web前端、移动前端等)和后端来说都是一致的。
以Facebook iOS应用开发为例。他们采用的也是单主干的开发分支模式,也要求代码提交的原子性,以及master分支上线性的代码提交历史。在持续集成方面,他们也是使用Phabricator作为流程和质量控制中心,进行各种各样的代码入库前检查。在持续交付方面,他们也是采用了和后端类似的方式,每隔一定时间进行一次全量的构建和验证。
当然,前、后端的开发也有些区别,比如:
这里,我再和你扩展一下前、后端配合的内容。前、后端团队有各自的部署日程(即版本火车),由功能开发团队决定后端和前端分别搭乘哪一辆版本火车上线。一般采用的方式是,后端先上线,同时使用功能开关让这个API对用户不可见;然后前端上线,最后打开功能开关完成整个功能。
总的来说,研发流程这个模块中提到的各种原则,在前端和后端都同样适用。在理解这些原则之后,你可以针对具体的情况,去设计适合的流程和方法。
有同学留言反馈,环境问题是他们研发过程中的最大痛点。具体来说,联调环境、测试环境的获取,常常需要排队。这里,我再提供些具体的解决方法吧。
从我的经验来看,使用云的架构,尤其是在Docker和Kubernetes的支持下,把这些环境做成自助化服务,是个比较好的解决办法。
比如,虽然Kubernetes没有提供“环境”这一概念,但我们可以在它上面添加一层封装,通过Infrastructure as Code(IaC)的方式,来自动化环境的获取和释放。这是一个比较通用的办法。具体来说,实现环境服务化的思路是:
事实上,这样的环境生成、管理系统作用很大。比如,可以通过发布管道编排来实现开发、运维、测试整体变更追踪。而且,随着业务增长,可以扩展到任何应用程序都能按需部署到任何规模的任何环境中。还有,如果QA可以将测试数据和测试用例也服务化,编排到管道中,就可以实现安全高效的一站式发布。
在下一篇文章中,我会与你更系统地讨论如何给团队配置、提供高效的研发环境。希望这样的内容安排,可以最大程度地帮助你解决环境问题。
在第3篇文章“效能度量:如何选对指标与方法,真正提升效能?”中,我对常用的度量指标给出了分类方法,以及选用的基本原则。有同学反馈,希望我能给出一些更具体的实施和使用建议。
所以,在今天这篇文章中,我会基于不同的改进目标,分别从提供用户价值、流程高效和质量这3个角度,再给出几个具体建议。
从提供用户价值的角度来看,可以选择以下几个指标。
从流程高效的角度来看,可以选择以下几个指标。
从质量的角度来看,可以选择以下几个指标。
好了,以上就是今天的主要内容了。如果有哪些你希望深入了解的话题还未涉及到,希望你可以留言给我。
最后,我想再和你强调一下,第4篇文章“流程优化:怎样才能让敏捷、精益真正为我所用?”中,提到的Why-How-What黄金圈法则和“实用主义”原则。
我觉得,这是提高研发效率的关键所在。因为软件研发是一个非常灵活、非常有创造性的活动,所以我们一定要抓住根本,了解我们到底需要达到什么目的,有哪些基本原则,然后才是学习一些可供我们参考的最佳实践。这样,我们才能灵活运用这些原则、最佳实践,真正提升团队的研发效能。
所以,在整个专栏的写作中,我也会着重系统化地讲解研发效能的基本原则。让我备受鼓舞的是,很多同学在留言中表示会支持这个思路。这里,我衷心希望你可以通过实用主义的方式,去寻找合适自己的最佳实践。
感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再见!
评论