InfoQ|接手了严重过时的软件,到底是该逐步重构还是摧毁重写呢?


有一个应用程序充斥着技术债 , 严重的过时了 , 或者只是对用户服务不足 , 因此 , 我们需要了解我们的最佳选择是什么——是继续艰难地探索并逐步进行重构更有意义 , 还是把它全部摧毁并从头开始重写更有意义呢?这就是我们将在本文中探讨的基本难题 。 所以让我们开始吧…...
但是没有那么快!在我们进一步研究之前 , 需要解决一个大家“避而不谈”的问题 , 即:对于任何需要改进的遗留应用程序 , 下一步要做什么并不是一个这样或那样就可以了的简单决定 。 我们通常会将我们的选项框定为重写或重构 , 但这些术语 , 正如我们将要看到的那样 , 实际上只是摆在我们面前的一系列选项的替代品 。
InfoQ|接手了严重过时的软件,到底是该逐步重构还是摧毁重写呢?
本文插图
通过重构 , 在现代化遗留应用程序的场景中 , 通常意味着我们将会保持应用程序基本不变 , 但会进行一些微小的内部改进以解决特定的问题(如可维护性、可扩展性等) 。 另一方面 , 通过重写 , 则意味着我们打算“从头开始” , 或者换句话说 , 进行重大的变更 。
但这只会引出下一个问题!较小变更(Minor)和重大变更(Major)到底是什么意思?如果我们打算将前端框架从 AngularJS 升级为 React , 但保留后端服务不变 , 这是重构还是重写呢?或者 , 如果我们想要将一个单体应用拆分成三个不同的微服务 , 但只是复制粘贴业务逻辑到新的版本控制存储库中 , 那这是重写、重构还是其他什么呢?我们真的在乎吗?给我们的努力贴上标签真的很重要吗?
【InfoQ|接手了严重过时的软件,到底是该逐步重构还是摧毁重写呢?】是的 , 确实是 。 虽然我们的工作是构建可运行的软件 , 而不是对语义进行哲学思考 , 但我们使用的词汇确实会产生影响 。 当我们提议走重写或重构的道路时 , 业务和技术涉众应该能够准确地理解我们的意思 , 以及需要付出什么样的努力 。 换句话说 , 我们措辞的精确性将有助于我们更好地设定预期 。 此外 , 当我们穿过一些概念上的迷雾并找到更清晰的定义时 , 也会让我们对这个决定有一个更细致的看法 , 并能使我们脱离狭隘的重写或重构框架 。
所以 , 就像任何一次长途旅行一样 , 在我们跳上车出发之前 , 让我们花点时间整理行李 。 我们不想出现在海滩上才发现自己忘了带泳衣 。
1功能改进 一个好的起点是定义重写和重构不是什么 , 它们是改进应用程序功能的策略 。 这种类型的工作 , 无论是修复缺陷 , 交付新特性 , 还是清理用户界面 , 我们都可以称之为增强 。 它是关于改进应用程序为用户所做的事情的 , 正如我们稍后将看到的那样 , 它是正常的开发状态 。
InfoQ|接手了严重过时的软件,到底是该逐步重构还是摧毁重写呢?
本文插图
但在某些情况下 , 功能增强的范围可能相当大 。 例如 , 企业可能想要确定某应用程序是为正确的用户群提供服务的 , 但所有的功能都需要彻底检查 。 这种情况也可能被称为重写 , 但是在这里我们要做一个区分 。 因为这种类型的工作需要构建所有新的功能 , 所以它与新建项目基本上没有区别 。 当需要定义新的功能需求时 , 从零开始开发一个独立的系统 , 并且不能继承原逻辑或代码 , 我们会将其视为新开发的应用程序 , 而不是重写 。
2重构是什么 向应用程序添加功能并不是本文的重点 。 我们的场景是:应用程序通常会执行预期的操作 , 但缺少如何执行的能力 , 换句话说 , 即缺少系统的非功能或质量属性 。 例如 , 用户可能对这些功能感到满意 , 但应用程序可能过于难以维护 , 或者可能频繁崩溃 , 或者在峰值负载下性能很差 。 当这些非功能属性缺失时 , 我们才会考虑重写或重构 。
关于重构 , 我们经常使用这个术语来指代不同的工作范围 。 Martin Fowler在他的 《重构》 一书中是这样定义重构:


推荐阅读