思考以下场景。
产品负责人大橘向团队中的三个开发人员 – 三猫, 四狗, 五谷 – 汇报了他们刚刚交付的报告所须要的紧急批改。第二天上午 10 点有一个客户会议,批改必须上线,这样大橘能力演示。当初是下午 6 点。五谷正在通勤回家,四狗正在去别墅的路上(她请了假)。三猫却恰好在他的笔记本电脑旁。
上面是接下来产生的事件。
- 三猫看到大橘的音讯,并让大橘晓得,没问题,他能够进行更改。然而他从早晨 9 点开始和今天整个上午都不在,因为他有家庭事务。因而,他可能无奈在早上现场推送更改或反对。
- 四狗,作为后座的乘客,在 Slack 上看到了这,并说 “ 没问题,如果有什么须要实现的,我早上会在那里 ”。
- 三猫开始写一些代码,并关上了一个 pull request(PR)。
- 早晨 8 点,五谷回到家,看了看 Slack,让团队晓得她当初能够帮忙了。她看了看三猫的 PR,发现没有测试,因为这是一个急件,于是决定增加测试。因为需要在 Slack 上,而且他们能够在彼此的 fork 上进行合作,这不是一个问题。
- 三猫早晨 9 点上班。
- 早晨 10 点,五谷实现了测试,这时四狗曾经上线,能够进行审查。四狗抓到了一个 bug(五谷在脑海中反转了一些需要,因为她很困),五谷调整了代码后,他们推送上线。
- 到了早上,四狗又做了一些批改,因为大橘在最初一刻提出了一些十分额定的要求,并把它们推送到了网上。三猫从他的手机上批准了第二个 PR(他很放心,正在查看)。客户会议获得了微小的胜利。
把性别反过来,这基本上是我团队一个周四深夜的状况。我感觉十分骄傲。不过不同寻常的是,这并不是我以前 24 岁时,为一家守业公司熬夜时那种愚昧的自豪感。看看我,我的工作很重要 如果我不间断工作 24 小时,世界就会灭亡
这次我的自尊心被不同的事件所激发。
- 我的团队中的三个开发人员都同样相熟代码 并同样具备批改和审查工作的能力。
- 整个团队奋起直追,没有留下任何一个人加班到深夜。
- 因为咱们有三个人,所以即便在匆忙的状况下也能实现高质量的工作。
后果是
- 只管这是一项紧急的工作,但测试工作曾经全面开展。因而没有开发债权。
- 所有的 bug 都被审查发现了。
- 团队的友情和彼此的信念达到了前所未有的高度。
-
- *
我在同一个团队曾经快一年了,这个时候你对代码曾经有点太相熟了,所以你开始有了想法:s_我要不要换个团队?_当初,要思考不同的起因:你是否受到挑战?路线图上有什么?你的职业规划是什么?我在这里就不说这些了。我想说的是,为什么我特地喜爱在这个团队工作,以至于我不想换。
通过思考,我意识到我喜爱在我的团队工作,不是因为_谁_在团队里,也不是因为_团队的工作内容。我喜爱的是咱们工作的形式。
- 整个团队晓得咱们所领有的大部分代码库,所以咱们一起探讨 / 设计和架构。这导致了十分好的各种想法和弱小的技术设计(咱们恰好有一个相当多样化的团队,对咱们来说是侥幸的)。
- 当咱们中的一些人不在时,咱们能够在紧急情况下替换。
- 咱们常常进行重构和试验 – 而且这样做很平安。
咱们是怎么做到的?** 咱们为团队制订的 Pull Request 审查规定和准则。
团队成立的时候,咱们只有 3 个开发人员,一个产品负责人和半个经理(另一半经理忙于治理一个更大的团队)。咱们决定,既然咱们人这么少,不如把咱们当成一个团队来运作。于是咱们想出了一个公关审查规定。 无论咱们中的一个人写什么,另外两个人都要承受 而后,随着咱们一直地审查对方的 PR,咱们把规定集扩大为一些准则。
我在这里写下这些规定和准则,因为我意识到兴许有些人会发现它们对他们的团队有用。也可能这些会给你带来一些思考,你会有齐全不同的想法。
规定 1
** 每次 PR 审查必须至多有 2 个同团队开发人员的批准。经理批准不算。
首先要留神的是,因为咱们一开始是 3 人团队,这是最现实的。所有 3 个开发人员都是 100% 的知情者。对于更大的团队来说,这可能是不同的。你的指标是邓布利多 –Horcruxes 的状况,如果你死了,至多有 2 到 3 集体晓得 Horcruxes。咱们的团队当初有 5 个开发人员,其中有 2 个老家伙,1 个新来的,还有 2 个中坚力量。咱们还是想保持每个人都审核每个人的 PR 的模式,但如果改成 1 个老前辈 + 1 个其余开发者的最低限度,可能会比拟正当。
“ 经理审核不算数 ”– 兴许这让你感觉 “WHAT,我是经理,而且是个了不起的编码员,我的审核齐全算数,你怎么敢。” 经理审核的确_有帮忙。咱们有了不起的经理,他们恰好是很棒的编码者,当他们有工夫审查时,他们常常会有很好的提醒或想法来帮忙咱们。
但你必须思考你的经理花了多少工夫在编码上。是否超过 50%?那么他们也是一个开发人员,所以好吧,让咱们来计算他们。然而,在咱们公司,开发经理偶然会做十分多的编码工作。到最初,是开发人员要和正在编写的代码一起生存。因而开发人员有最终的发言权。我十分不喜爱看到经理和开发人员有限的审批周期,一个经理始终在审批一个开发人员的 PR,即便团队中还有 3 个开发人员还没来得及看。
规定 2
** 每个 PR 必须有一个好的形容。通过浏览形容,评审员应该可能了解代码的目标。即便有 Jira ticket 或需要页面,也必须如此。
没有形容的 PR – 在我的团队中,这种状况永远不会通过。最好的状况是,他们没有写,因为 Jira ticket 有一个很好的形容。最坏的状况是:Jira ticket 没有任何形容。Jira ticket 什么都没有。
没有形容的 PR 的审核者有 2 个工作。
- 通过浏览 PR 中的代码变动,理解代码的作用;2.
- 试图依据 …… 审查者对宇宙和以后地缘政治气候的个别认识来决定代码是否做了_它应该做的事件?
如果没有明确解释代码要做什么的申明,审查它的正确性是不可能的。你基本不晓得什么是正确的。你是在你认为正确的假如上操作的。
规定 3
PR 必须有足够的单元测试和集成测试覆盖率 。
现实状况下,评审员能够很容易地看到所笼罩的测试案例列表。
如果测试覆盖率曾经存在,或者因为某种原因测试覆盖率不残缺(工作被宰割到另一个票据中,依赖性),PR 形容应该提到这一点。
给出好的 PR 评审是很难的,也是很费时间的。 这是因为一旦你理解了代码应该做什么,你就必须进行评审,记下你想要的测试覆盖率_这个。你要制订你本人的测试用例列表,并决定它们是哪种类型:单元测试 / 集成 / 端到端。
你还必须思考是否有可能的生产影响,以及是否须要在部署前对实时数据进行任何测试。
当初你晓得了所有这些,你再去回顾 PR,查看他们是否涵盖了你想到的所有内容。现实状况下是混合的 – 你想到了一些他们没有想到的货色,而他们也想到了一些你没有想到的货色,你们一起做得很好。这就是可能轻松地看到 PR 中笼罩的测试用例列表的中央(而不是必须浏览 100 行或 1000 行的测试,并且必须弄清楚哪些用例是真正被测试的)。
须要留神的是,如果遵循了规定 2,你只须要浏览形容就能够晓得代码应该做什么。所以,你能够在审查任何理论代码之前,就进行审查测试覆盖率的步骤!
我集体喜爱把所有这些 – 提到的测试、任何实时数据测试、任何实时客户端影响 / 须要的 prod config 变动 – 都放在 PR 形容上。这样一来,它就在一个中央。能够是一个链接的 Jira ticket。只有它在某个中央,并且曾经被思考过了。
规定 4
** 如果 PR 是一个 bug 修复,它必须蕴含一个测试,如果 bug 修复被复原,这个测试将失败。
我认为这是不言而喻的,但就像大多数不言而喻的事件一样,它不是。
假如有一个排版谬误,你用了 != 而不是 ==。过后是早晨 10 点,你本不应该进行编码,但你感觉那天早晨你想多走几步路。于是你开了一个 bug 修复 PR,把 != 改成了 ==。一些凶恶的人,也在工作,批准了它,而后把它放到了主分支。
三天后,你的好友三猫终于筹备好了他那份失控的 PR:他认为这是一个小性能,没有把它分解成更小的 ticket,但后果并不是这样,当初他有一个 2000 行的 PR,他在求他的团队审核。
三猫从上游合并,代码抵触的中央你把 == 换成了!=. 三猫很累,他没留神到怎么回事,!= 又回来了。
因为没有测试来抓它,所以 bug 又回来了。
这是一个人为的例子,但如果你在较长的工夫内留神 – 这种状况始终在产生。把 3 年内的 bug 摆出来,你会发现那些没有被测试捕捉的 bug 又呈现了。
就这样吧! 三条规定,还有第四条更多的是常识性的我的项目。
我意识到,这些规定,导致咱们团队产生了一些品质相当不错的代码。我对此非常高兴,绝不居功自傲。
同样,这些规定可能你会感觉不对,也可能它们恰好对你有帮忙。如果它们引发了任何思维或想法,我很快乐!