代码审查的目的是什么


76

我正在尝试以代码审查的价值出售我的组织。我曾在几个地方工作过。我已经看到它们用来确定样式选择和功能决策,并且我所看到的只是用于确保没有危险实现的直觉检查。我的直觉是,最有效的目的是在这两种选择之间。

那么,代码审查的目的是什么?


16
相关(关于堆栈溢出):代码审查的目的
yannis 2014年

16
-如果您编写了可读性强且易于维护的代码,您怎么知道?-查看代码后,您的同伴会告诉您。 理由:您无法自行确定,因为您作为作者比代码本身更了解。出于无法分辨绘画是否为艺术品的相同原因,计算机无法告诉您。因此,您需要另一个能够维护该软件的人员来查看您所写的内容并给出他或她的意见。该过程的正式名称是“同行评审”
t 2014年

3
“代码审查的目的是什么?” 防止开发人员编写Terribad代码,并引导他们朝正确的方向发展。
zzzzBov

7
似乎代码审查可能对此问题有间接答案..只需浏览那里的问题和答案,代码审查的目的就显而易见了:)
Mathieu Guindon 2014年

3
我想知道程序员有多少次仅通过在回顾过程中解释其代码的简单过程就发现了自己代码中的错误?
不激活柴刀游戏,2014年

Answers:


75

为什么要进行代码审查有多种原因:

  • 对其他开发人员的教育。确保每个人都看到与缺陷修复或增强相关的修改,以便他们可以理解软件的其余部分。当人们在需要集成的组件上工作或在一个人可能长时间不看某些模块的复杂系统上工作时,此功能特别有用。
  • 发现缺陷或改进机会。可以检查可交付代码以及测试代码和数据,以发现弱点。这样可以确保测试代码健壮和有效,并确保整个应用程序的设计和实现是一致的。如果需要进行其他更改,它将抓住机会,更接近切入点。

有几种进行审核的业务案例:

  • 发现缺陷或问题,需要在其注入之前对其进行重新处理。这样比较便宜。
  • 对系统和交叉培训有共同的理解。开发人员加速进行更改的时间更少。
  • 确定系统的可能增强。
  • 开放实施以确保测试人员提供足够的覆盖范围。从测试的角度来看,将黑盒子变成灰盒子或白盒子。

如果您正在寻找有关同行评审的好处和实施策略的全面讨论,我建议您参阅Karl Wiegers撰写的《软件中的同行评审:实用指南》


7
+1,我认为您以正确的优先顺序很好地把握了要点。与经常发现非常有创意的“ WTF”解决方案的同事打交道时,保持设计的一致性只能通过定期的代码审查来实现。
Doc Brown

我们在JavaScript代码中进行代码审查,主要是为了确保开发人员遵守概述的标准,在设计模块时使用设定的模式,使用提供的组件,并且不会针对已有的问题开始(有意或无意地)进行忍者编码对于。它们也很容易发现有人意外覆盖了this上下文,而不是.hasOwnProperty在应有的位置使用它,等等,等等。所以-主要用于标准。在像C#这样的托管语言中,与动态语言相比,您当然会少一些原因。
都能跟得上

1
到目前为止,您的答案仅暗示对代码正确性的改进。它无法解决代码的可读性/可维护性,开发人员很少能对其进行准确量化。
ArTs 2014年

51

代码审查是知识转移的工具。

  • 当开发人员检查彼此的代码时,他们会熟悉系统的所有区域。这减少了项目的总线因素,并使开发人员在必须对未编写的系统的一部分进行维护时效率更高。

  • 当初级程序员检查上级的代码时,初级程序员可以掌握一些技巧,否则这些技巧只能通过经验来学习。这也可以作为对过于复杂的代码的纠正。

    全面的代码检查将需要经常检查各种文档。这是学习语言或API的好方法。

  • 当高级程序员检查初级代码时,这是在问题转化为技术债务之前解决问题的机会。代码审查对于指导初级程序员可能是一个很好的设置。

