在检查代码时,我通常会针对如何解决问题提出具体建议。但是由于人们可以花费有限的时间进行审阅,所以这种方法并不总是能很好地工作。在这些情况下,如果开发人员自己提出解决方案,我会觉得效率更高。

今天,我回顾了一些代码,发现一个类显然设计得不好。它具有许多仅分配给某些对象的可选属性,而对其他对象则留空。解决此问题的标准方法是拆分类并使用继承。但是,在这种特定情况下,此解决方案似乎使事情变得过于复杂。我本人并未参与此软件的开发,也不熟悉所有模块。因此,我没有足够的知识去做出特定的决定。

我经历过的另一个典型案例是,我发现一个明显毫无意义甚至误导的函数,类或变量名称,但无法

因此,通常,作为审阅者,可以说“此代码有缺陷,因为...,以不同的方式进行处理”还是您必须提出来?一个特定的解决方案?

评论

提交用于代码审查的代码似乎太复杂时该怎么办?

@gnat:没有代码不是太复杂。这只是一个例子。我通常会问审稿人是否负责提出解决方案。

不,我想说的是,作为审阅者,您没有义务讲述如何改进它。如果您可以描述那里有什么不对劲,那就去做;如果不是,请提供一般意见。 (我记得收到的最有用的评论之一实际上就是“此类完全是垃圾”)

“解决此问题的标准方法是拆分类并使用继承。”我希望您不要审查我的代码!

查明潜在问题就足够了。审阅者以用户,维护者或设计者的身份查看代码。提供不同的视角或发现问题,编码人员可能尚未注意到,可以帮助编码人员改善工作。而且,如果您发现自己喜欢的东西,也不必举报。这不应该是一种纠正性的练习,而应该是一种启发性的练习。这就是为什么它被称为“同行评审”。

#1 楼

作为审阅者,您的工作是检查一段代码(或文档)是否满足审阅之前已商定的某些目标。

其中一些目标通常会涉及判断是否目标是否实现。例如,代码必须可维护的目标通常需要一个判断调用。

作为审阅者,指出未达到目标的工作是您的工作,这是作者的工作确保他的工作确实达到目标。这样,告诉您如何进行更正不是您的工作。

另一方面,仅仅告诉作者“这是有缺陷的。解决它”通常不会导致团队中的积极气氛。为了营造一种积极的氛围,至少要指出为什么您的眼睛有瑕疵,并为您提供更好的选择。
此外,如果您正在查看看起来“错”但又没有的东西,那是一个好选择。 “确实没有更好的选择,然后您也可以按照“此代码/设计不太适合我,但我没有明确的选择。”可以发表评论。我们可以讨论这个吗?然后尝试使事情变得更好。

评论


+1讨论以共同提出解决方案-这是我从高级程序员那里审查我的代码所学到的最多的方法

– dj18
17年5月23日在15:04

+1。提供反馈意见时,最好尽可能提供建设性的批评。

–FrustratedWithFormsDesigner
17年5月23日17:00



我特别同意最后一点。在没有给出解决方案的情况下,完全可以说“该解决方案因为...而感到不对”,或“我担心此部件可能因为...而有问题”。

–丹尼尔·T。
17年5月23日在20:45

@dotancohen:“我们可以讨论这个问题”是一个问题。就个人而言,即使只是我自己学习一些东西,我还是会进行讨论。

–巴特·范·恩根·舍瑙(Bart van Ingen Schenau)
17年5月24日在12:24

潜在的隐患是,经过足够的讨论和实现交流,这不再是一个回顾,而成为结对编程。结对编程很好,但是一旦完成,您将需要一个第三人来审核,因为失去了独立性。

–candied_orange
17年5月24日在15:55

#2 楼

这里有一些很好的答案,但我认为缺少一个重要的观点。您正在查看的代码,该人的经验以及他或她如何处理此类建议都将产生很大的不同。如果您非常了解您的队友,并且希望看到“此代码有缺陷,因为...,请以不同的方式进行处理”之类的注释足以使他或她提出更好的解决方案,那么这样的注释就可以了。但是肯定有一些人对此作出的评论还不够,需要准确地告诉他们如何改进其代码。所以恕我直言,这是一个判断电话,您只能针对个别情况提出。

#3 楼


因此,通常来说,作为审阅者,可以说“此代码有缺陷,
做不同的方式”,还是您必须提出一个特定的解决方案?


两者都不是理想的IMO。最好的办法是与作者讨论并共同解决问题。

代码审查不必是异步的。如果您停止将它们视为官僚主义的过程,而花一点时间进行实时沟通,那么许多问题将被释放。

评论


“官僚主义的过程”是一种很好的表达方式!

–frnhr
17年5月25日在18:27

#4 楼


在代码审阅中,审阅者是否应始终提出解决问题的方法?


否。如果您不是审查者,那么您就是下一位编码者。


在代码审阅中,审阅者永远不要提出解决问题的方法吗?


否。您的工作是传达当前的问题。如果提出解决方案可以解决问题,请解决。只是不要期望我遵循您的解决方案。您在这里要做的唯一一件事就是指出。您不必指示实施方式。


