首页 > 其他分享 >代码重构 V.S 架构重构

代码重构 V.S 架构重构

时间:2023-04-10 23:34:01浏览次数:30  
标签:重构 架构 代码 业务 问题 Role

1 代码重构

定义

对软件代码做任何改动以增加可读性或者简化结构而不影响输出结果。

目的

增加可读性、增加可维护性、可扩展性

3 关键点

  • 不影响输出
  • 不修正错误
  • 不增加新的功能性

代码重构时,发现有个功能实现逻辑不合理,可直接修改吗?

当然不可!

2 架构重构

定义

通过整系统结构(4R)来修复系统质量问题而不影响整体系统能力。

目的

修复质量问题(性能、可用性、可扩展......)

关键点

  • 修复质量(架构,而非代码层面的质量)问题,提升架构质量
  • 不影响整体系统功能
  • 架构本质没有发生变化

把某个子系统的实现方式从硬编码改为规则引擎,是代码重构还是架构重构?

属于架构重构,架构设计方案了,实现系统可扩展性。

3 代码重构 V.S 架构重构

代码重构 V.S 架构重构_可扩展性

4 架构重构技巧

4.0 手段

代码重构 V.S 架构重构_微服务_02

架构重构是否可以修改 4R 中的 Rank?

不能!修改 rank 就不是重构,而是演进了。拆微服务不属于改 rank。外部系统协作方式都得修改了。比如将淘宝的支付方式支付宝拆出来,成为支付宝公司了。

4.1 先局部优化后架构重构

局部优化

定义:对部分业务或者功能进行优化,不影响系统架构。

常见手段:

  • 数据库添加索引,优化索引
  • 某个数据缓存更新策略采用后台更新
  • 增加负载均衡服务数量
  • 优化代码里面并发的逻辑
  • 修改Innodb buffer pool 配置,分配更多内存
  • 服务间的某个接口增加1个参数

架构重构

定义:优化系统架构,整体提升质量,架构重构会影响架构的4R定义。

常见手段:

  • 引入消息队列(增加 Role )
  • 去掉 ZooKeeper,改为内置 Raft 算法实现(删除 Role)
  • 将 Memcached 改为 Redis( 改变 Role)
  • 按照稳定性拆分微服务( 拆分 Role )
  • 将粒度太细的微服务合并(合并 Role)
  • 将服务间的通信方式由 HTTP 改为 gRPC(修改 Relation )
  • SDK从读本地配置文件改为从管理系统读取配置(修改Rule )

4.2 有的放矢

代码重构 V.S 架构重构_微服务_03

案例

代码重构 V.S 架构重构_可扩展性_04

  • 开发效率很慢,P业务和M系统互相影响
  • 线上问题很多,尤其是数据类问题
  • M系统性能很低

有的放矢:

代码重构 V.S 架构重构_代码重构_05

重构只解决第1个问题(开发效率很慢,P业务和M系统互相影响)。其他问题咋办,架构师你不解决了吗?架构重构后了,各个业务部门再解决各自的问题,如 P业务后台优化自己的问题,M 系统优化自己的性能问题,因为这些问题本身靠重构是解决不了的,而是要靠重构拆分之后,各自再继续优化。

4.3 合纵连横

合纵

说服业务方和老板

  1. 以数据说话
    把“可扩展性”转换为“版本开发速度很慢然后给出对应的项目数据(平时注意搜集数据)。
  2. 以案例说话(其实更有效,给人的冲击力更明显) 若没有数据,就举极端案例,如某个小功能,开发测试只要5天,但是等了1个月才上线。

连横

说服其它团队。

  1. 换位思考 思考对其它团队的好处,才能让人配合。
  2. 合作双赢 汇报和总结的时候,把其它团队也带上。

案例

合纵:告诉PM和项目经理极端案例,设计2周、开发2天、一个月才上线。

连横:P业务线上问题大大减少,P业务不会被其它业务影响

4.4 运筹帷幄

① 问题分类

将问题分类,一段时间集中处理类问题。 避免对照 Excel表格,一条条解决。

② 问题排序

分类后排序,按照优先级顺序来落地。

避免见缝插针式的安排重构任务,不要搭业务的顺风车重构:

  • 避免背锅
  • 效果不明显
  • 无法安排工作量大的重构

③ 逐一攻破

每类问题里面先易后难。

把容易的问题解决掉,增强信心。

④ 案例

Before:

  • 1个100多行的Excel问题表格,一个一个的解决
  • 专挑软柿子捏
  • 见缝插针

After:

  1. 分类:性能、组件、架构、代码
  2. 分阶段: 优化-> 架构重构 -> 架构演进
  3. 专项落地: 明确时间、目标、版本

代码重构 V.S 架构重构_代码重构_06

5 架构重构FAQ

架构重构是否可以引入新技术?

可以,但尽量少,架构重构要求快准

业务不给时间重构怎么办 ?

