前言
专栏的其他文章都针对 Android 面试不同的方面做了很深入的剖析,今天就主要说说之前10月到11月小米面试前后的一些总结吧!当然,我不会透露任何的面试细节,即便是我说了,对大家也没任何帮助,因为面试面的是内力,不是要你给出每一个问题的标准答案,而是要你给出这个问题的你的、自己的答案。
作者简介
首先简单说说自己的经历,13年一个普通二本学校软件工程专业毕业,12年去了一家外包公司(实打实的做外包项目),太累,趁毕业辞职回了学校。13年毕业稀里糊涂和几个哥们开始自己创业,不到一年,团队解散。然后到了我上一家公司,从一个人独立的做项目到组建移动端团队,其中也有参与的产品目前每月可以收入上百万。但是,今年年中,我突然发现这3年多时间自己变化甚微,不仅仅是收入,还有技术、能力……甚至都开始迷茫了,接下来到底该往哪里走,继续技术深入?目前的平台没有需要;直接转管理?个人对管理这个东西还是比较敬畏,不希望别人做我的小白鼠耽误了别人,当然我也反感做别人的小白鼠(这也是离职的一个因素)。上一个家公司能给的就只有平淡的稳定,所以这个时候我开始反思是不是应该去经历一下大公司、大平台,此前觉得进了大公司后面还是要自己出来,何不就直接就在创业公司打拼呢!现在想想,有一个很重要的自身因素是非常重要的,那就是积累(业务能力、高度等等的能力),如果没有积累,就得不到信任,这是一个很残忍的现实,关于这点,我就不再深入了,相信在小公司工作过几年的同学都有自己的认知。因此,我决定找工作了!
关于简历
面试首先要提到的就是简历,简历这个东西真的是一个很深奥的事情,为什么深奥,其实是对像和我这样的人深奥:学历不好、工作经历不好。当然,这和目前技术研发人才需求的大环境也有关系,而且上述两点会越来越影响简历的通过性。说一个真实的事情大家就有概念了,这是一个前同事私下告诉我的,他比我先一年多离开公司,然后到了一个大厂(一个大电商),他现在也负责招聘面试,如果社招简历不是硕士,都会往后排排,虽然这不是公司规定,但是他们实际就是这样操作的。是不是很吓人?他自己都觉得吓人。说了这么多,那怎么办呢?学历不好、工作经历不好就别指望找到好工作了?当然不是,其实面试还是考的内功,简历只是一块敲门砖,如果你的内功深厚,并且能够很好的体现在简历上,那么简历真的只是一个简历而已。大家应该注意到了,上面提到了两点:
- 将能力很好的体现在简历上
- 内功深厚
如何将能力很好的体现到简历上其实不是一个理工科同学擅长的技能,所以要多写多改多请教,多找找有经验的朋友帮你看看,即便是没有这样的朋友,相信大家也有能力和渠道去接触到这样的人。另外关于简历的格式网上有很多文章,前面专栏里文章也有提到过,这点就不再深入了,有一点很重要的我觉得应该加强一下大家的警惕,就是用过,但是知道不深入的技术点一定不要写在简历上,一般大公司面试有一面一定是简历面,也就是按照你简写上写的技术点问,如果发现你写了,但是又说不出来很深的东西,那就相当减分了,所以这一点一定要注意。总之,简历不是你面试通过最关键的东西,最关键的是第二点:内功
关于内功
一个怎样的Android工程师才能进入到大厂呢?下面几个方面往往是需要具备的
一、基础
要想拿到大厂的offer,基础好是一个硬性条件,对于计算机相关专业毕业的同学来说,这些基础就是你大学所学的课程,如果不是计算机相关专业毕业的同学,那么就需要在基础知识这个方面下足功夫了,具体来说下面的东西必须掌握:
- 操作系统原理(里面有一些计算机组成原理的知识需要简单掌握)
- 网络原理
如果你没有掌握这些知识,或者之前学过,但是忘了怎么办?学啊!怎么学呢?去网上找一些大学的公开课,我是看的清华的,至于哪一个学校的适合你,就只有你自己判断了。可能大家会有疑问,面试会问这些知识吗?直接问的很少,但是只有你了解了这些知识,才能更深入的了解一些技术和知识。举两个例子吧,第一个,如果要做Android里的网络优化,你不知道网络里面的一些原理,你怎么知道怎么优化?如果你不知道UDP和TCP的详细区别,技术选择时,你怎么知道选择哪一个作为你通讯的协议?关于网络还有一个出现概率很高的问题就是TCP的三次握手和四次握手,其实它就是网络原理里面的知识。第二个,操作系统中,内存是发挥什么作用的,又是怎么工作的,知道这些,你再去了解Android的内存管理就信手拈来了。
二、数据结构和算法
数据结构和算法其实是分开的东西,我们需要先掌握各种数据结构,再去加深算法,数据结构和算法其实也属于基础,但是它现在越来越重要,所以我就单独拿出来说了。数据结构怎么深入同样我也推荐大家去看清华或者浙大《数据结构》公开课,特别是清华的,值得反复研究。至于算法,首先要做的就是动手,LeetCode上直接干!第二阶段就是要总结各种算法的思想和套路,像递归、动态规划等这些算法都是有套路的,在LeetCode上也有按数据结构和算法分类的筛选,大家可以针对性练习和总结。当然,对于一个Android程序员,能做到每天在LeetCode上刷题就非常不错了,所以一定要坚持,等你坚持到一定的时间,你会发现你越来越游刃有余,我从15年底开始在LeetCode上刷题,目前已经刷了200多道了,小米的面试也非常注重算法,还要能写。而且对一些特别注重算法的公司,算法这块的考核非常严苛,对,就是严苛,而不是严格。
三、设计模式
设计模式中包括了设计原则,其实对于Android开发人员来说,设计模式就那23种,知道并了解这些设计模式是第一个阶段,仅仅是到这个阶段是不够的,一般面试也不会问你某个设计模式的概念,而会让你具体的说说你对某一种设计模式的深入了解和使用,它的优缺点,所以,第二阶段就是要运用它们,其次要和Android源码中运用到设计模式地方进行结合学习。例如建造者模式,Andoird中的Dialog创建就使用到了,还有像单例模式、适配器模式、观察者模式等等都是在Android中非常常用的设计模式,也是在面试中出现频率很高的。
四、Java
Java我就来直接一点了,如下:
- Java集合(HashMap一般必考,通读源码很有必要)
- 反射
- 多线程
- IO、NIO(可选)
- 泛型
- JVM相关,如内存的管理、内存的回收、类的的加载等等
- Java异常
大家可能觉得这些自己多多少少都了解,但是当问到细节就不知道了,所以对于上面的知识还是需要系统的认知,项目中没有机会深入就自己一个一个突破,比如Java集合,首先对集合要有一个宏观的认知,这是我之前总结的一张关于Java集合的图:
它就是我通过查看集合的源码一步一步画出来的,等我画完,我脑袋里也有了一个清晰的认识。然后从常见类的源码开始动手,如HashMap,循序渐进,逐个击破。从这点也可以看出,我们对每一类知识一定要深入的了解,而不是泛泛的知道,比如Android的一些热修复框架,其中就是JVM中类加载和反射等技术。又比如并发中,线程池和ThreadLocal这些都是必要掌握和熟练使用的知识,也是面试经常会被问到的。
五、Android
Android其实要说的不多,对于一个有工作经验的Android程序员来说,基础的一些Android技术大家都是掌握了的,而如果要做一个加分的Android程序员,下面的Android技术就需要深入了解了:
- Android View的绘制和流程
- Android触摸事件分发机制
- 性能优化(网络、内存、电量、UI)
- 常见Android源码,如Handler、AsyncTask等等
- 熟悉Binder原理
- 了解一些Framework常见知识,如AMS
同样的,这些都是要系统的掌握和运用。
六、JNI
JNI其实属于Android NDK中的一个技术点,但是它不像上面的知识需要系统的了解,JNI我们只需要知道Java怎么调用C或C++的代码,C或C++怎么调用Java的代码,并且相互之前怎么传递各种参数(对象),因为一般Android开会不会涉及到写复杂的C或C++代码,我们使用NDK也更多是为了调用第三方的一些C或C++算法库,如FFmpeg。当然,如果你能写得一手好的C或C++代码,那么就更加分了。
七、框架和项目
在Android中会经常使用到一些第三方框架,这也是面试中会经常问到的,具体问题就是它们的原理或设计,像LeakCanary、OkHttp等,当然一般只会问你使用过的,在平时我们使用第三方框架的时,就需要去了解他们,仅仅是为了用而用,是面试官不想看到的现象,因为只会用,不懂原理,就不能控制,而是被框架控制。如何去了解呢,首先要知道这个框架怎么用,然后在找入口,从入口一步一步去探索。自己做的项目也和第三方框架类似,你自己参与的项目的架构如果你都不清楚,那么面试官也就知道你对技术的饥渴度了。比如我之前的公司就使用Netty做终端和服务器的通信,在我的简历中也体现了这点,我有信心将它体现到简历上,是因为我花时间去详细了解过Netty,从NIO到Netty,到Netty常用的类,再到一些慨念的了解,如零拷贝、IO多路复用、粘包、拆包等等。所以当你在项目中使用过了,并且被问到时你能很好的说出来,那一定是加分的。
八、其他
其他都是能为你的简历加分(好学历和好工作背景就不说了):
- 有开源项目
- 参与过开源项目
- 有个人博客(有内容、有深度、有价值)
这些也属于一个人的内功,但是它和上面我要提到的还不一样,因为它不是必须,但又有可能很重要。
内功小结
大家看我一会就把Android研发人员需要具备的内功总结完了,但是如果你真的要把这些都真正的掌握、变成自己的东西真的不容易。每个人都有自己的目标和梦想,在走向目标和梦想的道路上,肯定有各种各样的困难。只有克服困难,才能继续前行,所以,坚持吧!
知识点详细清单
上面我总结的我怕大家还是觉得太泛泛,没有干货,所以再给大家补一个清单:
- Activity的生命周期
- Activity的任务栈
- Activity的启动模式
- Fragment的生命周期
- Fragment的通讯,Fragment之间,Fragment和Activity
- 什么是Service,和Thread的区别
- Broadcast的作用和注册方式
- 什么是本地广播
- 什么是有序广播
- Android的异步处理方式有哪些
- AsycnTask、HandlerThread、IntentService源码
- Binder
- View的绘制流程
- 事件分发机制
- 自定义View的几种场景和方式
- ListView的缓存机制
- Handler、Message、MessageQueue、Looper
- 第三方开源框架设计和原理
- ANR是什么,怎么避免和排查
- OOM是什么,一般如果避免和解决
- 内存泄露是什么,常见的内存泄露有哪些
- 版本管理工具的使用,Git、SVN
- 代码编译工具
- 代码混淆
- Java IO
- 多线程
- 类加载器
- 反射
- 23种设计模式
- HTTP、TCP、UDP协议
- 计算机网络
- 操作系统原理
- 算法和数据结构:排序、二叉树遍历、动态规划
- 常见加密方式和原理
关于Android的前景
不断地也听见很多人在谈做Android是否还有前途、Android研发在走下坡路了、Android的工作太难找了,对于这些其实我的看法很简单,现在真的还没到说Android开发已经无路可走的地步,当然未来怎样我无法预判。现在各大公司其实都很缺Android研发(中高级),不断的在招人,就拿小米来说,别说来面试的人了,就简历都拿不到太多,需要花很多时间去找简历。所以,对于有Android开发经验的同学,更多应该想想怎么往深探索,而不是一味想着换方向,不管换到哪个方向,都会面对从初级到高级到资深再到专家的时间点。所以我认为正确的职业规划应该是金字塔形,核心竞争力一定要扎实!
总结
上面算是一个简单面试前技术点的总结,东西很多,如果要从零开始掌握这些也是非常艰难的过程,唯有靠自己点点滴滴积累,别无他法。其实自己总结出这些东西并不难,难的是如何学、如何坚持、如何加固,每个人的学习和积累方式都不同,一定要找到自己的方式,什么是好的方式标准就是让自己可以牢记、快速记,牢记比快速记更重要,如何坚持是一种意志力上的考验,往往我们需要为自己找一些长期和短期的目标,激励自己不断的进步。包括我在内的大部分人都不是什么天才,唯一能让自己进步的方式就是脚踏实地的去干,相信越努力、越幸运!
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android开发核心知识点笔记】
【Android思维脑图(技能树)】
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【Android高级架构视频学习资源】
Android精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
【Android进阶学习视频】、【全套Android面试秘籍】关注我【主页简介】或者【简信我】查看免费领取方式!
网友评论