RefinementCodeReview

2021年1月28日

当人们想到代码审查时,他们通常会想到开发团队工作流中的一个明确的步骤。这些天整合前检查,进行于把请求是代码审查最常见的机制,以至于许多人愚蠢地认为不使用pull request就会删除所有进行代码审查的机会。这种狭隘的代码审查观点不仅忽略了一系列显式的审查机制,更重要的是,它可能忽略了最强大的代码审查技术——由整个团队进行的永久改进。

软件中最普遍的观点之一是它是我们构建和完整的东西的概念 - 因此,建筑和建筑的无尽隐喻。188比分直播网 坚持原创然而,软件的关键属性是它,并且在发布后可以像最初在程序员的编辑器中编写时一样容易修改。这就是为什么Erik Dörnenburg明智地认为架构是一个糟糕的比喻,而且会更好188比分直播网 坚持原创被城市规划取代.有价值的软件通常处于恒定的变化状态,因为我们添加了更好地理解它可以带来的价值的功能。但是,机会不仅要添加新功能,而且还可以改进软件 - 将团队稳定地了解哪些软件能够启用这些更改的课程。

在适当的环境下,我可以查看半年前编写的一些代码,看到编写过程中出现的一些问题,并快速修复它们。这可能是因为该代码在编写时就有缺陷,或者代码库中的更改导致代码不再完全正确。不管是什么原因,重要的是在问题开始妨碍我们的时候就解决它。一旦我理解了阅读时并不明显的代码,我就有责任(就像Ward Cunningham所说的那样)把这种理解从我的脑海中抹去,并把它放到代码中。这样,下一位读者就不用那么辛苦了。

这一细化过程与代码评审过程完全相同,但它是在每次查看代码时触发的,而不是在将代码添加到代码库时。对我来说,这是一个至关重要的见解。毕竟,代码评审试图补救的许多问题只有在将来阅读代码时才会成为问题。我们有充分的理由在那之前不要担心他们。毕竟,就像添加一个大型公寓综合体改变交通模式一样,我们可能在6个月后改变了代码的上下文,改变了代码需要的修改类型。它还涉及到更多的人,在这个方案中,每个阅读代码的开发人员都是评审者,他们能够基于他们对代码的实际使用而不是一些一般的,但往往是模糊的指导方针来评审代码。

一种考虑行为有效性的方法是考虑如果是垄断会发生什么。如果我们拥有的唯一代码审查机制是来自后期程序员的迭代呢?一个结果是,审查的注意力会集中在更经常阅读的代码区域上——这是大部分应该引起注意的区域。一个担心是,从来没有读过的代码永远不会得到审查——但大多数情况下这是好的。拥有良好测试实践的团队可以确信代码可以工作,性能测试可以识别性能问题。考虑到这一点,如果代码永远不需要再被查看,我们就不需要花费精力使其易于理解。我本以为这样的案例会非常罕见,但这是一个信息丰富的思维实验。

但大多数都不是。一个明显的例外是安全问题。代码可以正常工作数年,直到攻击者发现一个漏洞,那时我们会哀叹它缺乏审查。这是一个高影响但罕见的安全问题的例子,值得特别审查。然而,这并不意味着我们不应该有意识地使用细化作为代码审查机制。相反,这意味着我们应该意识到罕见的高影响问题,并调整我们的工作流程,以观察在我们的情况下需要的特定问题的程度。威胁分析应该提醒我们需要额外注意的模块以及它们面临的风险类型。目标代码评审可能是为了安全考虑而安排的,它们可以更有效地运行,因为它们关注的是特定类型的问题。

为了实现这种永久的代码优化,我们需要其他的实践。如果我要改变代码,我需要有信心,它不会破坏现有的功能,所以我需要自我测试代码.我需要知道它不会为他人造成大合并冲突,所以我需要持续集成.我们都需要擅长188app彩票ios所以我们可以有效地改变代码。由于这依赖于许多开发人员预期修改代码基础的任何部分,我们最好集体的(或者至少是弱的)代码所有权。但是对于拥有这些技能的团队,他们可以依赖使用他们的常规细化作为他们代码审查策略的一个重要部分。

如果没有别的,我认为我们在代码审查中将更多的思想更加重要。完全关注的危险之一是在预先完成的审查中,它可以引导团队忽略如何在代码库中的变化。如果我有一个原始的主线,并确保每次提交都合并到该线程中是原始的 - 我可以确保码比在六个月后仍然是原始的吗?我争辩说,我不能,因为改变意味着关于六个月前的一些规范的良好决定不再是一个良好的决定。炼制代码允许我们评估旧代码的这种更改的使用,允许我们维持其健康。

确认

Ben Noble, Chris Ford, Evan botcher, Ian Cartwright, Jeremy Huiskamp, Ken Mugrage, Mario Giampietri, Martha Rohte, Omar Bashir, Peter Gillard-Moss和Simon Brunning在我们的内部邮件列表上评论了这篇文章的草稿。