当前位置: 首页 > 科技观察

又一个外卖故事:征服遗留系统

时间:2023-03-16 18:37:32 科技观察

背景如小强在第一个故事开头介绍的那样。今天,我们交付的典型软件已经成为由多个云原生应用程序组成的分布。但是,在我们服务的组织中,仍然存在像下面这样的庞大的旧单体应用程序,我们称之为遗留系统。一些遗留系统在组织中仍然发挥着重要作用,持续为客户提供价值,而一些已经成为组织发展的瓶颈,无法适应快速的业务变化。这个故事是关于我们如何帮助客户有效地维护、升级并最终摆脱这些遗留系统。说到遗留系统,我们并不陌生,也不乏案例。过去的大型项目为我们提供了很多值得分享的经典案例,从这些经验和总结中我们可以感受到这些项目所克服的挑战。这些挑战来自:如何有效积累遗留系统的上下文如何维护和变更遗留系统如何顺利完成遗留系统的技术迁移积累上下文万事开头难,当我们开始任何交付工作时,最后一个关键问题是如何快速建立业务和技术上下文。当我们开始接管遗留系统时,这个关键问题变得更加复杂和困难。遗留系统的上下文就像一个未完成的拼图,碎片散落在各处。有些信息只存在于某些人的脑海深处,有些信息则存在于庞大陈旧的文件中,真假难辨。代码不会说谎,但数百万行代码很容易让你迷失方向。在处理这个问题上,我们从以往的经验中形成了一套行之有效的方法。首先通过与客户团队的业务或技术人员沟通和询问,了解尽可能多的信息,然后通过阅读文档或在可用的环境中进行演示,得到更具体的理解,最后通过阅读代码解决剩下的疑惑,完成一个一块巨大的拼图。但实际操作起来还是不简单。这种情况经常发生。经过多次沟通和查阅文档中的信息,得到的信息往往与代码中的信息不对应,需要不断重复整个过程。我在去年经历的一个遗留系统改造项目中也有类似的经历,团队被令人沮丧的过程弄得不知所措,根据他们掌握的信息做出假设,最终在某种程度上损害了项目的交付。为了保证项目的顺利交付,团队付出了巨大的代价。获取上下文后,如何保持信息及时更新,并有效地与团队其他成员共享信息,是接下来需要考虑的问题。SpecificationbyExample为我们提供了一种有效管理所有信息并构建一组与代码一起管理的可执行LiveDocuments的好方法。但是对于遗留系统来说,这仍然是一个漫长而繁琐的过程。在信息收集和记录的整个过程中,团队需要表现出极强的耐心,才能有效地达成目标,为后续工作打下基础。进行变更对于一些遗留系统,我们只需要对其进行持续监控,确保其能够正常提供服务即可。但在大多数情况下,随着客户业务的不断变化,也将需要更改遗留系统以迎合这些业务变化。那么如何在不破坏遗留系统的情况下对遗留系统进行修改,就成为处理遗留系统的第二个挑战。使用我们提倡和坚持的一系列敏捷技术实践,可以为遗留系统的变更提供良好的保护网。在修改遗留系统之前,通过一定的单元测试覆盖率,加上我们之前建立的LiveDocument,可以为我们提供很好的质量保证。通过为遗留系统建立CI/CD流水线,我们可以在修改遗留系统时快速得到反馈,及时验证变更。通过创建Stubs来Mock遗留系统的外部依赖,可以帮助我们有效地缩短反馈循环,这可以大大增强我们对遗留系统进行更改的信心。这些实践看起来与我们交付的其他项目相同,但是当您需要为用旧语言编写的遗留系统提供单元测试覆盖时,当您的CI管道需要支持旧的商业中间件时看似平凡的技术实践可能会变得充满困难自动化部署时。在这个时候,坚持这些实践作为原则变得更加重要。只有这样,才能对遗留系统的变更提供有效的保护。当然,单靠耐心和原则是无法征服拥有数百万行代码的庞然大物的。处理遗留系统需要更多技巧。对此,我的ThoughtWorks同事从以往的项目经验中总结分享了很多处理遗留系统的技巧。尤其是在遗留系统的技术迁移过程中。例如:影响结构图和特征草图的使用,帮助我们理清程序中模块之间的关系和依赖关系。BranchByAbstraction的使用使我们能够逐步替换更新和消除系统的剩余部分。StranglerPattern的使用可以让新旧系统在一定时间内共存,使得遗留系统能够平滑地迁移到新的技术架构上。FeatureToggle的使用使得我们在部署后发现异常时可以快速切换回旧系统,将迁移风险降到最低。根据遗留系统的数据特点,建立自定义数据管道,完成遗留系统数据的迁移。正是这些技巧的灵活运用,才使我们真正做到了“旧不变,新创,一步切换,旧辞别”。写在***遗留问题是一个难题,在处理庞大的遗留系统时没有捷径、妙方或令人眼花缭乱的黑科技。重要的是,团队需要意识到,在面对遗留系统时,我们需要有:更强的耐心——在遗留系统漫长的开发过程中,有效地收集和巩固丢失的上下文。更坚定的原则——坚持敏捷的技术实践,为遗留系统编织一张可靠的保护网,为遗留系统的变更提供保障。更丰富的技能——尽量减少遗留系统技术迁移过程中对现有业务的影响,逐步顺利完成遗留系统的迁移。【本文为专栏作者“ThoughtWorks”原创稿件,微信公众号:Thinkworker,转载请联系原作者】点此查看该作者更多好文