现在的iOS开发者优胜劣汰,如何提高让本身不被淘汰?

序言:前端

若是从 13 年移动客户端大火开始算起,至今已经有五个年头了。如今移动端的形势也不须要太多的废话来描述,一句话总结就是:“浪潮退去,谁在裸泳一看就清楚。”我但愿借助这篇文章来聊聊在我心目中,移动互联网下一个五年的趋势和机会,以及咱们 iOS 工程师能作哪些准备,实现自我提升。本文主观性的见解比较多,文笔也比较激进,仅供参考。git

咱们都知道价格会受到供需的影响,若是某项技能在市场上紧缺,那么掌握这门技能的工做者工资就会相对高一些,好比 14 年前先后能写好 UITableView 就能找到一个相对不错的工做了。在我看来,将来几年的移动互联网,会出现“一个过剩,两个不足”,我会逐个分析并试着给出一些建议程序员

做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个个人iOS交流群:638302184,无论你是小白仍是大牛欢迎入驻
,分享BAT,阿里面试题、面试经验,讨论技术, 你们一块儿交流学习成长!但愿帮助开发者少走弯路。

如下资料须要的能够加群领取。面试

图片描述

(一)UI 工程师过剩shell

这一点是我老生常谈的了编程

,首先要注意的是避免成为 API 调用工程师,由于这些 UI 方面的知识对我的价值的增加不是线性的,若是你还记得高中数学,请回忆一下 y = ln(x) 这个函数的曲线。从零到写好 UITableView 给一个工程师带来的收益,远远不是从写好 UITableView 到写好 UIStackView 能比得上的。后端

就以 UIStackView 为例吧,先不说它从 iOS 9 才开始支持,而要想应用不支持 iOS 9,怕是要等到猴年马月了。就说它提供的功能,虽然简化了已有场景,但这个功能彻底能够经过封装已有的组件来实现,相信不少大型项目都有,为何还要费力气去兼容版本,以及再学习一个新的 API 呢?人的精力是有限的,若是你老是追着苹果的脚步,每一年补 WWDC 上那些新坑和老债,那么视野就永远只能停留在 iOS 中了。网络

(二)专业技能人才不足前端工程师

这里的专业技能指的是移动端这个大话题中里比较垂直的知识领域,大概包含如下几个方面:数据结构

一、图像/视频处理

随着网络基础设施的普及,以及流量费用的大幅度下降,4G 基本上已经全面商用了,若是说移动端前五年是文字为主,图片视频为辅的话,在接下来的几年中,用户对高质量图片和视频的要求会日益增加。

因为我对这个领域并不了解,因此可以推荐的并很少,在我印象中,OpenGL 这种跨平台的引擎,计算机图形学的知识,视频编码与协议都是能够花时间研究的,如今有不少优秀的创业公司也急需这类人才。严格来讲这些知识都不算移动互联网方面的知识了,因此门槛较高,但门槛这东西是个双刃剑。它会增长你的学习难度,但一旦你掌握了这门知识,门槛又会变成你我的价值的护城河。

我格外想要声明的是,CoreAnimation 这类的东西若是不是工做中强制要用,通常就别碰了,就像没人会傻到用 SpriteKit/SceneKit 去写游戏同样,这种 API 密集型,又不能跨端的库是没有前途的,真正有价值的动画必定是用一套统一的 DSL(领域特定语言)去实现,而后导出到各个平台上,因此开发者必定要多在动画的原理上下功夫,好比了解矩阵变换,线性代数这些,而不是把时间浪费在阅读官方文档上。

二、逆向工程

研究逆向工程的做用不只仅是破解 app,在我看来更可能是学习底层的操做系统。在开发 app 的过程当中,咱们使用系统提供的库,调用 API 就能够实现需求,其中的过程彻底是黑盒。而逆向工程的目的就是要开盒子,利用一些工具从二进制层面入手,反过来推测应用开发者的代码和逻辑。这其中会涉及到不少 C 语言,操做系统,编译原理方面的东西,相对来讲门槛很高。逆向工程对企业对价值也很大, 由于你们都不但愿本身被竞争对手一眼看穿,又对竞争对手对秘密颇感兴趣。

