在今年的网络研讨会和随后发布的博客中,我推荐了一些程序大牛们的好习惯,大家可以学习养成这类习惯,提高代码质量。今天,我们一起来深入地探讨其中的第一个习惯:代码审查。正如Steve McConnell在其绝佳专著《Code Complete》中阐述的那样,代码审查能够提供超乎想象的价值。“单元测试的平均缺陷检测率是35%,集成测试是45%,而对代码设计和逻辑方面进行审查,可以达到平均55%和65%的有效检出率。”我们的确需要高水平的静态分析来确保代码质量,然而,只有在代码审查高效并且优质的前提下,静态分析才能发挥出应有的效果。在过去的数年里,我目睹了形形色色的导致代码审查无效的因素。避免这些不良因素,最好办法就是养成良好的习惯。而养成良好的习惯就需要消除那些影响代码审查质量的坏习惯。
1. 对工具利用不够充分
首先,你不需查找和了解哪些工具可以做静态分析,因为这些东西可能会包含许多品牌问题,风格问题,使你不够客观。也不要使用特定的某种加密算法,如果工具能够找到这些算法,就让它去找吧。这样可以使你有更多的时间去深入研究代码的算法、安全性和性能特点。做一些有意义的工作,避免冗长乏味的无效劳动,这将使代码审查更有趣味,吸引审查人员参与,同时这也会使代码审查更高效更有意义。
2. 在代码和作者没有到位时就开始进行代码审查
这是一个很常见的问题,并且在时间为主导的公司里更容易出现。很可能是在发布代码库的同时就进行代码审查了。他们的逻辑是这样的:“代码还没有完成,但我们已经规划了一次代码审查,所以我们来看看已经完成的代码。”我们都知道,这样做代码审查是非常不好的,质量极低,所以以后不要再这么做了。确保作者已经完成了代码,如果他们还没有完成,那就推迟代码审查的时间。
3. 在回顾的过程中花费了太多的时间
这是一个很容易掉入的陷阱。如果审查代码花费了太多时间,那你就需要重新思考一些事情了。“太多时间”可能是审查会议超过了一个小时,或者会议占用了太多开发人员的时间表。如果代码审查花费了一个多小时,很可能是由于你一次尝试审查过多代码,(或者作者并没有准备好进行代码审查)。一个小时的代码审查过后,代码审查效率大大降低,尤其是对于代码作者而言。即使此时评论的不是最初作者,经过太长时间的代码审查,评议的效果就会降低并且更加容易让代码作者感到不愉快。
4. 针对个人进行代码审查
代码审查是关于代码的,而不是人。确保你是在谈论代码而不是代码的作者。“这些代码的规模并不是我们需要的” 一类评论要比“你写的代码太差了”这种评价更为客观,更不容易冒犯作者。相应的,当你作为作者接受这些批评时,要放宽心胸,做一个输得起的人。要认识到,任何人的代码都是可以改进的,你可以从这些数据和批评中学到很多。不管在什么样的代码审查中,你都可以更加优雅地促进代码审查愉快、高效和流畅的进行。应该将代码审查视为一个很好的学习和提高的机会。每个人都希望得到一些指导,但我们很少将审查的过程看作一个指导和学习的过程。尊重这个学习和指导的过程,你就不会把代码审查看作是针对个人的事情了。
5. 到最后才进行代码审查
这不只是一种比喻——我确实坚信,许多关于代码质量的实践都需要像做运动一样来对待。如果到最后一刻才做代码审查,那将没有什么效果。我们不可能在马拉松比赛的前夜开着跑步机练习,同样,你也不可能在发布前一天晚上来进行有效的代码审查。
6.后续跟进没有保持一致性
如何跟进在很大程度上决定了代码审查的质量。如果在一次审查中找出了问题,但后面却不去确认是否问题已经修复,那就是在浪费时间。代码审查只有融入到持续一致且责任分工明确的流程中去,才能发挥出最大的作用。确保每个人都明确他们各自的预期,并且及时跟进确保问题得到修复。如果在代码审查中没有找到任何问题,一定要认真对待,这非常值得怀疑。可能是由于开发者之间相互妥协让步,也可能意味着开发人员并不了解代码审查的价值,或者不知道如何做代码审查才合适。
7. 前后不一致的标准
如果不同的审查者查看和评判代码的标准不一致,那么你永远也不会知道代码审查是否有效。代码审查的范围及标准必须基于明确的政策,能够清晰的写出来,并加以引用。(参照检查列表进行代码审查,一开始可能会让人感到繁琐,但是它能够保持代码审查的持续性和一致性,起到两个方面的作用:保证遵从相应的行业标准;见证代码审查的有效性。)消除模棱两可的定义,非常重要的一步是将政策写下来,但这仅仅是第一步而已。在理想的情况下,我们需要将一系列基于政策的场景具体化,并且在如何操作方面向不同人征求意见。在公司里,不同团队做不同的事情是很常见的,可能每一个团队都会认为其他团队的做法不正确,在模棱两可的政策下,各种不同的做法都是允许的。这将会增加代码潜在问题。我们可以做到更好。将每一个人拉到同样的标准下,有利于提高代码质量,保持任务的一致性,同时可以持续不断地进行改进更新,如果有错误的代码,将会迅速得到修复,避免产生更大的问题。如果您的行业要求遵循某些特定的规范,如ISO 26262 或FDA等,就更加需要始终如一的标准来规范您的审计流程。我在各种各样不同的公司进行过代码审查调研,以弄清楚在什么环境下代码审查才是最有价值的,同时在什么样的状态下,代码审查就是在浪费时间。将合适的工具应用到合理的流程中,这样才能确保您从代码审查中获得最大的价值。将静态分析工具应用到代码审查系统中,可以确保代码的合规性以及对行业最佳实践的遵从,同时还可以帮助开发人员集中精力于解决潜在的缺陷,提高自身能力,这更是消除那些代码审查坏习惯的不二选择。