跳转至

结束语 以重构为动力,让遗留系统焕发新生

你好,我是黄俊彬。

不知不觉,课程接近尾声,感谢你的一路相伴。前面我们一起学习了如何通过自动化、系统化和工程化这三个关键方法来治理遗留系统,深入探讨了遗留系统的架构分析、架构设计、代码重构以及工程管理等诸多内容。

现在系统重构的学习之旅即将告一段落。今天,我还想和你分享三点“意识”层面的改变,这对于我们落地遗留系统改造同样重要。

自我要求

第一点是自我要求。所谓预防大于治疗,针对遗留系统道理也是如此。我们要充分利用好各种守护措施来保证代码合入前的质量,对自己编写的每一行代码足够重视。

就拿我之前参与改造的一个大型健康类App来说吧,代码规模在200W行左右,开发人员在100+左右,一次全量编译接近15分钟。代码人员规模庞大,代码耦合很严重,光靠加人已经无法推动产品快速响应迭代。

我们在业务上也听到了众多不同角色的反馈。

  • 产品经理说:一个简单的特性适配一款设备需要4人月。
  • 开发人员说:这个代码,改不动 …
  • 运营人员说:工作效率较低,配置活动成本很高,难度大。

对于这样的系统,只是对一个核心模块做重构打样,就花了接近3个人月的时间(因为前面花费接近1/3的时间做系统设计及分析)。不难发现,我们前期多点投入,代价要远比后期去偿还小很多。这也是我们常说的质量内建,因为缺陷发现得越晚,修复的成本就越高。

所以质量内建的原则是尽早发现问题,一旦发现立马修复。需要注意的是质量保障不是事后的一个阶段,而是发生在过程中的每一个阶段,质量保障不仅是测试的职责,而是每个产品团队成员的职责。

积少成多

第二点意识是积少成多

困难固然存在,但只有我们真正开始在项目上去实践和探索,才能一点一点打破这个僵局。

举个例子吧,这个案例我现在仍然印象深刻。这是一个类似微信的通讯类系统APP,与手机的OS强耦合,因此当业务战略有调整,需要应用也支持第三方的手机设备时,会因为耦合无法覆盖更多的设备。

虽然代码是有设计的,但是腐化严重,测试全靠人肉。像这样的系统其实很难短时间就完成大规模的改动。

对此,我们可以选择其中的一个模块来解耦,抽离成组件。对于这个项目,我们首先花了1周的时间分析了项目整体与系统耦合的清单,并选择了一个核心的通讯模块来解耦。解耦前通讯模块与系统API直接耦合的地方超过400处,通过解耦得到了很好地解决,改造的成效显著,通讯模块不再依赖系统API,能够支持跨端运行。

其实很少有项目能够有一个长期的窗口停了下来让团队专门做系统的改造,往往需要一边迭代业务,一边重构。就像一辆在高速上行驶的汽车🚗,我们不能停,得一边往前开,还得一边换轮胎🛞。

所以,在这个过程中,积少成多、化整为零、小步迭代都是非常关键的原则。我们的课程也始终贯彻着这些原则,借助多种自动化测试的手段以及自动化的安全重构来保障安全性,通过分析设计、小步地剥离组件及代码优化,结合持续集成流水线保证每次都有可测的版本。

与其一开始就想着大而全,不如从点到面,逐个击破,量变产生质变,让团队成员看到信心,让管理者看到变化。这样更有可能得到更多的支持,更有利于我们持续推进遗留系统的改造。

持续改进

第三点是持续改进。冰冻三尺非一日之寒 ,遗留系统不是一天就产生,也不单纯因为一次提交就演化而来,而是随着不断的版本更迭、人员变换、代码不断累积腐化而导致的。

遗留系统的技术债务就像一座冰山,虽然表面平平无奇,但是底下却是纵横交错。可怕的是很多时候我们却只看到了表面,而却无法真正发现阻碍产品快速演进的元凶。

面对这样的系统,有些人的选择是“躺平”,他们会觉得反正代码也已经这样了,这里好多问题都是以前遗留下来的,短时间内也很难改变什么。我其实也挺能理解这种心态,因为确实很多问题都是“祖传”下来的,在开发的过程中还需要经常“背锅”,忍痛维持现状是常态。

然而新技术日新月异,产品市场千变万化,唯一不变的就是变化。“忍一时”虽然能风平浪静,但是这样的系统内在“暗流汹涌”,我们新增的功能就好像在浮沙筑起高台,说不定什么时候就会出现严重故障。

所以,我们需要转变心态,主动、持续地改进甚至重构系统,才能适应变化。遗留系统重构的最终目标是构建一个具有可扩展性、高性能、高可用性的系统架构,提高系统的开发效率和产品的迭代速度。

重构后的系统能够更好地支持业务的高速增长,更好地满足未来的需求变化,为业务的持续发展提供坚实的技术保障。同时,重构后的系统也会给工程师带来更大的工作动力,因为高质量的系统和代码会让工程师的工作更有成就感和价值感。

遗留系统重构的意义不仅仅在技术上,更在于提升团队的工作状态和工程文化。这是一项既艰辛又充满乐趣的事情,能让我们在设计思想、代码质量、沟通协作、工程能力等方面都有较大提升。

再次感谢你选择这门课程,并一路坚持下来。我相信专栏的结束应该是另外的一个起点,期待与你再次相遇。如果在过程中你遇到任何的问题,欢迎你继续给我留言。

我知道有很多同学都在默默学习,课程结束的今天,希望你可以花几分钟填一下毕业问卷,非常期待听到你的声音。

希望你能将课程所学运用到自己的项目中,掌握重构之钥,解开遗留系统枷锁,高效交付软件,再会!

图片

精选留言(1)
  • peter 👍(0) 💬(1)

    请教老师几个问题啊: Q1:准备开发一个APP,持续集成方面,麻烦老师推荐一个方案。Github Action?or Jenkins? Q2:安卓APP,通过wifi和外部设备通信,会有安全问题吗?是不是wifi这种无线方式不安全? Q3:怎么知道AS所用的c++版本?AS4.2创建JNI项目,怎么知道编译所用的c++版本? Q4:service不是一个线程,也不是一个进程。那么,service运行在哪里?是运行在主线程吗? Q5:有开源的IM吗?类似微信一类的比较好的IM APP。

    2023-04-12