我即将开始计划我们的代码库的重大重构,我想得到一些问题的一些意见和答案(我已经看到很多关于类似主题的讨论,例如https://stackoverflow.com/questions/108141/how-do-i-work-effectively-with-very-messy-legacy-code,{ {3}},但我有一些具体的问题(在底部):
我们开发了一个复杂的应用程序。有大约25名开发人员在使用代码库。到目前为止,该产品的总人数约为150。 当前的代码库是一个使用ant构建的单个项目。我正在着手的项目的高级目标是将代码库模块化为其各种基础架构和应用程序组件。 目前各种逻辑组件之间没有良好的分离,因此很明显,任何模块化工作都需要包含一些API定义并进行严格的解决以实现分离。 质量标准很低 - 几乎没有测试,绝对没有测试作为构建过程的一部分运行。
另一个非常重要的一点是,该项目需要与活跃的产品开发和发送给客户的版本并行进行。
项目目标:
我的想法和问题:
答案 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)