前言
这是我去年的经历,觉得还挺励志的,希望能帮助到一些正在迷茫的同学。
是去美团送外卖了?有配电瓶车吗?
答:亲,有配的哦,开起来贼顺滑。啊呸,说啥了,咱进的是正儿八经的技术部门。
咸鱼的自我救赎
当时刚过完年回到上海,此时的我已经毕业两年半了,和大多数咸鱼一样,上班就是CRUD,下班就是看剧、玩游戏(英雄联盟、手游都玩)。
当时我的工资一个月到手就5k出头,但是因为在甲方驻场开发,加上差补餐补有接近8k,还包住。每到周末几个小伙伴一起打牌、一起搞情、一起洗脚,日子过得很是滋润,当时其实挺满足的。
让我萌生想跳槽的根本原因已经忘了,想了很久没想起来,可能是受其他小伙伴的影响吧,有了这种想法后就开始准备起来了。
刚开始只是每天下班后躺在床上看别人的博客学习一些东西,一般是22:30看一小时左右,当时最先看的是线程、四大组件、Java基础相关知识,等等这类比较基础的知识。
想跳槽的想法有了之后便一发不可收拾,如果说刚开始每天晚上看1小时只是在试探,那么半个月之后我便全力投入面试准备了。
当时工作上的事情不是很多,每天花个两三个小时基本就能应付了,所以其余的上班时间我都拿来准备面试了。准备面试的方式主要通过看别人的博客、看源码,内容主要是 Android 核心知识和 Android 面试题。
从二月初准备到了三月底,这期间我主要干了以下几件事:
1.看面试题
这期间我看了很多套 Android 面试题,还记得的有:
①Android Framework 高频面试题总结
②字节跳动高频面试真题解析
③美团 Android 面试真题解析
④Android社招高频面试题
........
很重要的一点,看题要带着理解、带着思考去看,将题目与实际开发的内容结合去理解,这样很容易就记下来了,死记硬背效果不好。还有看面试题不能只看一次,需要反复看,就像你高中准备考试那样。看完这些面试题后,我能很自信的在我简历写上了:
- 具有良好的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、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
4、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。