在我工作的地方,人们(顾问)感到迫切需要尽快发布功能。因此,不必花太多时间去思考如何正确地做事,或者因为他们不想破坏任何东西,而是从不同的模块复制并修改代码。
要防止这种情况并不容易,因为代码库对整个公司都是开放的。很多人为此工作。
既然现在已经一团糟,那么在不破坏太多冗余的情况下删除这些冗余的最佳方法是什么?
在我工作的地方,人们(顾问)感到迫切需要尽快发布功能。因此,不必花太多时间去思考如何正确地做事,或者因为他们不想破坏任何东西,而是从不同的模块复制并修改代码。
要防止这种情况并不容易,因为代码库对整个公司都是开放的。很多人为此工作。
既然现在已经一团糟,那么在不破坏太多冗余的情况下删除这些冗余的最佳方法是什么?
Answers:
答案的一部分是重构。
首先,开始编写单元测试,以确保您不会因更改而意外破坏任何内容。然后开始改进设计,逐步删除重复项等,在每个步骤之后运行单元测试,在任何测试失败的情况下解决任何问题,或者在遇到无法轻松解决的更大问题时立即恢复。
另一部分是教育。
必须教导人们不要留下错误的代码。这无疑是一场长期的战斗,因为习惯和思维过程很难改变(有时甚至是不可能)。但是,如果没有它,您将继续获得大量的错误代码,以进行重构。
您可以选择进行组代码审查以打开有关好的和坏的编码习惯的讨论,并传播前者的优点。仅仅说“您必须(不要)编写这样的代码”是不够的,您需要用逻辑和事实来说服人们。就像“如果该方法在代码库中重复了 n 次,您认为如果在该方法中发现错误,该错误将在方法代码的每个副本中得到修复,那您有什么机会呢?”
您的公司可能还需要修改顾问的激励和接受标准 -如果他们可以摆脱编写草率的代码,他们肯定会继续选择更简单的方法。如果公司在长期可维护性方面一直看重“快速交付”,那么什么都不会改变:-(因此,您可能还需要与管理层讨论。让他们理解的一种方法是:重构意味着保持代码干净,容易了解和维护。省略重构就像积累信用卡上的债务。您可以暂时摆脱它,但是如果您没有积极地控制自己的购买习惯和债务,那么一天不可避免地会崩溃。在软件项目的生命周期中,破产是指项目变得难以维护:从头开始重写它比在现有代码库中添加新功能要容易。或者用户对低劣的支持和功能感到厌倦,以至于他们只是转向竞争者。
作为@Peter所说的教育的一部分,您可以引入像PMD这样的复制粘贴检测器,并将其用作构建周期的一部分,以帮助强制执行这部分编码标准。
确保您的项目编码标准涵盖了这种模式,以便您有一个开始讨论的基线。
人们(顾问)感到迫切需要尽快发布功能
您没有技术问题,有社会问题。确实,您有管理上的问题。
要防止这种情况并不容易,因为代码库对整个公司都是开放的。很多人为此工作。
“代码库对整个公司都是开放的”不是问题。没关系
重要的是,有一个用于复制和粘贴的管理奖励系统。根本原因是,人们因复制粘贴而获得奖励(即得到报酬或称赞,晋升或延期)。
在没有从根本上将文化从“被迫尽快发布功能”转变为“获得适当的,经过良好测试的代码库更改的奖励”的情况下,您就无法打破这一点。
你必须
从顶部开始,然后是增强奖励的经理。您必须公开当前的做法并记录成本和风险。您必须提出降低成本和风险的替代方案。
您必须不懈地记录下来,并为该组织的剩余任期暴露成本和风险。狠。基于事实。成本和风险。每周都有更多的成本和更多的复制和粘贴风险。
您将不得不帮助经理人相信新方法,这会使他们看起来不错,而您将被忽略。
减少复制和粘贴非常重要。但是很难改变组织的文化。您必须提供许多事实,并且必须一遍又一遍地向不同意您的经理的理由。
我现在有一个从那里开始烂掉的代码库。我每个模块有10多个静态函数,这些静态函数基本上与其他模块中的相同静态函数相同。每个人的表现只是不同的足够尽快做事情的缘故,以保证新的化身。
今天,我不得不添加另一项功能,而我再也受不了了。我创建了一个新的库,将100+个函数组合为10个可重入函数,这些函数根据位标志略微更改了它们的行为,然后编写了一系列测试,以确保对该库的任何更改都不会破坏其他任何内容。
总花费时间:4小时。如果需要的话,我准备参加20小时的马拉松比赛,并且感到惊讶的是我能很快控制住不断增长的混乱状况。另外,以后修复一堆标头依赖性问题也变得容易得多。另外,由于我们许多专有的东西现在都在静态对象中进行链接,因此我们可以为客户提供比以前更多访问源代码的客户。
我的建议是:先咬紧牙关,然后立即将混乱的因素重构,以免真的变糟。可能不会花很长时间,但是为您自己创建一个新分支,以防万一。
此外,您仍然可以复制/粘贴以获取功能 在解决基本问题的同时。完成后,只需剥离粘贴的内容并改用新库即可。
我同意到目前为止给出的答案。你应该:
但是另一方面,您需要查看是什么导致人们复制粘贴并进行修复。
因此,我认为要停止复制/粘贴模式,您需要使重用更加容易。
阅读框架设计指南
希望这可以帮助。
负责的人有错。不能指望一个人来审查每一行代码,但是他们确实设置了标准和时间表。
承包商(或任何短期从事项目的人员)可以被安排到只因第一次使承包商工作而得到补偿的位置。有一些动力可以尽快完成。复制的代码可能永远都不需要修改,如果是这样,复制代码就不会被他们修改。
您可以尝试强迫他们自己解决问题。然后他们会从一开始就开始做,但是要花很多时间才能完成工作。我认为AmmoQ具有重构导致问题的事物的正确想法。