趁热打铁

发布: (2026年2月24日 GMT+8 07:23)
14 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本(除代码块和 URL 之外),我将为您翻译成简体中文并保持原有的格式。

Source:

让遗留系统转型变得简单、快速且安全

大型机现代化项目常因开发成本不断攀升、交付日期不断推迟而失败。这些失败源于低估了复杂性,并在未为安全、高效的变更奠定基础之前就尝试进行大规模转型。

采用正确的策略和一些优秀的工具,现代化可以变得高效、有效且安全。

提议的三阶段方法

  1. 重写 – 将 COBOL 转换为可移植、经过单元测试的 Java。
  2. 重新平台化 – 将 Java 代码从 z/OS 迁移到云端。
  3. 重新架构 – 重构并重新塑造,以提升可维护性并实现新功能。

通过在严格限定的迭代中依次完成这些阶段,现代化可以在保持系统稳定性的同时稳步推进,实现技能和知识的逐步转移,避免系统规模和成本不断膨胀的陷阱。

为什么现代化项目会失败

遗留系统难以维护和测试。成功的关键在于在尝试转型之前先让软件更易于变更——换句话说,“只有在铁热了才下手”。

遗留 COBOL 应用的特征

  • 缺乏自动化安全网 – 没有单元测试库、CI/CD 流水线或冒烟测试套件来捕获意外后果。
  • 高度耦合的单体结构 – 大多数组件是多用途的,使得隔离或抽取极其困难。
  • 零容错 – 它们处理生死攸关的事务(医疗保险、社会保障、失业救济等)。
  • 硬件高效设计 – 经过数十年针对 IBM 硬件的优化,几乎没有性能余量容纳低效的改动。
  • 持续的监管变动 – 没有用于重大转型的“冻结期”。

当这些挑战共存时,缺乏相关经验的开发团队很容易低估改造遗留系统的难度。

现代化团队的常见误解

  • 假设瀑布模型是唯一的障碍 – 认为 Scrum 可以立即采用,而不解决更深层的架构问题。
  • 将遗留设计视为偶然 – 把系统架构当作“开发者当时不懂更好方案”的遗物。
  • 使用考古隐喻 – 将发现过程描述为“挖掘文物”,却忽视了日常维护系统的人员的专业知识。

有才华且能力出众的工程师往往在现代技术栈上表现出色,但他们很快会陷入意想不到的约束以及与遗留系统的过度集成之中。他们的 Scrum 会议沦为仅仅展示透明度的机制,而非真正推动敏捷开发的助力。

他们拉动的每一根线似乎都可能使整件毛衣解体。每一个设定的目标或截止日期在面对后期才发现的约束时,都显得软弱或后退。

当团队在冲刺期间花时间在低层技术细节上,仅仅是为了填补演示环节时,项目经理应敲响警钟,提出关于投资回报的严肃问题。

思考实验

忘掉主机一会儿。想象你继承了一个庞大的软件系统——数百万行代码——并且在接下来的二十年里它完全由你负责。

  1. 第一个变更请求 到来:修改处理规则,扩展数据模型,调整审计/报告子系统。
  2. 你深入代码,发现一个 单块式鲁布·戈德堡机器没有测试
  3. 调整一个在许多地方出现的神秘标志会让你脊背发凉,因为你无法预测副作用。

如果你和大多数工程师一样,你的本能是 在动手之前先写测试——你知道意外的副作用可能会转移数百万救命美元。如果这与你的感受相符,下面的建议应该会显得合情合理。

关键要点

成功地现代化复杂的遗留系统 需要奠定基础,以安全地进行变革性更改。三阶段方法(Rewrite → Replatform → Rearchitect)提供了一条结构化的路径,在控制风险、范围和成本的同时实现该目标。

第1阶段 – 重写 → 可移植、已测试的 Java

目标:将 COBOL 程序转换为可移植、经过充分测试的 Java 代码。

注意:这 不是 市场上充斥的低质量 “JOBOL” 转译器。借助现代 LLM,我们可以获得更好的结果。

我们的做法

  • 函数和接口等价 的 Java 实现替换每个 COBOL 程序。
  • 引入 平台抽象层,使所有平台特定代码都位于定义良好的接口之后。
  • 编写 单元测试,验证功能等价性,并作为并行生产测试的安全网。

为什么重要

关键收益说明
测试覆盖率单元测试覆盖率显著加快变更验证,使快速、安全的部署成为可能。
可移植性抽象层使相同的代码和测试能够在任何平台(本地工作站、z/OS 或云)上运行。迁移离开主机时无需重写业务规则。
通过并行测试确保安全相同的函数和接口使您能够将新的 Java 组件与旧的 COBOL 版本并行运行,在进入生产环境前捕获回归问题。

