组织未注释的脏代码?


22

我想问你一些关于脏代码的问题。有些初学者在中等项目上编码。该代码是一个非常大的泥泞球。他们不是高级程序员。他们只知道如何稍微使用一下Java键盘。他们只是在主类中编写了12,000行代码,但是6000行属于NetBeans本身。

我的工作是分析代码并提出维护代码的好方法。我的想法是取消该项目,并使用OOP方法启动一个新项目。最近,我从该站点和其他站点收集了有关该问题的一些注释和想法。

现在,我有以下问题:

  1. 我们应该修复代码并将其更改为OOP吗?我们现在正在调试它。
  2. 该代码没有注释,没有文档,没有特定的编程风格,等等。更改它确实非常昂贵且耗时。我们能对此做什么?
  3. 我如何教会他们遵循所有规则(注释,OOP,良好的代码质量等)?
  4. 代码错误且容易出错。我们能做什么?测试?我们几乎写了两到三份A4纸进行校正,但似乎无止境。

我必须说我对他们是陌生的。我想我也违反了为项目添加新成员的规则。你认为我必须离开他们吗?


这需要分为两个或三个问题,目前范围太广。
乔恩·霍普金斯

2
这个项目受版本控制吗?
JBRWilkinson

2
当前代码正在生产中吗?
JeffO 2010年

是的,杰夫。这是一个生产,管理财务问题的管理项目!
萨利文

对不起,JBR,他们没有听到类似的事情。他们只是在整个硬盘上复制粘贴代码而已,这是他们执行版本控制的技术。
萨利文

Answers:


36

步骤0:备份到SCM

正如JBRWilkinson在评论中所暗示的那样,因为版本控制是抵御(不可逆)灾难的第一道防线。

还备份软件配置详细信息,创建可交付成果的过程等。

步骤1:先测试

然后开始编写测试

  • 对于什么有效,
  • 对于失败。

无论您决定做什么,都可以得到保障。您现在可以:

  • 开始从头重写
  • 修复它。

我的建议是从头开始构建通用体系结构,但要从混乱中提取验证检查点的部分,并在您认为合适时对其进行重构。

步骤2:验证和监控

设置一个持续集成系统(作为步骤0步骤1的补充)和一个持续检验系统(为步骤4做准备)。

步骤3:站在巨人的肩膀上

(如往常一样...)

步骤4:清洁

不用说,但您可能不想在代码本身上略读,而只是想在损坏的代码库上运行linters / static分析器和其他工具,以查找设计和实现中的错误。

然后,您可能还需要运行代码格式化程序,这将对整理工作有所帮助。

步骤5:审查

通过重构或清除漏洞很容易引入小错误。只需要选择一个错误并快速按下一个键,您可能会删除一些相当重要的东西而没有先意识到。有时效果只会在几个月后出现。当然,上述步骤可以帮助您避免这种情况(尤其是通过实施强大的测试工具),但是您永远不知道会发生什么,并且会遗漏什么。因此,请确保至少要有另外一对专用的眼球来审查您的重构(最好是更多的)。

步骤6:面向未来的开发过程

采取以上所有措施,并使其成为您常规开发过程的固有组成部分(如果还没有的话)。不要让这种情况再次发生,请与您的团队一起在您的流程中实施保障措施,并在您的政策中强制执行(如果可能的话)。将产生清洁代码作为优先事项。


但是真的,测试一下很多


一个很好的建议-如果您进行的测试可以发现问题,那么造成的损害并不重要。当然,我们都假设他们的版本控制已经..
JBRWilkinson

@JBRWilkinson:其实很好!确实,完全假设他们做到了。
haylem 2010年

2
首先启动版本控制;迟到总比不到好。
JeffO 2010年

@Jeff O:是的,这已经是我添加到答案中的内容。
haylem 2010年

在编辑后重写以使其更清晰。左署名:)
haylem 2010年

15

就个人而言,在我手头有一份《有效使用旧版代码》的副本之前,我不会开始这个项目。认真地说,它正是为这类事情而写的。它充满了处理棘手代码的策略,并且比我在这里可以给您提供的细节要多得多。


1
+1可以说明一切。
haylem 2010年

不幸的是,这里的人们对阅读书籍一无所知。他们只需要开发一个可行的项目即可。我开始读你提到的书,以及CODE COMPLETE 2。我说它们写得很棒。
萨利文

1
@Salivan-也许他们只是没有人说服他们相信这些书值得一读。如果只有一个和他们一起工作的人有兴趣阅读这样的书……
Jason Baker 2010年

1
@Salivan-关键是要找到一两个快速的胜利。做一些几乎可以立即得到回报的事情。就像版本控制一样,因此下次有人说“这是怎么发生的”时,您可以查找它。然后,通过阅读WELC副本,将其带入一些建议中。不要只是把书扔给他们。

2
@Salivan您可以为他们阅读书籍,并将内容滴加给他们作为建议。您可能会成为团队专家。
MarkJ 2011年

8

我去过那里好几次了。我的规则是:如果该软件不是微不足道的(您拥有的资源可以使用超过1周的时间)并且可以正常工作,请保留该软件并继续进行增量重构。

如果该软件不能真正起作用(大量错误,不清楚的要求等),那么最好从头开始重写它。如果很小的话也一样。

