如何说服同事代码重复是不好的?

35

我的一个同事在我们共同开发的项目中实现了一个新功能,他是通过拿取一个包含类似功能实现的文件,创建它的拷贝并将所有全局变量重新命名,稍微修改一下实现来完成的。于是我们就得到了两个几乎完全相同但命名不同的大文件。

我试着解释这样做会使我们的项目更难维护,但他不想改变任何东西,说这种编程方式更容易,而且如果代码没有问题,就没有理由去修复它。

我该如何说服他这样的代码重复是不好的?

这与这个问题有关,但我更感兴趣的是针对技术人员(另一个程序员)的答案,例如引用权威来源如书籍等。 我已经尝试过简单的论点,但没有成功。


31
下次需要在两个文件中更改相同的内容时,请确保将任务分配给他。更好的做法是,看看能否说服他认为重复是可以接受的,并让他负责所有类似的未来任务。然后看看他是否喜欢重复做同样的工作。 - FrustratedWithFormsDesigner
15个回答

31

问他如果在代码中找到一个错误,他会怎么做?他现在需要修复多少地方?

你还可以向他展示这个问题的答案(为什么“复制和粘贴”代码是危险的?)。


13

当他想要咖啡时,让他一口一口地从咖啡壶里喝而不是一次倒满整杯。如果他加奶油和糖,这种方法尤其有效,因为必须分配出微小的份量。这说明重复性任务非常繁琐和令人疲劳(就像更正20个代码片段而不是一个)。

然后,向他发送此帖子的链接,以便他可以看到其他支持你的人。


11

这里有两个选择:

  1. 他是一个理性的人,只是经验不够丰富。在这种情况下,你可以通过展示另一段代码中更清晰的重复例子来让他理解你的观点。你还可以找出原始副本中的错误(最好是几个错误),告诉他现在他的代码已经有问题了,必须修复它。

  2. 他很固执:那么你不应该在他身上浪费精力。去找他的老板,让老板来处理。有些人就是这样。

虽然第一种选择显然更好,但有时你没有选择权。如果最终需要在凌晨3点来维护他的代码,因为某个重要客户在地球的另一端开始大声喊叫 - 那么这肯定是你的问题,你的老板应该处理它。

最后,如果你的老板认为你错了,那么你可能不在正确的位置。


他是第三个选择。他以一种奇怪的复制和粘贴方式有很多编程经验。实际上,他成功地开发出了一个惊人的能力,来维护一大堆基本可以工作的代码。幸运的是,其中大部分都在一个不同的项目中,我宁愿刮掉我的眼球也不想看到这些代码。但也许他并不完全没有希望,可以被说服采用更好的方法。 - vitaut
这成为了一个管理问题。有坏编程习惯的有经验程序员很难被培训。大多数情况下,让他们感受到痛苦是唯一让他们认识到错误的方法。让他们知道,他们将负责维护所有复制品,无论原始程序员是谁。不幸的是,您不是经理。希望您的经理同意您的看法 :-) - Eldad Mor
@vitaut,根据你对他的描述,我认为他是第二类型:固执己见的蠢驴。也许在编写高质量代码方面很有能力,但他的思想过于僵化,这对他自己非常不利。 - Brad

8
给他一本《重构》的副本。

2
作为像我这样的新手的未来参考:http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672 - Max

5

让你的代码版本变得更好,让他因嫉妒而沮丧,然后说 - 如果你只是链接到我的代码...


3
你的同事通过牺牲组织的长期有效性(例如他的其他同事以及他自己)来优化他的短期有效性。第一个文件需要的任何更改可能也需要在第二个文件中进行,但是没有人会记得...这将导致两个查找和修复周期,而不是一个。
你可以对代码运行克隆检测器,并将结果展示给他的经理。
请参见Wikipedia on duplicate code 以获取列表。
您可以使用我们的 CloneDR 检测器查看各种语言的克隆检测示例。它旨在查找并检测具有一致重命名的大块代码,并且可以准确地显示发生了什么。

2

因为当你发现一个bug时,你需要在两个地方进行修改。因为当你想要添加一个新功能时,你需要在两个地方添加。


2
他可能认为它没有问题,也不会出现问题。此外,完美是好的敌人。我不认为他对复制/粘贴的危险毫不知情,只是他对错误潜在性的评估与你不同。
也许你可以给他演示一下它有多容易出错。如果你做不到,也许他是正确的。

1
如果原始代码能够正常运行,它可能“没毛病”。然而,将“别修理不坏的东西”这一概念过于推广也意味着“永远不要改进任何东西”。没有故障并不意味着好,而且代码不仅仅是通过错误计数来衡量的,还有可维护性、清晰度、可重用性和许多其他指标。 - Eldad Mor
这是真的。我正在考虑如何说服一个非常专注于这个特定复制/粘贴的人。我想你需要引入优先级。你的项目现在最重要的是什么?有任何截止日期吗?是否有一般的代码审查即将到来? - Carlos
我同意,也许现在为时已晚,因为他已经这样做了,复制/粘贴的修复将不得不等待。此外,也许有一个特定的原因来解释这个具体的复制/粘贴,尽管我发现很难去证明它的合理性。 - Eldad Mor
如果您是指在代码中找到错误,我可能可以做到,但这如何证明复制是有害的呢?他所说的“如果没有问题就不修复它”,我认为他是想只修复“真正”的错误,而不是诸如复制等代码问题。 - vitaut
在更广泛的意义上,bug 不仅仅是用户功能问题。如果某些东西难以维护,那就是个大问题。你的同事肯定很欣赏代码如果一直复制粘贴会变得笨重这一点吧?如果你能向他展示他现在这种做法有多让人恼火,或许他会改变想法。 - Carlos

2

不重复代码有很多合理的原因,但是请问...你的团队想要维护100K行(存在代码重复)还是50K行的代码?现在代码重复可能看起来很少,这就是为什么你的同事没有意识到DRY概念的重要性,但是想象一下如果他/她在未来5年里重复了越来越多的代码。谁来维护那些代码?你的团队吗?如果他/她有一天离职了呢?你的团队想要维护这个垃圾代码吗? :) 如果不想,那么你已经很有说服力地证明了不重复代码的重要性,更不用说“更多的重复”=“未来更容易出现更多的错误”。


1

从技术角度向你的老板提出申诉。如果老板同意你同事的方法和/或不让他修复它,那么如果上诉理由不起作用,你就没有太多可以做的了。


如果有人固执己见,上级权威的呼吁通常是唯一让他们服从的方法。就像那句老话说的,可以把马带到河边,但不能强迫它喝水。 - Caladain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接