过了30岁后的人很多都会感受到一个问题:从大学毕业到迈入30岁其实只是一瞬,感觉没做什么,还没潇洒完,还没耍帅够就听着身边的人开始叫你大叔、大哥了。而30岁后更恐怖,你感觉时间越过越快,职业危机的死神早已悄悄的站在你身后了。
黄金时期与技术热点
对于技术人,从大学毕业到30岁是一个黄金时期,这个时期需要积蓄足够的力量,在30岁左右爆发,否则35岁多数人会走下坡路,不排除有大器晚成的,但是大器晚成的前提也是在早年做了充分的准备。正是由于技术人的黄金时间有限,因此大家都希望抓住技术趋势,赶上风口。近10年技术圈的瞬息万变结合技术人的黄金时期有限,技术人也变得越来越浮躁,越来越焦虑。
首先列出最近几年技术圈的热点技术(这里只是做出举例,时间点未必完全准确):
2010年2011年:Android和iOS在中国发芽生根,很多Java开发和塞班开发投入了Android和iOS的怀抱。
2012年2013年:Html5定稿,挑战Android和iOS。
2014年2015年:Android和iOS大火,势不可挡,培训机构倾巢出动。
2015年2016年:前端火爆,Android和iOS逐渐开始饱和,大数据开始热门。
2017年:人工智能火爆,前端逐渐开始饱和,小程序正式上线。
2018年:区块链火爆,新闻铺垫盖地。
从2010到2018年,技术热点不断的变更,在Android和iOS最火爆之时,大家都在讨论Android和iOS如何开发,哪个技术会替代它们。而当人工智能、区块链火爆时,更多人讨论着如何进军它们,很少人再去关注Android和iOS。从Android、iOS和前端的火爆到它们饱和也就短短2年时间,那么最近火爆的人工智能和区块链会不会再走Android和前端的老路呢?所谓物极必反,在2010年Java开发人员铺天盖地的,Android开发极其有前途,谁又能想到8年后的今天,Java开发仍旧老当益壮,Android却像2010年的Java一样。
同样再过8年呢?我们谁也说不准,也许Android老当益壮,人工智能和区块链早已被新的技术热点盖过。
技术热点变更太频繁了,短短8年换了好几拨,而技术人员的黄金时期也就8年,这就意味着,我们需要在最短的时间选好需要从事的技术,前期可以摇摆不定,不断尝试,但是在后期一定要坚定一门技术栈,这门技术栈就是你安身立命的本事和跳板。为何说是跳板,因为技术做到后期,拼的不完全是技术了(技术是前提),你可能需要带团队,更深刻的理解和运用职场的规则,这里就不展开说了。
Android面临的挑战
因为我是做Android开发的(最早是Java开发),就来说一下Android的目前形势,有很多技术开始蚕食Android,包括 RN、小程序和前端,这些都不足以对Android带来太大的威胁,因为它们只能蚕食不能替代。目前最大的威胁是谷歌的Fuchsia,谷歌是何用意,现在谁也猜不准,如果谷歌的Fuchsia不是用来替代Android的,那么Android会存活很久(具体参照Windows);如果是来替代Android的并且谷歌大力推广Fuchsia,Android会在未来的5年面临生死存亡的挑战。
未知会带给人们恐惧和焦虑,如果你觉得Android没前途会灭亡,令你十分恐惧和焦虑,那么我建议你换一个你觉得有前途的技术,因为不看好Android的话,也很难有所作为,这也是对自己负责,记住你的黄金时期就那么几年。
其实在大方向讲,任何一个行业都有有一个成长周期,Android经历了2011-13年的野蛮生长后,已经进入了成熟期,这个阶段绝大部分企业对Android岗位的需求回归“理性”,不是懂一点Android基础就能找到工作的年代,这时候再从0起步可能比较晚,但Android市场却普遍缺乏高级人才。
目前Android市场上初中级的工资6K到18K不等,高级大概在20K-35K,很多朋友初中级开发者卡在20K这个门槛始终迈不过去,想要学习又不知道该怎么着手,大多从做上层应用开始,到做 Framework 层就浅尝辄止。
这里我找来一则高级Android开发的招聘要求:
这是小米在拉勾上的招聘要求,相当于p5到p6级别,除开学历的要求外,我们可以看到它在Android基础要求之外,把JNI/NDK/Framework,甚至JS、Server端开发也作为了提升点,是全栈方向的雏形。我觉得大家可以经常在招聘网站里看看现在的企业需要什么技术,当然也不能把企业要求的都学了。我这里大致总结了一下,Android开发人员的发展方向:
第一,横向提升。
基于全栈发展的趋势,在自己擅长领域深入专研的同时横向扩展,不要关起门来闭门造车。而这里说的横向提升就是向全前端转型,在除了要在APP会hybrid开发(web、native、前端交互、硬件交互)之外,还要会web开发,微信小程序,H5。
比如服务端开发,我们做Android开发很多时候,要依赖于服务端接口返回数据,可以自己试着搭建一下,至少要对服务端的结构理论、服务与服务之间通信、聚合是什么样的流程也是需要有所耳闻。
第二,纵向重塑。
一直以来,做Android开发有这么两个说法,如果是做应用开发,往应用架构方向发展比较合适,如果是做系统层开发,往往底层驱动比较合适。这里我是比较赞同的,那具体应该学习什么呢?
1.移动架构:架构展示层: MVC、MVP、MVVM、Clean、Flux、Android Architecture Components;架构层:模块化->组件化->插件化->沙盒/双开技术,比如可以双开微信,类似Docker, 每个页面都是插件,类似Vue.js中每个页面都是组件。
2.基础进阶:这个方向可能比较多,比如VIEW、Android动画机制、四大组件工作原理、多媒体技术等等。我们平常在工作中碰到的View滑动冲突问题、其实通过掌握View工作机制和Android触摸事件体系就能轻易解决掉。还有对于需要开发绚丽的动画效果,那么对于视图动画和属性动画一些特性必须有一定的了解。Android 中的四大组件工作机制其实底层应用的是Binder机制,我们不妨从 AIDL 这个接口来了解 Binder。
JNI 和 NDK 开发也是比较常见,特别对于一些做 SDK 项目为主的,这一块开发流程也是需要掌握,NDK开发(含JNI)也是用人单位区分应聘者的手段之一,企业不一定要用到,但是可以通过是否掌握NDK来筛选人才。
3.语言学习开发语言:这里我要纠正一下学习语言不是跨行业,比如Kotlin可以说是Android世界的头等公民了。再有时下比较火的Python和GO,另外做底层C/C 是必不可少的。
4.源码:要求能看懂并且熟悉源码(自己选几个第三方库的也可以),要做到熟悉源码及其实现原理。并且要做到能自己二次封装(或自己贡献三方库)三方库。这样一来,你就会在维护中慢慢成为这个技术块的专家了。我觉得输出倒逼输入是一个不错的学习方式。
其实学习的方向还有很多,这里就不给大家一一罗列了,因为不同行业不同项目需要学习进阶的技能都不一样,可以说360度发展。
Android如何学习
这是一个十分宽泛的问题,总的来说是分为工作学习和业余学习。工作学习首先尽量选择项目靠谱,团队技术好的工作,这方面对很多人来说并不可控。我们就假设你在普通的项目和普通的团队,不要只关注你的一亩三分地,你不仅要完全熟悉你负责的模块还要理解其他人写的模块,站在项目整体的角度来审视这个项目,它的架构和优化是否足够好,尝试着进行改进。对于你负责的模块要不断查看,是不是有更好的写法,试着重构。
业余学习方面,就是不断的输入输出,可以看博客、书和视频,其中视频的效率是最低的。然后写笔记或者博客,输出你的想法,因为你看懂了不代表你就会了。最近Android相关的技术出现了很多,比如RN、Kottin、Java新特性和Flutter等等,如果是项目用到就好好学,如果没用到大概了解就行,要把主要精力放在更深层次的知识点上,比如Android底层源码、性能优化、插件化、热修复和组件化等等。如果你不知道学什么,可以参考以下我的知识体系来跟我一起学习。
系统的学习路线
文章最后我给大家准备了一份系统的学习思维导图,还有相关的学习资源,这些资料也都是我开发这么多年一点一点的累积整理出来的,今天完全无偿的分享给大家就是想今年寒冬我们程序员能好过一点,希望大家都能工作顺利,事业有成。
首先是超级详细得不能再详细的Android开发学习思维导图,因为图片实在是太大了,所以我就只把二级目录的内容放出来。
接下来就需要梳理知识,提升储备了!(Android移动架构师七大专题学习资源)
- 架构师筑基必备技能:深入Java泛型 注解深入浅出 并发编程 数据传输与序列化 Java虚拟机原理 反射与类加载 动态代理 高效IO
- Android高级UI与FrameWork源码:高级UI晋升 Framework内核解析 Android组件内核 数据持久化
- 360°全方面性能调优:设计思想与代码质量优化 程序性能优化 开发效率优化
- 解读开源框架设计思想:热修复设计 插件化框架解读 组件化框架设计 图片加载框架 网络访问框架设计 RXJava响应式编程框架设计 IOC架构设计 Android架构组件Jetpack
- NDK模块开发:NDK基础知识体系 底层图片处理 音视频开发
- 微信小程序:小程序介绍 UI开发 API操作 微信对接
- Hybrid 开发与Flutter:Html5项目实战 Flutter进阶
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
然后再是通过源码来系统性地学习
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
再阅读前辈的一些技术笔记,帮助提升
刷大厂面试题备战,增加大厂通过率
以上内容均放在了开源项目:【github】 中已收录,里面包含不同方向的自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新中...