持续重构

ddatsh

dev #pattern

什么是重构??

不改变软件可观察行为的前提下改善其内部结构 —Martin Fowler

通俗说法:看起来没做啥调整,让系统继续更好的满足客户需求。同时,希望重构完成后,这个系统能够多蹦跶几年

重构分类

代码重构

《重构:改善既有代码的设计》、《重构与模式》

现在的程序设计都被框架封装了,设计模式基本是用不到的?

代码风格上,业务代码里充斥着大量的if和else,是否这些逻辑计算应该用策略来代替

大量 for 遍历再处理的场景,是否可用visitor方式处理,比如cat里有大量的应用

架构重构

《软件设计重构》

每个阶段都有自己的业务目标

针对业务目标做容量评估,对组件做评估,看当前支撑的量是多少,找到其中的瓶颈点做架构升级。1.5倍到两倍的冗余

把握节奏,太早会影响需求的迭代速度,运维成本高,太晚会不足以支持单量

技术方案长期规划,逐步实施

持续重构,重构在每个阶段都要有人力

重构的目标

重构面临的问题

需要有人为重构负起责任,坚持到底,并承担后果

为什么要重构?

近期问题如:不能支持业务、故障、响应不满足需求、单点无法扩容

长期问题如:维护成本大、扩容成本大、有明显风险、不支持业务扩展

不重构的话,TOP3无法解决的问题

  1. 如果是平台系统,当初的设计却是为了其中一个业务研发的,功能都是定制化的

  2. 在不合理的逻辑上叠加需求

  3. 数据模型不能覆盖目前的需求

当不重构,一改就可能出问题时,按正常的理解:改出来问题是能力的问题,对业务没有很好的把控,对代码没有深入的研究

而实际上重构是因为”坏味道“使得架构和代码本身已经无法阐述它的行为

再通俗点说就是:现有架构和代码,与目前承担的事情不是一个东西

持续重构

何时重构?

添加功能时、修补错误时、复审代码时

假如交易系统,核心需要稳定。如果重构是维持稳定的必要条件,则需要一个重做级别的重构,需要大量的时间。需要保证重构和需求至少1:1的投入

重构的原则

1、测试优先

2、OCP原则

3、小步快跑,大布局、小迭代

避免过度设计,对于未来的变化,既不要考虑的太多,也不能一点都不考虑

代码满足当前需求,并留有可扩展余地

4.数据

分库分表(横向、纵向)

字段合并、冗余

索引优化、数据缓存

重构注意事项

对系统进行一个生命周期预估

隐性及显性需求

隐性需求,大家都觉得很不爽,但是又说不出个所以然

视力不同的人看到不同的世界,洞察力不同的人看到不同的需求

割接(新旧系统替换、迁移)实测演练

比如 交易系统重构的割接采用留壳抠瓤的方式,对外接口和暴露方式不变,内部逐渐灰度用重构后的新系统来替换