背景
这篇文章来源于v2ex上的一个帖子:“iOS开发有什么国人写的比较好的书籍推荐?“(原文链接)。这里汇总的基本都是lujie2012
的回答,另外我还附带了一些他与别人的讨论内容。虽然帖子题目是推荐iOS书籍,但设计内容已经超出了这个题目,在我看来其中还迸发出很多有意思的观点,所以就想把内容整理出来。在经过其本人同意之后,有了如下内容,希望对大家有所帮助。
正文
推荐书籍
本人之前是从 Object-C 开始入门 iOS,全部自我学习写项目找工作混饭吃。因为之前犯过大部分 iOS 开发者犯过的错,没有深入学习知识,没有获得长进。我决心重新在 iOS 方向深入认真的投入一次,看自己可以扎入的有多深。
我开始没有关注 Swift,现在 Swift 成熟了,所以决定从头开始学习 iOS 的一切东西。后面 19 年开启 Swift,二次学习 iOS 开发,也感觉到突破了自己头顶那块天花板。我10个月看了10多本自己买的书,还为业务补充了好多知识,有坚持不下去的时候,但是就想把项目上线。最后克服了困难,回过头有收获和总结,我现在爱上了看技术书籍,钻的越细越发现有趣,也想去看算法了。类似写论文一样,没有秘密,直接分析到底。目前在模块化接入 Flutter,React Native,两端开发速度不一样,某些功能由 H5 做,我们就很闲了。现在的目标差不多就是把 Flutter 玩转,基本是二次从头学习 iOS 花了 1 年时间告一段落。
期间啃的书,有些是objccn里喵神的书,这些书对iOS开发帮助还是挺大的,其余都是些比较经典的技术书。
这些书我都看过一遍。(以下是笔者对书籍汇总成的一个表格)
分类 | 书名 |
---|---|
Objective-C | Objective-C程序设计 |
Objective-C高级编程 | |
Effective Objective-C 2.0 | |
Swift | Swift权威指南 |
Swifter 100个Swift2 开发必备Tip | |
Swift进阶 | |
Swift常用算法 | |
函数式Swift | |
iOS | iOS数据库应用高级编程 |
iOS动画核心技术与案例实战 | |
iOS Auto Layout 开发秘籍 | |
高性能iOS应用开发 | |
iOS测试指南 | |
iOS应用逆向工程 | |
LLVM COOKBOOK 中文版 | |
AV Foundation开发秘籍 | |
Core Data 应用开发实践指南 | |
Core Data | |
其他计算机书籍 | SQLITE权威指南 |
图解数据结构与算法 | |
数据结构与算法经典问题解析(Java语言描述) | |
数据结构教程 | |
Java 9编程参考官方大全 | |
Java并发编程实战 | |
深入理解Java虚拟机 | |
深入理解Nginx | |
Tomcat内核设计剖析 | |
C Primer Plus 中文版 | |
音视频开发进阶指南 |
另外需要补充的内容还有,tomcat 源码、nginx 源码、关于 HTTP 协议后端相关的东西。很多东西,写不成书,因为本身没有多少内容,有些东西只有国外有,但是 400 块,没有翻译版本。例如关于布局,从frame-》 constriants-》 archor-》到 StackView 其实苹果也是在不断的提供解决方案,目前最好的布局方案就是 stackview + anchor + constraint,但是没有这么一本介绍这些内容的书,我也是翻边了官方文档,在各自项目中看到蛛丝马迹去思考对比的。
其他学习途径
老话长谈,最好的资料是苹果官方开发者文档,官方的 WWDC Session。为了更深入理解苹果产品,我把历年的 WWDC 都看了一遍,从 2007 年 iOS6到2017年发布iphoneX,每年差不多 100 个介绍最新技术和解决方案的视频,而且内容含金量还非常高。哈哈,学到了很多苹果产品使用高级用法,体验了好多产品介绍。
iOS 开发者一定要关注 boxue 网站,可以的话买个终身会员,下载博主的 app,看看他的项目架构,里面的视频学起来。我 boxue 完成了 156 个 iOS 的视频,终身会员。boxue 的视频看一遍懂一点点,过段时间在看,又有一点点理解,例如 RxSwift,Protocol,Sequence 这些。另外可以结合 objccn 里喵神的那三本书,我是买了一起看的,它会使你对 swift 的写法和运用更高阶,让你的思想更接近 apple 官方或者大牛。例如序列化,持久化,函数编程,这些流行的概念可以带入项目中。
真心经验分享,中文书籍的东西只能看到 30%的技术,英文书籍的东西可以看到 50%,还有 50%在官方英文文档,各位一定要学好英语,在官方找一手资料和解决方案。这样就慢慢可以成为 Contributor,为社区贡献代码和解决方案,成为开拓者了。不然永远只是旁观者,玩技术,就希望把它玩到极致对吧,好比玩音乐,玩音乐的的境界可以看 Vista 2002 年演唱会。
另外,以上学习最难的是什么,是英语水平!!!! 我现在每天学习英语,英语水平上来了,感觉发动机动力杠杠的。二手知识基本过时,想要成为一流,那么英语水平就得要一流,差不多雅思 7 分这个水平。写代码看资料,觉得不是一个等级哦。
感谢公司提供的英语学习网站,https://english-bell.com.tw/default.aspx 。我大概充了 1 万 8,坚持每天 25 分钟的一节课学习 DME,现在学习了 300 天,学习英语推荐:购买朗文当代+DLL ebook + English bell,使用 SKype 上课,菲律宾老师 24 小时可以学习。
更多的讨论
如果学 iOS 都没有用过 CoreData,或者 Sqlite 进行持久化,那么几乎不可能成为高阶程序员。CoreData 固然难用,难学,但是我个人认为必须耐心学完,必须每个项目都使用,里面的设计思想和理论都很有用,每年的 WWDC 都有 session 讲解这一块。
iOS 本身知识的书籍不是很多,更多的是需要你去查阅官方文档去理解学习。有很多内容是涉及视图绘制技术,音频,网络这些,他们本身是最基础的东西,但是苹果没有给你知识辅导,不自学这些,只会使用苹果API,永远都只懂皮毛。觉得 iOS 端没有东西,其实东西多的很,例如 socket 编程,什么语言都可以实现,什么平台都有,但是 iOS 没有告诉你这个很重要,你就不学,不深入,调用一下 API 就好了。其实这才是真正的技术,再深挖就是 TCP/IP 协议,蓝牙协议,学编程要不要学这个呢?学 iOS 要不要学这些呢,肯定的,做程序员,不学这些就永远停留在初中级水平,35岁等着被淘汰。
当你学了这些底层知识,例如7层网络协议,就会明白什么技术和语言都是起始于二进制。字节编码,变成 Unicode,变成语言。那么语言写好的代码,变成什么呢?写好的代码变成汇编语言、command、再变成二进制,用户安装二进制,二进制再在运行环境变成 code,再执行逻辑。不懂编译器原理,怎么优化代码,怎么去做安全加固,反 hook ?
如此思考,HTTP 到数据的展示是最简单的编程工作。最近我在想一切的数据通讯,例如家里的电视遥控器,怎么做数据交互,转换,传播。光波,红外线,wifi,5G,想象最底层的实现和全路径思考才有意思。所以,计算本科教育虽然水,但是现在想想那时候用的滤波器和调制解调器,上模电不知道干什么,现在工作后,慢慢都明白了,这就是本科专业教育的本质和作用。系统的教育才是有意义的,为什么学高数,现在才多少明白了些。
对了,你对加密了解清楚吗? HTPPS 怎么实现的知道吗,看过源码实现吗?程序员对加密都不清楚,那真的不算高阶程序员。openSSL 库,都可以让你玩很久。iOS 也好,Android 也好,只是各自技术封装的一个平台,用于解决一定的问题。当你看透本质了解一个平台真正的东西,那么你也将知道技术的发展都是有着相似的规律的。
有个题外话,iOS 有出路么?你把他当成 HTTP + 页面来玩天花板确实很低,但你以iOS为出发点,研究整个系统体系,那天花板无限高。未来 20 年,领先技术和先进应用基本都会是移动领域带领的变革。
不要觉得iOS开发上限很低,iOS 岗位也很细的,你可以玩日志系统,埋点系统,推送系统,crash 系统,socket 聊天系统,实时在线系统,视频系统,相机系统,地理位置系统,三维系统,AR 系统,声音系统,安全系统。玩的东西多了呢!没有饭吃?没有前途?大部分人是岗位,是项目驱动,我也是,没有事情没有遇到难题就不会进步。但还是要自我驱动,不断往上拔,才能离那个最高处的天花板更近一些。
好比玩音乐,写歌作曲,你能随心所欲组合,基本是就是高级人才了。写代码一样,要玩它,玩技术,不然白费了那些年的教育。对于业务和技术,等你技术积累到一定程度,我个人倾向于先做技术专家靠谱一点。谁是榜样呢? JSPatch 的作者就是榜样,被挖到蚂蚁 P8 !时间对每个人都是公平的,记着不要重复劳动,要迭代你的技术,不断思考。看最底层的书,思考最底层的原理,你就不会迷茫。
问答环节
问:CoreData 有什么特别好的场景使用吗,我做了五年了,都是用的 sqlite 。
答:CoreData 最大的好处是他们的设计思想和结构,可以买来 《CoreData 应用开发与实践》+ 《Core Data》 看看。我也是看了这两本才明白 CoreData 真正的含义,但它也有个很大的缺陷:没有加密!!!!! 大部分项目采用 Sqlite 是为了加密!本质 CoreData 底层也是 Sqlite,它就是对Sqlite的一层封装。你想想手机相册 1 万多张照片,他们的存储和检索,不知相册,官方很多APP应该都用了 CoreData 来实现。会玩 CoreData,肯定会玩 Sqlite 。最好在项目里使用,用着用着就熟练了。Sqlite 做版本管理和迁移更方便,直接 SQL 操作数据库。我的建议是最好两者都学一下,都用起来。
问:我也一直在学习前端跟 iOS,为以后做独立开发者进行技术储备。但我从来不去研究背后深入的技术原理,CSAPP(Computer Systems A Programmer’s Perspective 中译:深入理解计算机系统) 包括操作系统相关的书我至少读了 3 遍,但这些跟 IOS 开发基本上半毛钱关系都没有,因为 APP 跟操作系统原理至少离了十万八千里的距离,另外就是这些底层知识根本用不上,大部分独立开发都是业务驱动的,有钱才有技术研究的需求,除了音频、视频等特殊算法场景,大部分技术方面的需求都是业务驱动的 UI 交互跟业务计算。
答:不争辩,我之前想说明一般程序员和高阶程序员解决问题思路问题。学习 7 层协议,不是造轮子,是知道水的源头。平台语言个有喜爱,萝卜白菜各有所爱,兴趣是最好的老师,好奇心是最好的动力。小程序,Weex,React 不是不会写,API 文档看一下,组件模块用一用,市面上什么样的 APP 搞不定?但是性能优化,高级特性,没有足够功力你能搞定?前端目前大量时间涉及 UI 开发,后端需要算法,如果不自己去补充知识,那么所谓大前端天花板当然低。阿里前端高 P 多还是后端高 P多,当然是后端高 P 多啊。But,不管哪个方向,最重要是成为专家。成为专家只看到自己项目范围内的知识肯定不够,前端不能看后端知识吗?我把 tomcat,ngnix,spring 源码都看过,当然也忘记了,但是我就是想知道数据通道怎么建立,TCP 怎么维护。google 牛皮就是发现目前协议不行,自己改协议、加密算法、HTTP2 通信、消息协议、TCP 协议,它敢于创新和实践。目前的我相对业务和赚钱,我更关注技术,只会应用技术是大部分人,but 要成为专家只有极少数人才可以做到,因为那要学好多东西哦。
再举个例子吧,Rx 这个东西,Java 有 RxJava, JS 有 Rxjs,iOS 有 RxSwift。现在各个平台都是把对方好的设计和轮子拿过来,编程思想和设计思想是一样的。但是因为编程语言和平台业务特性,没有机会接触更好的东西。那么就需要突破官方提供的限制,用编程思想来设计和架构改造自己的项目。如果只安于会基本使用语言,不精通语言,了解背后的逻辑,那么永远是入不了程序员门的。
移动互联网热的时候,培训班培训一下就可以干活,拿高薪。但高薪不应该是你做程序员的唯一原因,互联网发展的本质是技术结合业务,最后带来经济繁荣,技术永远是第一驱动力。而程序员就正是创造技术,运用技术,推动互联网繁荣最关键的一环,作为这个时代的弄潮我们应该很光荣才对。
我个人计划是学习英语+开发,在成为高级开发的同时,不断提高英语水平好,开阔自己的视野。东南亚,海外市场不是没有机会。当然,在目前巨头林立的环境下,你自己单干,那肯定一个浪花就没了。
问:现在 APP 成本过高,中小公司基本都不重视这一块了,而且目前同样三年经验的后端、前端、移动端,iOS 可能属于比较没有地位的了; 看你说的只会写应用层就不行了?一般公司本来就是面向业务编程,能解决业务问题,移动端一般公司哪管你那么多技术问题;还有一个更严重的问题,就是一般去面试 iOS 的公司,面试造轮船的风气实在太重了,大部分进去不就是个 UI 仔嘛,认清现实吧,本人面过其他技术,比 iOS好的多。
答:每个公司开发 APP 都想造航母,现在的确这样。就是大部分进去之后变成 UI 仔,所以我才建议如果从事 iOS 或者移动端开发,一定要自我学习,自我突破限制。我之前和一位同事一起做 iOS 端,后面他转了 JAVA 还升职了。But我始终认为我们项目的技术解决方案和技术不够强,不是没有业务,业务好的很,但是就是感觉移动端开发节奏和技术体系太碎片,每个人一个模块,最后重复劳动,效率还不高。对于这样的现实,肯定需要提升自我去解决,而不是等待机会。也正因此,产生了 Weex,React Native,Flutter 这样快速解决两端,热部署的技术,解放 UI 仔。
不讨论了, 看 Flutter 文档了。iOS 有没有人要,肯定要,前提你真正的热爱写代码,可以分析问题,解决问题,了解编程本质,精通OC、Swift语言,熟练前前后后一个 APP 的全部 API 和细节实现。好比相机,你只会 Github 上找一个高 Star 的库用用是不行的,那你永远不能体会苹果原始 API 设计思路,做不到随心所欲的使用。希望大家有时间多琢磨,想做一个优秀的程序员,放大了说想成为一个优秀的人,都是需要不断学习,不断成长的,大家加油吧!