一、关于我
笔者从事Android开发3年了,前两年一直在百度coder。因为业务调整的原因拿了N+1离开了,开开心心的在家休整了一个多月,上月末才开始面试。
可能是在百度安逸惯了,结果出来碰了一鼻子灰。
我一开始觉得自己好歹也算是三年大厂经验,要个16K不过分吧,结果,我先后试了今日头条、飞书、陌陌、优酷、微信都碰壁了。
字节的那两个是算法不过关,优酷是音视频开发苦手,微信和陌陌是因为flutter不会,后面HR又觉得我要价太高,然后……就没有然后了……
老实说是备受打击的,已经在怀疑人生了。
但是,总不可能不工作吧。
回去后闭关复习了20天左右,出关面了12家大厂,拿下了10家,节后到岗。心里美滋滋~ 今天特地来给大家分享我准备面试的经验,以此回馈社会,积攒人品,希望对大家准备面试有帮助~
二、我的面试准备
这是我最难熬的一段时间,很忙,但是也是真的非常充实。
我先是对前面五次碰壁的经历进行了总结,归纳了一下自己的短板,还有一些面试中的表现失误,全部用一个本子记了下来,这样一来,复习思路就清晰来了很多。
通过归纳我总结出了以下的一些点,大家也可以当做复习参考。
其实Android岗的面试都是差不多的。常问的这几块知识点,按照其重要程度排序,笔者认为可以这样排:
- 数据结构与算法,
- Java,
- Android(如果不找安卓的就去掉这部分),
- 计算机网络,
- 操作系统,
- 设计模式。
下面就按照这个重要性顺序给出一些准备的建议。
数据结构与算法模块
大家可以看这个:《最短时间搞定算法:字节跳动Android岗算法题考前突击宝典》
当然,学习和积累都是功在平时,指望临时抱佛脚的思想是非常危险的。这个分享只给那些时间仓促,没有办法的朋友,不过时间充裕的朋友也可以当做一个查漏补缺和重点突破的方向。
下面说一下我个人的学习方法推荐。
学习书籍推荐:
- 《算法导论》
- 《大话数据结构》
- 《数据结构与算法分析》(PS:java语言描述)
- 《剑指offer》
- 《labuladong的算法小抄》
推荐在线刷题网站:
- Leetcode(LeetCode Online Judge),
- Lintcod(LintCode - 主页),
- 牛客网(在线编程_C++Java前端经典笔试面试题库)
Java 模块
找程序员工作,大多数情况下需要掌握好一门面向对象的语言,主流上分为Java和C++两大阵营。这里讲Java需要怎么准备。
书籍推荐:
入门书籍:
- 《Java核心技术卷一》
- 《Head first in java》(如果一点面向对象的概念都没有那就看这本)
提高书籍(我一般只推荐经典书籍,很干):
- 《Java编程思想》
Java虚拟机:
- 《Java编程思想》
- 《深入理解Java虚拟机》
Java多线程:
- 《Java多线程编程核心技术》
- 《Java并发编程实践》
其实我觉得如果有一定基础建议直接看Java编程思想,面试中的考点经常都会在这本书中有讲到。当然Java虚拟机和多线程这两块需要再看一些专门讲解的书,每一次java面试考查内容几乎都离不开这两块。
下面我会对 java考察内容进行一些总结。
Java模块知识要点整理
1、深入理解Java泛型
- 泛型的作用与定义
- 通配符与嵌套
- 泛型的上下边界
- RxJava中深入理解泛型
2、注解深入浅出
- 注解(ANNOTATIONS)
- 元注解
- 自定义注解
- APT
- 插桩
- 反射
- Retrofit中的注解
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
内容较多,都以PDF的格式整理成文档了,大家可以通过扫描下方二维码,备注【
面试
】直接找我获取。
↓↓↓↓↓
Android 模块
主要问的一些问题
1, Activity,Service,BrocastReceiver,Intent,Fragemnet,ContentProvider,这些组件的基础知识,比如Activity两种启动方式,生命周期,四种启动模式,Service则主要是:两种启动方式,生命周期。还有组件之间怎么通信之类的问题。
2, Android的数据存储方式,数据库,sd卡,SharedPreferences 这些
3, Listview的优化,与scollview的区别
4, view状态与重绘,view的绘制过程,view的事件分发机制,view的事件冲突处理
5, Android多线程异步机制,AsyncTask工作原理与源码实现,Handler,Message,Looper异步实现机制与源码分析
6, Android常见的开源框架(主要是网络通信,图片加载这些),了解怎么使用,分析源码
7, Oom和anr异常引发的原因,怎么解决
8, 了解一些常见的图片缓存技术
Android常问知识点答案和解析整理
1、高级UI晋升
- 触摸事件分发机制
- View渲染机制
- 常用View
- 布局ViewGroup
- 自定义View实战
2、Android组件内核
- Activity调用栈
- Fragment管理与内核
- Service内核原理
- 内核之组件间通信方案
- 组件间通信方案
3、大型项目必备IPC
- Binder 原理机制
- 其他 IPC 方式
- ……
4、数据持久化
- Android文件系统
- 轻量级Kv持久化
- 嵌入式数据库 SQLite
- ……
5、Framework内核解析
内容较多,都以PDF的格式整理成文档了,大家可以通过扫描下方二维码,备注【
面试
】直接找我获取。
↓↓↓↓↓
计算机网络模块
书籍推荐:
《计算机网络自顶向下》
《tcp/ip协议详解》
主要看:主要看应用层,传输层,网络层,其中传输层最为重要。
主要问的一些问题:
1, TCP和UDP的区别
2, TCP的三次握手,和四次挥手,为什么需要三次握手,为什么要四次挥手(这两个为什么要考虑非常清楚)
3, TCP拥塞控制算法(慢启动,拥塞避免,快速恢复),流量控制算法,滑动窗口协议,选择重传。
4, TCP可靠性是怎么保证的(通过哪些机制保证)?
5, HTTP协议报文格式,请求方法字段以及各个方法之间的区别,了解常见的响应状态码,了解cookie机制,了解WEB缓存技术(条件get方法)。
6, DNS协议的各层域名服务器,两种查询方式(递归和迭代),dns缓存
7, Udp的特点,适用场景,校验机制
8, 从输入一个网址到最后网页显示整个过程发生了什么?
9, IP地址组成,ARR,RARP,ICMP协议,路由选择算法
三、一大把面经
1. 探探
是通过脉脉上网红马映怡推荐的,马映怡之前在字节跳动,今年4月份到了探探,在脉脉找到了我,正好我有出去看看的意向,就约了时间去面试,探探的办公环境还是比较好的。
一面
OpenGL一些知识,顶点着色器、片元着色器的工作原理,什么是VBO(这个没想起来),以及shader的一些简单问题
View的事件传递机制
包体积优化
JVM相关知识,Dalvik和ART的区别
组件化的实现方案
算法题,ViewGroup的层级深度,转换为二叉树的层级深度
二面
二面面试官,比较注重思维,我理解为聪不聪明的意思,有点脑筋急转弯的意思,要求的最简单有效的方法。
RecyclerView防止内存OOM的一道题,充分利用自身的缓存机制,可能我始终没理解问题所在,虽然给出解决方案,但是面试官不满意,太繁琐
讨论LRUcache的实现和时间复杂度
三面
cto面试
聊了一下抖音发展的过程中我的角色,做过什么事情,有什么收益
在华为的一些经历,为什么离开华为
聊了一到算法题,查找两个字符串的交集和字符串1中有字符串2中没有的问题。
四面(不是一天)
这次主要是聊一下我将要做的工作,以及让其他面试官再次了解一下我,因为评级比较高,所以需要谨慎点。
总结
整体来说探探发展还是不错,尤其近两年要上市,环境也不错,管三餐,加班不严重,双休,工资也给力,但是也是由于近两年要上市,所以要做的东西还是比较多和急,需要你有一定的能力。
2. 快陪练
快陪练整体的环境并不是很好,环境很嘈杂,而且我是在门口面试的,很乱。
一面
MVC、MVP和MVVM的原理和区别
设计的六大基础原则
使用UML画一下访问者设计模式
二面
先聊了聊为什么离开现在公司,毕竟现在这么火
我做的项目中的一些解决方案,组件化、字节码注入、包体积的极致优化
直播的架构设计
三面
设计一个上传日志的大小,涉及到,性能、文件大小、怎样压缩、时机、TopK问题等
聊了聊在字节跳动做的事情
总结
是一家创业公司,给的薪资还是挺不错的,但是由于是996,没有加班工资,多出来的钱可能就是加班工资吧,后面听hr说公司正在打算取消996
3. 猿辅导
猿辅导面试应该是有硬性的时间指标,应该是每一轮面试都要差不多1个小时,并且会出1~2道算法题。
一面
主要聊了下面几个方面
热修复,主要说了ClassLoader的方式和Rubost的插装方式,重点介绍了Rubost的原理。
实现直播礼物的一些技术选型,和播放带有alpha通道MP4的解决方案
怎么实现字节码注入
抖音组件的探索,SPI到字节码注入,优缺点。
接下来就是两道算法题
String字符串的数字相加
使用三个线程顺序打印有序的数组
提问环节
二面
包体积优化:静态Lint,Proguard,AndResGuard和删除R.java中的所有字段,删除access$方法,在gradle的transform阶段将压缩png和jpeg,使用google开源的redex方案,每种方案的原理以及优缺点
MVVM-livedata的实现原理
属性动画的原理,这里没看过,不太清楚
Kotlin写一个let的扩展函数,大体写了一下代码。
算法,可能是我写的太慢了,所以就只有一道
给定一个有序的数组和目标数,找出与目标数最近接的index,要求复杂度是log(n)的时间复杂度
三面
三面就比较轻松了,面试官一直乐呵呵的,又问了一下alpha视频的解决方案,然后聊了聊为什么要离开这么火的项目,问了问我的经历之类的,最后写了两道算法题
二叉树的深度和广度,要求一次遍历
给定一个二叉树和一个目标数,在二叉树中是否存在一条路径的所有节点的和与目标数是相同的case,并且打印。
总结
效率并不是很高,而且并不主动,可能是跟我要的薪水太高有关系,后面通过询问才知道,技术面试是通过了,可能字节跳动本来薪水就很高,我再跳过来,猿辅导考虑到我的工作年限和年龄,会倒挂一大批人,所以只能平薪过来,而且这样知道我肯定不会来,就没主动跟我说。
整个面试环节总体来说还可以,但是就是效率不高,也可能是我运气不好,我是4:10到猿辅导的,然后在前台等了20所分钟,hr才来,说了刚才在电话会议耽误了,这个理解,然后等待面试又等了10多分钟,来了server的面试童鞋,写了道算法题,重新调整到Android面试,又等了15分钟,真正Android面试开始在5:10左右,面试完成后基本到了8:30了。
对自己的表现基本满意,就是好久不手写代码,有点生疏,写的比较慢,大多数问题和答案都得到了面试的认可,对一些知识点没有复习到,其实我是这样认为的,并不是所有的问题或者知识都需要知道,你只需要有1~2个方面了解的很透彻,得到面试官的认可就行。
4. 抖音
一面
在抖音上显示自己做的功能,框架的搭建,实现原理,所做的优化点等。
组件化的实现,为什么做组件化,不同实现的优缺点。
hashmap的实现原理
view的优化,减少层级,异步加载,x2c框架引入,优缺点,textview的优化。
mp4播放alpha视频实现的原理
一面面试官大概聊了1个小时左右,没让我写算法,细究原理和细节,非常仔细。
二面
冷启优化的一些方案。
数据驱动业务的理解,怎么做,和pm产生分歧怎么解决。
我所有做的优化的收益是什么,有什么数据支撑。
事件分发机制,举了一个具体的例子来解决。
http的一些问题,1.1和2.0区别,心跳机制,https怎么建立链接,怎么进行数据加密等。
为什么离开,职业发展,诉求等。
聊了大概一个小时,面试官的思路相对独特,不是为做技术而做技术,技术始终要服务于业务,我非常认可。
总结
趣头条北京位于海淀,位置不靠近地铁,需要步行一段时间,不过效率挺高的,在面试完的第二天就给我发offer了,面试流程也相对较少。对趣头条的营收模式看的不是很清楚,类似发钱看新闻,但是现在头条也再做这个,趣头条能够搞得过头条是个问题,如果没有增长点,那后期的转型是什么(我瞎操心啥)?总体来说体验还是不错的,hr也很真诚,多次沟通,虽然最后我没有去,感兴趣的同学可以去看看。
5. 瓜子二手车
瓜子二手车真的是太远了,从海淀到工作地方将近花费了2个小时,而且还不在地铁附近,还需要坐公交。
一面
聊了一下项目中做过的东西,字节码注入相关知识,transform优化,mp4礼物实现等
从桌面点击icon图标开始,整个启动activity的启动过程
Binder的实现原理
插件化的原理,以及hook点,大概有两个,可以网上搜索一下
hashmap的实现原理
单例的实现,sychrnized的实现原理,以及双锁不加violate,会不会有线程安全问题
二叉树,读取每一层最右边的节点
二面
聊聊大概履历,以及在华为、字节跳动都做了什么,为什么要离开。
职业规划,怎么带领团队
代码设计的基础原则,以及用UML画出工厂模式
将两个有序的链表合并成一个有序的链表,递归和循环两中方式
时间分发机制,并且需要从Android的sensor开始到应用层,我只知道从Activity开始的流程。
聊操作系统Unix,汗颜,我知之甚少。
对新技术的看法(flutter),瓜子二手车也已经开始在项目中使用fultter相关技术
三面(总监)
自我介绍,为什么要离开
线程安全的问题,sychronized和viloated的使用
实现一个CAS(乐观锁)的方法
HashMap的实现原理,怎么优化内存占用,优化resize的过程,这个是开放的问题
四面(VP?)
自我介绍,在抖音做了什么
在抖音做的比较好的两件事情
设计一个美团的框架,组件化
总结
瓜子二手车是众多二手车中做的还算比较好的公司,现在像优信、人人二手车好像都不是很好了,就是太远了,公司附近也没有地铁站,就算是公交站还需要走2公里,但是面试官感觉还是比较有水平的,后期的hr跟我谈也是诚意满满,整个团队在我来看,还是一个想做事情的态度。总体来说hr还是非常真诚的,想去的朋友可以考虑考虑。
6. 小红书
小红书的装修真是豪,办公环境特别棒,但是面试流程有点多,足足面了5轮,不过总体来说技术还是很不错的,不论是广度还是深度,尤其最后一面,专门从上海飞来面试,十分荣幸,从这点就能看出公司对人才的重视程度,是一个值得加入的公司,hr小姐姐人美也真诚。
7. 饿了么
总体来说面试体验还是不错的,三面面试官对于职业发展和新技术的见解都是非常深刻,也给与了我很多建议。
8. 爱奇艺
这次面试的是奇异果,并不是爱奇艺app,因为我还是想做app,二面之后,我就跟面试官说了我的想法,就没必要聊下去了,就直接走了。
9. 快手
总体来说面试官的技术还是很厉害的,二面面试官的背景很好,思路也独特,有点外企风格。三面面试官比较注重算法,和解决问题的思路。整个面试流程真的是不太友好,三次面试去了三次,而且前两次都是在茶水间,一直说会议室订不到,环境特别嘈杂,而且前两次都是临近饭点,茶水间送饭更是杂乱,感觉快手效率和环境有一些混乱(个人面试感觉),但是不能否认快手在2018年的成绩还是很好的,尤其是直播的营收还是相当的不错。
10. 右划
右划真的是一家非常不错的公司,有一件事情就体现了整个公司的价值观:由于我当天去公司接待的人比较多,二面和三面中间大概有两个小时的空档,我其实挺不满意的,跟hr反馈了这个事情,hr立马就跟我解释了事情的原因,并且立马跟我道歉了,后面cto还专门为这个事情跟我说了原因。
虽然后面没有去这个公司,但是我还是很欣赏的,从公司层面,公司的定位很明确,而且有自己的核心技术。从个人来看,公司也是非常人性化,管三餐有房补而且有问题及时改正,我觉得大家可以来看看。
HR面总结
在大多数互联网公司内(除了外企),到了HR面,基本上已经定下来,正常的聊聊就能发offer了,只要别太“个性”,或者三观异于常人就能收到offer,大体就是一个积极乐观的态度。有几点需要注意下:
- 不要说前公司和前leader的坏话
- 对于为什么离开原公司,标准答案是目前公司不适合现有的自身发展,寻求更好的机会,(当然大部分都是因为钱 心知肚明就行,不用说出来)
- 展现自己积极乐观和乐于助人的一面
注意以上几点大体就没问题了。
最后
码字不易,希望大家点赞支持一下。
PS:文中资料都是免费分享的。直接扫码找我就行啦~ 记得给本文三连支持哦~