以上的内容均可以花时间研究的专业知识。这些知识大可能是自成体系的,没有较长时间的积累,很难入门。这一点很是重要,由于不少知识看起来很是专业,门槛也很高,好比我下一节就会提到这样的例子,但这些知识我并不鼓励学习。区分的标准是,你学习的知识是一个知识点仍是一个体系,若是你学习的只是知识点, 那么它只能是整个知识树上的枝枝丫丫,边边角角,若是你学习的是知识体系,就具有了衍生知识点的能力,也就是我反复强调的触类旁通的能力。

上面举的两个例子都是我认为不容易遭到时间的淘汰,比较值得研究的话题。在这些领域上的投入能够理解为线性的,也就是一分耕耘,一分收获。

(三)全栈人才紧缺

这里的全栈没有明确的定义,并不是先后端通吃才算是全栈。在个人理解中,只要是跨知识点的融合,都算是全栈,由于跨知识点的融合每每会产生 1 + 1 > 2 的效果。往小了说,全栈能够减小大量浪费在沟通上的时间。往大了说,一我的了解的领域越多,他就越能把这些领域融合在一块儿,既能站在更高的角度思考问题,也能做为团队的领导者和融合剂。这也就意味着,掌握全栈知识对我的价值的影响是指数形势的,你了解的越多,价值就会越快的提升,职业天花板也会越高。

不少技术是与业务绑定的,有了核心知识,在业务需求的推进下,很容易就会诞生一个框架。好比应用组件化,不少公司都有本身的组件化库,其实实现原理也就是两大类,但发表到博客里面之后,就会有很是多的业务背景干扰读者的认知,若是读者追着这类文章看,是很是难从框架中剥离业务的干扰,直接挖掘基本原理的。所以大公司搞出来的某些框架,真的没有那么神秘,早期都是一个简陋的基础框架,当面对业务业务需求时,运用一些合理的编程思想,逐步迭代,最后发布了一个完善的版本,大可没必要看得晕头转向之后妄自菲薄。

在以前面试的过程当中,我也注意到不少应聘者其实对技术很感兴趣,常常刷微博上的文章,了解的也不少。但大多数状况下只知其然,不知其因此然。这是由于这些技术偏离了你的应用场景。之前我总为微博上的好技术没法在项目中落地感到纠结,后来我忽然就明白了,这个思路就是错的,我应该挖掘公司项目的痛点,去微博,Google 等平台上的文章中寻找解决方案。因此我反对面向微博学习,应该要学一些更通用的技术,把技术与本身的项目结合起来,争取能在项目中落地,这比看十篇似懂非懂的技术文章还管用。

(四)大公司所谓的基础知识

为何建议不要研究单独的几个底层知识点,除了这种知识,以及逆向工程这种自成体系的,求职者只要具有扎实的基础,紧紧掌握一些基础知识就能够了。不少人都会以为大公司对底层的基础知识考察很严格,基础知识不表示底层,也不必定就很简单,它们一般是那些被框架作了一层封装,以致于若是不用心思考,极可能就会忽略的知识,但不了解这些知识会对你的思考产生较大的影响,也很容易栽进某个坑里。

除非是变态公司以偏题怪题刁难人为乐,或者无能面试官只会问本身懂的东西之外,正常的大公司面试都会考察一些比较基础的问题,若是你仍是以为题目太底层,只能说明本身看问题的角度还不够深入。

大公司着重考察基础知识,在我看来有两大缘由:首先,在比较大型的项目中,业务逻辑很是复杂,因此不多有人有精力去大量的检查并提升你的代码质量,这就要求工程师具有至关扎实的代码功底,不管是代码风格仍是语言的掌握都不能有太多问题。这样 Code Review 的时候才能把精力放在业务检查上,代码风格一笔带过,偶尔提醒一下就能够了。

另外一方面,基础知识决定一我的思考问题的深度和交流问题的角度。一个不懂计算机背景知识的程序员,看问题的方式常常是错误的,错误的思考方式也就决定了他很难走到正确的道路上,好比个人一个外行朋友曾经接手了一个用 C++ 实现的 GUI,他的第一个问题是“如何在 C++ 中把字符串加粗”,读者大可没必要感到荒谬,由于不少人思考问题的方式也不见得高明,在高水平,有经验的程序员看来,也许一样是不可理喻的。大公司复杂的业务逻辑一样也意味着不多有人会耐心的给你讲解每个名词,好比哈希表,并发,并行,编译,连接等等名词,若是你听不懂或者理解不正确,每每意味着交流上会存在一些障碍。

