大型系统的重构
软件是有生命的,随着时间推移,软件规模不断扩大,大家会发现新功能难以添加扩展,系统变得改一动百,老程序员开始辞职,这些都是说明软件系统必须重构了,Refactoring Large Software Systems一文以亲身经历谈论一个大型系统的重构经验。
大型软件的生命周期如下图:
成熟Maturity期初期:性能好,各方面功能都很稳定,可以顺利增加许多新功能,BUG能够控制修复。但是当到了
Infeasibility阶段就开始恶化,出现如下各种情况:
1.无法加入新功能。每次加入新功能都是非常费力,导致新功能实现时间延长,项目不断拖延。
2.每个BUG修复带来新的BUG,改正了老问题,却带来了新问题。
3.原先架构受到损害,被各种程序员改得面目全非。
4.散发代码臭味,重复方法 长方法。参考Martin Fowler的重构一书。
5.测试覆盖面不足,无法保证原先功能正常。随着新功能扩展复杂,老功能是否正常都无法保证。
他们提出重构方法:
1.重新设计redesign应用:一个完全重新设计和应用的重新实现。重新建模,从分析开始重新设计,代码重写。
2.重新实现Reimplementation:What不动,重新首先HOW:重写代码 进行可伸缩性的重构,增加并行异步执行。
成功重构的条件是:
1.Team :人员多少,期待一两个不现实。
2.经验:大型规模系统重构必须由经验丰富担任,扎实架构设计功底是必须的。
3.动机:不同于开发新功能,学习新知识,重构是代码质量更好。(类似做后勤,吃力不讨好,但是非常重要)
4.带头工程师:虽然都是高手,还是选出一个高高手带头,必须非常熟悉原来系统。
如何确保重构目标实现?
1.灵活:重构是一个长期任务,需要不断根据客户需要改变。
2.持续集成:需要Build服务器,每日集成
3.自动测试:确保应用程序的行为并没有改变的生命线
具体方法是:评估和总体规划
1.评估出原来系统问题:例如没有分层
2.提出解决问题的规划:分层,清理表现层,用通用框架替代自己做的。
下图是他们重构项目的一个步骤图,从原来耦合无层到后来分层:
重构不是一次性战斗,是长期艰巨任务,边开发边重构才不致于疴病成积。这是一个针对不断恶化的战斗。