大型Android系统重构实战

开篇词|一个App成了遗留系统,我们有啥破解之法?

黄俊彬

Thoughtworks 资深咨询师

你好,我是黄俊彬,很高兴在极客时间和你相遇。

作为一个在移动开发领域历练了十年的老兵,我曾参与过多个国内大型手机OS研发团队整机组件化、架构解耦的项目,在移动开发领域的架构设计、自动化测试、性能优化、DevOps等方面有丰富的经验。

近几年,我经历了多个大型Android遗留系统的重构项目,很多系统的代码达到百万行的量级。这个过程里,我收获了很多经验,也希望能够帮助更多朋友,在遗留系统重构方面少走弯路。

你的产品是遗留系统吗?

说起遗留系统,我们通常会有后面这几种认识。

  • Bug很多的系统就是遗留系统。
  • 代码很难维护的就是遗留系统。
  • 没有自动化测试的代码就是遗留系统。
  • ……

在这些认识里,已经提到了遗留系统的一些症状。其实对于遗留系统,我更认为它是一种“综合症”,指的是技术上已过时,但仍然在企业中使用的计算机系统或应用程序,有许多负面的症状

这么说你可能还是觉得有点抽象,可以对号入座,看看下面这9个问题是否在你的项目中也曾经遇到过。

如果你的产品也有类似的一些问题,那么不管你是团队中的任何角色,希望你能引起足够的重视,因为符合的“症状”越多,你的产品就越趋近于一个遗留系统。当遗留系统这个泥球越滚越大时,我们对它投入的改造成本就会越来越高。遗留系统就像一辆老破旧的小汽车,不知道啥时候会出问题,维修成本也越来越高,想快也快不起来。

如果你的产品现在的规模和复杂度还没有这么高或者产品才刚刚开始,没有这么多的问题。那么你更应该抓住这个时机,学习如何避免让自己的产品变成一个遗留系统,这样你付出的代价将会是最低的。

遗留系统改造落地的3大关键阻力

在接触了这么多的遗留系统和团队后,让我感受最深的就一句话就是:道理我都懂,但是“臣妾做不到”。

因为遇到这类瓶颈时,管理人员可能最先想到的就是“加人”。不过,我想说加人也许是加速系统腐化的另一个催化剂。如果没有从根源上解决遗留系统的问题,加人只会往系统里面增加更多的问题代码,加速系统腐化。所以,如果仅仅通过加人来解决工作量的问题,短期内可能会解决一部分效率的问题,但从长远来看治标不治本。

而研发人员心里想的方式可能就是重写,可惜现实很骨感。至少在这几年找我咨询的客户中,没有一个团队有勇气停掉业务迭代来重构整个系统。并且,即便能重来一次,如果缺乏有效的守护和持续的重构,重写的系统也会变成另外一个遗留系统。

所以,一边迭代业务一边重构系统是最佳的方案,可惜的是,这个方案很难有效落地。究其原因,主要有这样3点。

易出错,不知道怎样保障重构的安全性和效率。

如何保障重构的安全及提高重构的效率,是我们一定无法绕开的2大关键问题。很多开发人员宁愿简单粗暴地使用复制黏贴,也不愿意改动旧代码,很重要的一个原因就是担心重构不安全,万一重构反而引入一堆问题,那就得不偿失了。另外业务持续迭代,能分配在重构这件事上的时间有限,这就需要提高重构的效率。

复杂度高:遗留系统规模及业务复杂度高,缺乏改造的方法及经验,不知从何入手。

试想一下,如果由你来重构一个几百万代码的App,要从何入手呢?你觉得所有的代码都需要重构吗?如果不是,那么哪些代码是重构的重点呢?通常遗留系统的代码耦合度都很高,那么究竟哪些代码的依赖是正常的?哪些依赖是不正常的呢?

你会发现这里面会牵扯出很多问题,它们就像杂乱缠绕在一起的线团一样,如果我们找不到关键的线头,就很难解开这些错综复杂的结。

不全面:软件的复杂度并不会消失,单纯改造代码架构并不能彻底解决问题。

遗留系统的改造最终有2个目标:提高研发效率和提高产品质量。如果只是停留在代码层面的修改往往很难达到这两个目标。比如我们将单体的遗留系统重构为组件化的系统,虽然重构帮助我们拆分出了更加低耦合、高内聚的组件,代码维护起来更容易,但复杂度却会转移到组件的版本管理、集成步骤等工程问题。

重构只是解决遗留系统问题关键的一个举措。但如果想根治遗留系统,其实是一个软件工程的问题,要多管齐下,综合“治疗”。

如何克服三大关键阻力?

想要克服易出错、复杂度高和不全面这三大阻力,似乎是个非常复杂的问题。但实际中只要我们能抓住问题的根因,掌握系统解决遗留系统问题的关键方法,这完全是可以解决的。

那么这些关键的方法是什么呢?如下图所示,基于我在众多的遗留系统改造辅导项目的经验,我将其总结为自动化、系统化及工程化

自动化:通过自动化提高效率,守护质量。