所以个人建议是:数据结构,操做系统,计算机网络中的基础知识必定要扎实,怎么扎实都不为过,由于它决定了你看问题时候的高度,深度和思路。

(五)让脚本取代 GUI

脚本语言很是重要,绝对是提高工做效率的神器,我强烈建议每一个客户端工程师都应该了解一些 Shell 脚本而且掌握 Python,Ruby 和 JS 中至少一门语言。

理论上来讲没有什么是脚本语言作获得,Java 作不到的,但脚本语言最大的特色就是快,快到极点的那种快。对于一些极度简单的小需求,好比统计一个文件中某一列数字的平均数,我敢保证在我得出结果以前你确定还来不及打开 Java 编辑器。

脚本语言的另外一个特色是高度的自动化,只要 Unix 和 Linux 系统一天不死,shell 脚本就会永远存活,你学习的知识就永远不会过时,好比 awk 和 sed 这样的神器,年龄比我大得多,至今还很是实用,将来的 20 年也丝毫看不出淘汰的迹象。试问一下,有什么知识能比一个几十年不会过时,并且天天都能用上的知识更值得学习呢?因为 Shell 是距离操做系统最近的脚本,了解了它之后,不少复杂的操做均可以被自动化。好比想找到项目中无用的图片,也就是一行命令的事。

考虑到脚本语言极高的开发效率,不少对性能不敏感的框架都会选择用脚本语言来实现,好比 Node,Flask,Rails,mitmproxy 等等。做为一个大前端工程师,不能老是依赖后端工程师,不然没了后端就只能搞单机模式了。所以了解脚本语言还有助于咱们快速上手后端框架,这绝对是应聘时的加分项。

固然,不少人也会抱怨,咱们是 iOS 工程师,平时的工做也接触不到脚本语言,该如何学习并投入使用呢。个人建议有三个:

一、整理本身的痛点, 并尝试着用过脚本去解决,这对学习 Shell 有奇效

二、整理公司项目开发中的痛点,尝试着用脚本去解决,适合练习 Python,Ruby 和 JS

三、抛弃 GUI

GUI 诞生的目的是为了更好的显示信息,而不是成为技术残疾者的拐杖。举一个简单的例子,我发现不少人都装了不少编程效率方面的工具,好比 gitx,sourcetree,tower 之类的 git 工具,还有什么快速打开模拟器目录,Derived Data 目录的小工具,我以为这实在是太愚蠢了。放着大好的学习 Git 和 shell 的机会不要,把时间浪费在了解一个软件的 GUI 上,我以为是彻底不能接受的。尤为是对于 git 来讲,我建议多问问本身,学会的是 git 仍是 sourcetree 的按钮,未来换一个 GUI 工具,毕生功力还剩几成?至于某些小工具,这种绝佳的练手机会,怎么能拱手相让给别的软件呢,尤为是脚本能够自动化,软件就几乎不可能了。

啰啰嗦嗦说了不少,其实总结下来没几点:

一、学习一个技术以前不妨先思考一下它在整个互联网体系中目前的位置,有什么样的将来,会对我的价值有多大的提升

二、数据结构,操做系统,编译原理,计算机网络这些基础知识不能丢,它决定了你看问题时候的高度,深度和思路

三、将来须要特定技术领域里的专才,更须要全栈,归根结底是须要最大化本身的价值。我我的的建议是掌握好脚本语言提升效率,打通先后端,这样不管在外包,独角兽创业公司仍是大公司,都能独当一面

四、学习新技术时要避免好高骛远或者盲目迷信大厂,转发或艾特印象笔记提升不了本身,要结合实际场景,最重要的是要能落地!

做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个个人iOS交流群:638302184,无论你是小白仍是大牛欢迎入驻
,分享BAT,阿里面试题、面试经验,讨论技术, 你们一块儿交流学习成长!但愿帮助开发者少走弯路。

文章来源于网络,若有侵权,请联系小编删除。