百度App组件化之路

649次阅读  |  发布于4年以前

组件化是一个老生常谈的涉及面很广的话题,即不是做好一件事而是做好一系列的事情才能达成;其中包含组件化框架在内的各架构层级、构建系统、依赖管理系统、以及配套的防劣化机制与规则规范。

本文主要基于百度App背景、目标和组件化历程来讲述保障并行开发和组件复用的手段,尽量避免过多发散到构建系统、依赖管理系统,以及组件化框架这样的具体子方向。组件化的重要性取决于应用规模、团队规模、产品技术目标;所述内容虽然是从iOS平台出发,但方法论与实现路径适用于大部分平台。

背景与目标

百度App(大型App)复杂度来源

  1. 业务规模大:百度App技术方向及子方向70+,单端代码量180w+; 目标:隔离各组件间影响避免故障蔓延,并控制整体App的复杂度;
  2. 团队规模大:有代码权限的数百人; 目标:保障高效并行开发;
  3. 公司内部接入业务多:30+,非单纯基础库,与百度App关系复杂; 目标:处理接入业务与百度App架构及架构中各组件关系,保障快速高效接入与基础能力复用。
  4. 迭代速度快:3周一个版本,2周开发1周测试; 目标:避免高速迭代情况下组件化程度劣化。
  5. 技术形态多:H5、NA、Hybrid、Talos、Flutter并存; 目标:保障基础能力复用,构建系统支撑。

另外启动速度、体积等准入流程的约束;以及目标的多样性也是大型App复杂度来源因素;由背景产生的目标是天生的技术需求,除此之外,百度App在不同阶段有不同的产品技术目标。

百度App不同阶段的不同目标

  1. 合作业务三方库复用;单个技术组件输出(最早的需求,2014年),对单个组件输出来讲,如何避免输出时,拔出萝卜带出"泥";
  2. 矩阵产品孵化(2017年~2019);
  3. 小程序开源复用(2018年):输出组件兼容不同宿主,保持部分依赖组件可替代性; 目标多样性要求在开发时考虑到各个目标的诉求,在方案设计时尽量避免和这些目标冲突。

重要架构迭代

初始态-2013(钻木取火):

这一时期,百度App浏览器角色较重,大家都在一个工程里开发,各业务和基础逻辑交错,没有边界,你中有我、我中有你;UI架构比较复杂,每个RD都要从App主入口开始看懂主流程代码,小心翼翼的开发。

这一时期的架构是这样:

这一时期的主要问题有:

2014-2015(蒸汽机时代):

虽然当时团队规模只有几十人,但已经意识到了组件化的重要性;接入业务逐步变多,同时也有部分技术组件对外输出的需求;这一阶段:

这一时期的架构是这样:

这一时期的主要问题有:

2016-2017(电力时代)

这一时期重点建设了组件化框架(Pyramid、SchemeRouter)与分发框架(RemoteConfig、PMS、预取分发),及数据拆分框架(CocoaSetting);进一步保障了各组件能做到逻辑、数据各有归属;

这一时期的架构是这样:

2018-2019(理想态-核能时代)

随着百度App组件化程度的提高,主工程逐步壳化,沉淀了大批通用服务;这一时期团队高速发展,加入了多仓库和构建系统的支撑(EasyBox)。

这一时期的架构是这样:

这一时期,组件化框架相对完善,各组件已能做到逻辑、资源、数据各有归属。主工程进一步被弱化;

组件化的进阶-中台化(星际远航)

中台化的大潮滚滚而来,除云端一体化复用外,对组件化也提出了其他的更高要求。共享组件库+构建系统(EasyBox)合力,已能达到矩阵产品组合输出能力。

组件化的实现路径

自下而上的组件化建设

1、编译隔离、架构分层及层级访问限制机制建立

2、三方库规范化与基础库体系化

基础库要在无业务侵入的情况下经过一定程度的抽象到架构底层,二进制化实行组件负责人制度,并进行体系化建设避免上述问题。

所有三方库更新到最新发布版并二进制化避免业务侵入;差异部分明确修改点,通过运行时单独打补丁;对外输出时,明确这一点。

3、建立运行时分发与隔离服务

为避免各组件对共有逻辑、共有数据集中式处理,建立容器及分发机制来分发事件、数据、以及逻辑调用。

分发与隔离机制、容器机制是并行开发的重要保障。

4、服务层建立

多业务调用的低依赖组件去业务化抽象成通用服务:账号、分享、云控、统计、性能、AI等

5、建立组件模型

建立组件模型,各业务模块快速组件化。

6、业务组件化

按照组件模型,确定业务的功能范围、逻辑与接口边界,快速组件化。

7、劣化控制

组件接口变更、依赖变更、Warning数变化都会记录通知相关负责人,这些在Tekes平台管理;敬请继续关注后续公众号文章;没有防劣化机制,填坑速度永远比不上挖坑速度;一人填坑的速度也永远比不上多人挖坑速度。

收益总结

1.研发效率的提升,主要体现在以下几个方面:

2. 质量上,组件化具备设计时的隔离性,确保单个组件的故障影响范围内敛到自己内部,不会引发整体crash;

3. 为启动速度、体积等方向提供量化单位;

4. 建立健全架构体系,分组件深度优化。

吴军博士在《文明之光》一书中评价希腊人对世界文明的贡献这样写到:近代自然科学的很多体系都是在古希腊时代奠定的,希腊人在学术研究上有别于东方文明之处不在于一两项科学发明和发现,而在于他们将自然科学各学科分门别类,对每一个学科都建立起一整套系统的体系,在此基础上,演绎或归纳出普遍规律性,即定理或定律,继而成为自然科学各个学科的基石和支柱。

虽然没有这样的高度,但对软件开发来讲,也有异曲同工的作用。

结语

"自己"得来终觉浅,引用一段话作为结语,节选自《每个架构师都应该研究下康威定律》

架构的目标是用于管理复杂性、易变性和不确定性,以确保在长期的系统演化过程中,一部分架构的变化不会对架构的其它部分产生不必要的负面影响。这样做可以确保业务和研发效率的敏捷,让应用的易变部分能够频繁地变化,对应用的其它部分的影响尽可能的小。

参考

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8