00
说起 iOS 开发,自然是绕不开 iPhone 和 App Store 这两个词。
多少年过去了,我依然记得 2007 年乔布斯发布第一代 iPhone 时的场景,
可以说,那款 iPhone 重新定义了很多人对于手机的认知。
那一天,也是移动互联网时代的开端。
紧接着,在 2008 年 7 月的 WWDC 苹果全球开发者大会上,
苹果宣布 App Store 正式对外开放,这也意味着属于开发者的移动互联网时代真正开始了。
一转眼,十多年过去了,移动开发早已飞入寻常百姓家,
移动 App 基本成为了大众互联网产品的标配。
从技术角度看,这些年来移动开发领域相继诞生了组件化、热修复、动态化、大前端、Flutter、小程序等热门技术,
给人一种“乱花渐欲迷人眼”的感觉,它们争先恐后地成为行业焦点,
然后又在不知不觉中被后来者替代,最后再逐步淡出开发者的视野。
在我看来,这些技术看似过眼云烟,实则是递进式推动着移动技术的演进。
这些技术看似“纷繁杂乱”,实则是殊途同归,
它们背后都是一些通用的底层技术和创新的设计思想。
比如,热修复、动态化和大前端的底层技术,都是 JavaScriptCore 这样的 JavaScript 虚拟机技术;
再比如,大前端和 Flutter 的渲染,使用的都是 WebCore 中 Skia 这样的渲染引擎。
所以,每当我串起来整体看移动开发领域这些年的这些“新”技术时,总是会感慨说“万变不离其宗”。
我就觉得如果我们能深入进去把某一门技术研究透彻,那再拿下其他的技术时就会变得轻车熟路。

以组件化为例,它是顺应着 App 从单一业务到多业务汇聚的演进而出现的一门技术。
比如微信刚发布时业务单一,就只有聊天的功能,
后来又加上了支付、朋友圈、游戏,再等到小程序功能上线后更是打车、电影票、购物等只要你能想到的需求它都有,
俨然成为了一个超级平台。
从本质上讲,组件化是将上层业务隔离开,下层提供通用能力的一种架构模式,
这样上层业务团队可以分开从而减少团队沟通成本,
下层能力的通用性又反过来提高了各个业务团队的开发效率。
为了达到不同业务隔离的结果,解耦手段不断被引入到 iOS 开发中,
比如使用协议或者中间者模式在运行时统调等方式。
听到这里,你还会觉得组件化技术陌生吗?
并不陌生,它的核心思想就是解耦。
只要你把这块研究透彻了,那再理解与解耦相关的其他技术架构也就水到渠成了。

我们再以热修复为例,如果你看过相关的热修复技术源代码或者架构图的话,
应该不难发现热修复技术的核心引擎主要就是 JavaScriptCore,
它要求原生开发者使用 JavaScript 来编写代码。
而为了方便原生开发者,热修复引擎最大卖点就是将原生 Objective-C 代码转成 JavaScript 代码然后让 JavaScriptCore 去解释。
这样一个代码转换过程其实就是通过编译技术来实现的。
同时,在目前正流行的这波大前端和小程序浪潮中,
各种大前端技术都对 Web 标准做了大量限制,
定义了自己的规范模板。
这些自定义的模板最终都会使用 Babel 这样的前端编译技术将其编译成 JavaScript 代码,
然后再交给 JavaScriptCore 解释调用原生渲染。
所以,你看,只要掌握了热修复中的核心技术,就不难理解小程序的实现原理。
一切看起来就是那么自然。

最近圈子里又开始流行 Flutter 了,
在 Flutter 这波浪潮还没有全面落地铺开前,
很多人就开始关心:下一个热点会是什么?
其实我觉得大可不必在乎,
你只要静下心来好好消化掉这几年浪潮留下的关键技术,
在这个基础上再去理解各种“新技术”,必然会驾轻就熟。

