速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

如何在不破坏原代码的情况下重写旧系统

  • 2020-02-19
  • 本文字数:1889 字

    阅读完需:约 6 分钟

如何在不破坏原代码的情况下重写旧系统

不少工程师对旧项目和代码库谈之色变。但如果旧代码反复遭到黑客入侵,那就躲无可躲,必须提出有效的方案解决这个“不定时炸弹”。

选择重写:噩梦的开始

复杂繁多的应用程序往往牵一发动全身,当你想重做部分应用时,发现其他的应用程序也会受到影响。


更糟糕的是,当你更改代码前试图编写单元测试时,发现该代码最初并没有设计成可测试的代码。所以,在进行了种种挣扎和尝试后,你可能就会把这个应用程序冻结起来,再也不想碰它了…


那么,有没有一种办法既能更改无法维护的代码,又能使局面不那么糟糕呢?


我们知道,更改代码存在一定风险,而重构成本又太高。在这种情况下,从头开始重新编写代码看起来是个不错的主意。


按照这个思路,接下来会发生什么?


  1. 你在重写现有应用程序的同时,与管理层讨论一段时间内停用新功能。

  2. 重写一个包含现在应用程序功能的新程序大约耗时 6 个月。

  3. 几个月后,出现了一个令人讨厌的 bug,并且这个 bug 必须在旧代码中修复。因此,你又修补了旧代码和新代码。

  4. 再过几个月,公司将一些新功能交付给了客户。但新功能必须用旧代码才能实现,因为新版本尚未准备好。你不仅要再次返回到旧代码中,还要添加一个 TODO 以便这些新功能在新版本中实现。

  5. 转眼 5 个月过去了,你意识到项目可能要延迟,旧应用程序远比想象得要棘手。

  6. 7 个月过去了,你开始测试新版本,QA 质量检查发现了很多需要修复的问题。

  7. 9 个月后,公司再也受不了“不开发功能”。领导开始不满,你为此身心俱疲。你一边挣扎着更改旧代码,一边加快速度重写代码。

  8. 最终结果是,你做出了两个系统。摆脱旧代码还需要一段时间,因为新代码还没准备好。每个功能都需要在新系统和旧系统中实现两次。

最终,我选择扼杀

我现在的项目,就是在处理这个问题。我们内部有两个并行工作的系统:cart(旧系统)和 booking(新系统)。实际上,booking 应该替换掉 cart。


该项目始于三年前,但三年过去了,项目仍然未完成。


booking 总体上讲要优于 cart,但并不是说所有方面都比 cart 出色,一些购买流程会使用 booking,但仍有很多流程沿用 cart。


现在,由于新旧系统并行工作,所以新功能的实现时间是原来的两倍。有趣的是,由于最初的设计目的并不是为了支持我们想要的新功能,而是因为 booking 已经过时了,所以才会建议“适当重写 cart 系统。”


如果按照这个思路,接下来几个月,我们可能要让两个系统并行运行。显然,这不是个好办法,我还知道另外一种能有效解决系统问题的办法,就是“扼杀”。

如何“扼杀”旧代码库

方法很简单:逐步删除旧的代码库,使用新的代码库。


具体操作如下:


  • 让新代码充当旧代码的代理服务器(proxy)。用户使用新系统,新系统重定向到旧系统。

  • 在新代码库重新实现每步操作,这种操作在终端用户看来没有任何变化。

  • 通过让用户使用新功能来逐渐淡化旧代码。删除旧的、未使用的代码。

实际操作

来说说我们的系统,我们有一个用于处理付款的 cart模块



我们尝试重写,想法是创建一个新的、比 cart 更好的 booking 支付方式。但是这个项目没有 100%交付,因为重写工作耗费了太多时间,我们不得不在旧 cart 系统上开发新功能。


最终,我们还是创建了两个模块。



让我们再试一次,这次我们来“扼杀”cart 模块。与上一种方式不同的是,这次我们引入新 booking 模块作为代理服务器。



设置起来很容易。很快,我们可以在不重复付款处理逻辑的情况下将其交付生产。然后,逐步地,我们可以开始将付款逻辑迁移到新的 booking 模块。



在迁移逻辑时,我们摆脱了 cart 模块上未使用的代码。这个过程可能会需要一段时间,但我们正逐渐摒弃掉旧的、难以维护的 cart,开始应用新的、更好的 booking。


结束语

这样做最好的地方是可以解决重写期间无法交付新功能的问题。使用这种技术,无需复制代码,更无需实现两次新功能。另外,你需要尽快将新系统投入使用,更快地获得反馈,最大程度减少工作量并且降低把事情搞砸的风险。


