重构系统不得不考虑的两个问题

先讲结论:

  1. 老系统是否可以精简?
  2. 如何重构才可以一步一步上线?

公司之前的项目是一个大杂烩,多个业务放在一个项目中,多个网站也是放在一起,因为总是有一些共用的数据,结果导致很多工程师同事在一个项目上开发,之前大家开开心心和和睦睦,平安无事,但是随着业务越来越复杂,问题出现了:

  1. 共用的东西很多,牵一发动全身,经常出现修改一些东西需要在多个业务里面测试,因为没有写单元测试,就只能手动测试。
  2. 每个人写的代码参差不齐,某天你想重构一些代码,但你看看要改那么多地方,你就只能苦笑,结果就是破罐子破摔,就像有洁癖的人,只能捏子鼻子闭着眼睛生活。

所以今年7月份,我们启动了核心项目的重构,整体来说就是拆服务,写 API,用 API。 今天我不讲整个过程是这么做的,我只分享重构前做的一些考虑,如果你也在做一些大的重构,希望这些考虑可以给你帮助。

一,老系统的业务是否可以精简或者删除?

项目重构可不单单只重构代码,这正是一个非常好的机会来重新梳理业务,可能你感觉业务跑的很顺,但是:

  1. 会不会有哪些业务已经是可有可无的状态?
  2. 会不会有哪个流程本来可以更简单?
  3. 会不会有一些遗留问题早就应该解决了,但是一直因为忙忙忙的缘故被拖后?

在重构的之前,技术人要完整的理解现有系统的结构,更重要的是要理解业务,尤其是要和第一线的业务人员进行沟通,了解他们的工作模式,了解他们的现有流程的一些困惑或难点。

了解清楚后,开始做减法,已经不需要的功能或流程要在老系统上进行精简或删除,可能你会问“我已经要重构了,为什么还需要在老系统上精简?“,因为你重构的系统还不知道什么时候上线呢,而且重构的系统再开发的时候需要参考老系统。

二,如何重构才能一步一步上线?

这一点是我考虑不足的地方,因为项目拉的比较长,时间预估方面也考虑不周,导致项目延期比较久。其中很重要的一个问题是:如何才能一步一步上线?

  1. 重构后的系统哪些部分可以先做完上线?让老系统与新系统的兼容工作分步做,而不是想着一步就全部替换掉,这不现实。
  2. 数据存储结构是否需要修改?如果修改,是否可以先洗一部分数据?

分步上线是把风险也分步,把风险分散开对一个成熟的业务非常关键。而且每一步都会给大家很多的信心,很清楚看到我们在前进,否则战线拉太长,大家都会觉得比较疲劳。

总体来说,这两点是在重构项目的时候大家都可以尝试考虑的问题,希望对你有帮助。

原文链接:https://www.lijinma.com/blog/2017/01/18/tw...

本作品采用《CC 协议》,转载必须注明作者和本文链接
写文字大部分时候是因为我希望能帮助到你,小部分时候是想做总结或做记录。我的微信是 lijinma,希望和你交朋友。 以下是我的公众账号,会分享我的学习和成长。
本帖由 Summer 于 7年前 加精
lijinma
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 19

手动点赞!友情提示:如果重构才可以一步一步上线 =>如何重构才可以一步一步上线

7年前 评论

laravel 怎么做微服务的。。

7年前 评论
lijinma

@s4p3r
@MrJing 谢谢。。已经改了,看来我是错别字大王了。。

7年前 评论
lijinma

@yekexuan 微服务和 php 框架没什么关系。。只不过我们用的是 Laravel 和 Lumen

7年前 评论

@lijinma 是没有什么关系啊 只想知道你们是怎么做的。。

7年前 评论

我这边也打算明年过来重构现有的系统,但是在重构的过程中间,现有的业务不能停,也没有条件说完全开发一个新系统,之后再整体替换,所以我的计划是,将原有的系统整体做为前端,新系统做为后端处理业务,然后在原来系统的控制器那里,或者可以提前到路由那里,把请求转发到新系统这边来,新系统处理完成之后再扔回数据给旧系统,这样就完成了方法的替换,这种方式的好处是在整个重构的过程中,对业务部门是无感知的,我们可以一个方法一个方法去重构,方法重构完了,就在旧系统把请求转发过来,没有重构的方法,请求就还是走旧系统的逻辑;所有的方法都重构完了之后,旧系统就可以扔掉了,直接让前端指向新系统,不用旧系统再做转发了

7年前 评论
lijinma

@yekexuan 嗯嗯,我们用docker swarm

7年前 评论
lijinma

@远客 谢谢你分享

7年前 评论

希望可以分享一些技术层面的经验,你们是如果拆分的?
我们现在也在摸索着拆分系统,拆应用、拆服务
目前老系统还没动,只是把几个新的业务使用新的方式实现了,业务之间是分离的
后续都不知道在朝哪个方向进行了,另一个同事说要拆服务,可是服务要怎样一个拆法也是不清不楚的

7年前 评论

哈哈,“酒店哥哥” 让我产生了联想,我是不是太污了!:laughing:

7年前 评论
lijinma

@klgd 恩恩,好的,我理理思路。

7年前 评论
lijinma

@overtrue 哈哈哈哈。。。应该是“酒店妹妹”让你更容易产生联想吧。。

7年前 评论

@远客 如果不是重构某部分代码,而是重构整个数据库呢?如何一步步上线

7年前 评论
lijinma

@白纸 说说具体的场景?

一般的做法是:

第一步:
旧流程 -> 写旧数据表

第二步:
新流程 -> 写新数据表和旧数据表(双写)

第三步:
洗数据,把旧数据写到新数据表中

这样保证服务不用下线。

7年前 评论

@lijinma 目前的情况是这样一个复杂的业务系统,由于之前数据库设计的太差,导致一些数据经常丢失.
现在打算重新设计数据库,把整个系统重构,但是呢以前的数据是全部要的,因为是业务系统,所以涉及到的统计方面的模块比较多,一般业务表的数据都是几百万,最大的一张表1千6百万.
如果要按照上面所说的方法肯定是不行的,毕竟数据库重新设计了.表结构都不一样了,旧数据需要按新数据库的字段来导,这样的情况应该是考虑整体重构完在上线吗?是考虑先设计完数据库,导好数据,然后在重构还是?有没好的方法?

7年前 评论

每个人写的代码参差不齐,某天你想重构一些代码,但你看看要改那么多地方,你就只能苦笑,结果就是破罐子破摔,就像有洁癖的人,只能捏子鼻子闭着眼睛生活。

7年前 评论
lijinma

@白纸 能停服?能停服随便折腾,但洗数据你逃不过的。

7年前 评论
lijinma
7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!