最后,再说个你最能切身体会的企业招聘对于 iOS 开发者的要求。
以前对工作经历只要求有过完整独立完成的 App 上架就够了,而现在如果你缺少大型项目经验,团队规模小,
没有好的提质提效开发经验,在应聘时的竞争力会大打折扣。
但,这并不是 iOS 领域的个体问题,
任何一个领域其实都和移动领域一样,从小型到大型,从个人到团队,从低效到高效,从凑合够用到高要求。
比如说,后端开发领域伴随着互联网的发展,也有过同样的经历。
你会发现,在一些公司从后端晋升到更高级别的开发者会更多些。
这就是因为后端开发领域很早就从小规模开发转变成了大规模开发,
在这个过程中已经整体经过了大量的演进,
对于开发人员的要求也在逐步提高,
特别是对系统架构的稳定和灵活设计能力的要求,
还有对工程质量和规范效率方面的高要求。

我有幸深度经历了移动技术和后端技术的演进过程,
并在工作中进行了深度的调研和研究,
最终将成果落地到各个项目中。
在 iOS 技术发展的过程中,
我的知识也得到了递进式提升,
也最终被运用到了实际工作中,
比如组件化方案落地、大前端建设、应用开发阶段效率的提升、上线后各种难点问题的解决等。
在这个专栏里,
我会针对移动开发这些年演进过程中沉淀下来的那些技术,
那些支撑着 iOS 迈向更稳健、更成熟的技术进行详细而系统的输出。
同时,我也会提出自己的一些思考,
包括对于各种技术后面发展的方向和可能性的想法。

接下来,我跟你说下专栏大致内容构成和写作思路。
移动开发面对的也是计算设备,
和后端一样也要监控和解决设备的内存和线程等性能问题,
编程的本质就是要解决问题,无论是需求、开发、调试、线上问题都需要编程来解决,
而代码是开发者的唯一武器。
所以,在第一部分的基础篇,我会围绕着如何解决 iOS 开发各个阶段的问题展开。
这是编程的基础,没有这个基础其他都免谈。
同时,解决问题的扎实程度,也决定了你在面试中的竞争力。

iOS 开发者更多的是面向用户界面和交互的开发,
而在界面、交互以及数据通信处理过程中存在大量的重复工作,
因此我会在第二部分的应用开发篇里,给你推荐一些经典好用的第三方库。
用好这些库,能够帮助你大幅提高应用开发的效率。

同时,我也会带你去探究这些优秀库的背后原理和实现思路,
当你面对千奇百怪的需求时,也能够开发出适合特定需求的库。
说不定下一个经典的第三方库就是由你开发的呢?
如果你希望自己能在技术能力和职级上得到晋升,
在碰到问题时不再被动地见招拆招,
而是按照自己的套路主动出击化险为夷,
那么对于底层原理的深入学习就非常必要了。
在这个过程中,你还能学到前辈解决问题的思路,
这将让你收获颇丰。
所以,在第三部分的原理篇,我会专门针对一些底层原理,
比如 XNU、内存管理、编译等进行分享,
期待能够激发起你的学习兴趣,让你内力大增。 所谓良药苦口,底层知识的最初学习过程一定是辛苦的,
只有目标和意志非常坚定的那群人才能坚持下来。
但是,当你利用这些知识造出更好的轮子时,
那种成就感是你在舒适区获得的愉悦感无法比拟的。

iOS 开发技术的演进和前端是齐头并进的,
前端从开始的 H5 Hybrid 容器“陪跑姿态”转变为以 React Native 这样的技术为支撑的“助跑角色”,
还有 Flutter 这种新原生技术期待能够主导 iOS 的开发,
最后小程序这种产品形态主打生态牌,
而技术上返璞归真采用 Hybrid 技术又将前端技术重新拉回舞台。
面对现在这种原生与前端共舞的情景,
我会在第四部分帮你拆解各种技术细节,
以及它们之间的内在联系,
以便帮助你站在更高的视角去判断未来的技术走向和趋势。
晋升到更高位置的你,对未来技术走向的判断将尤为重要。

