Day955.到底是重构,还是重写? -遗留系统现代化实战

news2024/10/6 14:31:40

到底是重构,还是重写?

Hi,我是阿昌,今天学习记录的是关于到底是重构,还是重写?的内容。

到底是重构,还是重写?这是一个困扰着很多团队的问题。

重构吧,遗留系统积重难返,重构之路遥遥无期,三年、五年时间,可能也只是刚开了个头,还不如重写。

但重写就真的比重构好吗?遗留系统中最难获取的就是业务知识。

当问起一块业务时,得到的回答往往是:“没有文档”、“没人知道”或者“只能看代码”……没有业务,或者说没有需求,怎么可能构建出来一个新的系统呢?那到底应该如何应对呢?除了重构和重写,还有没有其他方式呢?


一、遗留系统现代化的五种策略

Gartner 在 19 年曾经有一篇报道,提出了遗留系统现代化的七种方案。把这七种方案做了整合,把它们整理成后面这五种策略。

它们各有各的特点,而且分别对应不同场景,要根据项目自身情况选择不同的策略或组合。

然后,再应用后面要讲的模式来落地。

1、Encapsulate

第一种策略是 Encapsulate,也就是将遗留系统中的数据或者功能封装成 API,供外部调用

在为什么要对遗留系统进行现代化?里提到过,遗留系统中蕴含着丰富的数据资产,但是因为技术和工具落后,导致它难以与新系统集成,这些数据被封印在遗漏系统中,成了数据孤岛。

比如早期的银行或民航软件,很多都是部署在大型机上的。企业非常希望开发手机 App,这样才能更好地为客户服务,但却很难访问到主机上的这些数据。同样地,遗留系统中还有一些功能十分重要,其他外部系统需要这些能力来构建业务。

比如一些公文流转的工作流,可能构建在基于 Lotus Notes 的办公系统中,但如果企业想要开发移动办公 App,并在 App 中复用这套工作流,也是困难重重。

问题虽然棘手,但事到临头,工程师们总要想办法应对。结合刚才说的情况,可以封装这些数据和功能,形成 API,供这些移动 App 或其他外部系统使用。

如果遗留系统本身就是基于 Web 的,可以在 Web 系统上直接构建 API;如果不是,可以选择构建一个全新的 Web API 来部署并提供服务。这样做的好处是,以较低的成本和风险,尽可能满足外部系统的需求。无需对遗留系统做较大的修改,只是增加一些 API 而已。

遗留系统本身不会被优化,但它可以通过这些 API 对外提供能力。还有一种情况,也建议你使用封装的策略,那就是当有一个第三方系统,希望扩展它的功能,但只能访问它的数据库,却无法修改代码的时候。这时有些团队采用的方式就是直接连它的数据库,并在已有的系统中基于这些数据构建新的功能。

不建议你这么做,直接连数据库固然简单,但由于可以访问它所有的表和列,距离混乱也就剩一步之遥了。

建议基于这个第三方系统的数据库构建一个 Web API,来向其他的系统提供你想提供的数据和功能,而不是暴露全部的数据。


2、Replatform

第二种策略是 Replatform,也就是替换运行时平台

这种策略不需要对代码大动干戈,只需要改动很小一部分。到了新的平台后,软件的功能和特性仍然保持不变。

比如,很多银行或民航软件还是基于 COBOL 的主机系统,把它们从大型机上迁移到 Linux 或 Windows 环境,就会甩掉昂贵的主机成本。

再比如,早年间开始构建的系统,由于种种原因,很多是基于商业软件的,想升级,就要花一大笔预算。很多企业为了节省这部分开支,会尽量避免升级,也导致系统最终变成了遗留系统。

可以通过 Replatform 策略来解除对商业软件的依赖,例如用 Tomcat 来替换 WebLogic。或者像.NET 这种技术栈,也十分有必要从.NET Framework 迁移到.NET Core 或者.NET 5。而 Python 从 2 升级到 3、JDK 的大版本升级等等,也都属于 Replatform。

在使用 Replatform 时,只需要对代码做少量更改,以适配新的平台。这样,只通过较小的成本就可以降低基础设施的成本,并提高性能。
还有一种迁移认为也可以看做是 Replatform,虽然它并不是替换运行时平台。

那就是迁移代码版本管理工具。比如你把代码从 SVN 迁移到 Git 中,不需要修改任何功能代码,但却可以享受新的代码管理平台带来的好处。


3、Rehost

第三种策略是 Rehost,也就是将应用程序或组件部署到其他基础设施中,如虚拟主机、容器或云。

这种策略完全不需要修改代码,而只需要迁移部署的环境,甚至都不需要重新编译,因此这种迁移方法也有个很形象的别名,叫做“lift and shift”,就是原封不动地拎起来,转移到别的地方去。

