遗留系统现代化实战
姚琪琳
Thoughtworks 资深咨询师
5615 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
用户故事 (1讲)
遗留系统现代化实战
15
15
1.0x
00:00/00:00
登录|注册

06 | 以增量演进为手段:为什么历时一年的改造到头来是一场空?

你好,我是姚琪琳。
今天我们来聊聊遗留系统现代化中的 HOW,也就是第三个原则,以增量演进为手段。
很多团队在一阵大张旗鼓的遗留系统改造后,终于迎来了最终的“梭哈”时刻。尽管事先可能在各种测试环境测过无数遍了,但上线生产环境仍然如履薄冰。
和遗留系统项目“相爱相杀”十几年,我可以肯定地告诉你,这种一次性交付的大规模遗留系统改造,几乎不可能一上线就成功,必然会有各种或大或小的问题,甚至导致不得不全量回滚,交付日期一拖再拖。哪怕你的“战前准备”历时一年,甚至更久,到头还是一地鸡毛。
你可能会有疑问,你见过很多大厂的案例,都是一次性上线的。没错,的确是这样,但大厂之所以有勇气这么做,是因为他们有很强的人力、物力支撑,客观条件允许这么做。对于资源有限的小公司、小项目,还是应该衡量一下改造的难度和运维的能力,以控制风险为主。
怎么控制风险呢?我的答案是增量演进。这节课,我带你把这个概念搞通透,顺便演示下代码和架构的增量演进怎么做。

什么是增量演进?

什么是增量?什么又是演进呢?这要从演进式架构开始说起。
我在北美的同事 Neal Ford 和 Rebecca Parsons,在《演进式架构》这本书中给演进式架构下了精准的定义:支持跨多个维度的引导性增量变更的架构
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

