破解遗留系统快速重构的5步心法(附实例)
前两天和一个架构师朋友闲聊,说到了 「重构」 这个话题,他们公司早年间上线的项目系统,因一直没专人在演进过程中为代码质量负责,导致现在代码越来越混乱,逐渐堆积成“屎山”,目前的维护成本已远高于重新开发一套新系统,想重构也没有合适的人力物力以及时机,只能继续凑合用。说实在的,这确实不只是朋友他们一家公司会遇到的问题,而造成这种情况的原因大概率有以下几点:
- 编码之前缺乏有效的设计
- 成本上的考虑,在原功能堆砌式编程
- 缺乏有效代码质量监督机制
可以看出,最好的解决办法就是不要堆积遗留问题。对此,业界现有的比较“成熟”的解决思路是:通过持续不断地重构将代码中的“坏味道”清除掉。 可惜说起来容易,做起来却很难,要克服遗留系统重构往往有三大阻力:首要的就是怕出错,不知道怎样保障重构的安全性和效率,其次,很多遗留系统规模及业务复杂度太高 , 开发人员又缺乏改造的方法及经验,根本不知从何入手 ; 而且如果修改只是单单停留在代码层面上,很难彻底解决问题,从而提高研发效率和提高产品质量。 后来我们扒了不少文章,终于看到一个不错的,一针见血地指出了三个关键点:自动化、系统化及工程化 。 简单来讲,就是要先通过自动化重构提高开发效率,再通过系统的流程方法,逐一击破,最后通过工程化管理,持续演进,如下图所示。
分享人是 Thoughtworks 资深咨询师、也是中国区 DTO 团队敏捷技术教练**「黄俊彬」**。最近极客时间还特意邀请他做了一个重构系统专栏—— 《 大型 Android 系统重构实战》 ,提前看了下导读,里面不但有详细的关于遗留系统重构三大关键的指南讲解,他还特意选择了一个在 实际工作可能会遇到的 App 项目,直接带你实操改造,这点还挺难得的。
在这个过程中,他自己也总结了一套行之有效和高效实战系统重构的方法论,并且尝试把这套方法论传授给更多的人,所以,他跟极客时间合作推出了 《大型 Android 系统重构实战》 专栏。这种资历的大佬能出来开课,把自己独特的方法和经验共享出来,真的很难得。五步提升,带你真正实战系统重构 。
为了让内容能够切切实实地帮助到大家,听说这个专栏经过了多次深入用户、专家调研的反复打磨。而且实打实地带大家实战,围绕着一个贴近日常开发场景的 APP 项目重构。特意看了下,这个实例里综合了很多遗留系统里的典型代码“坏味道”和代码耦合问题。 完整跟下来,不但能帮助你和你的团队掌握专栏里的流程方法、工具、设计思想,还能融会贯通到其他项目中,真正做到提高团队效率,提升最终的交付质量。
第一步:基础提升篇本篇主要讲解重构以及自动化测试的基础知识,包括重构的类型、时机、安全重构的手法,自动化测试的策略和常用框架。这部分内容是日常开发的必备技能,能有效帮助你提高编码的效率以及代码的质量。
第二步:分析设计篇这部分是针对遗留系统业务复杂度高的问题,会结合实例教你如何分析系统、诊断问题。根据现有架构与理想架构设计的差距,找出撬动遗留系统的关键杠杆点。学完这个部分,你就能了解主流的应用架构,掌握常用的遗留系统分析工具。
第三步:解耦重构篇通过系统的重构方法流程,借助自动化测试以及自动化重构方法,带你对示例项目做组件化重构和组件内的分层架构重构。另外,黄老师还会给你讲解业内一些主流的注入及路由框架使用及原理,帮助你在项目中用好这些框架。学完这个部分,重构易出错的问题就能迎刃而解了。
第四步:持续交付篇这一篇会系统介绍组件化后项目的版本管理、制品管理以及分层分级流水线的设计等工程管理问题。这些实用技巧是老师从多年的项目经验中沉淀总结而来,有助于解决改造不全面的问题。
第五步:扩展篇这一部分会将遗留系统的问题从 APP 扩展到整个手机厂商的 Android 定制系统,带你了解Android定制系统的耦合问题以及解耦的策略及方法。这个部分,可以扩展你的知识面,让你站在更复杂的问题域上,综合运用之前所学的内容,以不变应万变。 说了这么多,具体内容我们可以看看一起目录。 
详细可直接查看**《大型Android系统重构实战》**
相关文章:
破解遗留系统快速重构的5步心法(附实例)
前两天和一个架构师朋友闲聊,说到了 「重构」 这个话题,他们公司早年间上线的项目系统,因一直没专人在演进过程中为代码质量负责,导致现在代码越来越混乱,逐渐堆积成“屎山”,目前的维护成本已远高于重新开…...
信号量(上)实验
实验1:解决订票终端的临界区管理 订票终端是解决冲突问题,所以信号量的值是1 #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <semaphore.h> int ticketAmout 2; // 票的数量: 全局变量 sem_t mutex…...
阿里5年,一个女工对软件测试的理解
成为一个优秀的测试工程师需要具备哪些知识和经验? 针对这个问题,可以直接拆分以下三个小问题来详细说明: 1、优秀软件测试工程师的标准是什么? 2、一个合格的测试工程师需要具备哪些专业知识? 3、一个合格的测试工程…...
前端练习项目
30 Web Projects 30 多个带有 HTML、CSS 和 JavaScript 的 Web 项目,由 Packt Publishing 提供 https://github.com/PacktPublishing/30-Web-Projects-with-HTML-CSS-and-JavaScript Small projects https://github.com/WebDevVikramChoudhary/small_projects_for_…...
sql复习(set运算符、高级子查询)
一、set运算符 union:得到两个查询结果的并集,并且⾃动去掉重复⾏。不会排序 union all:得到两个查询结果的并集,不会去掉重复⾏。也不会排序 intersect:得到两个查询结果的交集,并且按照结果集的第⼀个列进…...
整车电源的几种模式:OFF/ACC/RUN/CRANK
本文框架1.前言2. 四种电源模式2.1 OFF模式2.2 ACC模式2.3 ON模式2.4 CRANK模式3. KL15/KL301.前言 在诊断或者网络管理相关模块开发对客户的需求进行梳理时,经常会看到客户对不同车辆模式下处理策略的需求,如果前期没接触过这几种模式,可能…...
踩了大坑:wordpress后台 无法将上传的文件移动至wp-content
一、问题描述 今天迁移了wordpress站点至新服务器,结果上传图片出现“无法将上传的文件移动至wp-content/uploads”的提示,这是怎么回事,为什么会这样。 报错如下: 2023/02/20 08:57:48 [error] 9861#9861: *79624 FastCGI sen…...
page cache设计及实现
你好,我是安然无虞。 page cache的设计及实现 page cache 本质上也是一个哈希桶, 它是按照页的数量进行映射的. 当 central cache 向 page cache 申请内存时, page cache 先检查对应位置是否有span, 如果没有则向更大页去寻找一个span, 如果找到则分裂成两个. 比如…...
使用seata来解决分布式事务
文章目录 目录 文章目录 前言 一、Seata的执行流程如下 二、使用步骤 三、配置微服务客户端 总结 前言 Seata部署指南 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模…...
推荐一款新的自动化测试框架:DrissionPage
今天给大家推荐一款基于Python的网页自动化工具:DrissionPage。这款工具既能控制浏览器,也能收发数据包,甚至能把两者合而为一,简单来说:集合了WEB浏览器自动化的便利性和 requests 的高效率。 一、DrissionPage产生背…...
MQ系列面试
先来说说什么是MQ,MQ与多线程之间的区别MQ是消息中间件 可以实现异步 多线程也可以实现异步使用传统http协议方式调用接口存在的缺点如果服务器端没有及时的响应给客户端的时候,容易造成客户端阻塞等待。服务器响应超时 客户端发送重试机制 需要考虑避免…...
一句话设计模式2:原型模式
原型模式:每次得到一个新对象。 文章目录 原型模式:每次得到一个新对象。前言一、原型模式和new的区别二、如何实现原型模式1. 什么clone接口2. 开始使用,并验证浅clone效果3. 深度clone(也就是address也要复制一份)总结前言 原型模式可以说是目前接触的设计模式中,比较无用的…...
c++11特性与c++17特性
1、自动类型推导auto // C11 auto func1() -> int // 需要指定返回值类型 {return 10; }auto func2() -> std::function<void()> {auto lambda []() { };return lambda; }// c17 // 之后无需指定返回值类型 auto func1() {return 10; }auto func2() {auto lambda…...
Redis02: Redis基础命令
一、基础命令 先启动redis服务,使用redis-cli客户端连到redis数据库里面 1. 获取符合规则的键: keys 要点: (1)keys 后面可以指定正则表达式 (2)在生产环境下建议禁用keys命令,因为这个命令会查…...
MDK的HardFault硬件异常和NMI异常原因总结
发出来,出现问题自行比对,现在一些代码,也会对这个进行分析。硬件异常原因: Unaligned load or store Load 或者 store 指令访问未对齐地址 Undefined Instruction 执行 ARM 未定义的指令 EPSR Fault 当前程序没有在 Thumb 状态下…...
视频图像质量诊断
视频图像质量诊断有哪些原理,视频图像质量诊断有哪些算法? 视频图像质量诊断技术支持对视频黑屏、视频干扰、视频卡顿、视频遮挡、亮度异常、图像偏色、视频模糊、视频冻结、视频抖动、场景变更、无字符叠加等20种视频图像质量异常进行诊断,…...
make、Makefile项目自动化构建工具
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹前言自动化构建工具是干什么的呢?主要是为了让我们对指令进行一些设置,就比如说,假如一个项目里有很多个源文件&…...
Linux系统之Uboot、Kernel、Busybox思考之一
目录 一 基础环境 1 硬件基础环境 2 软件基础环境 2.1 Uboot 2.2 内核 2.3 文件系统 二 启动过程 1 2 3 4 5 6 7 一 基础环境 1 硬件基础环境 CPU、内存和FLASH为基础环境,有了这三样,程序就可以跑起来。在此基础上补充各种外设ÿ…...
CCNP350-401学习笔记(401-450题)
401、What is the function of vBond in a Cisco SDWAN deployment? A. initiating connections with SD-WAN routers automatically B. pushing of configuration toward SD-WAN routersC. onboarding of SDWAN routers into the SD-WAN overlay D. gathering telemetry dat…...
一文带你看透前端世界里的日期时间,对就是Date
很高兴我们能够通过不同空间,不同时间,通过这篇博客相识,那一定是一种缘分,一种你和狗哥的缘分。今天我希望通过这篇博客对我所熟知的前端世界里的日期时间做一个汇总,不止是代码上的汇总哦! 目录 一、时区…...
实战react项目:基于快马ai快速构建包含图表与导航的用户数据仪表盘
最近在做一个用户数据仪表盘项目,正好用React配合Ant Design实现了一套完整的界面。这种包含导航、图表和动态数据的页面在后台系统中很常见,记录下我的实现思路和踩坑经验。 项目结构规划 首先用create-react-app初始化项目,然后按功能模块…...
springboot+vue基于web的社区交互图书管理系统的设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块划分关键技术实现数据库设计要点社区交互设计安全防护措施项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块划分 后…...
3大实战场景解析:如何用FakeLocation实现Android应用级GPS伪装
3大实战场景解析:如何用FakeLocation实现Android应用级GPS伪装 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation FakeLocation是一款基于Xposed框架的Android位置模拟工…...
Windows/Mac双平台实测:FORCE PRO 6.3.0求解器从注册到下载的完整配置流程
Windows/Mac双平台实测:FORCE PRO 6.3.0求解器从注册到下载的完整配置流程 在工程优化与控制领域,FORCE PRO求解器凭借其高效的数值计算能力和灵活的接口设计,已成为众多开发者的首选工具。最新发布的6.3.0版本在算法效率和平台兼容性上都有…...
如何一站式解决漫画格式转换难题:CBconvert完整指南
如何一站式解决漫画格式转换难题:CBconvert完整指南 【免费下载链接】cbconvert CBconvert is a Comic Book converter 项目地址: https://gitcode.com/gh_mirrors/cb/cbconvert 还在为不同设备上的漫画格式兼容性问题而烦恼吗?CBconvert作为一款…...
3步掌握Vortex:让250+游戏模组管理像专业开发者一样简单
3步掌握Vortex:让250游戏模组管理像专业开发者一样简单 【免费下载链接】Vortex Vortex: Nexus-Mods开发的游戏模组管理器,用于简化模组的安装和管理过程。 项目地址: https://gitcode.com/gh_mirrors/vor/Vortex 价值定位:重新定义游…...
HelixDB安全特性解析:类型安全查询如何确保生产环境可靠性
HelixDB安全特性解析:类型安全查询如何确保生产环境可靠性 【免费下载链接】helix-db HelixDB is a powerful, graph-vector database built entirely in Rust for millisecond query latency and ease of use. 项目地址: https://gitcode.com/gh_mirrors/he/heli…...
告别重复造轮子:用快马AI一键生成高复用性imToken集成代码模块
告别重复造轮子:用快马AI一键生成高复用性imToken集成代码模块 开发涉及钱包集成的DApp时,最让人头疼的就是那些重复性的基础代码。每次新项目都要重新写一遍连接钱包、处理授权、监听网络切换的逻辑,不仅浪费时间,还容易引入安全…...
pvr.iptvsimple技术解构:IPTV直播系统构建的底层逻辑与实践指南
pvr.iptvsimple技术解构:IPTV直播系统构建的底层逻辑与实践指南 【免费下载链接】pvr.iptvsimple IPTV Simple client for Kodi PVR 项目地址: https://gitcode.com/gh_mirrors/pv/pvr.iptvsimple 问题定位:IPTV直播系统的技术痛点与架构挑战 IP…...
Wan2.2-T2V-A5B常见错误排查:运行失败、生成卡顿的解决方法
Wan2.2-T2V-A5B常见错误排查:运行失败、生成卡顿的解决方法 1. 问题概述与快速诊断 Wan2.2-T2V-A5B作为一款轻量级文本到视频生成模型,虽然在资源消耗和响应速度上具有优势,但在实际使用过程中仍可能遇到运行失败或生成卡顿的问题。这些问题…...
