背景
这篇文章来源于v2ex上的一个帖子:"iOS开发有什么国人写的比较好的书籍推荐?"(原文连接)。这里汇总的基本都是lujie2012
的回答,另外我还附带了一些他与别人的讨论内容。虽然帖子题目是推荐iOS书籍,但设计内容已经超出了这个题目,在我看来其中还迸发出不少有意思的观点,因此就想把内容整理出来。在通过其本人赞成以后,有了以下内容,但愿对你们有所帮助。前端
正文
推荐书籍
本人以前是从 Object-C 开始入门 iOS,所有自我学习写项目找工做混饭吃。由于以前犯过大部分 iOS 开发者犯过的错,没有深刻学习知识,没有得到长进。我决心从新在 iOS 方向深刻认真的投入一次,看本身能够扎入的有多深。nginx
我开始没有关注 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,可是没有这么一本介绍这些内容的书,我也是翻边了官方文档,在各自项目中看到蛛丝马迹去思考对比的。spring
其余学习途径
老话长谈,最好的资料是苹果官方开发者文档,官方的 WWDC Session。为了更深刻理解苹果产品,我把历年的 WWDC 都看了一遍,从 2007 年 iOS6到2017年发布iphoneX,每一年差很少 100 个介绍最新技术和解决方案的视频,并且内容含金量还很是高。哈哈,学到了不少苹果产品使用高级用法,体验了好多产品介绍。sql
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 设计思路,作不到为所欲为的使用。但愿你们有时间多琢磨,想作一个优秀的程序员,放大了说想成为一个优秀的人,都是须要不断学习,不断成长的,你们加油吧!