怎样提升研发效率(1)

标签: 提升 研发 | 发表时间:2022-06-25 23:28 | 作者:Xargin
出处:http://xargin.com/

几十~几百人规模的小公司,业务、研发、产品、市场等等角色的沟通成本并不是特别高。在公司创业早期,一个人身兼数职,沟通成本就更低了。有事情,大家拉到会议室,简单学一下金字塔原理,碰到问题很快就能得到解决方案。

游戏界有一个很经典的案例,早期从北方暴雪跳槽出来的几个人,都是会写代码的美工,他们只用了 12 个人,在很短的时间内以极高的效率做出了 torchlight 这个游戏,完成度很高,令人惊叹。

公司扩张到千人时,沟通瓶颈就开始比较明显了,即使将所有人的 schedule 全部用会议塞满,还是难以快速有效地得到结论,所有人看起来都很忙,项目延期更是常事。大公司在和小公司在竞争的时候,同一起跑线的项目甚至会比小公司还慢,为什么会这样?

很简单,随着规模的扩张,大多数人的大部分时间都被浪费掉了。可以从研发的视角来举一些例子:

  • 编码时间被无穷无尽的对齐会议,故障处理,日会,周会,双周会,月会挤压,只能在一天挤出两三小时来做主业
  • 公司的人员配比不合理,例如 PM 有很多,但 RD 却不多,产品经理迫于 KPI 压力不断地规划短期低 ROI 项目,缺乏适当的中长期规划,导致研发人员需要不断地去做短期需求,处理短期故障,如此往复
  • 部门分工不闭环,大部分需求都需要跨部门合作,需要用大量的时间来对齐

就这么随便举举例子,就感觉到现如今的大公司工程师们生存何其艰难。有条件的话,我们还是要尽量来想想办法。

这篇文章要讲的解法就是尽量将可能会出的问题都通过工具化来避免。

工具化的优点是什么呢?

  • 降低事务性工作所占用的时间
  • 让知识和经验在企业内传承
  • 降低、消灭重复的错误

这些应该是比较好理解的,我来举几个最近碰到的案例,来说明工具化会对我们的工作效率产生怎样的影响。

依赖注入

以最近碰到的 case 为例,团队中的框架使用了 google 的 wire 作为依赖注入工具。在合作开发的项目中,有些人其实是不懂 wire 的。

我们知道这种代码生成的工具,会有一个原始文件和生成的文件,开发者负责编辑原始文件,运行 wire 生成实际需要执行的代码。比如:

wire.go => wire_gen.go

不太懂的开发者会直接去修改 wire_gen.go,在修改过之后,其实 wire.go 和 wire_gen.go 的内容就不太对得上了。但是因为编译时使用的是生成后的文件,所以上线之后验证没什么问题。

之后来了一位按正常流程开发的 RD,先修改 wire.go,然后手动执行 wire 命令,覆盖 wire_gen.go,这样前一位开发的代码就直接被覆盖消失了。

依赖注入的代码一般都用来做些初始化功能,新代码在上线后,老的业务功能可能就突然挂掉了。

从技术上来讲,这是一个比较蠢的错误,如果按照很多国内公司的管理套路,这时候可能就要祭出“敬畏线上,认真 review”的套路了。但其实我们可以用工具来避免这种问题再发生啊。

比如我们可以通过扫描 wire.go,判断 wire.go 和 wire_gen.go 的代码是不是能对得上,既然想到了这个解法,那 Google 的工程师应该也不应该想不到:

  ❯❯❯ wire -h
Usage: wire <flags> <subcommand> <subcommand args>

Subcommands:
	check            print any Wire errors found
	commands         list all command names
	diff             output a diff between existing wire_gen.go files and what gen would generate
	flags            describe all known top-level flags
	gen              generate the wire_gen.go file for each package
	help             describe subcommands and their syntax
	show             describe all top-level provider sets


Use "wire flags" for a list of top-level flags

