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.

137 lines
18 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.

# 用户故事 | 我是如何学习这个专栏的?
你好,我是戴铭。
专栏上线后,有些同学觉得学起来太吃力,也有些同学觉得学起来很顺利,那么这中间是因为学习方法的问题吗?有道是,方法比努力更重要,只有找到适合自己的学习方法,才能达到事半功倍的效果。
因此我今天特意邀请了4位同学来分享他们学习专栏的方法这不仅是要给各位同学提供一个分享自己故事的平台更是希望这些同学们分享的学习方法能够让其他同学受益从而帮助你可以更高效地学习专栏内容。
## 小万叔叔
你好,我是小万叔叔,目前在某鱼带领 iOS 架构组团队做一些工程优化方面的工作。我希望通过自己不断地学习、积累,可以把握团队的技术方向,进而把架构组发展成一流的技术团队。
其实,我在很早之前就知道戴铭老师,也看过他写的很多文章。这些文章,给我的总体感觉是有深度,有独特的见解。因此,当我在微信里面看到有分享订阅的时候,就第一时间订阅了。
说到专栏文章的学习时机,我一般是在文章更新后,当天早晨的上班路上去听。因为我对大前端技术非常感兴趣,所以听音频的时候自然也就比较专注,可以比较轻松地吸收文章中好的建议和思路。
说到学习专栏文章的方法,我的学习方式可能和其他同学不太一样。大部分同学应该会跟踪一个知识点,学习完专栏文章然后落地到实践,就类似看了专栏文章,然后做课后学习的方式。而**我的学习方法是,会看很多文章,然后把这些知识点汇聚到一起,落地到一个项目中。也就是说,我更希望的是我所学的知识能构成一个体系。**
比如说包大小优化就是一个明显的案例我在做包大小优化时用到的方案中汇聚了头条团队的一些技术分享图片格式的存储算法、识别算法源码格式的二进制内容CocoaPods 打包的方式等等,这些所有的知识点才能构成整个项目的推进树。
目前来看,这个专栏课程中提到的很多技术,我们都在实践,并且在持续优化,希望能做得更好。比如,在专栏的[第4篇文章](https://time.geekbang.org/column/article/86522)中,戴铭老师谈到了架构如何设计得更合理,也是我们目前在做全量组件化痛并快乐的一个过程,从最开始组件之间的严重耦合,到划分好相关的层级,业务组件按一定粒度进行划分,然后通过路由中间件进行解耦调用,都和我们全量组件化一路走来的过程极其类似。也许,这就是大型业务从堆积到细分,以适应未来业务变迁必须要经历的过程。
针对已经更新的三十多篇文章我的感触是从架构、性能监控、测试到代码规范涉及到了iOS开发的方方面面。与我而言很多内容都没有作者看得深所以在工程实践的过程中我也在不断地扩充自己的知识面去更深入地理解背后原理。也正因为如此这个专栏确实让我受益匪浅。
如果说让我感触最深的文章的话,就是讲[App包瘦身](https://time.geekbang.org/column/article/88573)的那篇文章。我所在公司的业务体量庞大而且由于前期的业务堆积没有处理好App包的问题导致App安装包的大小一度高达270MB。经过我们的努力现在的包大小在170MB左右而且仍在继续瘦身中。
总结我们的实践经验,再匹配这篇文章的内容,我们主要是从两个方面做出了努力:
1. 图片优化方面包括图片格式、Assert 分包、无用图片等方面的优化,为我们缩减了近 50% 的包体积。
2. 在二进制代码瘦身这块,我们做的更多的是,静态库和动态库的平衡、无用代码的删除精简、多套功能同化组件的合并统一。专栏文章里面提到的运行时检查类的方法,是我以前没有想到的。所以,我也会在接下来的二进制减包工作中,继续落地实践这个思路。
对于还在犹豫是否要购买《iOS开发高手课》的同学我的建议是 不管是否是初学者,里面涵盖的信息量和思考问题的方式,都值得你去购买。
## 谭鹏
你好我是谭鹏是河南省郑州市的一名iOS开发者。从2011年底的第一份工作开始到现在我已经工作快8年了。
在订阅《iOS开发高手课》专栏之前其实我已经通过工作实践、阅读相关技术资料积累了不少iOS开发知识。或许和我不擅于总结有关这些知识都是零散的没能构成属于我自己的知识体系。
比如说我了解iOS的底层原理对RunLoop、Runtime、KVC、KVO、多线程、内存管理这些都很熟悉了但也仅限于记忆并没有进行深入挖掘进而形成自己的输出更没能用这些知识储备去优化App性能。
因为我清楚自己的短板在哪里,在看到这个专栏的目录以及开篇词之后,发现这个专栏包含的知识非常系统,加之我现在的工作重心就是性能优化、架构,所以我就毫不犹豫的订阅了。等真正开始学习的时候,我发现专栏文章,大多是实战经验的总结,无论从知识的广度还是深度来看,内容都相当不错。
在我看来学习专栏文章的过程是和工作相结合的过程也是扩展自己知识边界的过程。比如我自己做原生开发的时候使用过Promise但是从来没想过要使用Promise的思想去解决一些问题。学完专栏的[第25篇文章](https://time.geekbang.org/column/article/93817)后我就马上在项目中引入了PromiseKit解决了多个网络请求串行的问题。
在学习完专栏文章之后,可以快速在工作中应用实践,实践的结果又会反过来扩充自己的知识体系,并增加学习的成就感、激情。这是一个正向反馈,可以让我不断地提高自己。
使用极客时间的这段时间,**我的最大感触就是,高效学习,需要先搭建知识的金字塔结构。 有了完善的知识结构,我们才能看到完整的知识地图,学习起来才能做到有的放矢。**
所以当我们在选择学习资料的时候还需要结合自己的实际情况以尽量完善自己的知识结构为目标。比如说iOS开发者要想提升自己想要成为一名高手的话就不能只盯着具体的语言比如Objective-C和业务逻辑还要在iOS底层原理、跨平台开发、网络协议、数据结构和算法等方面多下功夫。
因为,只有具备了完整的知识结构,我们才能走得更远。
## 大太阳
你好我是温超是一个北漂三年有余的iOS开发工程师。你也可以叫我大太阳因为我喜欢阳光也很乐观所以就用了这样一个昵称。现在我在一家做教育的互联网创业公司工作。在这之前我还做过棋牌游戏所以现在的工作也算是跨界啦。
其实我以前也听说过极客时间这个平台但是真正接触还是从戴铭老师的《iOS开发高手课》开始。让我订阅这个专栏的原因在于课程目录以及开篇词中的“我们程序员都是手艺人”这个观点这些内容真的是都说到我的心坎里了。
百度百科是这么解释“手艺人”的:以手工技能或其他技艺为业的人,包括陶工、瓦工、铁匠、织工、木匠、厨子等等,也包括米开朗基罗等文化艺术巨匠。在我看来,能创造、会精心打磨作品,正是广大技术开发工程师的标签。
千里之行始于足下,订阅课程是我们迈出学习之路的第一步,那接下来的路要怎么走呢?在此,我就和你分享一下我的学习方法吧。
在我看来,**当选择一种资料去学习一门知识时,最重要的是要弄清楚自己要收获什么**。这也很好理解只有当我们知道自己要什么以后才能有足够的动力去学习。可能同学们接触iOS开发的程度不同对自己需要学习的iOS知识的认知也不同。针对我自己的情况来说 在我还没开始学习之前我就清楚自己的弱点以及想要理解、学习的知识点。比如我的iOS基础薄弱对Runtime、RunLoop的原理掌握得不够透彻也没有过大型项目经验等等。
现在,这个专栏每更新出一篇文章后,我都会第一时间去收听音频,先对这篇文章涉及了哪些知识点、这些知识点的难度如何、我需要花多少时间去消化等问题,有个大概的了解。接下来,我会再去看对应的文稿,根据自己的情况进行针对性的学习,查找些相关的技术资料,并且一定要动手去做。正如戴铭老师在开篇词中所说,对咱们手艺人来说,不动手都是空谈,只看不练是不会有进步的。
对有些同学来说,专栏更新的速度可能有些快,前面的知识还没吃透,这时候要怎么办呢?我的建议是,不要着急,踏踏实实地学习,能学明白一个就是一个,学到就是赚到。
但是,当我们遇到一个难啃的知识点时,尤其是你已经在这上面花了很长时间了,那我的建议是不要一直钻牛角尖,你可以先去学其他的知识,等你觉得自己又思路了再回过头来继续钻研的效率会更高,这也是一种曲线救国的思想吧。
因为,很多知识都是相通的,就和链表一样,有的知识点是单向链表,有的是双向链表,而有的是循环链表等,你可能在学习其中的某一环,当你了解到它的上一个节点的知识点之后,你就能更快地学会这个知识点啦。
之所以这么说,是因为曾经在一个项目开发的初期,我因为语音播放的问题钻了牛角尖,导致项目工期延后了三天。其实,在我第一天卡在这个问题上的时候,技术老大就劝我说可以先写其他部分代码,然后再回顾头来解决这个问题。但当时我坚持己见,一直到把这个问题解决完才继续写其他部分的代码。等到项目上线后,我才反应过来,当时就应该先把这个问题放一放,等有思路了再去完成这部分代码,就不会有延误工期的事情了。
上面这些内容就是我学习这个专栏的方法和情况了。接下来我想再和你聊聊戴老师的《iOS开发高手课》。
说实话,大家在订阅一门课程的时候,看到的只有简介、目录和开篇词,很难去判断值不值得我为此付费。那么,关于这个专栏,我可以肯定的和你说,它值得。
就目前已经更新的三十多篇文章来说其中涉及的知识点需要我下很大功夫才能掌握。毕竟这些内容与我来说都是干货而且涉及的这些知识点是我们在iOS开发过程中真真切切会遇到的需要也值得我花时间去思考、去学习、去实践。
对我来说从我做iOS开发到现在一直没有在一个像样的、大规模的公司工作过而且基本上都是独立开发遇到问题基本上都是自己解决。这个过程就要求我必须不断地去了解、去学习相关的知识。
不是说通过这种方式学习的知识不深刻而是会很零散没有系统的知识脉络。在这之前我也通过其他平台尝试了很多iOS开发相关的课程、学习资料但效果一般没有沟通和交流感觉我就是在孤立、被动地学习。
相比之下,在极客时间这个平台上,同学们可以在评论区各抒己见,分享自己遇到的问题,以及对应的解决方法,作者还会帮我们解答那些我们自己解决不了的问题,这让我感觉收获非常大。我可以看到自己的问题,也可以通过其他同学的分享去避免自己犯类似的错误。所以,每篇文章后面的留言我都会认真看,除了收获知识外,我也更加坚定自己还有很大的进步空间。
在我看来,这才是一个正常的学习交流模式。
除此之外我还想对广大的对iOS开发有兴趣的同学们说几句只有你去做了才会知道自己的能力多强自己的不足在哪里自己有需要提高些什么。学习是一个持续的过程知识是不断积累的如果你想深入了解iOS开发你想成为一名优秀的iOS开发者或者是想要多学习与iOS相关的课程的话那就和我们一起来学习这个专栏吧。
## 冷秋
你好,我是冷秋,从事 iOS 开发有3 年了,现在瑞幸咖啡厦门总部负责 iOS 平台架构工作。
作为开发者,业务大多是重复性工作,你并不会因为多两年经验而有多么明显的竞争力。你要想比别人优秀,就必须跳出业务圈子,学习业务之外的知识,这样才能获得更高、更快的成长。所以,我每天都会抽出两到三个小时的时间,去学习,去丰富自己的知识体系。
在通过网站来学习iOS开发知识这件事儿上我总结得出入门级的内容超过90%都是重复的,而进阶级的内容你又要花时间去确认正确性的问题。而我们要利用好有限的时间去高效学习的前提,就是要学会挑选适合自己的学习资料。
所以当我在看到戴铭老师的《iOS开发高手课》专栏时就毫不犹豫地订阅了。当然在这之前我就知道戴铭看过他很多的技术分享干货十足而且尤其喜欢他PPT的风格佩服他能把事情做到极致的匠人精神。
说到我是如何学习专栏文章,或者其他资料去完善知识体系的,我觉得最重要的是要找到适合自己的方法,并养成一个良好的习惯持续学习。
对于任何一个开发人员来说,他的成长路径都是从 0 开始。那,对于 0 基础的入门同学,我总结了一个**由浅入深的学习步骤:会基本使用–>会完全使用–>会自己改造–>会自己创造。**这些步骤的谓语都是**一个库**或者是**一个工具**。而在这整个的学习过程中,都离不开一个词,也就是**举一反三**。
接下来,我以一个发送网络请求的问题为例,和你分享我是怎么用这种方法去学习的。
在日常开发中,我们经常会遇到问题,而这些问题就是学习的起点。遇到问题后,我们通常会在网上寻找解决方案,而解决方案可能就是一个库,或者一个工具。假设我需要发送一个网络请求,搜到了 AFNetworking于是就开始了对网络框架的学习。
**第一个阶段,会基本使用**。通常我们遇到的问题大概率是紧急的所以找到一个解决方案时看一些基本的使用文档然后复制粘贴地开始使用了。这对新手来说是没问题的但我建议你可以多去思考一层而不是简单地去copy。
比如说,你可以举一反三。除了 AFNetworking外还有别的库也可以解决这个问题吗 这时你需要在网络上进行深入搜索查看更多的类似分享然后就会发现还有很多网络库可以发请求。你可以先粗略看一下这些库的接口差异选择最适合自己的网络库而不是一定要用AFNetworking。
**第二个阶段是,会完全使用**。解决完发送网络请求的问题后你又遇到了更多的网络问题依旧需要靠AFNetworking来解决。但前提是你需要对这个库有更深的理解。
而深入理解一个三方库的最好办法,就是阅读官方示例以及文档,甚至阅读源码。因为,我们从其他技术文章里面得到的大多是基础用法,距离你了解这个库的所有功能,进而去更优雅地解决问题还差很远。
到这个阶段你还可以举一反三针对AFNetworking这个网络库去思考更深入的问题。比如说除了网络请求AFNetworking 还能帮我解决什么问题吗?
通过阅读AFNetworking的源码你可以了解到AFNetworking还有很多很强大的功能。比如AFNetworking不仅能支持传递明文的 JSON 数据,同时也能支持各种类型的加解密;除此之外,还能帮我监控当前的网络环境,是离线还是 4G 还是 WiFi可以让你在即将有大流量消耗的操作前提示用户是否继续。
**第三个阶段是,会自己改造**。随着业务发展,现有的网络库可能没办法支撑你的业务需求,你需要考虑改造现有的网络库。此时,你就可以根据之前阅读的源码,掌握大佬的设计思路,并按照这个思路去修改和扩展 AFNetworking。
在此基础上,你可以继续举一反三。你通过搜索发现,另一个网络库可以解决你的问题,这时你可否考虑手动修改现有的网络库,来增加其他网络库的功能呢。
**第四个阶段,会自己创造**。你在App开发过程中会用到大量的第三方库可以通过阅读源码去了解它们的设计思想。这样当你遇到现有的第三库不能解决自己的问题时就可以通过这些设计思想去封装一个库来使用甚至开源出来供其他人使用。
我认为创造是学习的最后一步。当你开始创造自己的网络库时所考虑的就不仅仅是接口调用了还要考虑接口设计的易扩展性等甚至还要去深入学习HTTP 传输协议,以及其他平台的网络库的设计思路。相比于会基本使用,这时你学习到的知识将会更加全面。
这时,你可以再举一反三。在开发 App 过程中你为解决网络问题开发了一个库。你可以将这个库的接口设计得更完整将架构设计得更灵活易扩展使得它可以被用于公司的其他App。然后你可以将这个库从App中独立出来变为一个大家都可以用的私有库甚至将它放到GitHub上供更多的开发者使用、完善其功能。
这就是我这几年来一直在坚持的学习方法了而关于学习时间我习惯在每天的早晨和临睡前花上2~3个小时去阅读些技术资料来提升自己。我坚持每天利用好好这两三个小时的时间直到现在这已经形成了我的习惯。
希望我的分享,可以对你有所帮助。
在最后我特别感谢这4位同学的分享。如果你也有自己的故事想要分享欢迎在留言区分享。我会在发布结束语的时候选出留言点赞数最高的那位同学送出一份“学习加油礼包”期待你的故事。