Showing Posts From

程序员

一位iOS开发者的进阶之旅

背景 这篇文章来源于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.0Swift Swift权威指南Swifter 100个Swift2 开发必备TipSwift进阶Swift常用算法函数式SwiftiOS iOS数据库应用高级编程iOS动画核心技术与案例实战iOS Auto Layout 开发秘籍高性能iOS应用开发iOS测试指南iOS应用逆向工程LLVM COOKBOOK 中文版AV Foundation开发秘籍Core Data 应用开发实践指南Core Data其他计算机书籍 SQLITE权威指南图解数据结构与算法数据结构与算法经典问题解析(Java语言描述)数据结构教程Java 9编程参考官方大全Java并发编程实战深入理解Java虚拟机深入理解NginxTomcat内核设计剖析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 设计思路,做不到随心所欲的使用。希望大家有时间多琢磨,想做一个优秀的程序员,放大了说想成为一个优秀的人,都是需要不断学习,不断成长的,大家加油吧!

关于996ICU的一些看法

这个项目在有7k多star的时候我就看到有人推了,当时也就是看看而已,了解了这个标识的意思,并没有点进去,更没有star。再之后随着越来越多的star和关注量,公众号、社区、论坛,但凡有程序员的角落,大家都在争先传播着“996ICU”这个概念,每一次转发、star都是对996这种工作制的无声抵抗。刚才看了一眼star已经12w+,马上就要超过react,这足以说明忍受着996的程序员是多么大的一个群体。我这里不想跟大部分人一样,痛斥996,歌颂这种行为,我想说些不一样的东西。 从自己经历出发吧,2015年刚出来工作的时候是996,当时我并没有不情愿或者觉得累,因为我很清楚自己就是个菜鸟,996可以让自己有更多的时间用来学习东西,提升技术。这种工作节奏持续了大半年,这段时间的感受也是即充实又满足的。后来公司业绩好转,改成大小周,再几个月后又改成双休。当然最开始享受双休的那几天还是很爽的,后来就慢慢习惯了,996前后我的工作状态并没有什么变化。 再后来进了现在的公司,人事告诉我大小周,那时我已经保持了将近一年的双休节奏,稍微犹豫了那么一会,但考虑到公司不错的发展前景,我还是答应进来了。从双休切换到大小周之后,我才意识到双休是多么爽的一件事。。。真的深刻体会到得到了就习以为常,失去了才懂的珍惜的感受。 在我进来不到半年的时间,公司运行的大小周调整为975,因为晚上7点公司提供晚餐,其实开发这边都是吃完饭休息一会再继续回去工作,大约也是9点走,可以说是995。 得知双休之后,我的学习状态也高涨起来了,规划着两天的自由时间可以做很多事情了,睡懒觉、打游戏、学一些自己感兴趣的东西、跑步。然而实际情况却是开始双休之后的很长一段时间里,我完成度最高的是睡懒觉、打游戏,对于学习,健身基本没怎么执行。有那么几个周末我深深地体会到舒适区只要进入,是很难挣脱出来。周末的早上醒来就感觉自己是被封印在床上了一样,除了刷手机什么都不想做,哪都不想去,早上喝水,中午叫外卖,晚上再来一份外卖,一天结束了。 同时我又是一个反省意识很强的人,在虚度了一个周末之后心里就会非常自责。一个被荒废的周末还不如忙碌一天的工作给我带来的满足感,我甚至产生了想要回到996的状态,以此来约束自律性很差的自己。 再后来也就是最近一段时间,为了达成近两个月的OKR,我“如愿以偿”地又回到了996的模式。因为早有准备,多上一天班并没有让我感觉失去多少自由。公司也考虑大家劳逸结合的情况,搭建了台球,乒乓球,Switch游戏机这种娱乐措施。周六加班,也就是做一些修修补补的任务,中午吃完饭会打一会台球,乒乓球,或者玩一会农药,回来继续工作。有时候会感觉周六加班更像是换了一个地方过周末。 但其实我也不是完全接受996的,它解决了我的时间配比问题,但也会给我引起其他不便。比如我想和女朋友周末出去就近玩一下,北京以内还好,如果想出北京就会时间安排不过来。当然还有其他的不便,要知道休息两天和休息一天可是相差一倍呢。 那回到这个话题,996这个制度是否OK呢? 如果你自律性很强,有很多想法想要实现,也有较好的时间规划,那多一些自己的私人时间是再好不过的了,996对你的确不能让你发挥更大的作用。如果你自律性很差,也没考虑过多出来的时间用来干嘛(玩和睡除外),那我建议你可以先好好想想双休之后你会做什么,双休对你来说生活品质是提高了还是降低了。当然如果你认为自己就是不想加班,只想过平淡恬静的生活,上班对你来说就是为了赚钱,这种想法也没错。因为不是每个程序员都热爱着这份工作,能从中获取到乐趣的,那就换份轻松点的工作呗。我下面讨论的内容对这类人群也是不适用的,你们可以看到这就结束了。 说些不那么中听的话,如果你自律性差,公司的996相当于帮你加了一道屏障,这个时间段它帮你隔开舒适区,迫使你投入到工作中。而我公司也有不少,没有加班任务,时不时也会主动来公司加班的人。那最理想的情况其实就是,公司相信员工,不强制加班,大家想休息了,该休息了就休息,保证把工作效率提上去。员工呢,同时为自己和公司负责,没完成工作,学习新东西,就可以来公司主动加班。 之所以说他理想,是因为很多公司不信任员工,很多员工也没有那种对自己和公司强烈的责任感。所以互联网行业出现这么多的996不是单纯公司的问题,一些程序员也负有一定的责任。 再说一些特殊情况,如果是无良公司,不考虑员工效率问题,各种强制加班,搞996,那我也是坚决反对的。 996ICU项目里有提《劳动法》,标准工时一周最高为48小时,而996是72小时,超标不少;以及超时薪资应为平日工资的150%。这让我想到了大二寒假在电子厂打工的经历,标标准准的按照劳动法来的,基本都是按时薪算的。为什么同样是受劳务合同保护,不同的行业却有着不同的处理方式呢? 我认为一个重要的原因是,电子厂流水线上的那是标准的工人,计时或者计件,可以清清楚楚的搞清楚。而程序员呢,智力劳动,没法准确的衡量一个人的工作价值。你加班两小时,是因为水平问题还是别的原因,如果是自己原因的话,公司需要付钱吗,这个说不清的。所以是否要按照劳动法付给雇员加班费,存在很多不确定因素,这个是不现实也是不合理的。 我们很多人其实心理也明白,去给996ICU点一个star并不会让自己摆脱996现状。但我们还是那样做了,这其中有一点抗争精神,但抗争之后我希望大家能够更清楚的看待996这个问题。 我更希望996这个含义可以适当拓宽一点,包含我们工作及工作以外提升自我的时间。 如果公司要求996,分出一些时间做自己的事情,保证工作学习的82配比。如果不要求996,那就尽可能合理分配时间,保证每周有72小时是投入到这个行业里来的。在这段时间里你可以用来提升自我,或者是听我给你们吹水🙃