wire 直接提供了 check 和 diff 功能,我们只要用 $? 来判断返回值就能知道命令执行是不是成功了。如果有不太懂 wire 用法的工程师胡乱做了修改,我们把 wire diff 和 wire check 配置到项目上线的 pipeline 中就可以阻止他们犯错,而不需要在上线出了故障以后再去写没什么用的悔过书。

社区里还有很多不错的 linter,也能够避免 gopher 新手犯一些错误,比如:

  • sql.Rows 忘记关闭
  • http.Body 忘记关闭
  • err 忘记 check

当然,通过工具避免犯错是一方面,标准库里的设计问题是标准库的设计问题,我们要分开来看待。

环境和 sdk 问题

redis client 和 server 端的不匹配问题

最近还碰到了一个 redis client 和 server 端不匹配导致高延迟 问题,我认为也是可以通过工具来解决的。

社区里有 terraform 这样的 IaC 工具,在公司内做企业级框架时,环境也应该是框架要考虑的重要环节,虽然这样的问题在 Go 里有 pprof,即使是工作三四年的小小工程师也能轻松定位,但毕竟这个错误是谁都可能犯的。最终我们还是应该用 IaC 将项目所在的 prod、staging、dev 环境都管理起来。不要让这样的坑被所有工程师都踩一遍浪费时间。

基础设施 sdk 的反复修复问题

redis 和 mysql 属于使用频率较高的基础设施,一般有问题社区里也能很快地找到解决方案。存储设施以外的可就真不一定了,比如 kafka、rocketmq、配置中心,社区里并没有独霸天下的方案,所以有些公司干脆就运维一套比较简单的服务,让业务自己去找开源社区的 sdk 来接入。

当碰到问题的时候,就需要业务自己找 patch 去修复。这显然也不是有效的解法,infra 的 sdk 最佳解法应由平台方提供,公司内的基础设施部门应该负起维护 sdk 的基本责任。

在阅读 《Software Engineering at Google》的时候我们也知道,国外公司的 Deprecation 也是有专门的流程和团队负责的,为了能节省这些重复的工作,社区里也有 dependabot 这样的帮我们去检查业务使用 sdk 并自动升级的工具。

极大降低基础设施和业务部门的沟通成本,不需要每次有 bug 都广而告之了。

总结

这一篇我们主要讲的是工具,无论你的角色是一线研发,还是架构师,从问题出发我们都能够推导出差不多的解决方案。以前在某公司做业务时,我个人总结的:配置化 -> 自动化 -> 平台化 -> 中台化 -> 被优化,也是很不错的指导原则。

下一篇,或许我们会讲讲平台化是如何降低沟通成本的。

相关 [提升 研发] 推荐:

怎样提升研发效率(1)

- - No Headback
几十~几百人规模的小公司,业务、研发、产品、市场等等角色的沟通成本并不是特别高. 在公司创业早期,一个人身兼数职,沟通成本就更低了. 有事情,大家拉到会议室,简单学一下金字塔原理,碰到问题很快就能得到解决方案. 游戏界有一个很经典的案例,早期从北方暴雪跳槽出来的几个人,都是会写代码的美工,他们只用了 12 个人,在很短的时间内以极高的效率做出了 torchlight 这个游戏,完成度很高,令人惊叹.

十倍效能提升:Web 基础研发体系的建立

- - IT瘾-dev
web 基础研发体系指的是, web 研发中一线工程师所直接操作的技术、工具,以及所属组织架构的总和. 在过去提升企业研发效能的讨论中,围绕的主题基本都是——”通过云计算、云存储等方式将底层核心技术封装成基础设施“. 互联网渗入到各行各业,业务爆发. 企业竞争白热化,对速度和品质要求越来越高. 一线工程师队伍越来越庞大,管理成本增高.

Lyft 如何提升微服务的研发效能(一)