重构的意义(如Fowler的书和Kerievsky的http://www.industriallogic.com/xp/refactoring/一样)在于它可以保持系统正常运行,也许重构将花费两倍的时间,但是风险为零。

从头开始重写可能会带来许多风险,从误解需求到错误的实施(毕竟,大多数团队都是一样的)。

我实际上看到一个复杂的过程从头开始重写了两次,但仍无法按预期工作。


如果可能的话,我还建议编写适用于适当方法的单元测试。他们将首先帮助明确定义代码应该执行的操作,这将有助于重构过程。
Michael K 2010年

2
不用说...我认为TDD是任何好的代码(又称新代码)的必要条件。
Uberto 2010年

从一开始就写作是一个非常好的主意。但是首先,您需要掌握一些工作图。但是,如果您必须分析代码以提取关系,该怎么办?此外,项目的规模使它不可能,或者使我们不得不雇用其他一些程序员。
萨利文

感谢测试驱动开发!
萨利文

“但是如果您必须分析代码以提取关系,您将怎么办?” ->如果是这种情况,则意味着该项目既小又不坏。再说一次,我将开始一次重构。另请参见天皇方法。 danielbrolund.wordpress.com/2009/03/28/…–
Uberto

2

我会完全重写它。有时不可能修复这样的代码。另一种选择是使其运行,而不添加任何新功能。为了教会团队编写良好的代码(经过精心设计,记录和测试),让他们修复您现在拥有的代码。让所有人修复错误/查看其他开发人员的代码,而不是其本人的代码。经过一些尝试,他们将了解到几乎不可能查看/修复此类代码。

在后期项目中增加人员很少有帮助。通常会违反截止日期。您应该尽一切可能成功完成项目,然后考虑离开。


完全重写与反复改进相比,需要花费多少费用?哪种方法能最快得出结果?
JBRWilkinson 2010年

@JBRWilkinson取决于。当您具有有效的代码时,迭代方法是好的。
duros 2010年

1
@duros,对于损坏的代码,是的。此代码在生产中运行。

2

我的建议是不要完全废弃整个代码。每个开发团队都面临着日常生活的问题。一次攻击一部分代码。修理,清洁,记录下来。然后移至另一部分。最主要的是总是随时准备一些可交付的代码。从头开始重写整个代码将花费直到现在为止所花费的时间,并且无法保证它会比现在更好。
但是,人们也应该避免以这种方式编写代码。花更多的时间进行代码审查。适应一些统一的编码风格。首先讨论设计,然后编写代码。这样简单的事情将会带来巨大的变化。

不错的博客讲述了Netscape为什么松动


2
在开始新项目的同时,同时更新/调试旧版本(并且您无法避免这样做,所以不要梦想它)正在尝试向多个移动目标射击。
JeffO 2010年

Manjo,“一次攻击代码的一部分”无效。悲痛欲绝,代码包含很多错误。它总是变成别的东西。我们应该攻击并销毁代码的一部分,然后构造它。我曾经向经理建议过这种想法,但是编码人员必须不用编写任何新代码。
Salivan

@Salivan ... 无需编写任何新代码。我确定管理层是在说这个。但是,当您陷入困境时,第一件事就是停止挖掘(不要继续犯同样的错误)。要在这些条件下创建更多的对象,就是继续挖孔。困难的部分是如何让管理层和编码人员理解问题。
SeraM '16

1

如果可行,请对其进行重构。有一些工具可以帮助您做到这一点。如果不起作用,请使用神奇的代码改进命令,即deltree在Windows resp上。rm -rf在Linux上。


2
建议“完全擦除所有代码”特别无济于事-您有一个更具建设性的答案吗?
JBRWilkinson 2010年

大声笑。我完全同意您,ammoQ!
萨利文

JBRWilkinson:重新尝试重新启动比尝试使混乱工作和清理工作更可能是一种更好的方法。我工作过的一家公司尝试过这种方法,而且年复一年,他们浪费了很多资源,却一无所获。
user281377 2010年

@ammoQ,如果发现错误,则需要使用旧代码来查看其实际作用

1
Thorbjorn:我们正在谈论的是无效的代码,对吗?分析没有做正确的事情的未注释的,肮脏的代码,比起其他任何事情,它告诉我的更多有关其创建者的心理状况的信息。
user281377 2011年

1

我们应该修复代码并将其更改为OOP吗?我们现在正在调试它。[...包含错误,没有文档...]

我去过那里,你对此表示同情。我什至写了一篇有关此的文章,这可能有助于您了解一些观点。简而言之:

如果代码中包含很多重复项,则应重写。如果没有可辨别的结构(没有清晰的接口,意大利面条),则重构将失败,您可能应该重写。

我如何教会他们遵守所有规则?

首先通过向他们展示自己可以从中受益的原因来说明他们为什么想要这样做。当他们同意并愿意学习时,就开始使用shuhari教他们。


谢谢马丁。“从向他们展示自己可以从中获得的收益开始,解释他们为什么想要这样做。当他们同意并愿意学习时,就开始使用shuhari教他们。”
萨利文

0

我的建议是@duros和@Manoj R的答案的组合。

从头开始,请记住这次要创建好的代码/ OOP /注释/等,请从您的旧代码中引用/复制并粘贴。当您遇到旧代码的不良部分时,请重写/重构它们。

如果您的开发人员没有受过良好的培训,那么我认为最好将他们发送给课程。对于快速变化的IT行业中的定期培训而言,这很重要

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.