You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
11 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 01 | 建立你自己的iOS开发知识体系
你好,我是戴铭。
这是我们专栏的第一篇文章。所谓知己知彼今天我们先来聊聊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的开发流程开发、调试测试、发布、上线进行了划分如下图所示。
![](https://static001.geekbang.org/resource/image/d1/15/d17804a152749a15e969ab9f5f6cb515.png)
我们在**开发阶段**需要掌握的基础知识,主要包括:启动流程、页面布局和架构设计。
* 启动的快慢可谓App的门面同时关乎日常的使用体验其重要性不言而喻。而只有了解了App的启动流程才能合理安排启动阶段对功能初始化的节奏将启动速度优化到极致。在专栏的基础篇我会和你一起剖析App启动时都做了哪些事儿让你可以掌控App的启动。
* 界面是开发App的必经之路是一定绕不开的如何提高界面开发的质量和效率一直是各大团队研究的重要课题。那么我在专栏中和你介绍、分析的目前界面开发的趋势就可以帮你夯实界面这块内容的基础。
* 架构怎么设计才是合理的,也是这个阶段需要探索的一个重要课题。毕竟每个团队的情况不一样,什么样的架构能够适应团队的长期发展,就是我在这个专栏里要和你好好说道说道的。
在**调试测试阶段**,我们需要掌握的主要就是提速调试和静态分析的内容。
* iOS 开发的代码都是需要编译的。那么,程序体量大了后,编译调试过程必然会变长。而有啥法子能够将这个过程的速度提高到极限,就是我要在这个专栏里面和你分享的了。
* 对 App 质量的检查,分为人工检查和自动检查。而质量检查的自动化肯定是趋势,所以自动化静态分析代码也是这个专栏会讲的。
在**发布阶段**,我们需要做些和业务需求开发无关、涉及基础建设的事情。这部分工作中,最主要的就是无侵入埋点和包大小优化。
* iOS 安装包过大会导致4G 环境下无法下载的情况,所以对包大小的控制已经成为各大公司最头疼的事情之一。希望我在包大小瘦身上的经验能够帮到你。
* 发布前需要加上各种埋点,这样才能让你充分地掌握 App 运行状态是否健康,同时埋点也是分析上线后遇到的各种问题的重要手段。但是,如果埋点的代码写的到处都是,修改和维护时就会举步维艰。所以我在这个专栏里,也会和你分享一些好的将埋点和业务代码解耦的无侵入埋点方案。
在**上线阶段**,开发质量的高低会影响上线后问题的数量和严重程度,比如有崩溃和卡顿这样导致 App 不可用的问题,也有性能和电量这样影响用户体验的问题。对于这些问题你一定不会袖手旁观,那怎么才能监控到这些问题呢?怎样才能够更准确、更全面地发现问题,同时能够收集到更多有助于分析问题的有效信息呢?
在这个专栏中,我会从崩溃、卡顿、内存、日志、性能、线程、电量等方面和你一一细说。
# 应用开发
应用开发部分,我们需要关注的就是一些经典库,因为这些经典库往往出自技术大拿之手,代码结构和设计思想都非常优秀,同时经过了大规模的实践,不断打磨完善,具有很高的质量保障。比如:动画库 Pop响应式框架 RAC、RxSwiftJSON 处理库 JSONModel、Mantle等。
![](https://static001.geekbang.org/resource/image/f9/2b/f9d371fe15b45db8a6eddbab3fc2962b.png)
在专栏里,我会和你好好介绍下布局框架新贵 Cartography 和富文本霸王 YYText 、DTCoreText ,分享我的使用经验,让你也能够快速上手并应用到你的 App 中。
应用开发中和视觉表现相关的 GUI 框架、动画、布局框架、富文本等部分知识掌握好了,直接能够让用户感知到你 App 的优秀表现。响应式框架、TDD/BDD、编码规范等知识能够让你的开发更规范化、更有效率。我会从实践应用和实现原理的方面带你全方位地去了解如何更好地进行应用开发。
有道是选择大于努力,可能你使用一个不恰当的库所做的大量努力,也不及别人用对了一个好的库轻轻松松、高质量完成的任务。
# 原理模块
说到iOS开发原理主要就是系统内核XNU、AOP、内存管理和编译的知识。这些知识具有很强的通用性其他任何语言、系统和领域都会涉及到。
![](https://static001.geekbang.org/resource/image/dd/c1/ddfa2f3959b62291d33d8d5af1708dc1.png)
在接下来的专栏里,我会为你剖析这些知识,希望能够帮助你更好地理解它们的原理。掌握这些通用知识,可以提升你的内功,助你打通任督二脉;深挖知识,可以帮你理清楚开发知识的规律,达到融会贯通的效果;掌握通用知识,也能够让你对未来技术见招拆招。所以,你花在这部分知识上时间,绝对是超值的。
# 原生与前端
随着 Flutter 和 React Native 越来越完善,关注的人也越来越多。原生还是前端,才是移动应用的未来,谁都没法说得清楚。有句话怎么说来着,无法选择时就都选择。
在原生与前端这个部分,我会着重和你分析隐藏在这些时髦技术背后的解释器和渲染技术,也正是这些技术的演进造就了目前跨端方案的繁荣。
![](https://static001.geekbang.org/resource/image/07/65/076882bee87fbd25defdbde0c1d6e765.png)
值得一说的是,从 H5 到 Flutter渲染底层图形库都使用的是 Skia。也就是说这么多年来渲染底层技术就基本没有变过。而且向Flutter 的演进也只是去掉了 H5 对低版本标准的支持。但,仅仅是去掉这些兼容代码,就使性能提升了数倍。
所以说,对于新的技术如何去看,很重要,先不要急着深入到开发细节中了,那样你会迷失在技术海洋中。你需要先建立好自己的知识体系,打好基础,努力提升自己的内功,然后找好指明灯,这样才能追着目标航行。
最后我来把整个专栏中涉及到的基础、原理、应用开发和原生与前端的知识梳理到一起就形成了如下图所示的iOS知识体系。
![](https://static001.geekbang.org/resource/image/ec/1f/ec339916b408ae3c86a5ee237ae3dc1f.png)
# 小结
今天我跟你说了 iOS 开发中哪些知识是需要着重学习的,以及怎样将这些知识体系化。在学习知识的道路上,我的建议是求精、求深,基础打牢,以不变应万变。在工作上,则要注重开发效率,避免不必要地重复造轮子,理解原理和细节,同时开阔眼界,紧跟技术前沿。
说到底,不要急着看到啥就去学啥,有目的、有体系地去学习,效果才会更好。即使工作再忙,你也要找时间成体系地提升自己的内功,完善自己,然后反哺到工作上,让工作效率和质量达到质的提升,进而从容应对技术的更新迭代。
按照知识体系高效学习是很棒的,会让你成长得很快。不过,有时找个咖啡小店,随便拿起一本书翻翻,或者随便挑几篇平时收集的文章读读,再拿出小本子记记笔记,也不失为一种很佛系的学习方式,毕竟生活中总是需要点儿惊喜不是吗。
感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎把它分享给更多的朋友一起阅读。