我觉得是时候,也有必要,承认一下自己的错,压制一下趾高气扬的自己,在知乎上看到一个帖子,有点被打击到了.帖子中涉及到的问题,我给贴出来,各位小伙伴们一起开探讨一下,问题的答案,有知道的请在后面留言
首先帖子的地址:https://www.zhihu.com/question/39597307/answer/82285626
iOS高级工程师是怎么进阶的?
我从事iOS 两年了,感觉只会搭建view,用第三方库,还有些机械代码?真的迷茫了。求大神赐教。想进阶,具体从什么大点入手呢?跪谢!!
说实话,两年时间只会搭建view、使用第三方类库,真的不能称为一个合格的iOS开发工程师!
1. 先说OC部分
-
既然做了两年了,对Objective-C足够了解吗?OC是如何基于C来进行的封装?解释一下这两行代码啥意思?
typedef __attribute__((NSObject)) CGGradientRef GradientObject;@property (nonatomic, strong) GradientObject storedGradient;
-
protocol、category这样的东西应该要手到擒来才是? 多线程部分的知识点掌握是否扎实?runtime这种黑魔法研究过没?代码足够优雅、后续维护容易吗?各种设计模式也得会吧?
2. 再说UI部分
-
既然写了两年的view,那么能快速仿造市面上这些主流App的UI吗?使用Reveal分析过微信、豆瓣、网易新闻、知乎、QQ、苏宁、淘宝、支付宝的UI吗?使用Charles去抓过他们的接口吗?
-
UI研究稍微深一点,比如侧滑菜单这种要怎么实现?如果你要做实现应该要了解UIView和UIViewController的关系了吧?我嘞个草,UIView一堆方法,UIViewController一堆方法,到底都是干嘛的啊?你难道不好奇?这块知识点一直是你的盲区,你能忍?我忍不了!
-
UIView再往深了看,下面还有CALayer,你研究过没?为什么修改CALayer的某些property默认会有个动画产生呢?
-
那么Animation、UIKit Dynamics、Drawing、Graphics这些随便拎出来一个,够你研究一阵了吧?你看看比如网易新闻,在新闻详情页面上拉,回到新闻列表页面的这个动画做的出来吗?你看看QQ在电话通信页面,点击右下角缩放图标,缩放成一个头像的这种动画,你会做不?
3. 还有这些大的功能点
-
既然用了两年第三方类库,那么比如图片缓存这类,看过源码实现没?如果自己来实现的话,有哪些Caching Algorithms?该怎么取舍?各种常用的第三方类库你研究过原理没?
-
你的App在和服务器交流数据的过程中安全性怎么样?你是不是要研究一下加解密?HTTP理解的够清楚吗?想没想过自己来写接口?或者更甚至一些自己来写个简易的HTTP服务器?接口部分甚至用CGI来实现也可以啊!
-
要写服务器,那应该要了解一下网络部分吧?TCP/IP 协议得熟悉吧?然后Wireshark各种抓包得会吧?
-
网络这块顺带过来之后,即时聊天类的App采用的什么技术?选 xmpp 还是 mqtt 还是自己写?正好可以顺势了解一下吧!
-
iOS SDK里面的各种API你掌握到了什么程度?这些功能模块排除地图、通讯录这种,说些高级的比如CloudKit、Extensions、TextKit、AirDrop、PassKit?觉得这些模块在自家公司的项目中压根没用过?可是看看你手边的App!
4. 其它专业化的方向
-
视音频处理做过吗?此类诸如豆瓣FM、虾米音乐、喜马拉雅、QPlayer这类的App你去研究过他们吗?还有VoIP这类的,我实习的时候做过这种╮(╯_╰)╭
-
游戏开发方向有没有兴趣?自己有没有去研究过呢?(反正这个我是真没有╮(╯_╰)╭)
5. 项目安全优化等
-
项目中写单元测试吗?UI Automation 自动化测试做的怎么样?持续集成平台诸如Jenkins等会用吗?
-
App的各种性能优化、Crash的统计分析等等你做了没?
-
App本地数据储存够安全吗?你对逆向了解多少?敏感部分是否做了代码混淆?
6. 知识体系要持续更新
-
官方的文档、国外的相关书籍采用的语言都是Swift,难道你不准备学学?除了native的,现在的HTML5也很火啊,难道不准备学?
-
英文练习的怎么样了?官方所有的开发者文档以及历年的WWDC视频看完了?这么多书,这么多大牛的博客,你难道从中一无所获?
官方1k多的文档不说,发下我的部分书单给你看看吧:
顶着高级头衔,但感觉我也只能算一个中级吧。
1. 会熟练使用Profiler来调试应用性能。比如其中有一个很好的模板叫Time Profiler,会告诉你应用当中哪行代码花了最长时间,当你界面卡顿的时候,用这个可以很快找到优化点。
2. 写测试,写测试不仅仅可以帮助你找BUG,更重要的时会让你去思考如何更好地架构你的应用,其实很多好的工程师,代码架构能力都是很不错的。同时也会用OS X Server和XCode配置 Continuous Integration。
3. 可以轻松编写多线程代码,熟悉NSOperation,GCD等
4. 熟知一些常用的系统类库的原理和Best Practics,比如Core Data,这个玩意儿要玩得好,也是很花时间的。
5. iOS应用,UI占很重要的一部分,可能大部分时候你只需要使用默认的UI组件就行,但是有些时候,你必须要自己去实现一些UI组件和动画,这个时候Core Animation啊,UIDynamics啊都是很值得去学习的点。
我一般的路径是,当要解决一个问题或实现一个功能的时候,我尽量自己去实现,但当自己写的东西无法达到预期的时候(性能太差,实现不了或代码逻辑过于复杂)我才会去找第三方库。
还有就是,如果你做了两年都觉得自己没啥大进步的话,那问题可能是你手头的项目并没有什么高的要求,没有性能问题要你解决,公司也对很多细节问题无所谓,那作为有要求的工程师,你要么自己有项目可以帮助自己提高(比如我总是会自己写应用来学习一些新API和技术);要么就换家公司吧。
1. 对计算机基础知识的了解很全面。网络协议TCP,UDP概念要懂伐...Base64不是加密要知道伐...线程和进程区别要知道伐...诸如此类
2. 对iOS开发的基础知识了解的很扎实。Runtime大概几个概念,msg_send怎么找方法的流程,大概能比较清晰讲一遍伐...多线程有几种写法、各个场景下的不同用法知道伐...hittest和respond chain的流程能讲清楚伐...
3. 良好的沟通能力、需求理解能力,乃至对未来需求的修改的判断能力。这个能省下N多因为理解不对或者改需求引起的加班时间。这个在大公司很重要,不过很多时候程序员的沟通能力取决于PD和交互的能力。
4. 学习能力很强,看一个技术文档,很快能抓到重点,看一个bug,一分钟内能找到stackoverflow,然后扫一遍就知道怎么改。其实有时候一个老手遇到一个很简单的问题不知道或者出错太正常了,但很少会因为一个这样的问题卡住。
憋闹,高阶人士说自己精通多线程GCD编程,你跟着去研究了一番,熟练掌握了dispatch_async的用法,觉得多线程也不过如此嘛……但之后你会发现,你除了知道了几个新api,其实技能并没有得到实际的提升,你还是不知道为什么有的代码在main_queue里执行以及在worker queue里执行会有不同的结果……
事实就是,很多问题你没有亲自遇到并解决,是没办法真正掌握的。
扯远了,说回如何进阶的问题。从操作性的层面,我觉得主要可以有以下几个方向:
了解苹果的新技术,绝大多数苹果的新技术都是为了提高开发效率而服务的(虽然有的也有坑,比如@IBInspectable这玩意儿,但毕竟是少数。),总体绝对是性价比很高的学习。
“那文档,好长啊,看不完怎么办T_T”
请移步app store,搜索WWDC。里面有历年WWDC技术会议的内容,近两年的还配有字幕 以及demo project,学起来趣味性十足,比看Ray wenderlich的教程还简单……
修炼基本功,http://oj.leetcode.com , 现在也支持Swift了。总体难度适中,不像ACM那么刁钻。非常适合当做了解语言特性以及锻炼自己基本编码能力的地方。 虽然算法没有用……但能写出算法的能力,很有用。这个训练能够潜移默化的提高你在平时写代码的速度。
了解FRP(FunctionalReactive Programming),对应框架就是ReativeCocoa和RxSwift,没错,这并不是必须的。但我还是忍不住要安利一下。这是能够最直接,最显而易见的提供你工作效率的框架。
学习别人造的轮子, github上有很多优秀的开发者的源码,其中很大一部分都有极高的学习价值。matteocrippa/awesome-swift 这里是一个集合的,你可以根据自己感兴趣的库进行学习。(记住是学习……是研究怎么实现……是思考换你来做的话,你会如何做……不是pod install然后跟着readme使用一下就完了……),国内也有很多大神的框架值得学习,比如ibireme的YYKit。
造轮子。 学得差不多了,就该自己造了。当你第一次以框架/Api设计者而不是使用者的角度来思考问题,也能够获得很多的收获。这一步能带给你能力的提升是最明显的,如果说1-4 ,都是在韬光养晦的积累阶段。那造轮子,就是你在成为高阶工程师之路的收获阶段。
@optional
贡献你的知识,把你的心得,领悟的东西写成博客。或者把你看过优秀的英文文章翻译成中文,方便后来的国内开发者们快速掌握。这并不是单纯的做好事,分享的过程,你能让你有新的感悟,学到新的知识。利人利己。
在我个人的概念里面,高级 iOS 工程师的定义,其中 iOS 只占了一半,这一半是熟悉 Objective-C、Swift、Cocoa、Xcode、App Store 等等,其实就是语言 + 工具链 + 生态
另一半,是 高级工程师,高级工程师是什么样的已经有很多的讨论了。
我算不上什么高级工程师,但我在BAT在二线互联网公司创业公司都呆过,见过一些算得上『高级iOS工程师』的人,我就先谈谈他们的共性吧。这些共性不是成为『高级』的充分条件,但肯定是必要条件。如果这些都做不到,那也算不上高级。
1. 对计算机基础知识的了解很全面。网络协议TCP,UDP概念要懂伐...Base64不是加密要知道伐...线程和进程区别要知道伐...诸如此类
2. 对iOS开发的基础知识了解的很扎实。Runtime大概几个概念,msg_send怎么找方法的流程,大概能比较清晰讲一遍伐...多线程有几种写法、各个场景下的不同用法知道伐...hittest和respond chain的流程能讲清楚伐...
3. 良好的沟通能力、需求理解能力,乃至对未来需求的修改的判断能力。这个能省下N多因为理解不对或者改需求引起的加班时间。这个在大公司很重要,不过很多时候程序员的沟通能力取决于PD和交互的能力。
4. 学习能力很强,看一个技术文档,很快能抓到重点,看一个bug,一分钟内能找到stackoverflow,然后扫一遍就知道怎么改。其实有时候一个老手遇到一个很简单的问题不知道或者出错太正常了,但很少会因为一个这样的问题卡住。
说句老实话,这几点其实看上去要求都不高,没有提到业界影响力,没有提到懂算法,没有提到会很多黑科技。但符合这几点的人才,我接触下来,其实并没有那么多。说道底,因为行业不算光鲜,国内程序员群体的平均能力良莠不齐导致的。
为什么很多大公司对学历有要求,或者对在别的大公司工作过的人特别青睐。因为对他们来说,上面提到的1、3、4条,学历好、待过大公司的人,会有更大的概率符合。
其实我没有回答题主的问题,我说了『是什么』,而没有回答『怎么做』,如果看到的人能有点启发,那就可以了。
我一直认为最出色的移动端程序员(其实所有的程序员)应该是个全栈程序员,因为我认识的好多优秀的ios开发工程师都是有一定的服务端开发背景,搭的了服务端架构,写的了前端js,和产品撕的了逼,做设计有自己的理由,写的了ppt,做的了演讲,一个优秀的开发工程师,成为一个全栈,我在路上
疯狂的造轮子。
基本来看,就是你对这个东西没什么兴趣,2年时间,其实能玩出挺多花的了。我一个月大概才摸1-2天,也有2年多了,都研究出了如何让矢量设计师以最小的工作量输出全部界面元素,并且生成触摸的代码,剩下做好动画和逻辑就好了。
尝试用逆向工程分析APP,了解你写的oc代码最后都是怎样编程汇编代码的。
深入理解iOS操作系统,理解iOS的工作原理,各种安全机制。