准备好以开发人员的身份进行代码审查了吗?


10

我在这里寻找一些想法。

我阅读了这篇文章,《如何进行代码审查代码审查》有什么好处?这些信息非常有用,但是我仍然需要在下面的问题上更加清楚。

我的问题是

  1. 作为目标开发人员,您能否建议开发人员在审查其代码之前可以采用的一些最佳做法。

    • 目前,我练习以下方法

      • PPT逻辑流程
      • 详细评论。

问题:即使我已经实施了上述做法,但它们对审核没有帮助。我面临的问题是,当引用某些逻辑时,我一直在寻找实现和流程,并且在过程中浪费了太多时间,并且引起了人们的注意。

我认为很多开发人员也会经历我正在经历的事情。


2
只有一个:不要在代码中做愚蠢的事情。
2011年

1
吻:如果代码很简单,您的大脑就能管理所有这些。
mouviciel

当您在公司中进行代码审查时,通常由谁主持会议?您或正在审查您的工作的人?我问是因为IMO中的代码审查会议不是花时间搜索一点点代码的地方,即使您真的很快就可以查找代码。
DXM

@DXM感谢您的回复。我的TL将领导会议。
Karthik Sreenivasan

@Karthik:k,那部分很好。因此,根据您的问题,您不会问如何编写和产生可用于代码审查的高质量代码。相反,您主要担心的是:“我一直在寻找实现和流程,浪费了太多时间”。您能详细说明一下吗?如果TL前面有代码并且正在主持会议,您为什么要进行搜索?
DXM

Answers:


8

因此,根据所提供的OP的详细信息,听起来好像是这样的问题:“我如何学习自己的代码,以便在被要求查找X或解释Y时,我能够快速做出响应。”

我能想到的一些建议:

  • 编码时,您需要花时间学习和理解自己的代码。这可能就是您的TL试图用很少的几句话传达给您的内容。作为当前项目的TL,在过去的11个月中,我已经进行了很多代码审查,而且我确实注意到一些开发人员在我们自己的代码库或其他地方(例如Google等等)并将其复制/粘贴到其中。就我个人而言,我无法忍受,因为尽管他们的代码通过了简单的单元测试,但他们不了解它的实际作用,因此我们永远无法保证存在某些边界情况或可能发生的预期故障情况。

  • 作为先前声明的必然结果,如果您必须复制/粘贴,请尝试仅复制/粘贴您先前编写并理解的代码。借用别人的想法当然是可以的,但是在这种情况下,请逐行重写他们的代码,因为在编写代码时,您将更好地理解它的作用。如果您使用的是外部API,即使您有使用该API的示例,也要花几分钟来查找参考,并了解该API的工作原理。不要仅仅假设如果它曾经起作用过,它也会在您遇到的情况下起作用。

  • 阅读并学习热爱DRY原理。很多时候,您试图复制/粘贴的内容可能会放在一个公共位置(单独的函数,单独的类,单独的库...)

  • 阅读,学会爱SOLID原则和,而你在它,回顾KISS这是已经被mouviciel提及。这些原则都是针对产生非常简洁,干净和模块化的代码。如果您在其中具有大型类和大型函数,则查找内容显然会变得困难得多,此外,还要尝试解释代码的作用。另一方面,如果您遵循(或至少尝试遵循)SRP,并使每个类/函数仅负责一件事,那么您的代码将很小且可读性强。

  • 拿起一份清洁代码。很好的书。它讨论的是编写易于解释,易于阅读,维护和扩展的代码。如果您练习编写易于阅读的代码,那么在代码评审中阅读自己的代码就不会有问题。这是一个有趣的部分,我已经要求人们阅读他们自己的代码,或者只是告诉我变量代表什么,即使他们仅在一周前编写了该代码(全新类,而不是旧版),他们也无法回答。 。良好的命名有很长的路要走。

  • 如果经过简化和重构,您仍然有一个必须执行某种不太明显的算法的函数,请花一些时间在该函数中编写注释块以解释该算法。从现在开始两个月后必须修改该功能不仅会有所帮助,而且如果您陷入代码审查中,则可以简单地读回自己编写的内容。

  • 如果上述所有内容之后,您是否仍然遇到麻烦?您是团队的新手,并要求使用许多旧代码吗?在这种情况下,可能是您的TL是A $$,并且您可以主动在会议前要求他轻松一点,而不浪费每个参与者的时间。当新人加入团队时,TL需要有足够的耐心,因为在新平台,新产品,新人,新环境中工作需要新人集中精力,而该人一开始会丢失一些细节。按设计工作,您的TL应该接受。

  • 如果上述所有内容之后,您仍然觉得自己的代码检查很糟糕。与您的TL交谈。有时,人们由于代码审查会议的性质而感到难过,而实际上TL对您非常满意。当我进行代码审查时,我的目标是突出需要更改的内容,确保您了解所做的更改并继续进行。很多时候,我没有时间有礼貌,有些人变得防御性,试图回答我的每一个评论。在那种情况下,代码审查会议会停顿下来,所以我倾向于打断他们并继续前进。通常,在会议之后,我会与新手交谈,以确保他们了解该过程,而且这不是私人的。经过很少的代码审查后,人们通常会更自在。


