Supernan1994's Personal Blog

工程团队需要注意的20个工作模式



0. 背景

GitPrime是一家做企业服务的公司。基于对工程团队代码仓库的pull request和code review的数据统计,GitPrime可以产出直观的图表,帮助管理者更高效的发现团队内部存在的问题。
GitPrime认为高效的管理者会把团队看做有多个模块相互依赖的系统,每个模块都有自己的输入和输出。当输入和输出不符合预期时,『数据』可以在探索问题的根本原因的过程中产生重要价值。20 Patterns to Watch for in Your Engineering Team这本书是GitPrime与上百家公司的合作时,总结出来的20个常见的工作模式。他们希望这本书可以帮助团队更好的认识成就、发现瓶颈,用数据驱动的方式debug研发流程。
这篇文章主要是基于我的理解对这本书进行的翻译和提炼。

1. 个人层面的工作模式

模式1:领域冠军 (Domain Champion)

领域冠军是某个服务的专家,他们清楚这个服务所有代码的细节,可能这些代码基本都是他写的。在对深度要求比较高的场景下,企业是需要有这种员工的。管理者需要保证这个领域的知识不能成为单点,并且鼓励领域冠军拓展知识广度。

1)如何发现他们?

2)如何处理这种情况?

很多人都喜欢呆在自己的舒适区,好的管理者需要推动他们走出来,提升团队同学的知识广度,减少系统的单点风险。

模式2:囤积代码 (Hoarding the Code)

囤积代码指总是自己写代码,到迭代结束的时候才提交一个超大的PR的工作习惯。这种做法会导致代码提交上来之后,因为时间原因,reviewer不能充分review所有代码,增加产生问题的概率;即使发现了问题,也不一定有时间改正,如果是设计上有问题,可能需要推翻重做。

1)如何发现他们?

2)如何处理这种情况?

模式3:大量废代码 (Unusually High Churn)

废代码是在写完之后很快就做了重写的代码。从统计数据上看,提交的代码一般有13-30%会作废,这里面包括一些测试、POC和必要的重构。超过这个范围说明团队或个人可能在非常痛苦的完成任务。这个问题可能由3种原因造成:

1)如何发现他们?

2)如何处理这种情况?

模式4:百发百中 (Bullseye Commits)

这种情况指:工程师能够很好的理解需求,并将需求拆分为小的任务,提交的代码基本不需要修改。

1)如何发现他们?

2)如何处理这种情况?

模式5:个人英雄主义 (Heroing)

“英雄”总是能在最后一秒钟修复别人的问题。但这个做法会导致几个问题:

1)如何发现他们?

2)如何处理这种情况?

模式6:过度帮助 (Over Helping)

过度帮助指一个工程师花费过多时间帮助其他工程师完成工作(一个人是另一个的mentor的情况除外)。这个问题会带来几个后果:

1)如何发现他们?

2)如何处理这种情况?

分开两个人并不是破坏友谊,而是让知识在团队中更均匀的分布,同时磨练团队里同学的能力,让他们的职业生涯得到成长。

模式7:随手收拾 (Clean As You Go)

习惯于随手收拾代码工程师会注意到已有代码的缺陷并改进它,即使跟当前正在做的任务没什么关系。这是一件非常值得鼓励的工作习惯。
比起实现业务功能,改进的工作往往不会得到很多关注,但对于团队来说时无价的。管理者应该鼓励这种行为。

1)如何发现他们?

2)如何处理这种情况?

模式8:得心应手 (In the Zone)

这类工程师能够持续稳定的输出高质量的代码。软件开发是一场持久战,如果想获得可持续的商业价值,必须要保证每天都有产出,真正有价值的创意可能需要花几年来实现。

1)如何发现他们?

2)如何处理这种情况?

模式9:乱试一通 (Bit Twiddling)

这种模式是形容像拼拼图一样工作,乱试一通,期望最后得到正确的结果。这通常是因为工程师没有充分理解问题,或者不知道这次改动的背景。
这种情况下,工程师可能会失去工作动力,而且很容易给线上引入bug。

1)如何发现他们?

2)如何处理这种情况?

创造性工作者会在解决新的、有挑战的问题中得到成长。新的经历会使他们有新的收获,这个是大多数工程师都喜欢做的事情。

模式10:打杂 (The Busy Body)

打杂的工程师是指在多个代码仓库中缝缝补补:一会儿解决前端问题,一会儿做个重构,一会儿去搞数据库的人。解决的问题通常来说比较轻量。
如果是短期表现没什么问题。但长时间如此会造成工程师没有太多主人翁意识,因为没有一个项目是他从头到尾做完的。这也会导致人员流失。

1)如何发现他们?

2)如何处理这种情况?

以上过程的关键是培养工程师的主人翁意识。

2. 团队层面的工作模式

模式11:需求变更 (Scope Creep)

这种情况是指,已经开始开发的情况下产生需求变更。即使设计最好的系统也会有需求变更的情况出现。管理者需要尽可能避免这种事情的发生。

1)如何发现这个问题?

2)如何处理这种情况?

模式12:产品把控能力不足 (Flaky Product Ownership)

把控能力不足的产品经理通常有两种表现:

1)如何发现这个问题?

2)如何处理这种情况?

模式13:不在规划中的大规模重构 (Expanding Refactor)

这种情况是指,本来想做一个小的优化最后变成了大范围重构。

1)如何发现这个问题?

2)如何处理这种情况?

模式14:临上线前提交PR (Just One More Thing)

如果只有少部分人在迭代结束的时候才提交代码,那么这是一个需要改正的习惯。如果所有人都这样,说明流程或团队文化有问题。

1)如何发现这个问题?

2)如何处理这种情况?

模式15:不经思考的merge PR (Rubber Stamping)

一般有几种情况:

Code review会带来很多好处:

1)如何发现这个问题?

2)如何处理这种情况?

模式16:知识谷仓 (Knowledge Silos)

谷仓效应指企业内部因缺少沟通,部门间各自为政,只有垂直的指挥系统,没有水平的协同机制,就象一个个的谷仓,各自拥有独立的进出系统,但缺少了谷仓与谷仓之间的沟通和互动。
在软件开发中,当知识没有充分共享时,会产生知识谷仓。比如三个人总是互相review代码,没有其他工程师能够参与进来。时间长了也会导致习惯性信任对方的代码没有问题,会导致很多PR没有经过详细的review就被merge。

1)如何发现这个问题? 2~3人总是互相review代码

2)如何处理这种情况?

模式17:合并自己的PR (Self Merging PRs)

合并自己的代码很容易引入bug,很多公司都不允许做这种操作。

1)如何发现这个问题?

2)如何处理这种情况?

模式18:长时间无法merge的PR (Long Running PRs)

这里指的是超过一周还没有merge的PR。放置时间太长会与最新的代码产生冲突,也会影响迭代进度。

1)如何发现这个问题?

2)如何处理这种情况?

模式19:高巴士因子 (High Bus Factor)

巴士因子是指几个核心员工收到不可抗力影响无法工作时,项目会瘫痪。员工的数量即为巴士因子。高巴士因子代表知识共享的程度更高。否则代表有筒仓效应。

1)如何发现这个问题?

2)如何处理这种情况?

模式20:迭代复盘 (Sprint Retrospectives)

在迭代复盘会上回顾迭代的目标、发生了什么、为什么发生、计划下一步做什么。

1)如何发现这个问题?

2)如何处理这种情况?


comments powered by Disqus