美文网首页
接手历史悠久的老项目,干or跑?

接手历史悠久的老项目,干or跑?

作者: 跨界架构师 | 来源:发表于2021-07-24 22:23 被阅读0次

我是一个着迷于产品和运营的技术人,乐于跨界的终身学习者。欢迎关注我的个人公众号「跨界架构师」

每周五11:45 按时送达~

我的第「199」篇原创敬上

大家好,我是Z哥。

这是我的第199篇原创,离200篇还有一步之遥。为了庆祝这重要时刻,我也在琢磨着要不要在第200篇的时候搞个什么小活动。还没想好,等下周再看吧。

不过不管怎样,你也应该为Z哥的坚持点个赞吧,哈哈。所以,看完文章后不要忘了划到文末点赞哦~

好了,回到正题。

很多人吐槽老项目是怎么怎么垃圾。这的确是一个很大的问题。根据 IEEE Spectrum 之前发布的一份报告数据:

自 2010 年以来,全世界IT 产品和服务支出约为 35 万亿美元,其中约四分之三用于运营和维护现有的 IT 系统。另外,至少有 2.5 万亿美元用于尝试替换旧的 IT 系统,而且其中约有 7200 亿美元被浪费在失败的替换工作上。

——https://spectrum.ieee.org/computing/it/inside-hidden-world-legacy-it-systems

因此,面对不堪的、充满历史味道的老项目对程序员群体来说会是一个常态。

不过我们可以做些什么呢?难道是要么硬着头皮去填别人挖的坑,要么跑路么?

如果你不跑路的话,最常见的应对方式无非是「重写」或者「重构」。

01 重写

一般来说,越是年轻的程序员越是最喜欢重写。除了年轻气盛的原因外,主要是因为完全摆脱了老代码的技术债和束缚,可以尽情地施展自己的才华。

但是对于老系统的重写,如果没有高层的支持、业务部门的配合,靠谱的开发团队,这事大概率很难能按预期完成。

而且选择「重写」方案不仅仅是重新写一套代码这么简单,系统切换也是一个头疼的事情,在复杂一些的项目里,它的难度并不亚于重写一套代码。

而且一旦选择「重写」,意味着在一段时间内要么老系统并行开发,要么会攒一堆需求,业务方能不能持续支持「重写」也会面临很大的挑战。

就算这些问题都能搞定。「重写」还可能造成的一个结果是:在过了几个月后,重写后的系统又成了别人眼中的“破烂不堪的老系统”。这是最讽刺的……

如果在重写过程中,由于任何原因牺牲了对质量的要求,这个讽刺很容易成为现实。

因此,很多公司之所以不支持重写,理由是:

又不是不能用。

这么看来他们并不是迂腐,也是一种理性的选择,也是没错的。

02 重构

相对地,年纪越大的程序员可能更倾向于重构。毕竟他们有更多的机会见过、经历过那些惨痛的重写事件。当然更主要的原因是,他们掌握了更多应对“垃圾代码”的方式方法,认为通过小范围的代码重构也能化腐朽为神奇,提升项目质量。

的确没错,但这是有一个前提的。就是垃圾代码的产生速度要低于重构的速度。可是对大部分中小公司来说,开发团队可能不具备这样的条件。因为技术好的程序员要么走向了管理岗位,要么身上的重担太多,没太多时间来做重构。再加上技术差的程序员继续复制粘贴,挖更多的坑。通过重构来改善老项目,可能永远在“重构的路上”。

而且,如果项目的技术复杂度大于业务复杂度,那么配合重构的测试成本就很高了。

除了这两种常见的方式外,还有其它的方式也能应对这些老系统。它们的的风险和收益在下图里已经很好地呈现出来了。

其实Z哥认为,这些方式我们都可以用,但是要沿着正确的思路来。(绞杀是什么?往下看)

