Android 程序员现状:没有架构师的命,却得了架构师的病
我贼牛逼。但是我不会口头上说出来,我要跳槽,这家小公司的舞台已经不够我发挥了,但我不会说出来,先找好下家,再提辞职,刚步入社会的我,就有如此远见,佩服自己。
于是我拿着自己 1 年工作经验的简历,投给了阿里巴巴,Android 研发工程师。淦,面试都没收到。然后我又投了当时如日中天的字节跳动,号称年轻人的天下。淦,又没收到面试。是我眼高手低了?投了一家上市公司,金融行业,程序员最赚钱的行业,我**,又不给面试。
???
最后终于面到了一家中大型的企业,嗯...中级 Android 工程师。自我介绍完,说了一下我做过的项目后,leader 脸上一副:就这?就这?的表情。当然,作为成年人的他,还是有着该有的涵养和礼貌,并没有打断我说话之类的。然后到面试问题环节 leader 一上来就问:看你简历上写熟悉 AIDL,说一说 oneway 吧我:啊?oneway 是什么?跟 AIDL 没关系吧,我熟悉 AIDL 指的是使用 AIDL 接口进行跨进程通信。面试官:...
啊哈,接下来的 15 分钟我羞耻的恨不得立马破门而出!binder 通信原理是什么?说不清。子线程可以创建 Handler 吗?母鸡啊。activity 启动流程总能说一说吧?哈哈哈,忘记了....
我人生中的第一次跳槽就这样羞辱的结束了。。。。。。。
这件事过后,我如梦方醒。光会砌砖(写业务代码)就想当总工头(架构师)?不可能。
这也是大部分码农无法成为架构师的一个原因。一直停留在业务层面,把砖砌的再好,终究只是砌砖师傅。
怎样能成为一名架构师?
我们依旧比喻成造房子,也就是说,从一个砌砖师傅怎么才能一步步成为总工头呢?
一、把砖砌好
代码是写给别人看的,写好业务代码是成为架构师的第一步。
没有哪一个架构师不是从写业务代码成长过来的。没有不懂业务的架构师,所有的架构,都依赖于业务。所有的架构师,也必须要去写业务代码,不把自己设计的东西,用在真正的项目里,恐怕他们自己都不会知道,这种架构设计的合理性在哪里。
这里我想表达的代码质量优化,并不单指日常编程。
我想表达的是一种架构思想:面向未来编程
一个好的工程师,在听到需求的时候,可以根据自己的业务能力,判断出来这些需求中,哪些是有可能变化的,哪些是不太可能变化的。
针对这些变化的内容,在编写的过程中,不会写死,而反复确认不可能会变化的需求,会写的简单一些,防止过度设计引起的复杂度。
简单说,当他拿到需求时,并不单纯是考虑这个需求怎么实现,还会考虑,自己设计的架构体系,扩展性在哪里,在他的眼里,看到的需求会被分解,折分,然后自己的技术方案,会挨个分解,分配。
在完成设计之后,他会很清楚的知道 ,自己设计的系统里,哪些变化是支持的,随便你改,我只需要改动一个很简单的内容,哪些是你绝对不能改的,你要改,我就必须花很大的代价,特别是在已经有线上数据的时候。
而且会拿着自己的架构体系跟 PM 沟通,讲清楚。
如果你编程时已经有了这种思想,说明你已经具备了一名架构师的基本素养。
二、清楚砖头钢筋水泥的成分
房子要建好,必定要选用好的材料。这些便是房子的底层、基础。
在编程中,我们所用的语言便是砖头,各种工具类便是水泥,各种框架便是钢筋。
光会用当然不行,必然要“知其然,知其所以然”,“所以然”便是各种方法、工具类、应用框架的底层源码以及他的实现原理。
对于绝大多数编程从业开发者而言都面临一个普遍的问题:广度与深度难以兼顾。
每个企业的业务方向都不一样,用的技术也不一样。运气好,面试的时候甲方公司用的技术刚好跟你学的一样,结果技术面一问,你只答的出四大组件有哪些,生命周期支支吾吾也说不太清楚,view 的绘制流程模棱两可,垃圾回收算法一知半解,性能优化一窍不通。这要是能找到 offer,那就见鬼了。
很多人在开发过程中只是浮在表面,忽略底层源码分析,面试求职的简历也没有进行修缮和突出重点,自然求职不顺,加薪无望。
所以解决这个问题的最好办法就是:**抓住不变量。**要知道,底层知识永远都不过时。算法数据结构永远都不过时。基本的程序设计理论永远都不过时。良好的编码习惯永远都不过时。分析问题和解决问题的能力永远都不过时。强大的学习能力和旺盛的求知欲永远都不过时。你大脑的思维方式永远都不过时。
举个栗子
大家应该知道也懂得性能优化的重要性,可工作中由于对整个知识掌握不够,所以会在性能优化上没有自己的理解。比如,Glide,这个是我们经常用的技术,相信大家都会用:
Glide.with(context).load("图片 url").into(imageView)
但是大家谁知道这个里面有性能上面的坑啊?
如果我们不能体系的去掌握 activity,fragment,application 的生命周期,而且也不了解 glide 源码,因而我们可能是直接在 context 的地方传 this,或者,直接给 application 的 context,那么此时 Glide 的生命周期就和 this,或者 application 绑定了,那么结果大家可想而知,在嵌套的 fragment+viewPager 的代码结构中,生命周期的管理不到位,就会带来生命周期问题的内存碎片。自然大家就知道,类似的情况多了性能就会一点一点的损失,最后导致 app 的运行过程中偶现的 OOM,结果可想而知。
底层知识学扎实了,上层的东西像风筝一般千变万化,而你是在底下扯线的那个人,顺着线往下拉,便能轻松看清楚这个风筝长什么样。
三、房子要漂亮,装修少不了
这个点相信大家很容易就能想到我接下来要说什么了。没错,就是 Android 开发少不了的—性能优化。
性能优化绝对是一个老 Android 必修的课题,没有过性能优化的经验,去哪里找工作都免不了碰壁。
一名 Android 架构师,必定要掌控整个 APP 的总体构成,用户体验,是最为重要的一点。
作为 Android 开发,大部分朋友可能会对性能优化这个 Topic 如数家珍,Google 官方在几年前也有“Android 性能最佳实践系列”(Android Performance Patterns),当然,其中大部分的 Tips 都是需要大家遵循的规范,但是无论理论上怎么说,我们所做的工作最终还是需要为业务服务,不管你是为了提高下载量、优化用户评价、还是提高业务的转化率,都需要给出性能优化的 ROI。
经过近十年的发展,Android 技术优化日新月异,如今 Android 10.0 已经发布,Android 系统性能也已经非常流畅,可以在体验上完全媲美 iOS。到了各大厂商手里,改源码、自定义系统,使得 Android 原生系统变得鱼龙
混杂,然后到了不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在跑分软件性能非常高,打开应用依然存在卡顿现象。
APP 进行性能优化已成为开发者该有的一种综合素质,也是开发者能够完成高质量应用程序作品的保证。
小结一下
从 Android 小白到架构师的职业规划到底是怎样的?
我们初入这行是可能出于兴趣,可能出于前景。入行这个职业就代表着你需要不断的学习、学习,进阶、进阶。
在我们入行之初,为了就业,我们不得不让自己的知识体系更具有**“广度”**
入职后,你发现并不是之前所学的知识都需要用到,你开始需要进阶某一知识模块的**“深度”**此时你具备初级开发的:知识点
工作了几年后,你发现你需要更大的舞台,你需要好几个连起来模块的深度进修。此时你具备了中级工程师的:知识面
又过了几年,你已是职场老鸟,你几乎能解决工作中所有日常问题。你具有许多的知识面,你将你所有的知识面串联,形成了一套完整的知识体系。此时你是一名高级工程师:知识体系
可是,你已经到了 30+,快要退休的年纪,你身后有无数的高级工程师随时可取代你的位置。
此时,你需要探索代码更深处的奥妙,你不再是只会建房子的“砌砖师傅”
你懂得每块砖头的组成、结构,你知道一所房子哪个地方需要这块“砖头”,哪个地方适合另一种“砖头”。你知道这所房子需要怎样建造,怎样设计更坚固、合理且美观。
此时,你是一名架构师。
最后
为什么很多程序员做不了架构师。1、良好健康的职业规划很重要,但大多数人都忽略了 2、学习的习惯很重要,持之以恒才是正解。3、编程思维没能提升一个台阶,局限在了编码,业务,没考虑过选型、扩展 4、身边没有好的架构师引导、培养。所处的圈子对程序员的成长影响巨大。
我是 zero,一名来自阿里的程序员。欢迎关注我的简书,分享 Android 干货,交流 Android 技术。对文章有何见解,或者有何技术问题,都可以在评论区一起留言讨论,我会虔诚为你解答。也欢迎大家来我的 B 站找我玩,有各类 Android 架构师进阶技术难点的视频讲解,只为助你早日升职加薪。B 站直通车:https://space.bilibili.com/544650554架构之路,我伴你成长。
文末:
放上我整理的一份 Android 架构师技能树,有点长,有兴趣的可以看一下收藏起来,没兴趣可不看。以下技术知识点在我的GitHub都有详细的讲解。
必备 Java 基础
泛型
作用于定义
通配符于嵌套
Rxjava 中的泛型
注解
自定义注解与元注解
APT,编译时注解处理器
插桩
反射,运行时动态获取注解信息
Retrofit
并发线程
线程共享与实现实现
CAS 原理
Android AsyncTask 原理
Java 虚拟机
Dalvik 虚拟机
CG 算法、机制
内存分配策略
Hook 技术动态编程动态代理模式双亲委托机制 JavaIO 体系 IO 操作 Dex 加密
数据结构及算法
数据结构
栈和队列
数组和链表,自定义一个动态数组
Hash 表,及 Hash 冲突的解决
二叉树
B+ B-树
基础排序算法:重点 快排、归并排序、堆排序(大根堆、小根堆)
快排的优化
二分查找与变种二分查找
哈夫曼树、红黑树
字符串操作,字符串查找,KMP 算法
图的 BFS、DFS、prim、Dijkstra 算法(高阶技能)
经典问题:海量数据的处理 (10 亿个数中找出最大的 10000 个数 TOP K 问题)
算法
分治算法
动态规划
贪心算法
分支限界法
Android 基础
Android Activity 生命周期
Application 生命周期
Android Service、IntentService,Service 和组件间通信
Activity 的 onNewIntent
Fragment 的懒加载实现,参数传递与保存
ContentProvider 实例详解
BroadcastReceiver 使用总结
Android 消息机制
Binder 机制,共享内存实现原理
Android 事件分发机制
Android 多线程的实现:Thread、HandlerThread、AsyncTask、IntentService、RxJava
ActivityThread 工作原理
嵌套滑动实现原理
RecyclerView 与 ListView(缓存原理,区别联系,优缺点)
View 的绘制原理,自定义 View,自定义 ViewGroup
View、SurfaceView 与 TextureView
主线程 Looper.loop 为什么不会造成死循环
ViewPager 的缓存实现
requestLayout,invalidate,postInvalidate 区别与联系
AndroidP 新特性
Android 两种虚拟机
ADB 常用命令
Asset 目录与 res 目录的区别
Android SQLite 的使用入门
Android 开发高级
Android 技术难点
AIDL、Binder、多进程、View 的绘制流程、事件分发、消息队列等。
这类知识对于定位自己为高级 Android 工程师的人来说是必须掌握的,同时他也是能鉴别高级和初中级工程师的一块试金石,其中 binder 是 Android 系统进程间通信最重要的手段之一,现阶段 app 的发展离不开多进程的运用,经常会启动例如定位、推送等需要在后台开启动的进程来来保证主进程的内存运行;所以合理的使用多进程也是十分必要的;view 的绘制是我们自定义控件的理论基础,只有掌握了 view 是如何绘制的才能个性化的自定义控件;事件分发一直是 Android 开发的难点之一,也是必须掌握的;关于 handler 机制也是 android 的一块难点,因为包括 Asynctask、系统启动、Intentservice 等底层都是通过 handler 来实现的,所以掌握后 handler 机制不仅能提高你的实战开发能力,更能让你系统的了解整个 android 系统运作的情况。
评论