最后,我希望你能认真动手完成每篇文章后面的课后作业。
对于咱们手艺人来说,不动手都是空谈,
就像绘画教程,光看不练,是不会有进步的。
这就如同九阴真经的口诀,铭记于心后还需要常年累月的修炼才能精进。
动手就会碰到问题,就会思考,这个主动过程会加深你的记忆,
这样后面再碰到问题时,你会更容易将相关知识串联起来,
形成创新式的思考。 好了,今天的内容就到这里,
如果可以的话,还请你在留言区中做个自我介绍,
和我聊聊你目前的工作、学习情况,以及你在学习 iOS 开发时的痛点,这样我们可以彼此了解,
也方便我在后面针对性地给你讲解。
加油,让我们一起静下心,沉到具体的技术里,潜心研究。
01
这是我们专栏的第一篇文章。
所谓知己知彼,今天我们先来聊聊 iOS 开发需要掌握哪些知识,
以及如何把这些知识融会贯通,进而形成一套成熟的知识体系。

我们现在所处的互联网时代,学习资料真的是非常完备。
比如,GitHub 上各领域的 Awesome 系列,就是专门用来搜集各类资料的,
其中 [iOS 的 Awesome](https://github.com/vsouza/awesome-ios) 里面,
就涉及了 iOS 开发的各个方面。

但知识掌握的牢固、精细程度,是根据学习资料收集的多少来衡量的吗?
当然不是了。

相比于以前的资料匮乏,现在的情况往往是大多数人手里资料一大堆,
但真正消化吸收的却是少之又少,用到相关知识时总有种“书到用时方恨少”的无奈。
毕竟,人的精力是有限的,根本无法完全掌握这些被轻松收集来的资料。

再看看我们身边那些“厉害”角色,
他们并不是样样精通,而是有擅长的领域。
从我接触的这些“大神”们的成长经历来看,都是先深挖某一领域,
经过大量的学习和实践后理解了编程的本质,
从而可以灵活调配和运用自己已经积累的知识。
在这之后,他们再探索其他领域时,
就做到了既快又深,成了我们眼中的“大神”。

所以,学习 iOS 开发这件事儿,
不要一开始就求多,而要求精、求深。
因为,条条大路通罗马,计算机的细分领域虽然多,
但学到底层都是一样的。

就比如说,很多 iOS 开发者,
刚学会通过网络请求个数据、摆摆界面弄出 App 后,
看到人工智能火了就去学一下,
区块链火了又去学一下,
前端火了又开始蠢蠢欲动。
但结果呢?每一门技术都学不深不说,学起来还都非常费劲。

因此,我的建议是不要被新技术牵着鼻子走,
而是努力提升自己的内功,
这样才能得心应手地应对层出不穷的各种新技术。

接下来再回到专栏上,
我希望这个专栏能够结合自己的成长经历,
与你分享核心且重要的 iOS 开发知识。
这些知识,不仅有助于你平时的开发工作,
能够提高你开发 App 的质量和效率,
还能够引导你将各类知识贯穿起来,
进而形成一套自己的核心且有深度的知识体系。

形成了这套知识体系后,
当你再学习新知识时,
就会更加快速和容易,
达到所谓的融会贯通。

举个例子,iOS 动态化和静态分析技术里有大量与编译相关的知识。
编译作为计算机学科的基础知识,
除了 iOS 开发,在跨端技术 Weex、React Native,
甚至前端领域(比如 Babel)都被广泛使用。

但是,这些知识的学习也要有所取舍,毕竟精力有限,
而且我们也确实需要一些“立竿见影”的效果来激励自己。
那么,我们应该先学习哪些知识,才能快速提高日后学习和工作的效率呢?
接下来,我就和你分享一下我脑海中的 iOS 知识体系,
帮你梳理出要重点掌握的核心知识脉络。

iOS 的知识体系,包括了基础、原理、应用开发、原生与前端四大模块。
我认为好的知识体系首先需要能起到指导 iOS 应用的开发和发现并解决开发问题的作用。
所以,这四大模块的设置初衷是:

基础模块的作用,就是让你具有基本的发现并解决开发问题的能力;
应用开发模块,就是用来指导应用开发的;
好的知识体系还要能够应对未来变革,也就是需要打好底子掌握原理、理清规律,看清方向。
所以,原理模块的作用就是帮你掌握原理和理清规律,而原生与前端模块会助你看清方向。

接下来,我就为你一一细说这四个模块。

基础模块
我把 iOS 开发者需要掌握的整个基础知识,
按照 App 的开发流程(开发、调试测试、发布、上线)进行了划分,如下图所示。