首先从业务角度来考虑到底是选择哪种方案。

   ■ 从业务敏捷视角来看,能不能让响应力变得更快?

   ■ 从运营效率视角来看,如何通过系统改造,提升业务运营的效率?

   ■ 从客户洞见视角来看,如何让系统更好地发现客户洞见,进而更好地理解客户需求和演进产品?

其次是从系统本身来考量,比如,我们想通过改造获得多大的弹性?

最后,根据整体上对业务帮助的价值大小来选择哪一种方式。如果对业务的帮助巨大,完全值得投入大量资源去重写,那么就不要畏畏缩缩的小范围重构。如果对业务帮助很小,那么也就别想着重写了,老老实实在小范围内修修补补就好了。

当你拿捏不准方案的时候,选择按模块替换会是一个不错的办法,相当于通过每一次换一个零部件,把整个机器上的零部件全部翻新一遍,以此完成重写的效果。Martin Fowler 称之为「绞杀法」。

「绞杀法」的最佳实践是DDD+微服务,因为它们可以提供更好的「隔离性」「自治性」,更有利于「替换」的进行。

当确定好改造的方案后,还需要制定度量指标,在实施改造的过程中持续关注这些指标的变化。最好能够通过可视化工具将这些信息共享出来,这样的好处有两点,

   ■ 一是能够让团队了解改造进展和成果,确保改造朝着正确的方向走;

   ■ 二是能够让相关的干系人(领导、业务部门)也能了解到工作的进展情况,提高对预期的确定性,以持续获得他们的支持。

关于具体重构方法我就不说了,可以翻看我之前的一篇文章《好的重构方法才能摆脱“屎山”》。

关于重写可以来聊几句,之前我们没聊过。我的建议是遵守以下几个原则。

    1.系统具备演进的能力。

    2.凭借度量指标来把握演进的方向。

    3.小步快速迭代。

01 系统具备演进的能力

既然是重写系统,那么一定要为可见的未来做一些预留,方便后续的演进。毕竟能够决定重写的系统自然是比较核心的系统,不管在技术上还是在业务上都会持续发生变化,注重系统的演进能力就是在降低未来项目复杂度增长的幅度。

具体的方法可以概括为3个词:抽象、分类(分层)、解耦。

02 凭借度量指标来把握演进的方向

前面也提到了度量指标的价值。这里继续强调一下它的重要性。

如果说在重写时期,度量指标是衡量重写工作完成好坏的尺子,那么在重写后它就是指引未来系统演进的明灯。

不管系统后续要做什么升级改造,对自身了解的越清楚,做出的决定和选择自然越合理。而度量指标起到的就是这个效果。

一个缺少度量指标的系统,随着业务逻辑的不断堆砌,很容易自由生长过了头。

03 小步快速迭代

近些年随着CI/CD的普及,小步快跑式的敏捷开发被越来越多人提到,并且开始运用。

它的好处是显而易见的,对项目的可控性更高,容错性更强。

如果你不知道“小步”该多“小”?你就按发布出了问题能不能快速回滚作为标准去考虑就好了。能快速回滚的迭代节奏就是“小步”。

其实重写系统完之后还有一个头疼的事情要解决,就是数据迁移。业界常用的方案有四种,我先大致列一下主要思路,后续再发文展开聊聊。

01 双写

    1.新库配置为旧库的从库,从旧库同步数据。

    2.数据写入的时候,不仅要写入旧库,也要写入新库。

    3.数据校验。

    4.两边数据完全同步后,灰度切流量。

由于有双写的存在,所以在切换的过程中出现任何的问题,都可以将读写流量随时切换到旧库去,安全感极强。

02 异步双写+对账

这个方案其实是双写的变种,将同步写入变成了异步写入。也因此需要一个对账机制,确保最终一致性的达成。

一般这个异步的机制要么通过 MQ ,要么通过数据库的 binlog 进行。

03 直接用新库,数据惰性迁移

