全栈工程师
本文介绍的东西很多,基本是涵盖了安卓开发人员进阶的所有必备技能,以及生活上的一些必备技能,成为管理者需要了解的知识,包括以后大家要创业还是当老板干啥的,都会提到;如果没有涵括到表述不完全或者缺斤少两的,麻烦大家在底下留言,后面我一定补上;
在看这篇文章的时候我希望大家放正心态,并不是说看完这篇文章你就能成为一名大牛了,能力的成长是一个日积月累的过程,如果没有长时间的积累,看了再多的方法也是白搭;成长最快的方法,就是选对一条路,扎扎实实做下去;
现状
首先,我们说一下国内安卓开发现状,国内很多安卓开发人员都是半路出家,就拿我自己为例,我也是在学校自学的java和安卓,没有别人引导,路线是直接抡起袖子开干,哪里不懂点哪里,一点点查漏补缺,慢慢完善;
工作后越久,越发现这种方式存在诸多弊端,那就是我们的基本功并不是很扎实,说的明白点就是我们实现功能都是嗖嗖嗖的,维护起来却是嗷嗷嗷的;当然这种从实践中来到实践中去的方式还是有很多好处的,因为这样能带来效率上的提升。
所以,写这篇文章的目的就是为了帮助更多的半路出家的安卓开发人员一步步成长,走上更为广阔而平坦的道路;我觉得一般的安卓开发人员都会经理这三个阶段:
- 初级安卓开发,半路出家,不懂底层,不懂原理,只会用三方框架,不思考框架优劣;
- 中级安卓开发,熟练使用各种框架,满眼都是bug,除了写功能就是写bug,遇到了工作瓶颈,想突破,但是不知道怎么突破;
- 中高级安卓开发,到了瓶颈期,眼看着别人做管理自己还是写代码,缺乏核心竞争力。看问题相对片面,难从系统的角度思考问题,想要培养但是没有方法;
做开发的我们向上突破必须具备什么样的技能呢?我相信这个问题很少有人能够答全,毕竟安卓这个知识体系涉及到的东西很多,其实以前我自己也是懵懵懂懂,然后在网上找各种资料,最终也知识有了初步印象,那就是,我们以后发展有三条路,要么呢就是做系统架构,要么呢,就是做资深开发,要么就是做管理;当然也有转行做产品的也不少,但是这篇文章不做讨论;
介绍
成为一名全栈工程师就是说不仅需要成为一名资深的开发,也需要懂系统架构和设计;而资深安卓开发需要不仅需要懂底层开发,更需要了解性能优化,linux,安全相关;而架构师不仅仅需要了解怎么保障架构稳定,性能优化,又要考虑到管理,成本及其他要素;而管理层的话了解的更多,心理学,管理学之类的也是必不可少;接下来我们针对细分领域具体讲一讲;当然身体是革命的本钱,关于养生,中医之类的也需要了解一些,这些后面我会提到;
什么是资深开发
资深开发大家都懂,就是继续在开发这条路上走,研究更难解决的问题,更底层更偏的知识是必要的,丰富的经验不用说了,基本都会随着开发年龄的增长而变得丰富;良好的编码习惯也会因为开发时间的加长而变得优美;我觉得吧,一个资深的开发人员就像是一个能工巧匠,大家可以想象一个木匠,他会慢慢地把一个作品做的精致而优美,也会考虑到成本进行适当的取舍,只要他执着于怎么做好一个作品,最后,时间的历练会让他成为一名优秀的匠人;
资深的开发也是这样,大家知道国内掀起一股新匠人的风,本质上是制造业的转型,从数量转质量;安卓开发人员也是,从开始的遍地都是培训出来的安卓程序员,到现在慢慢精简队伍,企业对安卓开发人员的素质开始变得更高,低层次的开发人员原来越来越不好找到心仪的工作,潮水退去,已经有很多安卓开发人员离开了安卓阵营,或转战其他开发阵营,或离开了开发行业;这背后是他们他们的心酸和无奈,但从本质上来说,这是资源的优化分配,倒逼程序员提高自己的能力;
其实说到国内的经济状况,大家也都看到了,至少从目前来看都是不容乐观的,从15年到现在,我看到的是更多的公司勒紧皮带过日子,我身边的小企业家都在抱怨生意不好做但是又不得不做,当然这些企业家里面有些只是想站在风口上吹吹风,并不是真的在实打实的做事业。但是还有一些企业家确实是想搞一些像样的产品,大公司的打压和繁重的企业税,租金,员工支出,让这些老板一到发工资的时候一个个长吁短叹,把自己活成了怨妇;
有很多小伙伴会说,资深开发我知道怎么做,不就是一直找开发岗位做下去嘛,维持现状就好了;这里我需要提醒一下,资深开发并不只是以工作经历来区分的,很多搞了很多年开发的人员,到了四十多岁了,还是一无所成,老板的样貌倒是有了(秃顶),事业却没有一点进步,不惑之年却还是很多疑惑,频繁跳槽为加工资的人在深圳真的不少,通常这类人也没有女朋友,具体原因不作讨论,但是这是事实;
所以想要做好一个资深的开发,并不是那么容易的事情,他需要一个人有死磕的精神,遇到搞不懂的不是想办法绕过而是想办法弄懂原理,然后功课,这类人就像是一个个攻城勇士,披荆斩棘,勇往直前,典型的如《老罗的安卓之旅》作者罗升阳;熟悉老罗的朋友都只是,老罗也是一点点从基础的安卓小白一步步成长为众所周知的安卓大神,这个过程说长不长说短不短,老罗是实实在在死磕了三年才有如此速度的成长,大家对比一下自己,同样是做了三年的开发,为什么跟他差距这么多;
什么是架构师
如何成为一名架构师大概是很多中级安卓开发多年的困惑;想要转型却不得其法,或许有些人会在业务时间看看《大话设计模式》这类的书籍,这类型的书我看过一些,比如前面提高的这本,我觉得写得就很好,没有刻板僵硬的解说,但是即便是这样我也没有完全吸收进去,究其根本是由于学习的时候并没有深入的理解场景,最重要的是,学完之后没有实际的项目运用到,最终随着时间的推移渐渐遗忘,依稀还记得那个名字;
当然架构师可不是懂懂设计模式就行了,设计师的核心价值在于灵活的把商业场景和架构选型结合起来;在众多的架构中选择更合适的设计,而这些设计有大有小,这就像搭建乐高城堡一样,乐高模组里面有很多原件供选择,你需要清楚这些原件的组成结构和使用方法,以及这些原件使用带来的利弊,你才能按照自己想法搭建出既美观又结实可靠的城堡;架构师也是一样,足够的阅历保证了定制化需求,对所用组件或技术的了解保证了产品可实现性,稳定性及维护性;
那么小伙伴有疑问了,我平时都是埋头写代码,根本没办法在项目中学习到怎么架构设计啊?怎么办,有两种方式,一种是从自己项目中学习,一种是研究开源项目;
第一种方式
这种学习方式其实我是不太推荐的,基于国内的发展现状,大部分从祖师爷那里传过来的代码并不优秀,有可能还是乱七八糟;因为很多的初创公司为了节约成本会找一些很有想法乐于学习,但是基本功却不扎实的小伙伴,这样的直接后果就是导致项目的维护越来越困难,代码的可读性越来越差,这种情况下去研究还不如不研究,当然了,有时候这些项目里面会用到一些很棒的工具类,这个里面会涉及到一些没见过的新知识到时可以去了解一下,但是总的来说,这种项目上研究架构师不太现实的,成本太高了;
还有一种就是项目的代码是非常清晰可读,设计非常优美,那么需要恭喜你,你这家公司的开发做得很棒,你可以在工作时间研究别人的优秀架构并学为己用;比如BAT这类公司的代码就写得很不错,即使是祖传的也不用担心,基本上在这类公司的安卓开发人员也不需要别人告诉他怎么样才能成为架构师了,因为公司本身就注重这方面的规培,比如我一个在阿里上班的朋友就说他们所用到的大牛写得框架都需要了解内部原理,一方面是为了帮助新人成长,另一方面也是为了公司项目的健壮性考虑。在这个过程中,自然而然会接触到怎么做架构;
第二种方式
这个是推荐大部分人使用的方式,也是在我们公司内部强烈推荐的一种方式,这种方式是研究别人优秀的开源项目(注意是项目而不是代码),架构师是站在高处看大局的人,格局自然要高一点,这就需要研究整个开源项目,这些项目小到一些辅助工具,大到一个完整项目;这些项目里面会有很多优秀的代码设计,设计理念,架构设计,编码习惯;一般这些项目会考虑的比较全面,含括了安全,健壮性,可维护性等优点,相对于第一种方式来说,我们能更加轻松高效的获取到架构师相关知识,为成为架构师添砖加瓦;
github上有很多优秀的开源项目,我想很多安卓开发小伙伴都不知道这玩意有多优秀的吧;这是一个开源社区,也是一个基于git搭建的版本仓库;基本所有的安卓开发大牛都在上面留有他们的足迹;如果不了解这个工具的大家可以自行去补充一下;github上的项目众多,并不是所有的项目都适合你阅读,比如一些star虽然很多,针对不同水平的开发人员我在这里给一些建议;
- 9gag这类型的超小型项目适合初级开发人员阅读,这会帮助理顺思路,优化自己编码习惯;如果你觉得这类型的已经摸透了,那么Google提供的一些小的开源组件和建议可以去阅读一下,比如TodoMvp ,安卓最佳实践等;
- 开源第三方库和安卓系统源码适合中级开发人员研究,这类东西对基础要求稍微高一点,如果没有一定的基础是很难读懂的,但是既然大家都是要成为架构师的人了,必然这点水平是具备的;安卓源码自不必说,这里博大精深,即使是自身开发人员也需要从里面吸收营养;开源三方库网上很多,有一些研究起来还是有点困难的,被研究的比较多的,网络层的有okhttp,数据库有ORMLite,图片加载有glide,网络隔离有retrofit,这些在后面会提到;在阅读这类代码的时候需要注意里面用到的设计模式,这些模式为什么要这么用,有什么好处有什么缺点;
- 安卓底层源码和大型开源项目适合资深开发人员阅读,这类项目一般比较庞大,如果挨个文件阅读必然会导致效率低下,最后灰心丧气,不得其果;因此在阅读这类代码的时候,我们需要取其精髓,一个是从大的系统架构商来说他们是怎么架构的,如何实现组件化的,组件之间怎么解耦的,大的一个项目怎么做的单元测试;
学习路线
本文的重点是教大家一个方法,也是通常所说的“术”,后面如果有空的话我也会在博客上分享一些学习笔记给大家,帮助大家梳理学习过程中遇到的各种问题;
这里我分为两大部分来讲,一个是行业内的,一个是行业外的;行业内的代表专业技能的提升,行业外代表个人综合能力和素质的提升,大家不要忽略了行业外的知识而当一个工作狂,长短板类型的人到了最后会越来越被动,当然,少部分人除外;
接下来我会具体分享怎么学习才能成为一名真正意义上的全栈工程师,这个是大纲,具体的需要大家根据大纲自行寻找资料进行学习,因为本文只是提供一条成长路线,如果有相关资料只要不涉及版权我也会乐于分享出来的;有空的时候我也会通过博客的方式,尽可能通过博客的方式让大家读懂,一起成长;
资深开发之路
成为资深安卓开发需要什么:
安卓高阶
- 懂NDK开发,而不仅仅是知道怎么使用jni调用;
- 懂屏幕适配;
- 懂UI加载流程;
- 熟悉消息分发机制;
- 懂高级绘图,懂UI定制,熟悉离屏渲染,硬件加速,熟悉强排班,强交互;
- 懂AndroidStudio高级应用(熟练使用快捷键,Gradle基础语法,会多渠道打包,自定义打包);
- 熟悉makefile语法,懂得自己使用cmake编译So依赖和可执行文件;
- 熟悉shell语法(数组,管道,遍历,流程控制,条件判断,云算法),懂得编写简单的脚本;
- 熟悉音视频编码原理,熟悉视频录制,视频播放;
- 熟练进行文件操作;
- 熟悉虚拟机运行原理,熟悉热更新,增量更新;
性能优化
这里我把安全也加入到性能优化里面;
- 内存泄露原理分析及场景分析,GC垃圾回收机制原理详解
- 内存优化工具使用:Lint,MAT,LeakCanary,TraceView;
- 数据传输的效率优化
3.1 ProtolBuffer提升数据传输效率
- 后台服务内存优化
4.1 如何保障服务的常驻内存
4.2 双进程守护
- 多线程并发
5.1 阻塞式队列
5.2 锁机制原理分析,与竞争锁
5.3 原子锁,对象锁,nio与bio区别与应用
- 混合式优化
6.1 帧率详解及其卡段分析 UI线程掉帧与内存避免(reactnative)
6.2 避免render方法过渡重绘
6.3 scrollView内存优化(可见与不可见终极解决方案)
6.4 分析程序启动流程、优化启动流程和提速
- 安装包性能优化
7.1 打包流程分析
7.2 aapt资源文件打包原理
7.3 resources_arsc二进制机构分析
7.4 资源文件压缩
7.5 资源动态加载
7.6 Lint工具优化
7.7 极限压缩、
- 应用安全
8.1 Proguard高级混淆
8.2 https防抓包机制(拒绝被hook)
8.3 Dex加密与反编译(APP加固)
8.4 数据库加密方案及原理
8.5 Gradle插件自动化减少apk文件大小
架构师之路
- Uml相关绘图,Uml正向及逆向工程,
- Aop切面设计,插件化;
3.安卓系统源码分析
2.1 handler原理与源码分析
2.3 Binder核心原理与架构设计
2.4 PackageManagerService源码解析及apk安装流程
2.5 Activity管理架构设计及跨进程跳转
2.6 剖析App,完全解读App启动流程;
- Android事件总线架构设计
- 动态换肤核心技术
- 组件化框架设计
6.1 ARouter集中式路由及核心原理实现
6.2 如何当项目实现组件化
6.3 SkyRuler项目组件化框架实现(重定向,跳转前预处理–登录,统一跳转入口,支持多类型参数传递,多Moudle跳转)
- 数据库框架设计
7.1 ORMLite核心架构
7.2 xml脚本打造数据库版本全量升级架构
7.3 面向对象式手写数据库架构设计
- 网络请求框架设计
8.1 网络请求层七层模型及架构剖析;
8.2 okhttp源码分析与架构解读;
8.3 okHttp任务队列架构设计
8.4 socket连接池复用机制详解
8.5 拦截器责任链模式实现重连,补全Http头,链接与Http协议解析等
8.6 使用泛型完成手写高扩展的OKHttp网络访问框架设计(支持高并发,请求队列)
- 图片加载框架设计
9.1 Glide架构思维分析与源码详解
9.2 手写Glide注入内部生命周期(打造不一样的缓存方式)
9.3 建造者模式打造手写Glide架构的高扩展性
9.4 请求队列、请求转发、加载器、加载策略、缓存策略详解
9.5 Lrucache和DiskLruCache解析
- 其他架构实现
10.1 Android全版本编译时权限申请框架(含8.0 动态申请)
10.2 动态代理打造高可替换的网络库隔离(retrofit,okhttp隔离)
- 设计模式
11.1 MVC架构设计及三层膜性剖析
11.2 MVP思想精髓与解耦View与Mode的巧妙设计详解
11.3 架构提升之路 MVP思想实现企业级项目基础框架搭建
11.4 MVVM架构解析及DataBinding架构解析
综合素质打造
心理学里面有一句话说人是社会性动物;每个人都会与整个社会发生连接,生活中的方方面面构成了整个社会,这个社会中会有很多细分领域,这些细分领域无时不刻不在影响着我们,对这些领域具有一定的基础知识其实是非常重要的;包括心理学,哲学,宗教,经济学,政治学,中医学,康复学,法学,文学等;
了解这些并不是为了让我们看起来多么博学多才,学以致用,这些知识在很多的场景有很大帮助,比如我以前有个朋友撞了别人,本来私了了,但是过了一年人家以旧病复发为由索取高额赔偿,而朋友想通过汽车保险降低损失却被告知有骗保风险,弄不好坐牢;如果懂一点基础法律常识,那么这些事情会好处理很多;
程序员一般或多或少有些职业病,如何预防并保持健康的身体很重要,有很多同事已经有了相对应的症状;健康的重要性无需多言,只不过没有到真正生病没有几个人会真正关注,大家都学过《扁鹊见蔡桓公》,见微知著才能防范于未然;
如果想要走管理这条路的小伙伴或者已经走上管理的小伙伴就需要提前储备一些提升效率的事情,一直以来我们都是按部就班自我摸索,这样索然很好,但是少不了走一些弯路,有很多事情我们是可以更加高效的完成的,当然,要做好管理第一要务是做好自我管理,如果自我管理难做好就很难有对事情的掌控能力,缺少这种掌控力就很难具备大局观,那么在思考问题的时候就很难做到全面,果断的决策;
现在很多公司都流行敏捷项目,但是我去研究了一阵发现,真正的敏捷是做好自我管理,这种自我管理并不是增加员工的负担,反而是通过调用大家自我管理的动机而把事情做好,这种情况下,做的事情越少效率反而更高;
综合素质打造有很多方面,因为时间来不及整理,我大概列出如下几项:
综合素质:
- 行业分析报告,上下游产业链
1.1 50大产业链全景图
1.2 互联网灰黑产业白皮书
1.3 褥羊毛产业研究报告
- 敏捷管理知识
2.1 敏捷软件开发原则、模式与实践.((美)Robert.C.Martin)
2.2 Scrum精髓_敏捷转型指南
2.3 硝烟中的Scrum和XP-我们如何实施Scrum
2.4 高效程序员的45个习惯
- 文档管理与分类,待办事项管理;
- it领域各行业解决方案分享;
- 高效搜索与资源整合能力;
- 基础健康与养生,了解自己身体;
- 亲密关系,爱情,婚姻;
这些不够详细,但是后面我会慢慢完善,也会通过博客的方式分享出来;