遗留系统现代化改造中的增量演进方法是一篇介绍了在软件系统演进过程中如何应用增量演进的技术文章。作者首先阐述了增量演进的概念及其在代码和架构两个维度上的应用。在代码的增量演进中,作者以代码重构为例,介绍了如何通过复制代码、引入开关等方式实现无测试的安全重构,并完成增量交付。在架构的增量演进中,作者提出了绞杀植物模式,即新建一个系统,让它与旧系统并存且缓慢增长,直到某一天完全取代旧的系统。文章详细介绍了使用绞杀植物模式进行架构演进的四个步骤,并强调了增量演进原则的重要性。作者指出,增量演进的思想不仅适用于遗留系统现代化,也适用于平时的设计工作,强调了持续验证和细粒度的回退机制的重要性。整体而言,本文通过具体的案例和实际操作步骤,为读者提供了一种在遗留系统现代化改造中实现增量演进的方法,有助于读者更好地理解和应用增量演进的概念。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《遗留系统现代化实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • hk
    姚老师你好,我想问下,如果重构涉及到数据库表的改造,比如直接用新表,旧表不用了,也可以按并行运行和绞杀植物模式去处理吗?按个人理解,当然理解浅薄,数据库相对于代码和架构,应该是最难的,还牵涉到老数据的问题。所以想请教下老师在这块有什么经验和方法可以更换的处理数据库演进这块?谢谢

    作者回复: 应该是必须“按并行运行和绞杀植物模式去处理”,否则风险太大。 如果要绞杀一个表,可以: 1. 先建立新表,将旧表数据迁移到新表中,这时新表没人用,所以是安全的 2. 在读取时,通过开关控制读取新旧表,可以进行对比测试 3. 在写入时,新旧表双写 这样在并行运行一段时间后,你就有信心用新表替换旧表了。

    2022-11-17归属地:河北
    3
  • 刘大明
    试着回答一下第二个问题。 在无测试的情况下重构,我首先想到的第一步,就是通过ide的快捷键直接调用重构的一些操作。在不济,就参考<重构>一书里面的一些操作手法,也可以保障重构的有效性。 上家公司每次重构或者上线一个新功能都喜欢加开关,来手动的去做开关导流,但是确有个坏毛病,旧的代码也不清理,这样就导致,代码里面充斥着各种开关判断。 问题1.关于开关的管理,老师有什么好的经验吗?或者好用的开源软件来去管理,每次开关多达几十个,可能到了后面,很多开关都不知道是什么意思。 问题2.关于导流,老师有什么好的经验吗?上家公司都是我早上上班之后,手动的开启开关,当客户反馈新功能报错或者不好用的时候,在手动的关闭开关,有没有什么好办法,只切部分流量到新功能这种。

    作者回复: 感谢分享。 对于作业第二题,其实我想问的是,除了课中给出的方案外,还有没有其他方案,你可以再思考一下。 对于你的问题,你其实缺少的是一个特性开关管理和A/B测试工具,很多开源工具其实是两者结合的。我推荐几个,你可以调研一下看哪个适合。包括: - ConfigCat(configcat.com/) - Flagger(flagger.app) - Flagr(github.com/checkr/flagr)

    2022-04-22
    2
  • Geek_d8e0b2
    目前重构的项目基本上表结构都变化了怎么去做开关呢,非常难受

    作者回复: 如果表结构都变了,加开关就很难了,需要两套schema以及数据备份。其实我课程中一直强调一点,就是一次只做一件事,数据拆分和数据库重新设计不要同时进行。

    2022-07-09
    1
  • aoe
    目前正在做一个关于分布式事务最终一致性的重构,开始前的方案有两个: 1、业务开始前生成一个 traceId,将它保存在所有步骤中(工作量太大,放弃) 2、优先解决出问题最多的服务,提升事务的可靠性 - 可行,采用;就按老师说的来:建立开关、增量迁移、并行运行、代码清理 - 因为刚在02课学习了遗留系统现代化的三个原则—2. 以价值驱动为指引 - 完成这个功能带来的收益最大

    作者回复: 感谢分享。 不知道你说的第1个方案是不是指给请求加correlation id,如果是的话,可以考虑开发一个库,从切面层在request head里加,后续的转发请求也都在head里加上同样的id,方便跟踪。

    2022-04-22
    2
    1
  • Geek_70dc13
    问题三有点抽象.新薪酬服务在对接一遍通知服务(毕竟最终也是要的)另外新薪酬服务只替换了部分功能,也不妨碍通知功能..没太理解

    作者回复: 薪酬服务完全拆分出去了,因此对于遗留系统通知模块的依赖,需要替换成API调用

    2022-07-22归属地:河北
  • Geek_6a6d13
    文中在如何实现绞杀植物模式的第三步说,"并行运行和绞杀植物模式一样,也是一种常用的架构现代化模式",可以理解成并行运行既是绞杀模式包含的一部分,同时也可以单独出来成为一种模式,是吗?

    作者回复: 绞杀植物、抽象分支、扩张收缩、并行运行,这些模式都有相似之处,但是关注点不同,所以名字不一样。绞杀植物主要关注的是长期共存然后替换;抽象分支关注建立抽象层,再逐个替换;扩张收缩关注的是先建新接口,再删除旧接口;并行运行关注的是同时运行,A/B测试加以验证。

    2022-05-13
  • 子夜枯灯
    现在在做的项目重构功能最大一个难处,在于简历测试机制。一个持续开始四五年的项目完全没有单元测试及自动化测试,全靠人力测试。在于验证重构质量上面,老师有哪些推荐的开源工具或者思路提供么?谢谢

    作者回复: 可以用SonarQube扫描代码,逐个缺陷去修复,修复之后再扫描代码,对比缺陷数量。 重构主要的思路就是坏味道驱动,重构后的代码没有明显的坏味道就可以了。希望对你有帮助。

    2022-05-10
  • killer
    细粒度的每个功能点一个开关,有可能是一个mq的监听方法,或者某个方法级别的,我们要自己开发这种开关工具吗?有没有现成的解决方案

    作者回复: 开关工具其实很简单,读配置或数据库就可以了,完全可以自己写。现成的工具也是有的,ConfigCat、Flagr、Flagger等,但并不一定适配你的场景了。

    2022-04-22
  • 公号-技术夜未眠
    干货满满,看得出来老师实战经验很丰富
    2022-04-22
    1
  • 伊诺
    最新公司,迭代老系统; 网关采用三种模式 1、只发老核心; 2、只发新核心; 3、新老并行发,通过响应比对新老接口 字段差异;
    2023-11-30归属地:重庆
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部