举个例子来说明,如果你的公司有一个 SAP 的 ERP 系统,可以将它从本地的数据中心迁移到 AWS 或 GCP 中。Rehost 可以让你在完全不修改已有系统的情况下,快速上云,体验云环境带来的弹性、安全性和高性能,并且迁移过程也能做到很平滑。

然而由于没有任何适配,也就无法充分利用云原生的优势,因此还需要对系统内部的代码和架构做进一步调整,比如将单体架构拆分为可以独立运维的微服务。


4、Refactor/Rearchitect

第四种策略是 Refactor 和 Rearchitect,它们是指在不改变系统外部行为的前提下,对代码或架构进行调整、优化,以偿还拖欠已久的技术债务、改善非功能需求、提升系统健康度

  • Refactor 主要是指代码级别的重构,比如你可能用 Sonar 等代码扫描工具,扫描出了很多代码坏味道、缺陷或隐患,修复这些问题的过程就属于 Refactor。这和我们平时说的代码重构基本上是一个意思。

  • Rearchitect 是指架构级别的重构,它包含两层意思。

    • 第一层比较好理解,就是指从单体架构到分布式架构的这种架构调整。
    • 第二层是指不改变部署单元之间的关系,而是对单个或多个部署单元内部进行模块化或分层重构。由于这种模块化和分层也会涉及很多代码的调整,所以这种 Rearchitect 往往会和 Refactor 同时进行。

5、Rebuild/Replace

第五种策略是 Rebuild 和 Replace,都是指对遗留系统进行替换。它们两个替换的范围和程度不同。

  • Rebuild 可能是对应用程序的某个组件或某个服务的重新设计或重写,但会保留其原有的业务范围和业务规则。

  • Replace指彻底淘汰应用程序的所有组件,去构建或购买新的软件,同时会考虑添加新的业务需求或移除某些旧的业务需求

在为什么要对遗留系统进行现代化?提到过,遗留系统中的业务知识是严重缺失的,不仅没有遗留下来的文档供我们查阅,也没有任何一个人能说清楚全部的业务细节。

在这样的基础上实施 Rebuild 或 Replace,风险和成本都是相当高的,但相对来说,收益也是最高的,一旦替换成功,就可以彻底摆脱原来的遗留系统了。


下图是对上面五种策略的一个总结,你可以从中看出它们的收益、风险和成本(用面积表示):

在这里插入图片描述


6、其他策略

除了上面的几种策略以外,对于遗留系统来说还有一些应对策略可以选择。

不过由于不涉及到代码、架构或运行环境的变更,没有把它们作为遗留系统现代化的策略。

  • 其中一种是 Retain,即保持系统当前的状态不做任何修改或更新

对于尚可满足使用的遗留系统来说,这无疑是风险和成本最低的策略。

在以假设驱动为指引说过,使用人数不多、需求很少、只需要一两个人维护的遗留系统,就可以使用这种策略。

  • 还有一种是 Retire,就是评估完工作量、使用情况和业务价值之后,选择完全停止使用的一种策略。有的时候系统已经没有什么人用了,或者类似的功能在其他系统中可以替代,就可以选择让这个旧系统彻底退休了。

二、你应该选择什么样的策略?

面对如此眼花缭乱的策略,恐怕更加无所适从了吧?

到底是 Replatform 还是 Rehost?是 Refactor 还是 Rebuild?是 Rearchitect 还是 Replace?

其实,还是要依据目标和系统现状做判断。先看最终目标,企业遗留系统现代化的四个目标,即业务敏捷、运营效率、客户洞见、系统韧性与弹性。

对于业务敏捷来说,Replatform 和 Rehost 通过替换运行时环境和上云可以提升部署频率,特别是 Rehost 可以显著提升系统在遇到故障时的恢复时间;

Refactor/Rearchitect 通过改善代码和架构的质量,可以缩短需求交付周期,减少线上问题数量;

Rebuild/Replace 由于在某种程度上做了替换,也可以大幅度提升业务的响应力和交付质量。

对于运营效率来说,Refactor/Rearchitect 和 Rebuild/Replace 都可以提升价值流效率。而要想改善客户洞见,最有效的方式还是 Rebuild/Replace。

在系统韧性与弹性方面,Rehost 显然是不二之选。我们要结合当前遗留系统的现状和想要提升的目标,做综合判断,对于不同的模块,也可以选择不同的策略组合,来实现一个完整的业务目标。比如遗留系统中的有些业务,需要提供 7x24 小时的高可用服务,类似银行转账、保险报案等模块。但这些模块很有可能还位于单体的“大泥球”中,和其他模块有着剪不断、理还乱的关系。为了支撑这些需求,可以先采用 Rearchitect 的模块化策略,结解耦模块之间的关系;

