Appearance
开篇词iOS架构与开发工程化,让你成为10x程序员
你好,我叫林永坚,在澳洲互联网公司 REA Group 担任 Mobile Tech Lead 一职。作为技术负责人,我主要负责移动端的架构与研发,同时也负责移动团队的建设和推动公司的工程化实践。
在我所负责的 App 中, realestate.com.au App 是澳洲本土企业流量排名前几的 App,几乎每个在澳洲买房、卖房、租房的人都会使它。在 App Store 上,这款 App 的评分也一直保持在 4.7 星以上。要知道,在 2020 年澳洲排名前 20 的免费 App 只有 8 个能到达 4.7 星。
现在看这款 App 已经是一个非常成功的产品了,但其实在几年前,我们也面临着重重困境。
工程化实践的重要性
那是五六年前,我刚加入 REA Group 公司,当时我们的 App 版本发布周期长达 8 个月到一年。
为什么会这么长呢?因为我们没有好的开发流程和工程化标准。
举例来说,仅仅在准备发布阶段,由于没有代码管理规范,也缺乏自动化工具的支持,我们都需要专门停止手头工作,用一两个月的时间来准备。比如合并代码,需要手工操作,要花 2周 ~ 4 周;部署测试也是手动,需要 1 周时间;最后再进行回归测试,又要 2 周 ~ 3 周。
当时因为发布流程十分复杂,人工操作繁重还容易出错,有的同事为了逃避麻烦甚至请了病假。
虽然我们花那么长时间来准备,但 App 在 App Store 上的评分只有 2.5 星。主要原因是用户体验非常不好,经常崩溃,差不多每 5 个中就有一个用户的 App 会闪退。
为什么会这样?
其中一个原因就是没有统一的代码管理流程,开发者想要 Push 什么风格的代码都可以。比如,当时就有一名开发者为了学习 Core Data,在一个周末期间把学习的 Core Data 的代码直接 push 到了主分支。
结果,他的这个 Push 操作让 App 的崩溃率上涨了 10%。事后虽然我们想要补救,但因为这部分代码没有任何架构设计,花了两三年才逐渐把相关代码移除完毕!
另一个原因就是,代码没有统一而灵活的系统架构设计与开发模式。就像前面的那次事故,之所以要花两三年才移除干净,就是因为缺乏面向接口的编码模式,Core Data 的数据对象污染了整个代码库。同时,又因为 App 缺乏分层的架构设计,导致所有逻辑都编写在臃肿的 View Controller 里,单元测试覆盖率几乎为零。可以说,代码库进入几乎没法维护的状态,很多崩溃情况无法修复。
为了避免同类的事情再次发生,也为了提高效率,我们开始了漫长而十分崎岖的工程化实践之路。最终,App 的崩溃率从 20% 以上下降到 0.01% 以下,App Store 的评分也从 2.5 拉升到 4.7 星。
为什么有这门课程?
虽然我们下定决心改变现状,但在开始实施工程化实践的时候还是面临许多困难。
当时我们想要规范代码管理流程,提高开发、迭代、打包和发布效率,不再纯手动操作,但实际做下来事情千头万绪,既没有明确的工程化目标和方向,市面也没有相关的资料可供参考,只能通过不断试错来推进。
而且,既然是要进行 iOS 工程化开发,就需要工具支持。但当时不仅相关的工程化、自动化工具稀少,苹果公司所提供的工具链也非常不友好,市面上的 CI(Continuous Integration,持续集成)工具并不支持脚本化和版本管理,很多时候需要人手操作来搭建,且每次 MacOS 或者 Xcode 更新,都需要重新搭建。
如今四五年过去了, 适用于 iOS 开发的 Swift 语言逐渐成熟,可重用组件的编写以及可扩展架构的设计变得越来越方便;而苹果公司的工具链,特别是支持自动化和工程化的开源工具和在线服务(如 Fastlane、 TravisCI )也越来越丰富。
此外,像 GitHub 、GitLab 等代码管理平台的出现,也使我们的开发流程更容易统一和规范。
但我发现,还有些 iOS 开发者并没有意识到技术的变化,仍在用纯手工的形式开发和发布 App。
另外,虽然过去了很长时间,但市面上有关 iOS 开发的工程化实践资料仍然很少,有的只是介绍如何使用系统 API 来开发一款 iOS App,还有的是介绍各种自动化和工程化工具的使用,并没有连贯起来形成体系。
为了让你不再像我以前那样一直掉坑填坑,也为了帮助更多的开发者,我结合多年的工程化实践经验,做了这样一门课程。我希望以一个类似朋友圈的 App 为案例,来向你介绍如何在架构和开发 App 的时候进行工程化实践,降低开发门槛和维护成本,同时还能快速迭代与发布。
之所以选择以一个开发类似朋友圈的 App 为案例,是因为该 App 的架构非常通用,它包含了网络访问、 JSON 数据解析、数据存储,以及响应式数据流处理等功能模块。通过它,我们可以把这一套架构应用到各种场景中,例如电商类 App、生活类的房产App、卖车 App,以及社交类短视频 App,等等。
课程设计与收获
根据实际项目开发流程,我把本课程分为五大部分。
第一部分:配置与规范
在这部分,我主要介绍如何定义和配置一套统一的规范,具体包括:搭建统一的开发环境,使用 CocoaPods 统一管理第三方的依赖库,统一 Project 和 Target 的配置,使用 Swiftlint 统一编码规范,以及使用 Git 和 GitHub 来规范源代码管理流程。
我希望通过这部分的学习,能让你在开发所有的 iOS 项目时更规范。如果你的团队有新成员,它也可以帮助你更好地让新成员接手项目,同时也可以极大减轻团队成员之间的沟通成本。
第二部分:基础组件设计
因为基础组件能够帮助功能模块之间解藕,提高可重用性,还能支撑业务功能的快速开发。所以,我将会介绍如何使用极少的工作量来构建一些非常实用的基础组件。这些组件包括:设计规范组件、路由组件、多语言支持组件、动态字体和深色模式的支持组件。除此之外, 我还会介绍如何使用隐藏功能菜单来分离生产环境与研发环境。
第三部分:架构与实现
随着 iOS 和 Android 成为移动端的两大霸主,为了兼顾两者,有些公司使用 React Native 或者 Fluter 等非官方方案。而我们则致力于使用官方平台所提供的原生技术,通过一套架构设计,使得开发者可以很方便地在 iOS 和 Android 之间进行业务代码的开发。
在这一部分,我会为你详细介绍如何使用 BFF 和 MVVM 来设计一套跨平台的架构。
具体来说,我会详细介绍这套框架中的 iOS 的部分,包括 MVVM 模式中每一层的功能、责任,以及具体的代码实现。同时我还会演示如何通过 TDD 方法来对 MVVM 中每一个功能模块进行单元测试,从而提高代码的质量和有效地降低 App 的崩溃率。
通过这部分的介绍,我希望你能学会如何从零开始设计一个符合你团队具体情况的 App,同时也可以尝试在原有的 App 里面,循序渐进地引入 MVVM 架构来提高代码的灵活性、扩展性和可维护性。
第四部分:上架与优化
在这部分我会介绍自动化上架以及上线后优化的一些技巧。比如,如何统一管理证书与描述文件,如何快速交付,如何灵活支持统计分析,如何借助崩溃报告解决线上的 Bug,如何设置远程开关,如何进行A/B 测试,等等。
我希望你可以在这部分学会搭建一套自动化的流程,来实现无人操作打包、签名、分发与上架,有效提升 App 的交付速度。
第五部分:加餐
缺乏架构设计的 App 都会遇到一些问题,每当一个新的功能,或者更好的技术栈出现后,想要引进来会带来很多麻烦。
比如想支持动态字体或者深色模式,由于最初开发时没有考虑到,后来想要加进这些功能时就变得十分麻烦,几乎需要修改整个 App。所以架构设计的可扩展性、灵活性对产品不断迭代尤为重要。
为了测试架构的灵活性,我就做了一个大胆设想,在不改动任何原有代码的基础上把 UI 层从 UIKit 替换成苹果公司最新的 UI 框架 SwiftUI(下面是 SwiftUI 的实现效果)。在专栏中,我会详细告诉你我是一步步怎么做的。
讲师寄语
如果你已经在 iOS 开发上有 2~3 年的经验,能读懂系统 API 和使用三方库开发绝大部分的功能,想要自己从头到尾架构设计一个 App;如果你平常需要花很长时间做大量的重复劳动,例如管理证书、打包、签名、部署测试设备和上架,迫切想从中解放出来;如果你想提升自己,彰显技术实力,帮助团队规范开发流程,甚至成为团队的技术负责人......
那么,这门课非常适合你。
通过它,你可以掌握一套工程级的 iOS 开发流程。它能让你编写出更高效、易读,易于维护和扩展的代码,同时还能减少大量重复劳动,提高技术工作效率,助你以一当十,成为10x 程序员。
在学习上有一个 721 法则,说的是,一个人的能力习得,70%来自实践,20%来自他人,10%来自培训学习。我希望通过这次实战课程,能让你更上一层楼。
[
](https://shenceyun.lagou.com/t/mka)
《大前端高薪训练营》
12 个月打磨,6 个月训练,优秀学员大厂内推,点击报名,高薪有你!