15 架构重构

“架构设计三原则”中的演化原则,提到了系统的架构是不断演化的,少部分架构演化可能需要推倒重来进行重写,但绝大部分的架构演化都是通过架构重构来实现的。相比全新的架构设计来说,架构重构对架构师的要求更高,主要体现在:

  1. 业务已经上线,不能停下来:既需要尽量保证业务继续往前发展,又要完成架构调整
  2. 关联方众多,牵一发动全身:尽量减少对关联方的影响,或者协调关联方统一行动,是一项很大的挑战
  3. 旧架构的约束:需要在旧的架构基础上进行,这是一个很强的约束,会限制技术选择范围

即使推倒重来,完全抛弃旧的架构而去设计新的架构,新架构也会受到旧架构的约束和影响,因为业务在旧架构上产生的数据是不能推倒重来的,新架构必须考虑如何将旧架构产生的数据转换过来。

架构重构对架构师的综合能力要求非常高:

  • 业务上需要架构师能够说服产品经理暂缓甚至暂停业务来进行架构重构;
  • 团队上需要架构师能够与其他团队达成一致的架构重构计划和步骤;
  • 技术上需要架构师给出让技术团队认可的架构重构方案。

0.1. 有的放矢

通常情况下,当系统架构不满足业务的发展时,其表现形式是系统不断出现各种问题:

  • 轻微的如系统响应慢、数据错误、某些用户访问失败等,
  • 严重的可能是宕机、数据库瘫痪、数据丢失等,
  • 或者系统的开发效率很低。

期望通过架构重构来解决所有问题当然是不现实的,所以首要任务是从一大堆纷繁复杂的问题中识别出真正要通过架构重构来解决的问题,集中力量快速解决,而不是想着通过架构重构来解决所有的问题

需要透过问题表象看到问题本质,找出真正需要通过架构重构解决的核心问题,从而做到有的放矢,既不会耗费大量的人力和时间投入,又能够解决核心问题。

一个简单的做法判断到底是采取架构重构还是采取系统优化:假设现在需要从 0 开始设计当前系统,新架构和老架构是否类似?如果差异不大,说明采取系统优化即可;如果差异很大,那可能就要进行系统重构了。

0.2. 合纵连横

0.2.1. 合纵

架构重构是大动作,持续时间长,且会占用一定的研发资源(包括,开发和测试),因此不可避免地会影响业务功能的开发。因此,要想真正推动一个架构重构项目启动,需要花费大量的精力进行游说和沟通,要和利益相关方沟通好,让大家对于重构能够达成一致共识,避免重构过程中不必要的反复和争执。

在沟通时经常遇到的一个问题是凭感觉而不是凭数据说话所以在沟通协调时,将技术语言转换为通俗语言,以事实说话,以数据说话,是沟通的关键

0.2.2. 连横

除了和上下游沟通协调,有的重构还需要和其他相关或者配合的系统的沟通协调。由于大家都是做技术的,有比较多的共同语言,所以这部分的沟通协调其实相对来说要容易一些,但也不是说想推动就能推动的,主要的阻力来自“这对我有什么好处”和“这部分我这边现在不急”。

有效推动的策略是“换位思考、合作双赢、关注长期”。就是站在对方的角度思考,重构对他有什么好处,能够帮他解决什么问题,带来什么收益。

如果真的出现了对公司或者部门有利,对某个小组不利的情况,那可能需要协调更高层级的管理者才能够推动,平级推动是比较难的。

因为大部分重构的系统并不是到了火烧眉毛非常紧急的时候才开始启动的,而是有一定前瞻性的规划,采取等待的策略也未尝不可,但要明确正式启动的时间。

除了计划上灵活一点,方案上也可以灵活一点:可以先不做这个系统相关的重构,先把其他需要重构的做完。因为大部分需要重构的系统,需要做的事情很多,分阶段处理,在风险规避、计划安排等方面更加灵活可控。

0.3. 运筹帷幄

  1. 区分问题的优先级:集中有限资源去解决最重要或者最关键的问题
  2. 将问题分类:相似问题统筹考虑
  3. 不能迫于业务压力,专门挑容易做的实施:到了稍微难一点的问题时,因为复杂度和投入等原因被搁置,达不到重构的真正目的

集中有限的资源,某个阶段集中解决某一类问题。

  1. 首先这样做效率高,因为阶段目标比较明确,做决策和方案的时候无须进行太多选择;
  2. 其次每个阶段都能看到明显的成果,给团队很大的信心。比如说第一阶段做完后,系统很少有因为机器过载、缓存响应慢、虚拟机挂死等问题导致的故障;完成第二阶段的事项后,因为组件、外部系统故障导致系统故障的问题也很少了。
  3. 完成前两个阶段后,可以安心地做第三阶段的“服务化”工作了。

总结一下重构的做法,其实就是“分段实施”,将要解决的问题根据优先级、重要性、实施难度等划分为不同的阶段,每个阶段聚焦于一个整体的目标,集中精力和资源解决一类问题。这样做有几个好处:

  • 每个阶段都有明确目标,做完之后效果明显,团队信心足,后续推进更加容易。
  • 每个阶段的工作量不会太大,可以和业务并行。
  • 每个阶段的改动不会太大,降低了总体风险。

具体如何制定“分段实施”的策略呢?

  1. 优先级排序:将明显且又比较紧急的事项优先落地,解决目前遇到的主要问题。
  2. 问题分类:将问题按照性质分类,每个阶段集中解决一类问题。
  3. 先易后难:
    1. 首先,一开始就做最难的部分,会发现想要解决这个最难的问题,要先解决其他容易的问题。
    2. 其次,最难的问题解决起来耗时都比较长,占用资源比较多,如果一开始做最难的,可能做了一两个月还没有什么进展和成果,会影响相关人员对项目的评价和看法,也可能影响团队士气。
    3. 第三,刚开始的分析并不一定全面,所以一开始对最难的或者最关键的事项的判断可能会出错。
  4. 采取“先易后难”的策略,能够很大程度上避免“先难后易”策略的问题。
    1. 首先,随着项目的推进,一些相对简单的问题逐渐解决,会发现原来看起来很难的问题已经不那么难了,甚至有的问题可能都消失了。
    2. 其次,先易后难能够比较快地看到成果,虽然成果可能不大,但至少能看到一些成效了,对后续的项目推进和提升团队士气有很大好处。
    3. 第三,随着项目的进行,原来遗漏的一些点,或者分析和判断错误的点,会逐渐显示出来,及时根据实际情况进行调整,能够有效地保证整个重构的效果。
  5. 循序渐进:按照前 3 个步骤划分了架构重构的实施阶段后,就需要评估每个阶段所需要耗费的时间,很可能会出现有的阶段耗时可能只要 1 个月,而有的却需要 6 个月,虽然这可能确实是客观事实,但通常情况下,按照固定的步骤和节奏,更有利于项目推进。

每个阶段最少 1 个月,最长不要超过 3 个月,如果评估超过 3 个月的,那就再拆分为更多阶段。先划分了阶段,每个阶段又分了任务子集,当任务子集比较小的时候,多个任务子集可以并行;当任务子集比较大的时候,就当成一个独立的里程碑推进。

上次修改: 10 June 2020