然后再用 Rearchitect 的服务化策略,将这些模块拆分成独立的服务;最后再用 Rehost 策略将这些服务部署到云上,以提升系统的可用性。

当然,如果由于系统耦合严重,模块化改造很难实施,也可以选择用 Rebuild 策略重写这一部分模块。再比如一个部署在 WAS v6 上的 Java Web 遗留系统,由于只支持 Java EE 1.4,技术栈严重落后,已经很难在市场上招到人来维护了。

这时,可以先选择 Replatform 策略,将 WAS 替换为较新版本的 Tomcat,以摆脱昂贵的商业软件;

然后再次使用 Replatform 升级 Java 的版本,包括所依赖的第三方工具,这样就完成了整个技术栈的升级。

如果企业认为当前遗留系统已经彻底无法满足业务的需要,且具备足够的资源来构建新的系统,就可以使用 Replace 策略来彻底替换旧系统。

同时,在遗留系统并不是很大,但重要性又相对很高的情况下,也可以考虑 Rebuild/Replace。

这里一直没有提 Encapsulate 这种策略,是因为它有自己独特的适用场景,也就是与其他外部系统集成的时候。


三、总结

遗留系统现代化的几种策略,不同的策略有不同的适用场景,总结到了一张表中。

在这里插入图片描述

要记住的是,一定要根据项目的情况来选择不同的策略组合。

不要上来就大张旗鼓地重构或重写,一定要弄清楚想要的是什么。

除了重构和重写,其实还有很多选择。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/461550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络模型入门及蠓虫分类问题简单实战

学习知识要实时简单回顾,我把学习的神经网络模型简单梳理一下,方便入门与复习。 神经网络模型 神经网络简介 人工神经网络是在现代神经科学的基础上提出和发展起来的,旨在反映人脑结构及功能的一种抽象数学模型。自 1943 年美国心理学家W.M…

【分段DP】ABC275 F

一万年没写DP了 这么简单的DP我居然没写出来 F - Erase Subarrays (atcoder.jp) 题意: 思路: 原本的思路是这样的: 看到3000的数据范围就是n^2的DP了 看到删子串,那么留下来的就是子序列,要使得剩下来的子序列的…

剑指Offer--05替换空格58左旋字符串

文章目录 一、剑指Offer--05.替换空格二、剑指Offer--58.左旋字符串 一、剑指Offer–05.替换空格 题目是这样的 意思是将字符串s中的空格替换为字符串"%20",如果只是替换一个字符还好,可以在原数组直接替换,但是是将空格替换为字符串&#xf…

Vue+Echarts 项目演练(下)收尾工作图表绘制

设置销售总量图表 中心容器地图设置 产品库存统计图 产品类别图表 项目可视化完结-整体展示 设置销售总量图表 在第一个容器中进行图表设置 <template><div><h2>A</h2><div class"chart" id"oneChart">容纳后期的图表…

shell编程规范与变量

shell脚本编程规范 shell脚本概述 将要执行的命令按顺序保存到一个文本文件给该文件可执行权限可结合各种Shell控制语句以完成更复杂的操作 Shell脚本应用场景 重复性操作交互性任务批量事务处理服务运行状态监控定时任务执行 什么是Shell 就是与内核沟通的界面、应用程序等…

[JAVA数据结构]顺序表ArrayList

目录 1.线性表 2.顺序表 3.ArrayList简介 4.ArrayList的使用 4.1ArrayList的构造方法 4.2ArrayList的常用操作 4.3ArrayList的遍历方法 4.4ArrayList的扩容机制 5.ArrayList的具体运用 ArrayList是一种基于数组的数据结构&#xff0c;是线性表的一种&#xff0c;也是…

[NLP]如何训练自己的大型语言模型

简介 大型语言模型&#xff0c;如OpenAI的GPT-4或谷歌的PaLM&#xff0c;已经在人工智能领域掀起了一场风暴。然而&#xff0c;大多数公司目前没有能力训练这些模型&#xff0c;而且完全依赖少数几家大型科技公司作为技术提供者。 在Replit&#xff0c;我们已经大量投资于所需…

linux-01-基础回顾-虚拟机安装linux(centos7)、linux常用命令

文章目录 Linux-Day01课程内容1. 前言1.1 什么是Linux1.2 为什么要学Linux1.3 学完Linux能干什么 2. Linux简介2.1 主流操作系统2.2 Linux发展历史2.3 Linux系统版本 3. Linux安装3.1 安装方式介绍3.2 安装VMware3.3 安装Linux3.4 网卡设置3.5 安装SSH连接工具3.5.1 SSH连接工具…

Neural ODE 神经常微分方程

