如何拒绝您认为不必要的代码审查?


89

我被要求查看一些代码来解决我认为不存在的问题。

这个比我更高级的修复程序坚持认为自己的修复程序是必要的,但对我而言,它似乎不过是C ++诡辩。我们的部署过程的一部分是代码审查,作为一名小公司的第二高级工程师,我希望审查变更。

我相信审稿人对代码更改的责任与原始编码员一样,并且我不愿意对此更改负责。您将如何拒绝此评论?


113
对我来说似乎很明显。您在评论中指出,该代码是C ++智能手淫,其目的是解决不存在的问题。然后,作为检查过程的一部分,您拒绝代码。
user16764 2013年

86
当您拒绝它时,请不要使用“智力自慰”一词。如果您使用该措辞,您将激怒他,而他不会把您所说的视为潜在正确的技术批评,他会将其视为人身攻击。这可能完全是智力上的手淫,但您可以绝对确定他不会那样看。
Michael Shaw

15
詹姆斯(James)-我从您的问题中消除了情感,以便让社区专注于您的核心问题。正如其他人指出的那样,在您的评论中使用加载的术语只会加剧显然是微妙的情况。

8
C和C ++充满了似乎有效的东西,但实际上是未定义的行为。UB是一个真正的缺陷,即使您无法编写表明它不能正常工作的测试。例如,许多编译器通过假定从未发生未定义的情况,将UB用作优化机会。例如,如果您过去size > size+1用于检查有符号整数的溢出,则编译器可能会简单地用替换该表达式false,因为未定义有符号整数的溢出。参见blog.llvm.org/2011/05/…–
CodesInChaos

5
@MichaelShaw“他会将其视为人身攻击。” 这个问题的措辞在我看来像是对高级开发人员的人身攻击,与OP意见分歧的他现在可以“获胜”,因为他已被置于权力位置。
jwenting

Answers:


274

要求一个失败的测试用例,而没有成功的更改。

如果他不能生产一个,您可以以此为理由。

如果他能提供一个,那么您需要解释为什么测试无效。


245
或者,也许如果他能提出一个建议,那么您可以重新检查您的假设,并认为他也许是正确的。大概,练习的目的是改进代码,而不是赢得辩论。
Caleb

99
仅仅因为您不能编写测试并不意味着它没有坏。未定义的行为通常碰巧可以正常工作(C和C ++充满了),竞争条件,由于内存模型弱而可能重新排序...
CodesInChaos 2013年

29
另外,标准重构又如何呢?您如何为重构工作编写失败的测试?
Mike Weller

62
“请他证明为什么有必要……”也许要问他你为什么有必要。
Mike Sherrill'Cat Recall'13

8
@RhysW:错误的假设。带有竞态条件的现有代码也无法在这方面进行测试。因此,新代码在理论上和经验上都更好。仅在经验上更好的前提下,您的假设才成立。
MSalters 2013年

152

审稿人应客观。

显然,您在审查代码之前就已经对所讨论的代码形成了看法,这听起来像是您和修复者已经放样了。如果真是这样,那么你将有困难的时候出现的目标,一个更加困难的时间客观的。这些都无助于该过程,可能您可以做的最好,最客观的事情就是以太接近问题为由拒绝了。

考虑一个团队方法。

如果无法删除自己,也许您可​​以让其他几个工程师同时检查代码。他们会同意您的意见,否则代码将被拒绝。如果他们同意您的意见,那么您将不再只是您与修复者,您将能够提出更强有力的理由,要求团队客观地查看修复程序并决定不接受该修复程序。另一方面,如果他们决定接受此修复程序,那么这也将是团队的决定。毋庸置疑,您应该以开放的心态参与进来,并且除了理性的讨论之外,您不应该尝试通过其他任何方式影响其他团队成员的观点。重要提示:如果以后有不好的结果,请不要说“嗯 总是说这是错误的代码,但其他团队成员的人数远远超过了我。”

拒绝是代码审查过程的自然组成部分。

代码审查过程并不适用于更多高级人士的橡皮图章修复。它在那里可以保护和提高代码质量。如果您有正当的理由拒绝修复程序,那没有错,即该修复程序无法改善代码。如果在对代码进行开明的检查之后,您仍然认为该修复程序并未降低可证明问题的风险和/或严重性,那么您应该拒绝它。这不是个人的,只是您的诚实意见。如果修复者不同意,那也没关系,到那时,管理人员就必须解决这个问题。只要确保保持诚实,开放和专业。

责任是双向的。

您说您不想为此更改负责,这显然是因为您不相信有问题。但是,你需要认识到,如果你错了,有一个问题,那么你可能最终被负责该拒绝本来可以避免该问题的代码。

做笔记。

保留审查过程的书面记录将有助于您保持事实的正确性。写下您的想法和疑虑,同时审查,描述和测试可能用来衡量所谓的问题和解决方案的任何测试的结果,等等。如果问题升级,则将记录您为支持自己所做的工作位置。如果以后再次出现此问题(如果将修复程序附加到他自己的视图上,则可能会出现),您将有一些需要记忆的地方。


24
+1这比接受的答案有用得多
Simon Bergot 2013年

2
绝对是 公认的答案是针对一种情况的,显然不如这种情况笼统和深思熟虑。
Florian Margaine 2013年

40

写下您可能拒绝的理由和抗辩理由。然后与修复者进行合理讨论,如有必要,请升级为管理者。

如果您有足够的文档(包括代码清单,测试结果和客观参数),则将充分了解。

您将对定影液造成不适,因此请确保该问题值得(即,非定影液是否会造成伤害?)

另外,如果修复程序与所有者有任何关系,请忘记此答案。


