前言

Android开发3年当了2年咸鱼每天CRUD,复习2个月幸运拿下美团offer!

这是我去年的经历,觉得还挺励志的,希望能帮助到一些正在迷茫的同学。

是去美团送外卖了?有配电瓶车吗?

答:亲,有配的哦,开起来贼顺滑。啊呸,说啥了,咱进的是正儿八经的技术部门。

咸鱼的自我救赎

当时刚过完年回到上海,此时的我已经毕业两年半了,和大多数咸鱼一样,上班就是CRUD,下班就是看剧、玩游戏(英雄联盟、手游都玩)。

当时我的工资一个月到手就5k出头,但是因为在甲方驻场开发,加上差补餐补有接近8k,还包住。每到周末几个小伙伴一起打牌、一起搞情、一起洗脚,日子过得很是滋润,当时其实挺满足的。

让我萌生想跳槽的根本原因已经忘了,想了很久没想起来,可能是受其他小伙伴的影响吧,有了这种想法后就开始准备起来了。

刚开始只是每天下班后躺在床上看别人的博客学习一些东西,一般是22:30看一小时左右,当时最先看的是线程、四大组件、Java基础相关知识,等等这类比较基础的知识。

想跳槽的想法有了之后便一发不可收拾,如果说刚开始每天晚上看1小时只是在试探,那么半个月之后我便全力投入面试准备了。

当时工作上的事情不是很多,每天花个两三个小时基本就能应付了,所以其余的上班时间我都拿来准备面试了。准备面试的方式主要通过看别人的博客、看源码,内容主要是 Android 核心知识和 Android 面试题。

从二月初准备到了三月底,这期间我主要干了以下几件事:

1.看面试题

这期间我看了很多套 Android 面试题,还记得的有:

①Android Framework 高频面试题总结

alt

②字节跳动高频面试真题解析

alt

③美团 Android 面试真题解析

alt

④Android社招高频面试题

alt

........

以上完整学习笔记pdf全部免费分享,需要的朋友可以一键三连(点赞+收藏+关注)后,【点击这里直达免费获取方式

很重要的一点,看题要带着理解、带着思考去看,将题目与实际开发的内容结合去理解,这样很容易就记下来了,死记硬背效果不好。还有看面试题不能只看一次,需要反复看,就像你高中准备考试那样。看完这些面试题后,我能很自信的在我简历写上了:

  • 具有良好的C/C++/java编程基础,熟练掌握常用的设计模式,熟悉多线程编程、熟悉网络编程;

  • 熟悉掌握Android App开发知识和技巧

  • 熟悉android结构体系,熟悉android常见组件如:activity,service,fragment等组件的原理

对于Framework这听着就高大上的东西,当时我能做的就是带着理解把下面这几道题目背的滚瓜烂熟,在此之前我压根就了解Framework。

  • Binder有什么优势?(字节跳动)

  • Binder是如何做到一次拷贝的?(腾讯)

  • MMAP的原理讲解;(腾讯)

  • 为什么Intent不能传递大数据?(阿里)

  • 描述AIDL生成的java类细节;(字节跳动)

  • 四大组件底层的通信机制;(字节跳动)

  • 为什么Intent不能传递大数据?(阿里)

对于背面试题,我只能说两个字。

alt

2.源码初探

在看完上面的面试题后,已经能应付很多问题了,但是好像还缺了点什么?没错,就是能让你装逼的源码。当时我选择了常用集合的源码,基本都是边看源码、边对着别人的博文跟着一行行的学。在学习 Android 集合源码时,对我很有帮助是这份《Android源码解析》:

主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。

alt

看完这些源码后,我把一些我掌握的比较好的写到简历里去了,因为这是当时我觉得自己为数不多的亮点了。

这些源码的准备也基本全用上了,面试中遇到过这些相关的问题:

  • AsyncTask 是串行还是并行执行?

  • AsyncTask 随着安卓版本的变迁

  • Retrofit 与 OkHttp 是怎么合作的?

  • Retrofit 中的数据究竟是怎么处理的?它是怎么返回 RxJava.Observable 的?

  • ..........

后面被问多了,就会加一些自己的思考。

自己深挖过(例如看过源码)的知识点被问到时,一定要抓住机会表现,让面试官感受到自己的深度,这些都是加分的点。

3.项目准备

除了技术知识外,项目也是必不可少的一环,但是不需要准备很多,只需要挑2-3个你最牛逼的需求点准备就行了。

  • 图像处理SDK(独立aar,拼图整体界面纯Canvas绘制及手势动画,利用renderscript滤镜算法及高斯模糊,深拷贝备份实现回退.......)

  • 画屏APP( 给Android app设计编写架构,研发框架,完成产品功能迭代与性能调优.......)

第2其实就是来凑数的,打扰了。

但是项目中遇到难题时千万不要总想着退缩,这些解决难题的过程、解决的难题,都会让你快速成长和受用终身。

这些内容就是我开始面试前的全部准备了,从2月初到3月底,差不多准备了1个半月,当时的简历是这么写的。现在看起来有点 low,但是当时已经是我的极限了。

alt

咸鱼修炼出山

准备好了之后就是疯狂投递简历了,各种知名的招聘网站都要去投,也没有什么挑选的说法(唯一可能就是尽量选互联网公司,还有就是像阿里腾讯这种大公司,咱是不敢投的),只要是招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进阶

alt

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

3、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

这个源码的资料我在上面已经分享展示出来了,这里就不再放图片了。

以上完整学习笔记pdf全部免费分享,需要的朋友可以一键三连(点赞+收藏+关注)后,【点击这里直达免费获取方式

4、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。