审稿人何时应提出解决问题的方法?


何时才是最有效的解决方法?通信。我们是猴子而不是英语专业的代码。有时,显示代码糟糕的最好方法是...并非最佳...是向他们展示更少的代码...更多选择...哦,天知道你的意思了。

评论


不要在真空中编码,因为它很烂。

–user251748
17年5月23日在16:27

嗯当我提出解决方案的建议时,它通常会带来我所知道的好处,但是花很长时间才能详尽列出所有这些好处。 (这些通常与稳定性有关,并且有信心在我们更改周围的其他内容时,它可以继续工作。)因此,如果您做的其他事情不能解决那么多问题,我将不会很高兴(至少除非您能告诉我我提出的建议未能解决的一个很好的理由)。您将如何处理?

– jpmc26
17年5月24日在22:34

P.S .:“代码猴子”通常用来描述一个不熟练,没有思想的程序员,即使这是一个坏主意并且没有良好的设计敏感性,他们也只是按照他们的意思去做。参见城市词典。甚至Wikipedia也指出它有时是贬义的。

– jpmc26
17年5月24日在22:37



@ jpmc26如果您要使用代码与我交流,那么我希望您使用能显示如何更好地解决问题的代码。另外,可以将Code Monkey与情感一起使用。肯定比英语专业的学生要多

–candied_orange
17年5月25日在0:20

“代码猴子起床喝咖啡。代码猴子上班。代码猴子开无聊的会议,和无聊的经理罗布。罗布说代码猴子非常勤奋,但是他的输出很臭...”

–巴尔德里克
17年5月25日在8:34

#5 楼

主要问题是,如果人们知道如何更好地编写代码,通常他们通常会首先这样做。评论是否足够具体,很大程度上取决于作者的经验。经验丰富的程序员可能会接受“此类课程太复杂”之类的批评,然后回到制图板上并提出更好的建议,因为他们因头痛而休假或者因为匆忙。

通常,您至少必须确定并发症的来源。 “这一课太复杂了,因为它违反了各地的得墨meter耳定律。” “此类混合了表示层和持久层的职责。”学习识别这些原因并简洁地解释它们是成为更好的审阅者的一部分。您很少需要深入了解解决方案。

评论


+100我对Code Review的最普遍的挫败是,如果我知道更好的方法,那么我可能会那样写。

–RubberDuck
17年5月23日在16:24

我爱你的第一句话。这让我想到问自己:“这段代码足够好吗?”然后掷硬币决定是否要改善它! (通常我会一直坚持到时间用完为止,但是当它足够好时,也许我可以停下来吗?)

–user251748
17年5月23日在16:26

IMO“此代码很复杂,因为它违反了得墨the耳法则”,这是一个不好的评论。 “此代码很复杂,因为X太与Y和Z耦合了”。

–user253751
17年5月25日在1:46

“如果人们知道如何更好地编写代码,通常他们一开始就会这样做”。也有例外。我以这种工作方式开发了此代码,但将来会在某些方面伤及我们。非技术经理不理解“我不喜欢此代码,并希望三天时间对其进行改进”。非技术经理了解“ Joe审查并拒绝了此准则,我需要三天的时间来改进它”。

– gnasher729
17年5月25日在19:31

#6 楼

不良程序员有两种类型:不遵循标准惯例的程序员和“仅”遵循标准惯例的程序员。

当我的工作联系/向他人提供反馈的信息有限时,我不会不要说“这是一个糟糕的设计。”但是类似“您可以向我解释这堂课吗?”之类的东西。您可能会发现这是一个很好的解决方案,开发人员竭尽所能,甚至意识到这是一个糟糕的解决方案,但这已经足够了。

根据响应,您将对如何处理每种情况和每个人有一个更好的想法。他们可以迅速发现问题并自行发现解决方法。他们可能会寻求帮助,或者只是尝试自行解决。

我们的业务中有建议的做法,但几乎都有例外。如果您了解该项目以及团队是如何进行的,那么可以以此为背景来确定代码审查的目的以及如何着手解决问题。

我意识到,这比起明确的解决方案,更多的是解决问题的方法。变化将覆盖所有情况。

评论


但是,如果需要解释才能被认为是不错的设计,则会缺少内联注释。

–通配符
17年5月23日在16:10

有时规则没有例外,但通常没有例外。

–user251748
17年5月23日在16:20

@Wildcard-取决于查看它的人的能力和偏好/意见。

– JeffO
17年5月23日在18:29

@Wildcard我采用的方法是将反馈表达为问题,但答案(最终)将采取注释或代码更改(例如更好的命名)的形式。这为开发人员提供了解释其思想,讨论各种选择的机会,而不是感到像是需求或无意间为他们完成工作。

–IMSoP
17年5月24日在16:52



#7 楼

当我审阅代码时,如果我可以毫不费力地解决问题,则只会为我确定的问题提供解决方案。我确实尝试具体说明我认为问题出在哪里,并尽可能参考现有文档。期望审稿人为发现的每个问题提供解决方案会产生有害的动机-这会阻止审稿人指出问题。