- - DockOne.io
【编者按】本系列讲述了 lyft 是如何从本地开发、联调测试以及线上发布等多个环节提升微服务的研发效能,本文是该系列的第一篇. 2018 年底,Lyft 工程团队完成了将原来基于 PHP 的单体架构拆分成一组由 Python 和 Go 组成的微服务. 几年下来,微服务架构在允许团队之间相互独立地进行运维和交付服务方面取得了很大的成功.

美国科学家研发软件将GPS精度提升到厘米量级

- 可可 - 36氪
你的GPS很快就能告诉你你的身高是多少了. 美国俄亥俄州立大学的科学家昨天发布文章称他们正在开发的软件能将GPS的精度提高到厘米量级. 这项研究的初衷是为研究山体侵蚀或者冰川移动的环境和地质研究人员提供帮助,同时也可以把这些便宜的传感器放到危险的地方还能预测山体滑坡等自然灾害. 但这样精度量级的GPS技术一旦应用到手机上,必然会给LBS市场带来新的变化,对于增强现实类的应用而言尤其如此.

阿里Serverless架构落地实践:人力节省50%,研发效能提升40%

- - InfoQ推荐
作为一名阿里老兵,杨皓然早在 2010 年即加入阿里云,曾深度参与阿里云飞天分布式系统研发和产品迭代的全过程. 如今,他是阿里云 Serverless 负责人. Serverless 有哪些典型的应用场景. Serverless 在研发效能上可以发挥怎样的作用. Serverless 在阿里内部有哪些实践.

科学家研发出可将锂电池充电效率与容量提升十倍的突破性新技术

- 虎必成 - Engadget 中国版
其实我们并不是很常追随一些电池技术的进展,但说到开创性的大突破的话,我们可绝对不会错过. 这个由西北大学工程师所研发出来最新技术,宣称可以让锂电池的充电效率与容量得到十倍的大幅度成长. 教授 Harold Kung 与他的研究团队表示,此电池技术的关键在于锂离子在石墨烯层间的流动状态 -- 离子在其中的流动速度很直接的影响到充电速度的快慢.

Go 1.1 的性能提升

- - 博客 - 伯乐在线
伯乐在线注:今天上午在微博推荐了英文原文,感谢 @Codefor 的热心翻译. 如果其他朋友也有不错的原创或译文,可以尝试 推荐给我们. 这是Go1.1发布后性能提升分析系列的第一篇文章. Go官方文档( 这里和 这里)报告说,用Go1.1重新编译你的代码就可以获得30%-40%的性能提升.

提升Java的锁性能

- - Java译站
几个月前我们介绍了如何通过 Plumbr来 进行线程锁检测,随后便收到了很多类似的问题,“Hi,文章写得不错,现在我终于知道是什么引发的性能问题了,但是现在我该怎么做. 为了在我们的产品中集成这个解决方案,我们付出了许多努力,不过在本文中,我想给大家分享几个常用的优化技巧,而不一定非要使用我们这款锁检测的工具.

六种习惯提升大脑能力

- sayhelen - 战隼的学习探索
科学家发现,成年人大脑的可塑性远比预计的强. 我们的日常行为和周边环境,都能引起大脑神经回路的重新连接、功能重组和位置的改变. 有些人甚至认为,不同的思考方式也足以重塑大脑.     研究表明,小鼠在滚轴上训练一段时间之后,海马区神经元数量显著增加,在学习和记忆测试中表现得更好. 针对人类的研究也显示,体育锻炼能提高大脑的执行能力(包括计划、组织、多任务处理能力等).

提升 web 应用程序的性能

- pathfinder - IBM developerWorks 中国 : 文档库
作为 web 用户,我们知道页面加载或刷新的速度对其成功至关重要. 本文将帮助您更好地理解影响 web 应用程序性能的因素. 学习识别这些问题并且找到客户端内容的瓶颈. 探索 JavaScript、DOM、CSS 和 Dojo 小部件的性能问题. 将通过一个例子展示使用 YSlow 和 Firebug 适当调整 Dojo 小部件.