Neural ODE ODE常微分方程 欧拉法求解&#xff1a;欧拉法求解过程是一个递归的过程&#xff0c;这个思想和牛顿法、梯度下降法是相似的。并且它将函数离散化&#xff0c;分割成一个个小段来求解。欧拉法求解的常微分方程的形式通常为 图片来自知乎Neural ODE&#xff0c;这个…

EventBus源码解析

文章目录 前言一、EventBus使用二、EventBus事件流程分析1.注册订阅者2.发布事件Event3.接收事件Event4.取消注册订阅者 三、发送粘性事件问答EventBus 以及它的优点EventBus原理 EventBus中设计模式为什么要使用 EventBus 来替代广播呢&#xff1f;说下 5 种线程模式的区别Eve…

进程、进程组、会话期

进程 在内核中&#xff0c;每个进程都使用一个不同的大于零的正整数来标识&#xff0c;称为进程号pid&#xff08;process ID&#xff09;。 进程组 一个进程可以通过 fork() 调用创建一个或多个子进程&#xff0c;这些进程就可以构成一个进程组。例如&#xff0c; liyongj…

UE4架构初识(四)

目录 UE4仿真引擎学习 一、架构基础 1. GameMode 2. GameState 3. GameSession UE4仿真引擎学习 一、架构基础 1. GameMode 即使最开放的游戏也拥有基础规则&#xff0c;而这些规则构成了 Game Mode。在最基础的层面上&#xff0c;这些规则包括&#xff1a; 出现的玩家和…

深度赋能产业数字化转型,蚂蚁集团数字化三件套亮相中国国际金融展

“十四五”规划纲要指出&#xff1a;加快推动数字产业化&#xff0c;推进产业数字化转型&#xff0c;实施“上云用数赋智”行动&#xff0c;推动数据赋能全产业链协同转型。明确提出了通过科技创新&#xff0c;加快产业数字化转型的要求。 4月25日&#xff0c;以“荟萃金融科技…

Flowable打印调用原生API查询接口的SQL日志

一.简介 建议在 Spring Boot 的 application.properties 中添加如下配置&#xff0c;开启 flowable 日志&#xff1a; logging.level.org.flowabledebug这个配置表示开启 flowable 的日志&#xff0c;开启日志的好处是可以看到底层的 SQL语句。 二.查询部署信息 例如查询流…

【python中的魔法方法有哪些?】

__init__(self, ...): 类的构造函数&#xff0c;用于创建一个类的实例并初始化它的属性。__str__(self): 返回对象的字符串表示形式&#xff0c;可以用于打印对象或者转化成字符串。__repr__(self): 返回对象的字符串表示形式&#xff0c;通常是用于开发者调试和查看对象信息。…

4.24~25(总结)

第一周任务 - Virtual Judge 分析&#xff1a;这道题开始想错了&#xff0c;所以错了一次。后来又仔细读了一遍题&#xff0c;才发现&#xff0c;要是最长的那个排序子数组&#xff0c;所以第二次就做出来了&#xff0c;它其实应该分为两大块&#xff0c;第一块找左边的起点&a…

HTTPS (HTTP+SSL) 对称/非对称加密 中间人攻击 证书加密

&#x1f496; 欢迎来阅读子豪的博客&#xff08;JavaEE篇 &#x1f934;&#xff09; &#x1f449; 有宝贵的意见或建议可以在留言区留言 &#x1f4bb; 欢迎 素质三连 点赞 关注 收藏 &#x1f9d1;‍&#x1f680;码云仓库&#xff1a;补集王子的代码仓库 不要偷走我小火…

“源擎”云原生分布式核心业务系统有什么产品优势?

“源擎”核心系统利用云原生、分布式、微服务技术&#xff0c;基于企业架构设计思想&#xff0c;构建了基础服务、业务服务、交易中心以及系列支撑组件&#xff0c;包含业务架构和多个微服务应用。 业务架构中&#xff0c;交易中心为银行提供了更灵活的选择&#xff0c;支持产…

出现Invalid bound statement (not found)问题的解决办法(已解决)

前言&#xff1a; 今天在写项目时出现了Invalid bound statement (not found):xxxx这个问题&#xff0c;网上找了很多博客都不行&#xff0c;最后修改了配置文件解决了问题&#xff0c;借此将此类问题常见的解决办法汇总一下。 话不多说&#xff0c;直接列出解决办法如下&…

linux-0.11 研究

前言 多阅读优秀代码&#xff0c;才能提高快速、深刻理解代码的能力。linux 内核源码无疑是最好的选择&#xff0c;不过当前 linux 内核版本为 6.3&#xff0c;代码量是相当庞大了&#xff0c;别说看完整个代码了&#xff0c;就算是看完一个子系统&#xff0c;都是不太现实的。…