#8 楼

我的观点是,在大多数情况下,我倾向于不提供代码,这有很多原因:


如果仅靠解释还不够,他们可以随时索取以下示例:您在想什么。
您不会浪费时间来尝试熟悉一些您很久没有接触过的代码,只是对其进行了少量的修改,而其他人只是花了一些时间做到这一点。
如果他们已经熟悉而您却不熟悉,那么仅给出反馈可能会导致比编写的代码更好的代码。给某人一个现成的解决方案通常会导致他们只使用它,而没有考虑进一步改进它。
始终提供解决方案总是屈服。您正在与某人合作,希望是因为他们足够优秀,可以被录用。如果您设法了解为什么某事是一个坏主意,那么他们为什么不通过听取反馈并自己做来学习呢?
总是提供解决方案只是很奇怪。想象一下,您正在他们的办公桌上进行配对编程:他们刚刚完成了几行您认为不好的工作。您只是告诉他们发现的内容以及原因,还是抓住他们的键盘并立即显示您的版本?这就是总是向别人提供您的解决方案的感觉。
您总是可以说出您想做的事情,而无需花费时间来实际编写它。在描述问题中的第一个问题时,您就是这样做的。
不要分发食物,而是教如何钓鱼;)

当然,您在某些情况下会想到一些特定的替代方案,值得附加。但这在我的经历中确实很少见。 (很多评论,大型项目)如果需要,原始作者随时可以要求您提供样品。

即使是这样,由于第三个原因,在给出样本时也可能值得一说,例如“使用x.foo()会使此过程更简单”,而不是完整的解决方案-让作者自己编写。这样也可以节省您的时间。

评论


您的第5点让我微笑,我在想象“决斗的键盘”,看看谁能先得到一个很好的解决方案。谁知道“配对编程”可能像那两个赛车街机游戏一样,或者是一种全接触运动? “史蒂夫只是在禁区内2分钟残酷地检查了罗恩到BSOD。”

–user251748
17年5月25日在13:33

#9 楼

我认为代码审查的关键是在审查之前就规则达成共识。

如果您有一套清晰的规则,则无需提供解决方案。您只是在检查是否已遵守规则。

唯一的替代问题是,如果原始开发人员无法想到一种实现符合规则的功能的方法。假设您有性能要求,但是经过多次优化尝试后,该功能花费的时间超过了阈值。

!如果您的规则是主观的,则“名称必须由我批准!”然后,是的,您刚刚任命了自己的命名者,应该期望可以接受的名称列表的请求。

您的继承(可选参数)示例可能更好,因为我已经看过代码审查规则,禁止使用长方法和“太多”功能参数。但是通常这些可以通过拆分来轻松解决。这是“此解决方案似乎使事情变得过于复杂”的部分,在此部分您的客观性受到侵犯,可能需要论证或替代解决方案。

评论


“我认为编写代码审查的关键是在审查之前就规则达成一致。”这将是理想的情况。实际上,我们不能假设每个开发人员都知道所有规则。代码审查有助于传播这些知识并通过实际示例解释规则。也许那是进行代码审查的最大好处之一。

–弗兰克·普弗(Frank Puffer)
17年5月24日在6:47

将规则写在编码标准文档中,并交给新开发人员

–伊万
17年5月24日在6:57

我们已经写下了编码标准,并将这些标准提供给了新开发人员。这在大多数情况下都有效,但有时会产生误解。除了书面的编码标准外,在代码审查中还解决了诸如DRY或SOLID之类的通用原则。我们希望开发人员具备有关这些知识的基础知识,并且还会进行一些内部培训以改进它。这是一个持续的过程,代码审查是其中的一部分。

–弗兰克·普弗(Frank Puffer)
17年5月24日在11:45

#10 楼

如果快速简便地输入潜在的解决方案,我会尝试将其包含在我的同行评论中。如果不是,我至少会列出我的担忧以及为什么我觉得该特定项目有问题。对于变量/函数名称,如果您想不到更好的选择,我通常会承认我没有更好的主意,并以开放式问题的形式结束注释,以防万一有人可以。这样,如果没有人提出更好的选择,则不会真正阻止审核。

对于您在问题中给出的示例,该类的设计不佳。我会发表一些评论,尽管看起来似乎有些过分,但继承可能是解决代码试图解决的问题并将其留在那的最佳方法。我会尝试用某种方式来表述,以表明它不是止步不前,并且由开发人员决定是否修复。我还要承认您对代码的那部分不是特别熟悉,并邀请更多有知识的开发人员和/或审阅者阐明这样做的原因。

#11 楼

去和您正在检查代码的人交谈。友好地告诉他们,您发现它很难理解,然后与他们讨论如何使之更清晰。

书面交流会浪费大量时间,以及面对怨恨和误解。

面对面,带宽要高得多,而且它具有防止敌对情绪的情感通道。

如果您实际上和那个人聊天,它会更快,并且您可能会结交新朋友,并且发现你们俩都更喜欢您的工作。

评论


这似乎没有提供任何实质性的东西,超过了先前的11个答案

– gna
17年5月25日在16:13