前言
Android开发3年当了2年咸鱼每天CRUD,复习2个月幸运拿下美团offer!
这是我去年的经历,觉得还挺励志的,希望能帮助到一些正在迷茫的同学。
是去美团送外卖了?有配电瓶车吗?
答:亲,有配的哦,开起来贼顺滑。啊呸,说啥了,咱进的是正儿八经的技术部门。
咸鱼的自我救赎
当时刚过完年回到上海,此时的我已经毕业两年半了,和大多数咸鱼一样,上班就是CRUD,下班就是看剧、玩游戏(英雄联盟、手游都玩)。
当时我的工资一个月到手就5k出头,但是因为在甲方驻场开发,加上差补餐补有接近8k,还包住。每到周末几个小伙伴一起打牌、一起搞情、一起洗脚,日子过得很是滋润,当时其实挺满足的。
让我萌生想跳槽的根本原因已经忘了,想了很久没想起来,可能是受其他小伙伴的影响吧,有了这种想法后就开始准备起来了。
刚开始只是每天下班后躺在床上看别人的博客学习一些东西,一般是22:30看一小时左右,当时最先看的是线程、四大组件、Java基础相关知识,等等这类比较基础的知识。
想跳槽的想法有了之后便一发不可收拾,如果说刚开始每天晚上看1小时只是在试探,那么半个月之后我便全力投入面试准备了。
当时工作上的事情不是很多,每天花个两三个小时基本就能应付了,所以其余的上班时间我都拿来准备面试了。准备面试的方式主要通过看别人的博客、看源码,内容主要是 Android 核心知识和 Android 面试题。
从二月初准备到了三月底,这期间我主要干了以下几件事:
1.看面试题
这期间我看了很多套 Android 面试题,还记得的有:
①Android Framework 高频面试题总结
②字节跳动高频面试真题解析
③美团 Android 面试真题解析
④Android社招高频面试题
........
以上完整学习笔记pdf全部免费分享,需要的朋友可以一键三连(点赞+收藏+关注)后,【点击这里直达免费获取方式】
很重要的一点,看题要带着理解、带着思考去看,将题目与实际开发的内容结合去理解,这样很容易就记下来了,死记硬背效果不好。还有看面试题不能只看一次,需要反复看,就像你高中准备考试那样。看完这些面试题后,我能很自信的在我简历写上了:
-
具有良好的C/C++/java编程基础,熟练掌握常用的设计模式,熟悉多线程编程、熟悉网络编程;
-
熟悉掌握Android App开发知识和技巧
-
熟悉android结构体系,熟悉android常见组件如:activity,service,fragment等组件的原理
对于Framework这听着就高大上的东西,当时我能做的就是带着理解把下面这几道题目背的滚瓜烂熟,在此之前我压根就了解Framework。
-
Binder有什么优势?(字节跳动)
-
Binder是如何做到一次拷贝的?(腾讯)
-
MMAP的原理讲解;(腾讯)
-
为什么Intent不能传递大数据?(阿里)
-
描述AIDL生成的java类细节;(字节跳动)
-
四大组件底层的通信机制;(字节跳动)
-
为什么Intent不能传递大数据?(阿里)
对于背面试题,我只能说两个字。
2.源码初探
在看完上面的面试题后,已经能应付很多问题了,但是好像还缺了点什么?没错,就是能让你装逼的源码。当时我选择了常用集合的源码,基本都是边看源码、边对着别人的博文跟着一行行的学。在学习 Android 集合源码时,对我很有帮助是这份《Android源码解析》:
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
看完这些源码后,我把一些我掌握的比较好的写到简历里去了,因为这是当时我觉得自己为数不多的亮点了。
这些源码的准备也基本全用上了,面试中遇到过这些相关的问题:
-
AsyncTask 是串行还是并行执行?
-
AsyncTask 随着安卓版本的变迁
-
Retrofit 与 OkHttp 是怎么合作的?
-
Retrofit 中的数据究竟是怎么处理的?它是怎么返回 RxJava.Observable 的?
-
..........
后面被问多了,就会加一些自己的思考。
自己深挖过(例如看过源码)的知识点被问到时,一定要抓住机会表现,让面试官感受到自己的深度,这些都是加分的点。
3.项目准备
除了技术知识外,项目也是必不可少的一环,但是不需要准备很多,只需要挑2-3个你最牛逼的需求点准备就行了。
-
图像处理SDK(独立aar,拼图整体界面纯Canvas绘制及手势动画,利用renderscript滤镜算法及高斯模糊,深拷贝备份实现回退.......)
-
画屏APP( 给Android app设计编写架构,研发框架,完成产品功能迭代与性能调优.......)
第2其实就是来凑数的,打扰了。
但是项目中遇到难题时千万不要总想着退缩,这些解决难题的过程、解决的难题,都会让你快速成长和受用终身。
这些内容就是我开始面试前的全部准备了,从2月初到3月底,差不多准备了1个半月,当时的简历是这么写的。现在看起来有点 low,但是当时已经是我的极限了。
咸鱼修炼出山
准备好了之后就是疯狂投递简历了,各种知名的招聘网站都要去投,也没有什么挑选的说法(唯一可能就是尽量选互联网公司,还有就是像阿里腾讯这种大公司,咱是不敢投的),只要是招2年 Android 的投就完事了。只要能给个面试机会,咱就得谢天谢地了。
从3月底面试到了4月底,总共面了20来个公司。基本是每天2个面试,上午下午各一个。早上室友还没起床,我就已经出门了。早餐都是在三林东地铁站附近的巴比馒头解决的;午餐就在面试公司的附近找家麦当劳解决。那段时间每天在路上奔波的时间至少四五个小时,但是完全不觉得累,整个人对未来充满了希望。
也多亏了这一个月的面试时光,我走过了上海的很多地方:漕河泾、张江高科、唐镇、人民广场、陆家嘴、中山公园,之前在上海呆了2年去过的地方还没我面试期间去的多。
面试经历
面试有时候就跟碰运气一样,运气好点,问的全是会的,运气差点,两句话就被轰出来。
这里就只放部分公司的面试题了,有些实在是不记得了。。。
小公司1
-
java有什么特性,继承有什么用处,多态有什么用处
-
反射是什么,在哪里用到,怎么利用反射创建一个对象
-
代理模式与装饰模式的区别,手写一个静态代理,一个动态代理
-
对象加载的过程,属性先加载还是方法先加载
-
垃圾回收机制与jvm结构
-
自定义View,事件分发机制讲一讲
-
http与https有什么区别
-
Activity启动模式,以及各启动模式生命周期问题
-
静态方法,静态对象为什么不能继承
-
Activity怎么启动Service,Activity与Service交互,Service与Thread的区别
-
介绍一下android动画
-
Launcher启动App的流程,中间有几种跨进程通信(socket)
-
Handler通信,Binder通信
-
你碰到过什么内存泄漏,怎么处理
-
RXJava怎么切换线程
-
Fragment hide show生命周期
-
平常有用到什么锁,synchronized底层原理是什么
小公司2
-
简单描述下Handler,Handler是怎么切换线程的,Handler同步屏障
-
Glide的缓存,有用过Glide的什么深入的API,自定义model是在Glide的什么阶段
-
讲讲mvc,mvp模式,presenter内存泄漏的问题
-
ANR了解过吗?有没有实际的ANR定位问题的经历
-
性能优化你做过哪些?
-
有什么实际解决UI卡顿优化的经历
-
有做过什么Bitmap优化的实际经验
-
项目搭建过程中有什么经验,有用到什么gradle脚本,分包有做什么操作
-
组件化有详细了解过吗?ARouter详细原理
-
讲一下事件分发机制,RecyclerView是怎么处理内部ViewClick冲突的
-
mainfest中配置LargeHeap,真的能分配到大内存吗?
天天拍车
-
说说HashMap的原理
-
说说Java的内存分区
-
讲讲你对垃圾回收机制的了解,老年代有什么算法?
-
说说你对volatile字段有什么用途?
-
说说事件分发机制,怎么写一个不能滑动的ViewPager
-
说说你对类加载机制的了解?DexClassLoader与PathClassLoader的区别
-
说说插件化的原理,资源的插件化id重复如何解决?
-
mvp与mvvm模式的区别是什么?
-
JetPack组件用过哪些?lifeCycle的原理是什么?如果在onStart里面订阅,会回调onCreate吗?
-
单例模式有什么缺点?
-
说说App的启动过程,在ActivityThread的main方法里面做了什么事,什么时候启动第一个Activity?
-
说说你对Handler机制的了解,同步消息,异步消息等
-
说说你对屏幕刷新机制的了解,双重缓冲,三重缓冲,黄油模型
-
onCreate,onResume,onStart里面,什么地方可以获得宽高
-
为什么view.post可以获得宽高,有看过view.post的源码吗?
-
attachToWindow什么时候调用?
-
DataBinding的原理了解吗?
浦发信用卡
-
自定义view,中英文字符串宽高测量显示,测量算法,可扩展性
-
事件分发机制
-
Activity,view,window联系
-
热修复和插件化原理
-
Synchronized底层原理,java锁机制
-
java容器,hashmap和hashtable区别,hashmap原理,扩容流程,扰动算法的优势
-
ArrayList和LinkendList区别,List泛型擦除,为什么反射能够在ArrayList< String >中添加int类型
-
Http和Https区别,SSL/TLS过程
-
Android性能优化
-
jvm虚拟机,堆和栈的结构,栈帧,JMM
-
组件化注意点,组件间通信机制
-
线程安全的单例模式有哪几种
-
熟悉的设计模式
美团
-
线程挂起,休眠,释放资源相关,唤醒,线程同步,数据传递,问了很多线程的问题,问了20分钟大概
-
static synchronized 方法的多线程访问和作用,同一个类里面两个synchronized方法,两个线程同时访问的问题
-
内部类和静态内部类和匿名内部类,以及项目中的应用
-
泛型是什么以及在项目中的应用
-
handler发消息给子线程,looper怎么启动
-
down、move、up事件的传递
-
activity栈
-
封装view的时候怎么知道view的大小
-
intent-filter
-
arraylist和linkedlist的区别,以及应用场景
-
怎么启动service,service和activity怎么进行数据交互
-
下拉状态栏是不是影响activity的生命周期,如果在onStop的时候做了网络请求,onResume的时候怎么恢复
-
view渲染
开始面试完拿到了几个offer,但是拒绝了,选择了面试最后两家公司:浦发和美团,我不是一个相信运气的人,但是这次幸运女神确实眷顾了我,让我抓住了最后一根稻草。
进美团并不是一帆风顺的,拿到面试资格都费了好大劲,当时自己的简历太普通了,大概率入不了美团hr的法眼,但是我还是厚着脸皮投了很多部门,有些部门还投了很多次。终于,在我的死缠烂打下,有一位善良的hr给了我一次机会,这是我进美团的第一位贵人。
就这样,我不可思议的拿到了美团的offer,薪水也超过了我的预期。
进大厂的诀窍
经过这几年的“摸爬滚打”,我发现进大厂确实有一些诀窍,对于和我一样背景一般的同学,只要你抓住了诀窍,进大厂不是梦。
**1)一定要提前准备,至少准备个一个月,**网上的面试题多看看,对于那些高频题目,带着理解去学习,实在不能理解的就背下来,大家高考的时候不都是背过来的。
2)大厂通常有很多部门,每个部门的hc数和招人标准都不一样,即便是同个部门,如果hr不同,标准肯定也不一样,**重复投简历可以增大我们拿到面试机会的概率。**同理,重复面试不同的部门,也可以增大我们进大厂的概率。
3)大厂经常会布局新业务,**新业务需要快速启动入场,hc通常会有很多,因此招人的标准会稍微降低,**这个时候是个绝佳的机会。我当时进的就是个新的业务部门。
写在最后
有时候,选择比努力更加重要,机遇比奋斗更加重要。但是,机会只留给有准备的人。我们只有时刻准备着,才能在机会到来的时候,去抓住它。
我很幸运的是,当我准备好的时候,机会来了。从此以后,我变成了一个相信运气的人。
我相信,越努力,越幸运。
这里给大家分享一下我的面试复习路线,有需要的朋友可以参考一下:
1、看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
2、进行系统梳理知识,提升储备
客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
系统学习方向:
-
**架构师筑基必备技能:**深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
-
**Android高级UI与FrameWork源码:**高级UI晋升+Framework内核解析+Android组件内核+数据持久化
-
**360°全方面性能调优:**设计思想与代码质量优化+程序性能优化+开发效率优化
-
**解读开源框架设计思想:**热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
-
**NDK模块开发:**NDK基础知识体系+底层图片处理+音视频开发
-
**微信小程序:**小程序介绍+UI开发+API操作+微信对接
-
**Hybrid 开发与Flutter:**Html5项目实战+Flutter进阶
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
3、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
这个源码的资料我在上面已经分享展示出来了,这里就不再放图片了。
以上完整学习笔记pdf全部免费分享,需要的朋友可以一键三连(点赞+收藏+关注)后,【点击这里直达免费获取方式】
4、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。