会哭的孩了有奶吃。收集数据和案例,事实说话。

其它团队不配合怎么办 ?

学会利用上级力量。上级都不支持,说明你做的这个没意义,所以领导也不在乎。那就别做了。

业务进度很紧,人力不够怎么办 ?

收集需要重构的证据,技术汇报的时候有理有据

代码重构 V.S 架构重构_微服务_07

6 测试

6.1 判断

  1. 代码重构、架构重构、架构演进都不需要去修复问题 ×
  2. 微服务拆分既可以是架构重构的手段,也可以是架构演进的手段 √
  3. 架构重构应该搭业务版本的便车,可以避免对业务版本有影响 ×
  4. 架构重构是为修复问题,因此应该将系统遗留的问题都在架构重构的时候修复 ×
  5. 架构重构应该分门别类,按照优先级逐步落地 √

6.2 思考

架构重构的时候是否可以顺手将代码重构也做了 ? 因为反正都安排版本了。No!

局部优化不属于代码/架构重构。

标签:重构,架构,代码,业务,问题,Role
From: https://blog.51cto.com/u_11440114/6181597

相关文章

  • gitlab——项目代码迁移
    gitlab——项目代码迁移目的:将原来服务器上的项目代码迁移到另一台服务器上。step1.首先新建一个空文件,将原服务器代码取下来:gitclonehttp://***(原服务器代码地址)step2.进入到取下来的git项目文件夹中:cd*****(取下来的项目文件夹路径)注:step1和step2相当于拉取线......
  • 课上测试-实现分页显示和模糊查询(代码部分)
    今天的软工课上,老师给我们布置了课堂小测试,要求我们做一个简单的科技政策查询系统,具体要能实现模糊查询和分页显示。这里展示我实现的代码。目前实现了基本功能,还有点小不完善,之后再改一改吧。Query.javapackagemain;importdao.Bean;importdatas.DB;importj......
  • 24种常见的坏味道及重构手法
    神秘命名不能见名知意尽量去一个合适的名字重复代码改动的时候很必须要全部找出,修改困难抽取公共代码,以便统一维护过长的函数小读完所有行才知道清楚这个函数的大意,很多时候只需要知道这里面大概做了啥,不需要知道没一行做了啥,没行都读效率影响阅读效率,一般不要超......
  • mybatispuls的代码生成
    pom文件配置 <!--https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5......
  • R语言MCMC的lme4二元对数Logistic逻辑回归混合效应模型分析吸烟、喝酒和赌博影响数据|
    原文下载链接:http://tecdat.cn/?p=29196最近我们被客户要求撰写关于逻辑回归混合效应模型的研究报告,包括一些图形和统计输出。吸烟、喝酒和赌博被认为是由许多因素造成的。Logistic回归分析是一个非常有效的模型,可以检验各种解释变量和二元反应变量之间的关系。同时,双变量模型分......
  • 没有在线调试功能时,调试代码心得
    1、串口输出数据2、极端情况,没有额外串口时,可以把一个串口先当调试口用,先调试其他功能3、可以控制printf是否可以输出信息4、生成可执行文件时,生成一版带printf输出,一版不带printf输出,调试时两者交替用5、串口发送数据是否正常,接收处理数据是否正常6、串口通信必须保证一端功......
  • Stata中的治疗效果:RA:回归调整、 IPW:逆概率加权、 IPWRA、 AIPW|附代码数据
    全文链接:http://tecdat.cn/?p=10148最近我们被客户要求撰写关于Stata中的治疗效果的研究报告,包括一些图形和统计输出。今天的主题是Stata中的治疗效果。治疗效果估算器根据观察数据估算治疗对结果的因果关系。我们将讨论四种治疗效果估计量:RA:回归调整IPW:逆概率加权I......
  • MATLAB代码:综合能源系统优化模型概述及其鲁棒优化
    MATLAB代码:综合能源系统优化模型概述及其鲁棒优化主要内容:本文在分析典型冷热电联供(combinedcooling,heatandpower,CCHP)系统的基础上,并结合其他优秀lunwen加以补充模型中的不足处,并围绕该系统结构设计了微网调度优化模型构架.在该结构中,选取电气、烟气、蒸汽、......
  • mybatis代码
    /*//根据id查询详情publicvoidselectById()throwsIOException{//接受参数intid=1;//现在是固定数据,以后会变成动态数据//1.获取SqlSessionFactoryStringresource="mybatis-config.xml";InputStreaminputStream=Resourc......
  • 不想做架构师的Gopher不是好程序员
    最近我们在组队学习《手把手带你写一个web框架》,强制PUSH,坚持每天学习打卡,不完成惩罚发红包的那种。你别说,效果还真挺好。昨天学到了架构部分,很受启发,光学不写假把式。(还是得坚持输出哇)我站在大佬的肩膀上输出一篇总结文章出来,希望对大家有帮助:概述所谓架构,与一线开发最大......