这个方案中间需要架设一个缓存层,用来存放数据的key。过程是这样的:

    1.先访问新库,如果有数据则直接进入步骤 3 ,如无数据进入步骤 2 。

    2.访问旧库,找到相应的数据 Insert 到新库,再进入步骤 3 。

    3.进行业务逻辑的操作……

随着时间的推移,数据慢慢会从旧库同步到新库。剩下还未同步的数据使用同步工具做一次全量同步。

原则上,以上的每一个方案在实际切流量之前都要对数据做核对,确保两边的数据一致。

最后迁移完后可以通过流量回放工具(如阿里的 jvm-sandbox-repeater )或者全链路压测工具来验证新版本的系统是否能运行地符合预期。

好了,总结一下。

这篇呢Z哥和你分享了应对老项目的思路,总的有5种:

   ■ 重构

   ■ 重新部署

   ■ 更换平台

   ■ 重写

   ■ 绞杀

我建议根据业务敏捷、运营效率、客户洞见、系统本身的韧性和弹性来考虑选择哪一种。

接下来专门对重写展开细说了一下,建议遵守三个原则:

    1.系统具备演进的能力。

    2.凭借度量指标来把握演进的方向。

    3.小步快速迭代。

最后分享了3个常用的新老数据迁移方案。

    1.双写

    2.异步双写+对账

    3.直接用新库,数据惰性迁移

如果你有兴趣进一步了解的话,推荐两本关于重构和重写不错的书给你,《重构-改善既有代码的设计》,《重构与模式》 。可以等有购书满减活动等时候入手。

在我看来,不管是重构还是重写,本质是让数据流转地更通畅。需要在过程中不断审视这一点。

推荐阅读:

   ■ 如何让自己更自律

一些贼好用的开发原则


如果你喜欢这篇文章,可以点一下右下角的「爱心」,支持我的创作~

定期发表原创内容:架构设计丨分布式系统丨产品丨运营丨一些深度思考。

相关文章

  • 接手历史悠久的老项目,干or跑?

    我是一个着迷于产品和运营的技术人,乐于跨界的终身学习者。欢迎关注我的个人公众号「跨界架构师」每周五11:45 按时...

  • 接手老项目

    在每个控制器的viewDidLoad打一个断点,真机调试老项目,点击使用项目,可以快速知道每个控制器对应哪个界面,...

  • Building for iOS, but the linked

    新公司接手一个老项目全是手动链接静态库。最新版XCODE跑老项目报错如标题。静态库链接错了。 百度了各种解决方案 ...

  • 记一次ASP.NET项目修改

    最近接手了一个ASP.NET项目,身边没有老司机,如何把项目跑通是坑了我两个晚上。总结如下: 多搜索自己不熟悉的平...

  • 编写可维护的 JavaScript

    几乎每个程序员都有接手维护别人遗留项目的经历。或者,有可能一个老项目某一天又被重新启动。 通常情况下,接手老项目都...

  • 接手一个老项目

    在着手一个项目前先读文档(如果有文档的话)。尽管读了文档你不一定知道每一个代码的细节,但是如果你了解那个问题的话,...

  • 接收项目初次加载pods出现 resources.sh: Per

    接手老项目。加载pod报错/Users/song/Library/Developer/Xcode/DerivedD...

  • Linux下MongoDB实现远程自动备份

    看过上一篇接手老项目的痛——MongoDB学习及集群搭建知道,最近接手了一个后妈养的项目,项目的数据库没有人维护,...

  • 如何运行vue项目(维护他人的项目)

    假如你是个小白,在公司接手他人的项目,这个时候,该怎么将这个项目跑通? 前提:首先,这个教程主要针对vue小白,并...

  • Tomcat 8.5 配置https协议、http自动转向htt

    一、前言 最近接手一个老项目进行维护,其中老项目是基于http的请求来的,所以导致用户在访问页面的时候总是弹出莫名...

网友评论

      本文标题:接手历史悠久的老项目,干or跑?

      本文链接:https://www.haomeiwen.com/subject/lzovmltx.html