39.面对遗留系统,你应该怎样做

定义什么是遗留系统?

不经过充分测试的代码或者系统,称为遗留系统。

background:

在《你的代码是怎么变混乱的》?

代码是会随着时间腐化的,无论是有意的,还是无意的,即便是最理想的场景,代码设计的很好,维护的也很精心,但随着技术的不断进步,系统也需要逐步升级换代。

problem:

系统不断升级改造是不可避免的事?

问题是,你连自己三个月前写的代码都不愿意维护,那当面对庞杂的遗留系统时,又该何去何从呢?


重写真的是一种灵丹吗?

不经思考的重写,就像买彩票一样,运气好才能写好,但大多数人没有这么好的运气,我们不能总指买彩票中大奖改变生活,那有什么扫尾靠谱的一点的路呢?

分清现象与根因

Where are we?(我们现在在哪?)

Where are we going?(我们要到哪儿去?)

How can we get there?(我们如何到达那里?)

第一个问题: 面对遗留系统,我们的现状是什么呢?

对于现状的讨论,我们关心的比较少。因为大多数情况下,现状都是很明显的,但这一次不一样,也许你会说,不就是遗留系统,烂代码。

遗留系统和烂代码到底是不是问题?其实并不是,他们只是现象,不是根因

keys

在动手改动之前,先分析一下,找到问题的根因。

例子: 实现一个直觉需要两天的需求,需做到两周或更长时间,根本原因是代码耦合太严重,改动影响的地方太多;再比如,性能优化遇到瓶颈,怎么改延迟都降不下来,根因是架构设计的有问题,等等。

如果不进行根因分析,你很难确定问题到底出在哪,更关键的是,你无法判断重写是不是真的解决问题。

如果是架问题,你只是进行模型的调整是解决不了问题的,同样,如果是模型不清楚,你再优化架构也是浪费时间,

找到问题的根源:防止自己重新走上老路。


确定答案


1.假设找到遗留系统中存在的问题的根因,顺利地回答了第一个问题。接下来,我们来回答第二个问题,目标是什么。对于遗留系统而言,这个问题反而是最好的回答:

重写某些代码


强烈建议:

先尝试重构你的代码,尽可能在已有代码上做小步调整,不要走到大规模改造的路上,因为重构的成本是最低的。

我们的关注点在于第三个问题:

怎么做?我们需要将目标分解一下。


要重写一个模块,这时,你需要思考,怎么才能我们重写的代码和原来的代码功能上是一致的,对于这个问题,唯一靠谱的答案是测试。对两个系统运行同样的测试,如果返回的结果是一样的,我们就认为他们的功能是一样的。




不管你之前对测试是什么看法,这个时候,你都会无比希望自己有了大量的测试。如果没,你最好先给这个模块补充测试,因为只有当你构建起测试防护代码。后续的修改才算是在走坚实的道路上。

关于遗留代码的定义:

遗留代码就是没有测试的代码,按照这个定义,标准,很多团队写出来就是遗留代码,换言之,自己写代码就是在伤害自己。

怎么去替换遗留系统?

分成小块,逐步替换。任务分解思想在发挥作用。

tips:

按照分模块的做法,将新代码放到新模块里,按照新的标准去写新的代码/比如,测试覆盖率要达到100%,然后,让调用入口的地方依赖于这个新的模块。

新代码怎么写?

回到一开始的地方,我们为什么要做这次调整。因为这个系统已经不堪重负了,那我们所做的修改是不是一定能解决这个问题?答案是不好说。

很多程序员都会认为别人给留下的代码是烂摊子,但真有一个机会让你重写代码,你怎么保证不把摊子弄烂?

这是很多人没有仔细思考过的问题。如果你不去想这个问题,即便今天你重写了这段代码,明天你又会怨恨写这段代码的人没把这段代码写好,只不过,这个被抱怨的人是你自己而已


要想代码腐化的速度不那么快,一定要在软件设计上多下功夫,一方面,建立好领域模型,另一方面寻找行业对于系统构建的最新理解

1.关于领域模型的价值,不少行业已经形成了自己在领域模型上的最佳实践

2.寻找行业中的最新理解,简言之,我们需要知道行业已经发展到什么水平?


比如说,今天做一个大访问量的系统,我们要用缓存系统,要用 CDN,而不是把所有流量都直接转给数据库。而这么做的前提是,内存成本已经大幅度降低,缓存系统才成为了标准配置。

拜 REST 所赐,行业对于 HTTP 的理解已经大踏步地向前迈进,CDN 才有了巨大的进步空间。而今天的缓存系统已经不再是简单的大 Map,有一些实现得比较好的缓存系统可以支持很多不同的数据结构,甚至支持复杂的查询。从某种程度上讲,它们已经变成了一个性能更好的“数据库”。

有了这些理解,做技术选型时,你就可以根据自己系统的特点,选择适合的技术,而不是以昨天的技术解决今天的问题,造成的结果就是,代码写出来就是过时的。

前面这个例子用到的是技术选型,关于“最新理解”还有一个角度是,行业对于最佳实践的理解。其实在这个专栏里,我讲的内容很多都是各种“最佳实践”,比如,要写测试,要有持续集成,要有自动化等等,这些内容看似很简单,但如果你不做,结果就是团队很容易重新陷入泥潭,继续苦苦挣扎。

既然选择重写代码,至少新的代码应该按照“最佳实践”来做,才能够尽可能减缓代码腐化的速度。

总之,改造遗留系统,一个关键点就是,不要回到老路上。



总结时刻:

只要产品还在发展,系统改造就是不可避免的,改造遗留系统,前提条件要弄清楚现状,知道系统为什么要改造。是架构有问题,还是领域模型混乱,只有知道根因,才可能有的放肆进行改造。

改造遗留系统,tips:

1. 构建测试防护网,保证新老模块一致

2.分成小块,逐步替换

3.构建好领域模型

4.寻找行业中关于系统构建的最新理解

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容