代码审查与以下内容无关:

  • …发现错误。那就是测试的目的。代码审查仍然经常会发现一些问题。

  • …对样式问题进行挑剔–解决一种样式,并使用自动格式化程序强制实施。但是自动化工具无法检查很多事情。代码审查是确保代码充分记录或自我记录的好地方。


2
您最后一次提出的问题是我完全不同意的-我们刚刚经历了一次令人苦恼的经验,审查了初级开发人员的代码,而最明显的抱怨实际上是关于样式的问题,但不是那些很容易通过编程实现的样式问题强制。。。。。。。。。。是的,有些情况下您可以使计算机找到问题,但大多数都不是通常可以通过脚本找到的问题。需要30秒钟的阅读时间,我们才能开始阅读,另外30秒钟可以向开发人员解释,并希望对此问题进行修正。仍然对此感到震惊:/
和平主义者2014年

7
@pacifist那不是应答者描述的那种风格。样式是关于大括号,缩进等的位置。如果您的初级开发人员使用过多的if语句,则您会遇到与样式完全不同的问题。编码STYLE的一个普遍属性是它不会影响性能。而且我认为,大量的if陈述会影响性能。
Pimgd

12
在进行审查时,我经常发现我认为“这看起来像是错误”的地方,然后写一个特定的测试用例来证明它是一个错误。因此,代码审查的许多目标之一就是发现错误。这就是为什么我认为“代码审查或测试”观点过于单一的原因。
布朗

2
除了@DocBrown之外,还有一些情况无法轻松测试-数据争用,某些类型的死锁,活动锁,未定义的行为/值(主要在C / C ++中,但哈希表中元素的顺序在未定义中也是如此)或资源韭葱(即使使用GC,循环打开文件也可能不是一个好主意)。这些事情中的一些可以通过足够智能的编译器静态分析来检测。
Maciej Piechotka 2014年

2
@pacifist您的特定示例将在代码审查中被彻底炸毁。对于任何静态代码分析器来说,它也是一个危险信号(循环复杂度17!)。代码审查将很快将该功能识别为语义样式(甚至是算法!)中的问题。然而。这种问题不仅是“样式”问题。如果您这样对待它,那么很快您的存储库中就会有一些非常讨厌的代码。毕竟,这只是“风格”。
Pimgd

12

我个人从代码审查中获得的最有价值的东西是对其他人清楚该代码的信心。变量是否明确命名?每个代码块的目的是否合理明显?有任何含糊的注释可以澄清吗?注释中是否概述了边沿大小写和参数的有效值,并在代码中进行了检查?


2
这似乎并不能提供超过先前4个答案的任何实质内容
gnat 2014年

2
@gnat:其他答案涉及知识转移和发现错误。这些很重要,但是代码审查还有更多。

1
据我所知,此答案中有更多内容是合理解决的:“如果您正在寻找有关同行评审的好处和实施策略的全面讨论,我建议您查看软件中的同行评审: Karl Wiegers撰写的实用指南。” 这个答案也涵盖了这一点:“针对过于复杂的代码的纠正措施”
2014年

2
@gnat强调其他答案中提出的观点的不同方面。您是否曾经对六个月前编写的自己的代码感到困惑?通过代码审查,您可以加快该过程。如果您的同事对您的代码感到困惑,那么当问题仍然存在时,您仍然可以进行澄清。
200_success,2014年

1
@ 200_success。但是,即使确实存在,这一点看起来也很难表达。甚至您的评论也比该“答案”更好地传达了它。更不用说它只是重复先前评论中的内容,该评论指向在相关问题中解释此问题的规范答案
gnat

7

我想添加两个未包含在其他好答案中的区域:

进行代码审查的一个重要原因是霍桑效应,在我们的案例中,霍桑效应转化为:如果您知道以后有人会看您的代码,那么您起初就更有可能编写出更好的代码。

另一个重要原因是需要更好的安全开发实践。只需查看Apple的goto失败(意外的重复代码行)或Heartbleed错误(输入验证中的基本失败),即可了解在安全的开发生命周期中进行适当的代码审查的重要性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.