QQ空间业务是腾讯公司开发的一款具有个性空间和博客功能的社交平台,自2005年上线以来,经历了多次迭代与升级。它支持用户书写日志、上传图片、听音乐、写心情等,还提供了多种个性化设置,让用户能够展现自我。QQ空间也是许多年轻用户的首选社交平台,拥有庞大的用户群体。
QQ空间业务作为腾讯旗下的一款重要社交产品,自2005年上线以来,经历了多次迭代与升级,以下是对QQ空间业务的详细介绍:
1、发展历程
- 初出茅庐:2005年6月6日,Qzone1.0内测版首次发布,获得英雄帖即可参加内测。
2、空间重构项目的背景
- 随着业务发展,QQ空间承担了为很多兄弟业务引流的责任,许多团队在空间的代码里协作开发,加上自身多年累积的功能迭代,空间的业务变得非常复杂,业务的复杂带来了架构的复杂,架构的复杂意味着维护成本的升高,多年来空间的业务交接频繁,多个团队接手,交到我们团队手上时,空间的代码已经一言难尽。
3、为什么要重构
- 空间是一个祖上很阔的业务,代码量非常庞大,单统计结合版的代码,就超过了150w行,同时空间的代码运行环境也极为复杂,涉及5个进程和2个插件,随着频繁的交接和多团队的协同开发,空间的代码逐渐劣化,各项代码质量的指标几乎都在手Q里垫底,空间的代码成了著名的原始森林 - 进得去出不来,代码的劣化导致历史bug难以收敛,即使一行代码不改,每个版本也会新增历史bug30+,面对如此庞大的历史债务,空间已经到了寸步难行,不破不立的地步,重构势在必行。
4、空间的架构是如何逐步劣化的
- 扩展性低,异化代码无处安放,结合版与独立版涉及大量的代码复用,包括组件、页面和跨App的复用等,但由于前期架构扩展性不高,导致异化的业务代码无处安放,开始侵入底层技术组件,底层组件代码开始受到污染。
- 代码未隔离且缺乏编程范式,空间是个平台型的业务,广告、会员、游戏、直播、小世界等团队都会在空间的代码里开发,由于没有做好代码隔离,各团队的代码耦合在一起,各写各的,同时由于缺乏编程范式,同一个类中的代码风格迥异,破窗效应发生,污染开始扩散。
- 维护成本暴增,恶性循环,空间的业务逻辑本身就很复杂,代码的劣化使其复杂度暴增,后续接手团队已有心无力,只能缝缝补补又三年,恶性循环,最后陷入怪圈: 代码很乱但是稳定,开发道理都懂但确实不敢动。
- Feeds流的崩坏,以空间的Feeds流为例,最开始的架构思路是很清楚的,核心功能在基类实现,上层业务可以低成本地开发一个新的Feeds流页面,同时做了很多动态化和容器化的设计,来满足迭代效率,但后续的需求迅速膨胀,异化出18种Feeds流场景,单Feeds流可能出现60多种卡片,这导致基类代码与Feed View中的代码迅速膨胀,同时N个团队在同一批代码中开发,代码行数和圈复杂度逐渐劣化。
5、架构的生命力
- 痛定思痛,在进行空间重构前的首件事情就是总结经验,避免重蹈覆辙,如何保证这次重构平稳落地并且避免后续每三年一重构?我们总结了四点:渐进式重构、提高扩展性和复用性、复杂度长期可控、做好防劣化。
6、渐进式重构如何实现
- 作为一个亿级日活的业务,空间出现线上问题很容易引起大量投诉,高速公路换轮胎,小步快跑是最合适的方式,平稳落地的关键是渐进式重构,避免步子迈得太大导致工作量扩散,要做到渐进式重构,核心是保证两点:一个复杂的大问题能被分解为许多个小问题,可针对小问题重构和回滚;系统随时都是可用状态,每解决一个小问题,都可以针对性的测试和上线。
- 先拆解,后治理,我们并没有立即开始对旧代码进行重写,而是先基于团队的RFW-Part框架对老代码进行拆解,Part自带生命周期,可以保证老代码平移前后的运行逻辑一致,尽管代码逻辑没有翻新,但大问题被拆解为一个个小问题,我们再根据优先级对单个Part进行重构,保证无论重构了多少,空间都是可用状态,能立即上线验证。
- 架构融合,我们彻底抛弃了空间老的技术组件,与团队内部沉淀的RFWComponent进行架构融合,同时也积极接入手Q统一的UI体系,保证开发能专注于业务中间层开发。
- 提效前置,简化运行环境,在进行业务重构前,我们先还了一部分技术债,包括去插件化、进程统一、工程结构优化和编译优化等,这些工作都在业务重构前完成并上线验证,简化了空间代码的运行环境,提升开发效率,保证了重构工作的敏捷性,达到了针对单点问题快速重构快速验证的目的。
7、如何保证架构的扩展性与复用性
- 扩展性和复用性是软件工程永恒的话题,空间历史架构并没有很好处理这两点,其他业务接入时难以处理异化逻辑,使异化逻辑侵入底层代码,同时为了强行实现结合版和独立版的代码复用,使不同的场景耦合在一起,互相干扰,为了提高架构的扩展性和复用性,我们重新设计了空间的架构层级。
- 业务层打薄,专注中间层,为了避免代码跨层级污染,我们对架构的分层比以往更细,隔离做得更严格,底层技术组件基于RFW框架,RFW中的组件更干净,没有任何业务侵入,能在其他App开箱即用,中间层负责对RFW组件和手Q运行环境做桥接,并对底层组件进行扩展,实现一些空间相关但与具体场景无关的功能,中间层的代码能在一周之内迁移到其他App。
- RFWComponent是一线开发在实际业务中沉淀出的一套组件库,目前由空间和小世界团队共同维护,所有组件都经过了线上业务的验证,保证了易用性和扩展性,组件也很完整,开箱即用,最重要的是,RFW的核心组件都可由上层注入代理实现,这使其并不依赖于手Q的运行环境,也避免了业务侧逻辑入侵底层代码,目前整套架构已在空间、小世界、频道、基础等团队深度使用,空间也是第一个使用这套架构重构老代码的业务,整个过程非常省心。
8、如何降低复杂度并长期可控
- 组合代替继承,Part + Section,拆!什么是RFW-Part?RFW-Part是团队内部沉淀的一套页面级的UI容器架构,Part可感知页面的生命的周期,功能在内部闭环,不同Part无法感知对方存在,代码是严格隔离的,但是Part是页面级框架,无法解决Feeds流列表复杂的问题,Section架构作为Part的补充。
9、如何防止劣化
- 建立严格的代码审查机制和自动化测试流程,确保新加入的代码符合规范和标准,定期对现有代码进行重构和优化,去除冗余和过时的逻辑,加强团队之间的沟通和协作,共同维护代码质量,引入静态分析工具和性能监控工具,及时发现和解决潜在的问题。
10、性能优化
- 对关键模块进行性能分析和优化,如数据库查询、网络请求等,采用缓存技术减少重复计算和数据获取的时间,优化算法和数据结构,提高程序的执行效率,合理利用异步加载和懒加载技术,提升用户体验。
11、项目重构成果总结
- 通过这次重构,QQ空间的架构得到了显著改善,提高了代码质量、可维护性和扩展性,减少了历史bug的数量,提升了系统的稳定性和性能,为未来的业务发展奠定了坚实的基础。
12、展望
- 持续关注技术发展和用户需求的变化,不断优化和完善QQ空间的功能和服务,加强与其他平台的整合和合作,拓展业务领域,探索新的技术和模式,为用户提供更加个性化和丰富的社交体验。
相关问题与解答
1、为什么QQ空间要进行重构?
- QQ空间之所以要进行重构,是因为其业务发展迅速,导致架构变得复杂且难以维护,随着时间的推移和技术的进步,原有的代码逐渐劣化,维护成本升高,为了提高系统的可维护性、可扩展性和性能,满足未来业务发展的需求,QQ空间团队决定进行大规模的重构。
2、QQ空间重构采用了哪些关键技术?
- QQ空间重构过程中采用了多项关键技术,首先是基于RFW框架进行架构融合,以提高代码的复用性和可维护性,采用了渐进式重构的方法,确保重构过程平稳过渡,不影响用户的正常使用,还引入了严格的代码审查机制和自动化测试流程,以确保代码质量,对关键模块进行了性能优化和缓存技术的引入,提升了系统的性能和响应速度。