+1表示“请勿复制并粘贴您不理解的代码”。不能忍受!同时为“与您的TL对话” +1
MarkJ 2011年

@DXM您了解问题的细微差别的能力非常专业,更不用说您的回答了,内容丰富且具有描述性。心灵=吹!
Karthik Sreenivasan

@DXM从您的参考文献中“另一方面,如果您遵循(或至少尝试遵循)SRP,并使每个类/函数仅负责一件事,那么您的代码将很小并且可读性强。” 您能告诉我* SRP是什么意思吗?*我在这里还看到了另一篇有关代码清晰度的有趣文章。
Karthik Sreenivasan

1
@KarthikSreenivasan-在上下文中,它是一种方法或类负责一件事的实践。例如,将数字相加的方法也不应返回平均值。简单的搜索就发现了这一点:en.wikipedia.org/wiki/Single_responsibility_principle
Ramhound

10

做法各不相同,但以我的经验来看:

  • 不要对代码做任何特殊的事情。当您了解要审查的代码时,自然会多花一些代码,而且解决诸如拼写错误之类的明显问题也没有害处。但是不要去添加很多详细的注释,也不要仅仅因为代码已计划进行审核而更改代码。

  • 编写代码,并在审查之前将其分发给审查者。这通常是由中立的第三方(可能是代码检查协调人)完成的。如果将其打印出来,代码应该足够小,以免行被太多的换行,但又要足够大,以使每个人都可以轻松阅读。如果需要的话,以横向格式打印。

  • 代码应打印或显示行号。最好,该编号应从一个文件继续到下一个文件。引用“ 3502行”比“ foo.c的238行”要容易得多,并且有了数字,每个人都可以谈论特定的行,而不会浪费时间查找这些行。

  • 绝对应该有一个促进者,顺便说一句。他或她的工作是防止评论陷入细节,防止其变得个性化或激烈,并严格限制评论的时间。

  • 作为作者,您应该在审查会议之前亲自审查代码。如果这是别人的代码,请写下您建议的更改。这可以使您记忆几天后可能没有看过的代码,也可以帮助您练习用批判性的眼光看自己的代码。在以审阅者和作者身份进行了几篇评论之后,您会发现自己的笔记与小组其他成员的笔记更加接近。

  • 准备在审核期间做笔记。这不应该是您的主要关注点-其他人应该记录小组同意的行动项目,以便您可以专注于解释代码并听取反馈。但是有时候,您会得到一些有价值的反馈,而不是一项行动性的建议,您应该纠正这种情况。

  • 请记住,这不是个人的。很难避免在评论过程中感到(和扮演)防御。如果您认为自己的代码被误解了,那么可以对它进行解释,但这比尝试监听的要多。


我要添加一件事:“ 3502行”将是一个很大的红色标记。拥有非常长的文件绝对是一件坏事。
2011年

2
@VJo:Caleb建议让行号在文件中继续,因此3502行实际上是foo.c的238行。
Heinzi 2011年

我不同意文件中连续的行号。对我来说,这只是令人困惑和尴尬。如果发现任何问题,无论如何都需要通过模块(类,文件甚至方法)来跟踪它们。此外,在代码审查期间,您不应该审查整个系统,而应该审查一个子系统甚至是几个类或文件,因此跟踪变更的位置应该不难。
Thomas Owens

1
@ThomasOwens行号仅是为了在审核期间轻松地在审核的代码中描述位置。与使用“文件foo.c,第123行”相比,它更快且更不容易出错,OP专门询问花费更少的时间查找代码。同意应按文件跟踪问题。输入法(IME),评论倾向于涵盖一组课程,可能是两个大的课程或十几个小的课程。3500条以上的行太多了,无法一次查看-只是为了说明数字从一个文件继续到下一个文件。
卡莱布

如果您有条理,那就没关系。对我来说,我觉得这会让我慢下来。我参与了代码审查,我总是打印出文件,按类/文件装订它们,然后阅读并注释它们。如果有人想告诉我要看的地方,我想要一个文件名/行号对-这对我来说将更加容易,尤其是因为我的IDE在每页的页眉/页脚中打印出文件名,然后我将每个文件的行号。
Thomas Owens

3

在其他答案中添加的另一件事是:使正式代码审阅者更轻松,进行很多非正式代码审阅!例如:

“嗨,鲍勃,我能告诉你如何实现foo()函数吗?” “嗨,史蒂夫,你能看一下这个课程表,让我知道你的想法吗?” “嘿,凯伦,您能帮我解决这个问题吗?我认为我有一个很好的解决方案,但是我可以使用您的帮助...”

养成规律的习惯。在设计过程的早期阶段让同事参与时,您:

  • 建立关系
  • 获得对该问题的新见解
  • 提高您解释当前问题/解决方案的能力
  • 节省以后在正式代码审查中的时间

+1进行团队建设,并提高您解释问题的能力。的确是个好主意!
Karthik Sreenivasan
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.