实用技巧

  • 逐程序 重写可保持双重维护成本低,并实现快速重新集成。
  • 将此指导视为 框架 而非硬性规定——根据接口边界和 LLM 驱动的生产力调整工作粒度。
  • 专注于 稳定接口,在实现平台抽象的同时,可在并行测试中进行验证。

第 2 阶段 – 迁移 → 云基础设施

目标:将已测试、可移植的 Java 代码从 z/OS 迁移到云环境。

“云迁移”听起来像是最终的终点线,但它带来的权衡必须谨慎评估。

云的优势

  • 按需付费 硬件资源 → 灵活的成本模型。
  • 内置冗余 跨多个数据中心 → 提升灾难恢复能力。
  • 独立的 CI/CD 流水线 → 更容易部署,且不会干扰主机系统的发布周期。
  • 访问 庞大的市场,提供开发者生产力、分析和监控工具。

需要预见的挑战

挑战影响
复杂性将应用拆分到多个平台会使理解和故障排查更加困难。
延迟用约 50 ms 的 API 调用取代亚毫秒级的本地调用,可能在大规模时威胁批处理周期的时序。
成本新的云资源需要费用,且不会立即抵消本地支出;同时还需要具备云原生技能的工程师。

迁移建议

  1. 从小开始 – 仅迁移 规模相当大且自包含的功能组件,这些组件具有明确的数据边界。
  2. 评估数据本地性 – 确保组件能够容忍网络延迟带来的任何运行时性能下降。
  3. 限制跨平台胶水 – 最小化临时集成层;每增加一层都会带来成本、拖累和风险。
  4. 保持简洁 – 让现代化系统保持精简,以保留速度并降低维护开销。

Source:

第三阶段 – 重塑 → 可维护性与新功能

目标:重构或重新架构系统以提升可维护性 开始交付新功能。

现在应用已经:

  • 更易于更改(得益于现代化的测试)。
  • 更易于部署(得益于 CI/CD 流水线)。

团队可以安全地进行更深层次的转型。

前进的两条路径

路径适用情形
可维护性优先在添加新功能之前,你希望继续提升可测试性、模块化以及整体代码健康。
功能优先你有一批用户体验改进或业务关键功能的待办事项,现在可以安全交付。

为什么可行

  • 重写阶段 有意避免了大幅度的重新设计,使代码库保持稳定且经过充分测试。
  • 有了这层安全网,重构(例如,抽取服务、引入领域驱动设计)或 重新架构(例如,迁移到微服务)就变得低风险。

最后思考

大型机遗留应用程序是 庞大、复杂且关键任务 的。它们的功能和结构已经演变为紧密耦合的多用途组件。

在你完全了解系统并建立安全网 之前 尝试全面转型是灾难的配方——每一步都像踩到耙子一样。

“趁热打铁。”
利用三阶段方法的动能,但要有计划地推进,以测试和并行执行作为护栏。

策略建议

在尝试对系统进行根本性改造之前,先投入时间让系统更易于变更 之前

  • 重写 COBOL 为可移植、单元测试的 Java,同时保持功能和接口等价,
    • 防止范围蔓延,
    • 实现并行生产测试,且
    • 是实现软件可塑性的最高效路径。

这一步关键的第一步——从 COBOL 转向更高效的语言——可以是:

  • 最容易的步骤,如果你专注于此,
  • 如果你忽视这些遗留系统的根本挑战,则会成为持续的负担,最终决定是 沉浮

本文未涉及的主题

  • 数据现代化
  • 接口现代化
  • 支持 COBOL/Java 集成的软件工具(帮助您快速上手)
  • 项目规划、管理和成功指标

如果有足够的兴趣,我可能会写这些主题的文章。我始终乐于与任何感兴趣的人讨论这些以及更多内容。

联系我们

如果您对这套策略感兴趣,并希望在您的具体项目中得到帮助,我很乐意协助。

关于作者

Sam Wiley – 软件工程师兼 Boring Technology 倡导者,专注于大型机现代化。

  • 现代化团队的首席开发者,利用 IBM Redbooks 中的知识构建新功能。
  • 为每年处理 数十亿美元 的软件成功交付了生产环境的现代化部署。
  • 技术顾问,协调跨学科团队的现代化工作,规划并监督众多项目。
  • 强调务实、降低风险和成本的转型策略,在技术创新与运营稳定之间取得平衡。
0 浏览
Back to Blog

相关文章

阅读更多 »

理解 importmap-rails

介绍 如果你使用过现代 JavaScript,你会熟悉 ES 模块和 import 语句。Rails 应用可以使用 esbuild、vite 或 bun 来实现这些功能……

你只需要 Postgres

封面图片:You just need Postgres https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads...