如何进行大型重构项目?

时间:2011-04-02 08:08:57

标签: refactoring project-management legacy

我即将开始计划我们的代码库的重大重构,我想得到一些问题的一些意见和答案(我已经看到很多关于类似主题的讨论,例如https://stackoverflow.com/questions/108141/how-do-i-work-effectively-with-very-messy-legacy-code,{ {3}},但我有一些具体的问题(在底部):

我们开发了一个复杂的应用程序。有大约25名开发人员在使用代码库。到目前为止,该产品的总人数约为150。 当前的代码库是一个使用ant构建的单个项目。我正在着手的项目的高级目标是将代码库模块化为其各种基础架构和应用程序组件。 目前各种逻辑组件之间没有良好的分离,因此很明显,任何模块化工作都需要包含一些API定义并进行严格的解决以实现分离。 质量标准很低 - 几乎没有测试,绝对没有测试作为构建过程的一部分运行。

另一个非常重要的一点是,该项目需要与活跃的产品开发和发送给客户的版本并行进行。

项目目标:

  • 允许跨不同项目重用组件
  • 将应用程序与基础架构分开,并允许它们独立发展
  • 提高可测试性(通过创建API)
  • 简化开发人员的开发环境(更少的代码签出和编译)

我的想法和问题:

  1. 您对该项目的目标有何看法?你会改变什么吗?
  2. 你有这些项目的经验吗?会有什么建议吗?
  3. 我非常关心缺乏测试 - 因此我无法控制,因为我知道重构过程并没有像我一样破坏任何东西。这是一个问题22,因为这个项目的目标之一是让我们的代码更可测试......
  4. 我很受Michael Feathers'Strategy for large scale refactoring的影响。根据它,自下而上的方法是解决我的问题的方法 - 不要首先跳到代码库并尝试修复它,而是通过在几个月内围绕新代码添加单元测试来开始,并看看如何代码(和团队)变得更好,在某种程度上抽象将出现,API将浮出水面,基本上 - 模块化将自己开始发生。 有没有人有这方面的经验? 正如关于这个主题的许多其他问题所见 - 这里的主要问题是管理上的怀疑。 “如何按类别进行测试(并花费大量时间这样做)会让我们进入一个稳定的系统?这是一个很好的理论,它在现实生活中不起作用”。有关销售此产品的提示吗?

3 个答案:

答案 0 :(得分:12)

嗯,我想现在比以后更好,但你肯定有一项任务在你面前。我曾经在一个三人小组中负责重构类似大小的产品。这是程序代码,但我将描述一些类似适用的问题。

我们从底层开始,通过选择应该具有高度可重用性但不是可重复使用的功能来开始放宽。我们会在现有代码上编写一系列单元测试(根本不存在!),但不久之后,我们遇到了第一个大问题 - 现有代码中存在已经处于休眠状态的错误。

我们修复它们吗?如果我们这样做,那么我们已经超越了重构。因此,我们要记录现有代码的问题,希望获得一个固定且经过新近测试的代码库,但当然管理层认为有更重要的优先事项而不是修复从未出现的错误。可以理解的。

所以我们认为我们会尝试修复新代码中的错误。然后我们发现原始代码中的这些错误使其他代码工作,所以真的是“概念错误”而不是“功能错误”。也许。原始软件中偶尔出现间歇性痉挛,这些痉挛从未被追踪过。

然后我们改变了方向并决定将错误保留到位,正如真正的重构应该做的那样。很容易无意中引入错误,故意这么做很难!

接下来的问题是,代码是混乱的,我们编写的初始单元测试必须大幅改变才能满足重构。换句话说,两个移动目标。不好。只是写测试花了很多年,让我们失去了对项目价值的信念。这真的是你想要离开的东西。

我们最终发现,如果我们要完成这个千年,我们真的不得不淡化重构的程度,这意味着我们梦想的代码库将无法实现。我们宣称最可行的解决方案只是清理和修剪代码,至少使概念上更易于理解,以供将来的开发人员修改。

有限重构的优势减少被认为不值得管理层付出努力,并且鉴于硬件平台(嵌入式项目)中发现了类似的可靠性问题,公司认为这是他们更新整个产品的机会,用从头开始编写的软件,新语言,对象。这只是原始产品中广泛的系统测试规范,这意味着它有机会。

答案 1 :(得分:3)

这正是我们过去几年为web2project所做的事情。我们从一个现有的系统(dotproject)中分离出来,这个系统有很高的圈复杂度(低:17,平均值:27,高:195M) ),许多重复代码(整体代码的8%)和零测试。

自拆分以来,我们减少了重复代码(总体增加2.1%),减少了总代码(200kloc减少到155kloc),增加了近500个单元测试,并提高了圈复杂度(低:1,平均值:11,高: 145M)。是的,我们还有很长的路要走。

我的策略在我的幻灯片中有详细说明: http://caseysoftware.com/blog/phpbenelux-2011-recap - Project Triage&复苏;和这里: http://www.phparch.com/2010/11/codeworks-2010-slides/ - 单元测试策略;在这样的各种帖子中: http://caseysoftware.com/blog/technical-debt-doesn039t-disappear

只是为了警告你......一开始并不好玩。一旦您的指标开始改善,这可能会很有趣并且令人满意,但这需要一段时间。

祝你好运。

答案 2 :(得分:3)