9
对于您的答案的最后一部分,我将投票两次。非常可靠的答案。

31

最近在LinkedIn新闻中,有一篇关于工作场所解决冲突,谦虚而非自大的文章。不幸的是,我现在找不到链接,但是总的目的是试图以一种非对抗性的方式提出问题。请不要以为我暗示您自大,这只是本文撰写的方式。

无论如何,告诉高级程序员他的假设是错误的,只会导致他采取防御性方法,并在他的回应中向您发起攻击。但是,如果您提出一个为什么他认为问题存在的问题,从您缺乏理解的角度来看,他/他可能会更愿意讨论此事。

因此,与其说“问题不存在,就不必复审”,不如问“为了正确复审,我需要理解问题。请您从您的角度进行解释”观点看法?”

例如,文章描述了一项针对儿童的测试,其中一个成年人举起一个立方体,除了面对成年人的那个立方体外,其他物体的所有面都是一种颜色。当询问孩子们成年人看到的是什么颜色时,五岁以下的孩子几乎总是说出他们能看到的颜色,因为他们不理解成年人可能对自己的看法有所不同。


8
很好,但是我无法理解底部的示例是如何关联的(当然,我并没有断言它是无关的,只是指出我对这种关系的理解不足)。
ugoren

8
@ugoren哈哈,我喜欢你在那里所做的!
TheDarkKnight

1
@ugoren的关系是“除非您能看到整个图片,不要形成具体意见”
RhysW 2013年

2
我一直喜欢谦虚的方法,我会基于我不理解的原因拒绝更改,因此我没有资格对此表示满意。
PhilDin

2
@PhilDin谦虚,然后四处说你不具备这份工作的资格。如果他有能力审查代码,我认为将他置于该职位的人们都希望他有足够的资格来这样做。
安迪

9

C / C ++可能充满未定义的行为。一方面,这很糟糕,因为它可能导致意外的行为。另一方面,它允许进行积极的优化,通常在使用C / C ++时,您会对速度感兴趣。

编写断断续续的测试用例可能很困难-它可能涉及奇怪的体系结构或编译器,而这种架构或编译器已不复存在。同样,在任何明智的体系结构上看起来 “它都不会引起任何问题”。

但是,在某一点或另一点上,您将更改平台(例如-您想移动,以便移植到ARM或要加快处理速度并使用GPU)。此时,事情可能开始破裂,您需要对其进行调试。它可能像将编译器更新为较新版本一样琐碎(并且您可能需要/需要它)。

有问题的代码是:

int d[16];

int SATD (void)
{
   int satd = 0, dd, k;
   for (dd=d[k=0]; k<16; dd=d[++k]) {
     satd += (dd < 0 ? -dd : dd);
   }
   return satd;
 }

在最后一次迭代期间d[++k] => d[++15] => d[16]访问。由于通常下一个元素是合法内存(就分页而言,不是C内存模型),即使是琐碎的编译器也不会产生任何具有奇怪行为的可执行文件。编写测试用例的唯一方法是找到具有与C完全相同的内存模型(可能是VM)的平台。

但是gcc 4.8 prerelase看到d[++k]在每个循环中执行。因此,k < 16否则访问将是非法的,并且馈给编译器的程序的合法性是合同的一部分。因此,给定假设,循环条件始终为真,因此它是无限循环。这听起来可能很奇怪,但这是完全合法的优化-发出system("dd if=/dev/zero of=/dev/sda"); system("format c:")也将是loop的正确替代。您可以选择更多微妙的方式来表现行为。例如,在关于事务性内存的讲座中,我记得当两个线程增加相同的值时,演示者尝试了几次以获取错误的值。

但是,与某些语言相对的C / C ++已标准化,因此可以参考客观来源来解决此类争议:

  • 如果您认为这不是问题,请尝试使用C / C ++标准进行证明(即,它会导致定义的值和行为)
  • 如果他认为这是一个问题,请他使用C / C ++标准进行证明(即,它导致未定义的值或行为)

通常,如果您的团队使用C / C ++编写,手头准备标准很有用-即使团队专家有时也会在其中找到一些奇怪的东西。


4

这听起来更像是您的团队政策的问题,而不是此特定的审查。当我由9人组成的团队在一家大型软件商店工作时,审稿人对代码拥有否决权,这是我们大家都尊重的标准。我们足够有才华和精明-即。“成熟”,但更多的是“不幼稚”而不是“经验丰富”-我们的团队负责人可以合理地期望我们始终能够达成协议,而不会在审慎的时间内争论不休。

仅仅根据您在帖子中使用的语言,我可能会警告您,这听起来像您将以一种可能导致论点下移的方式来处理这种情况。也许这是“智力自慰”,但是他或她这样做可能是有原因的,而您的负担将是想出一种解决该问题的简单方法-如果不存在这种方法,请在注释中说明原因实际上,手淫代码是必要的。


1
“ ...但是他或她这样做的原因可能是...” -这是您所做的一个很大的假设。而且您还忽略了问题指出(OP认为)不存在问题的观点。当然,提出“解决方案”的人应该承担责任,以证明存在真正的问题需要解决。对不存在的问题提出“更简单的解决方案”是没有意义的。
斯蒂芬·C

4
@StephenC是的,我支持OP在这种情况下应从怀疑中受益。否则,它将是一次真正的对抗性审查。
djechlin

3

使提交者证明自己的代码可以解决他的问题。如果他可以测试并向您显示证据,那么您就是错的人,应该停止抱怨并加以处理。如果他不能出示证据来支持他的主张存在问题,并且不能出示证明他的补丁可以解决问题的证据,那么我会将他送回绘图板。

当然,围绕此可能会有敏感的内部政治性。但是,这就是我的选择方式。

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.