通过自动化重构可以帮助我们提高效率,减少人工挪动代码引起的风险。通过自动化测试可以帮助我们构建守护网,避免重构破坏之前的逻辑。通过自动化守护可以帮助我们守护架构,避免代码腐化。

系统化:通过系统的流程方法,逐一击破。

从遗留系统的分析到架构设计,再到系统的重构流程及代码落地,最后通过度量来持续反馈和帮助改进。通过系统化的方法来指引你如何一步一步按部就班进行遗留系统改造。

工程化:通过工程化管理,持续演进。

从组件代码提交后的分支管理及代码管理,再到持续集成流水线的质量门禁检查,最后进行制品版本管理。通过自动化的流水线来转移组件化后的集成复杂度,让软件发布能更加高效。

这三个关键方法,也贯穿了《大型Android遗留系统重构》专栏的始终。

为了让你从头到尾体验一次遗留系统的重构之旅,我选择了一个贴近实际工作的App项目,带你一步步把它从单体架构改造为组件化架构。这个示例项目包含了遗留系统各类典型代码坏味道以及代码耦合问题,我们在改造过程中也会逐一解决。

我讲的内容很多都来自一线大厂的经验,所有的实践方法均在实际的项目中落地过。掌握了课程里的流程方法、工具、设计思想,你还能将其无缝运用到其他的项目中,真正提高团队的效率,最终提升交付质量。

整个课程分为了5个部分,包含基础篇、分析设计篇、解耦重构篇、持续交付篇以及扩展篇。后面是整体设计图。

基础篇:主要讲解重构以及自动化测试的基础知识,包括重构的类型、时机、安全重构的手法,自动化测试的策略和常用框架。这部分内容是日常开发的必备技能,能有效帮助你提高编码的效率以及代码的质量。

分析设计篇:针对遗留系统业务复杂度高的问题,我将结合实例教你如何分析系统、诊断问题。根据现有架构与理想架构设计的差距,找出撬动遗留系统的关键杠杆点。学完这个部分,你就能了解主流的应用架构,掌握常用的遗留系统分析工具。

解耦重构篇:通过系统的重构方法流程,借助自动化测试以及自动化重构方法,带你对示例项目做组件化重构和组件内的分层架构重构。另外,我还会给你讲解业内一些主流的注入及路由框架使用及原理,帮助你在项目中用好这些框架。学完这个部分,重构易出错的问题就能迎刃而解了。

持续交付篇:系统介绍组件化后项目的版本管理、制品管理以及分层分级流水线的设计等工程管理问题。这些实用技巧是我从多年的项目经验中沉淀总结而来,有助于我们解决改造不全面的问题。

扩展篇:这一章会将遗留系统的问题从APP扩展到整个手机厂商的Android定制系统,带你了解Android定制系统的耦合问题以及解耦的策略及方法。这个部分,可以扩展你的知识面,让你站在更复杂的问题域上,综合运用之前所学的内容,以不变应万变。

这个课适合谁来学?

如果你主要负责团队的技术管理,那么课程里讲解的方法和流程,能有效地帮助你整体把控项目的质量及团队的研发效率。

如果你主要负责团队的架构,课程介绍的工具、流程、案例,能有效指导你的团队进行架构改造落地,让你掌握如何通过自动化来守护架构,防止架构腐化。

如果你主要负责业务的测试,移动应用的自动化测试分类、框架及应用场景将会对你有所帮助,课程中还结合案例对上述内容做了综合性的运用。通过课程学习,你将系统掌握移动端的自动化测试策略,并在实际项目中运用。

如果你主要负责业务的开发,学习课程中的实践及方法,不但可以提升代码设计及编码能力,也能让你系统掌握自动化测试、安全重构、架构设计等知识,最终提升你和团队的开发效率及版本提测质量。

最后,欢迎你在留言区畅所欲言,分享你的理解或者提出自己的疑问,聊聊你是否遇到过遗留系统,踩过哪些坑。如果你身边有陷入遗留系统遇到困难的朋友,也推荐你把这门课分享给他。

希望通过这门课的学习,你能系统掌握遗留系统重构之法,走出遗留系统的泥潭。轻装上阵,持续交付高质量的软件,让我们一起开启这段学习之旅吧!

课程配套代码链接(内容随课程更新逐渐完善):https://github.com/junbin1011/Sharing

教程推荐

TensorFlow在线教程

PHP7+在线教程

Dart在线教程

MATLAB在线教程

TypeScript在线教程

Python Web 渗透测试在线教程

随机推荐

和府捞面浓汤鲜煮面4袋速食面番茄牛肉面条评测好不好用?最真实...

狮王小狮王儿童氟防蛀牙膏 20g评测数据怎样?独家揭秘评测?

狮王小狮王儿童氟防蛀牙膏 20g分享一下使用心得?真实评测分享点...

卡诗元气姜粉瓶生姜洗发水250ml好不好,推荐购入吗?最新口碑评...

佳沃云南蓝莓14mm 12盒原箱生鲜性价比高吗?详细评测分享?

LAIMANUS洗衣粉莱曼斯香味皂粉洗衣粉5kg评测怎么样?用户使用感...