xilove0 2020-05-12
这两年有很多人有这方面的疑惑,在大方向讲,任何一个行业都有有一个成长周期,Android经历了2011-13年的野蛮生长后,已经进入了成熟期,这个阶段绝大部分企业对Android岗位的需求回归“理性”,不是懂一点Android基础就能找到工作的年代,这时候再从0起步可能比较晚,但Android市场却普遍缺乏高级人才。
目前Android市场上初中级的工资6K到18K不等,高级大概在20K-35K,很多朋友初中级开发者卡在20K这个门槛始终迈不过去,想要学习又不知道该怎么着手,大多从做上层应用开始,到做 Framework 层就浅尝辄止。
这里我找来一则高级Android开发的招聘要求:
这是小米在拉勾上的招聘要求,相当于p5到p6级别,除开学历的要求外,我们可以看到它在Android基础要求之外,把JNI/NDK/Framework,甚至JS、Server端开发也作为了提升点,是全栈方向的雏形。我觉得大家可以经常在招聘网站里看看现在的企业需要什么技术,当然也不能把企业要求的都学了。我这里大致总结了一下。
第一,横向提升。
基于全栈发展的趋势,在自己擅长领域深入专研的同时横向扩展,不要关起门来闭门造车。而这里说的横向提升就是向大前端转型,在除了要在APP会hybrid开发(Flutter、web、native、前端交互、硬件交互)之外,还要会web开发,微信小程序,H5。
比如服务端开发,我们做Android开发很多时候,要依赖于服务端接口返回数据,可以自己试着搭建一下,至少要对服务端的结构理论、服务与服务之间通信、聚合是什么样的流程也是需要有所耳闻。
第二,纵向重塑。
一直以来,做Android开发有这么两个说法,如果是做应用开发,往应用架构方向发展比较合适,如果是做系统层开发,往往底层驱动比较合适。这里我是比较赞同的,那具体应该学习什么呢?
架构展示层: MVC、MVP、MVVM、Clean、Flux、Android Architecture Components;架构层:模块化->组件化->插件化->沙盒/双开技术,比如可以双开微信,类似Docker, 每个页面都是插件,类似Vue.js中每个页面都是组件。
这个方向可能比较多,比如VIEW、Android动画机制、四大组件工作原理、多媒体技术等等。我们平常在工作中碰到的View滑动冲突问题、其实通过掌握View工作机制和Android触摸事件体系就能轻易解决掉。还有对于需要开发绚丽的动画效果,那么对于视图动画和属性动画一些特性必须有一定的了解。Android 中的四大组件工作机制其实底层应用的是Binder机制,我们不妨从 AIDL 这个接口来了解 Binder。
JNI 和 NDK 开发也是比较常见,特别对于一些做 SDK 项目为主的,这一块开发流程也是需要掌握,NDK开发(含JNI)也是用人单位区分应聘者的手段之一,企业不一定要用到,但是可以通过是否掌握NDK来筛选人才。
这里我要纠正一下学习语言不是跨行业,比如Kotlin可以说是Android世界的头等公民了。再有时下比较火的Python和GO,另外做底层C/C++是必不可少的。
要求能看懂并且熟悉源码(自己选几个第三方库的也可以),要做到熟悉源码及其实现原理。并且要做到能自己二次封装(或自己贡献三方库)三方库。这样一来,你就会在维护中慢慢成为这个技术块的专家了。我觉得输出倒逼输入是一个不错的学习方式。
其实学习的方向还有很多,这里就不给大家一一罗列了,因为不同行业不同项目需要学习进阶的技能都不一样,可以说360度发展。接下来直接给大家介绍一下,我的自身情况和学习的历程。我的故事可能有点枯燥,但是希望大家可以做个参考,给自己积累一点学习之外的经验也好。
13年,我从一个二本学院的化学专业毕业。许多同学毕业后都是在制药工厂上班,朝九晚六,拿着微薄的工资。那个时候的自己很迷茫,总觉得未来不该如此淡然无味。一波波的招聘信息里面,最热门也最诱人的是互联网/IT领域。
顺势而为勇者胜。当机立断,我决定转战互联网行业。
不过,那时的我仅仅会一些C语言,投了几十份简历都石沉大海——就我这专业,就我这经验,想要很好的offer应该有点天方夜谭吧,现实也的确给了我响亮的一巴掌。
不服输,我赌上了所有的勇气立志从头开始全面学习IT互联网相关的知识。
生活总是会眷顾有准备的人,不久我还是拿到了一个offer,虽然公司不大,但总算也是对自己努力的回报。
对基础原理不断挖掘
进入公司,我的职位是Linux应用开发工程师,做App网络传输模块,本质上就是把本地的数据通过socket传输到服务端。用到的技术是C语言,网络编程,多线程编程。
那时是最痛苦的几个月,因为非计算机出生,很多东西都不会,经常程序段错误,都不能定位到问题代码。
当时处于试用期间,秉承着不成功则成仁的心态开始恶补相关的基础知识以及代码规范。那时网络上没有现成的视频资料,艰难地把计算机专业的书籍自学了一遍。例如,数据结构与算法,计算机网络,操作系统原理,计算机体系结构……
熬过了试用期,产品也上线了,第一次体会到成就感爆棚的感觉。
现在回头看,经验就5个字:原理很重要。很多看起来没用的原理,其实是重要基础。比如:
你能讲清楚函数的调用过程吗?是怎么调用的?怎么返回的?参数是怎么传递的?函数的内存布局是怎么样的?
如果了解这些原理,就可以快速使用各种开源库。可以更快地熟悉各种中间件sdk的使用方法。刚入行技术不求多,熟练掌握一项技术,能把原理讲清楚,拿得出手才有基本竞争力。
专注方向
了解技术全貌,做合格架构师
基础仅仅是开始,技术要有应用场景,转化为产品才能最大化地产出价值。
后来,我自学了Android开发,比如UI开发,网络开发。当时也是夜郎自大得以为UI开发就是Android的全部。投递了很多大厂的Android岗位,却没有收到面试邀请。回过头来再做分析岗位需求时,才发现自己技术栈背景确实不匹配,就算进了面试,好多问题也都答不上。比如:
1. 动态化混合渲染技术架构是怎么样?怎么提高开发效能?
2. 产品的DAU有多少,如何保证稳定性高且可用的?
3. 如何跟踪用户行为,利用大数据完善产品功能,降低运营成本?
这些问题让我意识到,语言、UI和原理只是程序员的基本技能而已。
想要进一步发展,不光只考虑个人技术,必须在整个产品生命周期、开发、运维、能效上有合理的架构,进而满足行业的发展需求。你不光需要考虑业务需求如何实现,更多的重心需要关注开发提效,大团队并行开发协作,大流量稳定性保障。
学习Weex技术,Rn技术后,颠覆了我对移动APP开发的认识。如果写native页面,可能一天一个页面,Android iOS就需要2个人日,Weex是跨平台渲染,一份代码可以在Android iOS两个平台使用。那开发一个页面就只需要原来一半的资源。通过新技术合理架构提升研发效能,动态化技术提升发布成本。
无论程序多么完美,Bug永远存在。对于线上故障,如果不能提前预防以及快速解决,损失可能不堪设想。所以线上运维,异常监控,性能监控,数据埋点是优秀架构师的必备技能。
自学的过程是痛苦的,移动端的技术日新月异,很多前沿的技术还没有体系化的书籍,只能在论坛,博客等看零碎的文章,学习效率比较慢。要想高效的学习一线技术,网络课程是一种新的选择。有老司机指导方向,避免走弯路,事半功倍。
沉淀经验
适应发展,做技术的领头羊
有良好的技术基础,学会了行业流行的框架,可能只是获得了进入大厂的敲门砖。多少人努力进入大厂,最终默默无闻地进去,悄无声息地出来。没错,平台很重要,但更重要的是你能在这个平台上发展到什么程度。
能够决定你在这个平台发展多远的东西,往往很实在,那就是你的技术水平。
我本人也是Android开发工程师,从业已经有七年多了,这里分享一份我这么多年以来收集的一些Android进阶资料,包括现在一些BAT大厂提升进阶所需的知识图谱,和Android小白——Android高级架构师 所需的进阶视频、全套学习PDF文件、面试文档、源码笔记。
如果你有需要的话,可以私信我【进阶】领取
这个日异月新的时代,不光需要Follow一线技术,更重要的是要引领时代,才能在技术快速发展的阶段不被淘汰,才能在下一次技术革命中抓住机会。