当代码很难审查时我们能做点什么?

本文最初发布于 Understand Legacy Code 博客 , 由 InfoQ 中文站翻译并分享 。
代码审查是通过让更多的人关注代码来提高代码质量的一种方法 。 在处理遗留代码库时 , 这种做法有助于传播知识、让更多的人熟悉代码库并降低破坏代码的风险 。
但有时 , 你可能会遇到代码很难审查的情况 。 可能是 pull request 很大 , 或者变更涉及到代码的许多部分 。
也许变化不大 , 但却很危险!
你会觉得这段代码既脆弱又复杂 。 变更太大会让你觉得不安全 。 团队并不清楚这种变更可能带来的副作用 。 测试套件也不是非常全面 。 变更似乎有效 , 但是需要花费过多的时间来验证没有任何回归问题 。 也许比变更本身花费的时间还要多!
这种情况下就陷入了进退两难的境地:

  • 你是试着找出明显的缺陷并将其合并 , 而寄希望于没有因为自己知识不完备而漏掉什么?
  • 或者停止合并 , 直到你冒着超期的风险 , 在所有你能想象的场景下对变更进行测试?
当代码很难审查 , 但又没有时间把所有事情重做一遍时 , 该怎么办?
即使难以审查 , 也不能跳过审查!首先 , 如果你觉得变更非常困难 , 以至于没有时间做适当地审查 , 那么你在审查最后的代码时应该少花点时间 。
“合并 , 然后祈祷没有什么不好的事情发生”是一个非常坏的主意 。 当你这样做的时候 , 你靠的是运气 。 当你运气不好时 , 你就会失败 。 总有一天 , 你会惨败 。
想想看:如果代码现在很难审查 , 那么 6 个月后就会更难维护!你会忘记当时做决定的背景 。 我们不会动没有上下文的变更 , 因为我们害怕产生意外的后果!幸运的是 , 有一个简单的解决方法 。
然而 , 当你承受着发布的压力时 , 很难想出不同的方法 。
【当代码很难审查时我们能做点什么?】如果你不了解你正在审查的变更所带来的影响 , 你能做什么?我认为如果你遵循这 5 个技巧 , 就可以力挽狂澜 , 把项目推向正确的方向 。
审查高难度代码变更的 5 个技巧1. 关注可读性
我总是会在幻灯片中以下面这句话介绍 Software Crafters Montreal meetup:
代码不是你告诉计算机做什么;它是你告诉另一个程序员你想让计算机做什么 。
我认为这是可以工作的东西可以变更的东西之间的区别 。
因此 , 你在审查时首先要注意的是可读性 。 你了解这个变更的全貌吗?不要试图找到所有可能的 bug 。 你明白这是怎么回事吗?正在解决的问题是什么?你的团队如何决定通过这个变更来解决问题?
2. 要求证明
你能搞明白这个变更之后这个软件会发生什么变化吗?你了解这些变化背后的意图吗?
手动测试就可以了 。 通常 , 在你添加自动化测试之前 , 遗留代码库就会需要进行大量的变更 。 短期来看 , 手动测试可能更快 。 不要只是在看过屏幕截图或重现 PR 场景的视频之后就信任代码 , 你需要做得更多 。 在合并之前对变更后的代码进行 QA 审查 , 在变更刚完成的时候 , 是发现问题的好时机 。
把这作为主要关注点 , 要求查看最终结果的 QA 记录 。
3. 要求自动证明
手动测试也可以 , 但是如果你真的需要节省时间 , 就应该自动化这些测试 。 你不可能每次变更时都有时间手动重现所有场景 。 这项繁重的工作应由计算机来完成 。 这就是为什么你应该推动团队为代码编写测试 。
如果没有测试 , 就去找他们 。
如果变更伴随自动化测试 , 请确保自己了解它们验证的内容 。 人们很容易为了编写测试而编写测试 , 而忽略它们的可读性 。 好的测试将帮助你理解代码应该做什么 。 它们可以充当软件的活文档 。
如果代码需要大量变更才能进行测试 , 而你没有时间怎么办?如果你不知道如何才能做得更好 , 请使用生存模式:尽可能地进行审查 , 然后借助手动测试 。 但是 , 你应该在下一个迭代中优先解决这个问题 。
在你希望偿还的所有技术债务中 , 在代码库上编写自动化测试是最重要的一项!它能节省你的时间 , 让你更容易在截止日期前完成任务:
  • 自动化测试的执行速度比手动测试快;
  • 自动化测试覆盖到的变更将不太可能引入回归 , 因此 , 你花在调试和修复代码上的时间会更少;
  • 测试将迫使你改进代码的设计——关注测试之苦 , 简化测试过程 。
4. 要求进行小变更
对于难以审查的代码 , 一个常见的情况是差异超过 500 行代码 , 而描述却简单如“