最后,你可以有条不紊地进行重写,而无需将代码冻结 6 个月。尽管“扼杀”可能带有暴力色彩,但这种隐喻恰恰描述了慢慢摆脱旧系统的方法,与完全转换相比,这样做的风险较小。当旧代码实在难以使用时,这可能是迈向更好设计的第一步。


如果你在从事领域驱动设计(DDD),我建议你采用这种方法逐步淘汰旧系统。


你可以将旧系统视为黑匣子,创建一个 Bubble Context ,在其中应用部署 DDD 原理。Bubble Context 与旧系统进行交互。逐渐地,新功能将在不断增长的 Bubble context 中实现。同时,业务中用到旧系统的机会也越来越少,直到有一天,你可以彻底关闭旧系统。


原文链接:


https://understandlegacycode.com/blog/avoid-rewriting-a-legacy-system-from-scratch-by-strangling-it/


2020-02-19 13:324819

评论

发布
暂无评论
发现更多内容

2024-05-08:用go语言,给定一个由正整数组成的数组 nums, 找出数组中频率最高的元素, 然后计算该元素在数组中出现的总次数。 输入:nums = [1,2,2,3,1,4]。 输出:4。

福大大架构师每日一题

福大大架构师每日一题

当「软件研发」遇上 AI 大模型

阿里巴巴云原生

阿里云 云原生 通义灵码

掌握高阶定位技巧:Xpath神功解析!

测吧(北京)科技有限公司

测试

新一代智慧音视频平台,企业必备新基建

中关村科金

音视频 企业服务 大模型

理论+实践,带你了解分布式训练

华为云开发者联盟

机器学习 华为云 华为云开发者联盟 大语言模型 企业号2024年5月PK榜

一键自动化博客发布工具,用过的人都说好(oschina篇)

不在线第一只蜗牛

运维 自动化

程序员离不开的10款开发软件(必备)

伤感汤姆布利柏

Sermant在异地多活场景下的实践

EquatorCoco

数据库 异地多活

深入学习和理解Django模板层:构建动态页面

快乐非自愿限量之名

django 框架

TouchDesigner Pro for mac(可视化原型渲染设计)v2023.11760激活版

iMac小白

TouchDesigner下载 TouchDesigner激活版 TouchDesigner破解版

Apache RocketMQ ACL 2.0 全新升级

阿里巴巴云原生

阿里云 云原生 Apache RocketMQ

Invisor for Mac v3.24激活版 - 轻松管理您的Mac文件与文件夹

iMac小白

Invisor下载 Invisor for mac Invisor 破解版 Invisor激活版

程序员必备的8款工具软件,第5款简直绝了!

高端章鱼哥

Cheetah3D for mac(3D渲染建模软件)v8.1激活版

iMac小白

Cheetah3D注册机 Cheetah3D 8新功能 Cheetah3D8下载 Cheetah3D破解版

安全是最大的豪华!星纪元ET成功挑战31.9米空中坠落试验

Geek_2d6073

Analyzing Efficiency:QCN6224 vsQCN6274 WiFi7 chipset

wallyslilly

在 Postman 中设置和使用 Mock Server

Liam

程序员 前端 Postman Mock MockServer

当「软件研发」遇上 AI 大模型

阿里云云效

阿里云 云原生 通义灵码

开发欧冠体育赛事直播在线观看平台:时间与费用详解

软件开发-梦幻运营部

Navicat Premium for Mac(多连接数据库管理工具)v16.3.4中文激活版

iMac小白

Navicat Premium 中文版 Navicat Premium 16下载 Navicat Premium16破解版

Infuse for Mac - 影音播放新高度,轻松驾驭您的媒体库

iMac小白

Infuse 中文 Infuse播放器 Infuse 下载

CopyClip for Mac激活版 - 你的智能剪贴板管家

iMac小白

CopyClip下载 CopyClip激活版 CopyClip mac

星纪元ET首次上演空中“自由落体”,极致安全实力无惧硬核极限挑战

Geek_2d6073

天上掉下个“星纪元ET”!首次挑战空中坠落试验高调秀肌肉

Geek_2d6073

从代码到洞察:使用API接口深入分析商品详情数据

Noah

Mitti for Mac v2.8永久激活版:视频编辑新选择,简单而强大

iMac小白

Mitti下载 Mitti激活版 Mitti for mac

将“安全”进行到底!星纪元ET挑战TOP Safety空中坠落试验现场大公开

Geek_2d6073

单体到微服务架构的涅槃重生之路?

智在碧得

微服务 微服务架构 单体架构 单体项目 单体服务

芯盾时代IAM,三种权限管理模型按需选择

芯盾时代

权限管理 iam 统一身份认证 统一身份管理平台 最小权限管理

如何在不破坏原代码的情况下重写旧系统_文化 & 方法_Nicolas Carlo_InfoQ精选文章