最近一年工作变动比较频繁,年初和9月份经历了两波面试,大环境和体验很不一样,希望这些总结能帮助到找工作的同学,因为每个人的经历不同,按需参考
基础背景
笔者本7,一直从事Android相关开发工作,呆过5家公司,规模有大有小。技术栈Java/Kotlin/Flutter,做过sdk开发、系统软件开发、普通业务开发,涉及领域有游戏、工具、教育、云、电商等。主动离职过也被裁过,面过30+公司,也当过面试官。
23年大环境
笔者年初被裁,深圳、上海海投,最后约面试的只有10家。
入职后干了一阵不顺心离职,9月份重新开启面试,北上广深杭海投,最后约面试的只有5家。
(初创公司或规模太小笔者都暂不考虑)
简历准备
基于笔者最近自身面试体验,考察内容八股比重已经越来越小,对项目及算法的考察占比越来越多,所以大家平时工作中的时候就要多总结项目亮点。
简历的话一般不要超过3页(多了面试官看的时候真的很麻orz),以亮点项目为主,多写些你主导了什么,最好有数据支撑,技术点的话仅仅了解的就不要写上去了,简历是可以设计的,确保你简历上写的都是你真正熟悉的,可以引导面试官一步一步问下去。
建议养成即使不跳槽也定期更新简历的习惯,推荐一个我自己在用的简历管理软件
www.500d.me/
面试形式及考察内容
技术面试一般3-4面,大家可以根据面试官信息、岗位偏好进行差异化准备
一面
面试官一般是你今后工作的同事或组长,主要考察内容偏向基础知识、项目
二面
面试官一般是你直属leader或移动端负责人,主要考察内容偏向项目深挖
三面
面试官一般是业务负责人,主要考察你的业务sense、做事的方法论、思维完备性等。
比如让你做一个优化,你是只聊到一个点,还是能有全局意识,从线下线上、数据、异常容错等多角度来回答。
HR面
这个环节有卡人的吗?我反正没见过,相对还是比较轻松的环节,大家真实回答就好。
一般会考察你的经历的真实性,沟通协作能力,了解一些个人基本情况,薪酬情况及薪资期望
面试准备
八股
通常指一些基础、进阶的Android相关的知识,一般需要基于自己的理解,多刷一些面经,将高频次考察的点最好能背下来。建议真正开始面试前随机抽取一份八股题自己模拟面一下,最好张嘴讲,脑子里过跟你实际有组织的说出来还是不太一样的
check List:
1.Java基础
2.Android基础
3.性能优化
4.常用开源库理解
5.网络
Android相关的八股真的是太多了,一定要抓重点高频的看,复习时间不宜过长,否则很容易又忘了,如果基础比较好的同学建议复习个 1-2 周就差不多了。
如果我是面试官,此模块10分制我给3分的比重
项目
说一下你做过的最难的项目/项目中的难点亮点
不知道什么时候卷起的这阵风orz
我觉得大家不必死扣“难”这个字眼,只要把自己主导的项目核心的点真实清晰流畅的讲出来就好,如果面试官觉得你做的东西没有深度不够“难”,我只能说有缘再见了,无需自我pua
如果平时有总结的习惯,建议复习个一周就够了,毕竟自己做的东西,回忆一下就差不多了。还有就是可以代入面试官视角审视下你的项目,你会问什么?
如果我是面试官,此模块10分制我给5分的比重
代码考察(算法/设计)
现在一般都有算法考察环节,Android的话一般难度 easy/medium,没什么好说的刷题就完了,这里推荐东哥的刷题指南,讲的透彻易懂
labuladong.gitee.io/algo/home/
建议通读一遍,里边的题目都跟着刷一遍,然后去刷 LeetCode hot100
leetcode.cn/studyplan/t…
笔者刷了两轮,基于自己理解基本达到默写的程度
还有一些公司可能喜欢考一些多线程的题目,建议也都过一遍
leetcode.cn/problemset/…
再来就是一些情景设计的题目,列几个笔者真实面试经历过的:
1.写个跨进程通信的例子
2.按钮防重
3.搜索页面的设计
4.单例模式
算法的话国内一般考察用牛客,跟leetCode操作还是不太一样的,需要自己写输入输出,建议提前去熟悉下界面
www.nowcoder.com/
有的公司可能会将代码考核的环节放到开头,即使没写出来不要影响后边的心态,真不是说没AC就一定挂的。
如果纯小白,可能需要个把月刷下题找找感觉,基础比较好的同学我觉得过一遍hot100花个1周就差不多了
如果我是面试官,此模块10分制我给2分的比重
开放性问答
现在一般面试官最后都喜欢反问一下你有什么想问我的吗?面试是个双向选择的过程,大家可以抓住这个机会多了解下团队氛围、工作强度等和自己息息相关的问题,下面列了一些笔者常问的问题以供参考
一面:
客户端的团队规模,业务介绍,工作作息时间
二面:
开发节奏、项目周期(单周/双周/月迭代)ps:这个还是可以侧面看看卷不卷哈,单周可能压力就比较大orz
如果自己去了后边会负责哪块
三面:
职级晋升、调薪这块是什么样的,业务是否盈利,业务的发展等
HR面:
薪资构成结构、公积金基础及比例、福利等,当然这些一般hr都会沟通中就跟你讲,如果没说到的check补充问一下
其他一些笔者碰到的问题总结如下:
可以自己提前脑补个好点的说辞
1.同事对你的评价?正向的反向的
2.你未来几年的职业规划是什么样的
3.对加班的看法
4.公司或团队有让你不满的地方你会什么表现?
自我介绍
我面了30多家公司只碰到过一次开头没让我自我介绍。所以这是很重要的一个环节,建议写下背诵下来机械化呈现给面试官,一般控制在2-3分钟,主要聊下你的工作经历,主导了些啥,牵引面试官后边继续问你
简历投递与面试排期表
如果想节省时间,一般不要等完全复习好再开始投简历,可以提前一个多礼拜就开始投递,HR筛选约面试也要时间的
约面试一天一般不要超过3个,2个我都觉得挺累了,可以规划个表格记录一下便于自己check有无冲突
各公司面试偏好
手机类厂商
一般两面技术面,如果有三面一般是整个业务负责人,偏向问一些方法论、思路、规划等问题,不问具体技术问题,没有算法题(oppo,vivo)
华为、荣耀的话比较例外,面试的时候没有算法环节,但是多了个单独的算法考核和性格测试,都是你在限定日期前任意时间打开链接进去做题就行,会有作弊监控,一般2-3道题,性格测试就常规答题就行
大疆的面试风格感觉跟手机厂差不多,然后也多一个性格测试环节
富途
富途的面试官感觉都很open,面试感觉像跟朋友聊天一样,但是三面的时候很喜欢问一些智力型题目,比如白鼠试毒、赛跑问题 blog.csdn.net/weixin_3983… 等
腾讯/字节/拼多多/美团
八股越来越少了,更侧重项目了,每面都有算法题
面试通关之后
谈薪
恭喜大家通关技术面试,但是接下来也是比较重要的环节。
由于每个人的背景、经历不同,而且薪资涨幅一般都会参考你近一年或半年的薪资流水,所以即使相同的职级,薪资可能也天差地别,这里推荐一个网站,可以对不同公司的职级薪资范围有一个大概了解,仅供参考哦 duibiao.info/
跟HR argue薪资技巧:
如果有其他offer比较好谈一些,笔者也是argue有成功有失败,但是大家还是大胆要,这是最容易争取的环节了,一般入职后再想涨薪是很难的,不要怕offer argue没了,如果真想要你不存在这问题。
如果入职时间是前司年终奖没拿到的情况,可以尝试问问可不可以签字费补偿一下。
欢迎大家传授argue技巧
调查
你也不想入职后团队氛围很差很卷吧,建议大家通过脉脉(仅供参考)、熟人提前渗透了解一下
面试之外
恭喜大家顺利入职,真正的战斗才刚开始。
如果明天你就要离职了你今天会干些什么?
多多定期总结吧,多关注记录一些具体数据指标
还有一些绩效证明啥的可以保存一下,有些HR可能要求提供一下
最近看了公司几个技术分享视频,是纯英文分享,感觉很有意思
之前投简历的时候,比如多邻国、滴滴要求英文面试,遗憾的留下了弱鸡的泪水
如果多会门语言,机会也会更多,英语学习要排上日程了,争取下次面试可以有更大的选择范围
最后,附上笔者经历的4波面试的真实面经,祝大家都拿到满意的offer。
2016年~2023年真实面经
OPPO
聊项目
Volley如何做到可以使用httpclient,httpurlconnection,甚者扩展一下使用okhttp的?
Glide.with 传不同context区别?Glide创建的感知生命周期的Fragment与一般Fragment有什么不同?
Glide preLoad原理
Glide的缓存与其他库的缓存有什么不用?
Glide的BitmapPool有什么作用?什么条件下会用?
App图片这块怎么处理的?有碰到内存泄漏吗,怎么处理的?
LeakCanary如何检测内存泄漏的?
SmartRefresh下拉刷新原理?为什么包什么控件都可以?
RecyclerView缓存机制,和ListView区别,多级缓存好在哪里?
IPC有哪些方式?
IPC的安全怎么保证的?
做sdk要考虑哪些方面?
App线上bug怎么处理的,有印象深刻的吗?
为什么要跳槽?
今后的规划是怎样的?
大疆
聊项目
HashMap 扩容流程讲一下 ,为什么是长度变为两倍
IPC、Binder内存映射具体是怎么实现的
除了Binder 其他通信方式两次拷贝是什么样的
为什么 有了 Binder 还要有 Socket 为什么跨设备不能用Binder
安全校验怎么校验
Tcp/Ip
jvm模型
gc回收方法
你看过的源码
自定义View
动画的种类跟区别
MVVM和MVP区别及优势是什么?mvp模式使用中发现过什么问题
rxjava的背压思路
retrofit源码
一个很大的文件存进app数据库怎么做
多部门协作可能另一个部门返回的数据格式跟自己封装的不一样该如何处理
如何修改请求的url
Review代码主要看什么?
你觉得无人机这个行业怎么样?怎么看待的?
富途
平常看过第三方框架源码吗,都看哪些
用过哪些设计模式,觉得哪些第三方框架设计的非常好,用了哪些模式
Android里的IPC
Android里为什么要定义一个UI线程,你觉得iOS是单线程模型吗
内存泄漏的根本原因是什么?解决过哪些内存泄漏问题,有没有总结过怎么防止出现这些问题
有用过多线程吗,怎么用的
做过什么性能优化
HashMap的存储结构,红黑树查找的时间复杂度,插入数据的流程,数组的索引怎么算的
abcde 占多大内存 int占多大内存
内存、进程、线程你是怎么理解的
死锁是什么,怎么解决死锁
http是哪一层,TCP流量控制拥塞控制有什么区别
两个线程 对同一个普通变量分别累加10次 最后变量的值?为什么?
说下快速排序,时间复杂度,怎么计算的
一堆鸡蛋,怎么快速找到最大和最小的
二叉搜索树的特点? 实现二叉搜索树插入函数
洗牌算法
公司发现某一段时间内少发了工资,现在要给那段时间内在职的人员进行补发工资,写一段SQL
查询需要补发的人数
旋转数组,找出最小的数,时间复杂度尽量低
买卖股票 只能买卖一次
赛道赛跑问题
腾讯
聊项目
Java8 Lamda 匿名内部类 会引发什么问题 怎么解决
Handler机制,同步异步消息、为啥不会卡死
epoll相关 Linux多路复用实现机制
做过的性能优化
断点续传机制
虾皮
乐观锁、悲观锁区别,适用场景
CAS有什么问题
锁优化过程
volatile和synchronize的区别,volatile可见性怎么保证的
synchronize锁静态方法和实例方法区别
单例模式用过哪些?枚举的单例用过吗?怎么破坏这些单例,为什么序列化可以破坏,还有什么方式?
手写DCL的单例,两处判空的目的,volatile的作用,除了防止指令重排还有什么作用
HTTPS秘钥协商流程,HTTPS是保证什么安全?可以防止第三方破坏吗?C\S端可以判断通信是否可信吗?
View绘制流程,绘制最开始是从哪里触发的
Jetpack用过哪些组件,LiveData使用有碰到什么问题吗?怎么判断该用粘性还是非粘性的?
卡顿优化,卡顿监控原理,内存优化,启动优化
Glide缓存机制,缓存流程,怎么查找有没有缓存的?比其他图片库好在哪里,和Fresco对比如何
Linux跨进程通信方式,Binder的优势
应用怎么使用内存映射,有哪些使用场景,有了解过xlog吗
消息机制,一个线程可以有几个Looper,几个msgQueue,几个Handler,子线程looper和主线程有啥区别
没消息时怎么处理,挂起是在哪里挂起,epoll相比select\poll 有什么优势
idleHandler听过吗?有哪些使用场景?为什么不可靠?
搜索二维数组
QQ音乐
activity a 启动 activity b 生命周期, onPause onStop什么区别
android ipc有哪些方式,如果想要传一个大的图片文件怎么办?
binder线程满了会发生什么?ipc传输数据的大小限制
mvc/mvp/mvvm 优缺点? mvi听过吗
apk打包流程
热修复了解吗? classloader怎么加载的?
tcp相比udp为什么稳定
java的内存结构,哪些是线程私有的?哪些地方会发生oom
垃圾回收机制,怎么检测要回收对象?垃圾收集算法有哪些?Android虚拟机相比java的做了哪些优化
compose 用过吗?
做过哪些性能优化?
内存泄漏有哪些场景?内存泄漏怎么检测?hprofeFile怎么分析,有分析过吗?
Flutter相比原生开发有哪些优缺点?
两个队列实现一个栈
100个石子,每次可以拿1-5个,甲乙两个人拿,甲先拿,甲采取什么策略可以一定拿到最后一个石子
百度
聊项目
sdk开发碰到过什么问题?
sdk开发需要注意什么?
项目中的难点?
代码的设计原则有哪些?怎么做解耦?
性能优化?
okhttp原理
线程池有没有做过什么封装?比如管理、成功失败监控等等
Flutter和native是怎么进行调用的?
性能优化做过什么?内存都怎么看的?
ipc有哪些方式?binder的原理是什么?怎么一次拷贝的?
Java内存模型,为什么Java要设计这么一个东西?
cpu优化
如何判断一个链表有么有环
一个整数数组中找出主元素,主元素即出现次数大于数组个数一半的元素
字节
抖音
Flutter优缺点?
Flutter绘制流程
Flutter碰到过什么性能问题吗
Flutter碰到的觉得最难的最有挑战的问题?
final 关键字都用在什么地方?为什么要这么用? valatile 关键字的作用
Context 有几种?有什么区别?为什么application\service的context跳转页面要加flag?
Activity 和 window的关系
5个线程 依次打印 1 - 100
今日头条
IM消息机制,收发过程阐述一下,如果长连接断掉了,重连也连不上怎么办?
IM消息的顺序是如何保证的?比如一条消息传递的比较慢,后面的消息先到达了
有了解Kotlin吗?Kotlin和Java有什么区别
MQTT的机制是怎样的
保存日志并上报到后台,写到数据库或文件中耗费性能,怎么解决?如果日志没保存完,应用挂掉了怎么办?
列表卡顿怎么检测?如何获取到完整的信息以供分析
商业化
静默安装是怎么做的?有了解过应用安装过程吗?
Java泛型擦除机制
Kotlin里的 late init 和 lazy 有什么区别
Kotlin里扩展函数里可以访问私有成员变量吗?
Retrofit源码,动态代理时怎么找到注解声明的参数,怎么拿到具体类型的?
Okhttp里用了哪些设计模式,有哪些拦截器作用是什么,缓存怎么实现的?线程池怎么用的,两个队列是干什么用的?
线程池处理任务的流程
Jetpack AAC架构 和 MVP 的对比
Jetpack里 LifeCycle怎么实现的?LiveData怎么实现的?怎么处理发送数据的?
LeakCanary内存泄漏检测原理,什么时候去dump内存?是每次destroy吗?
idleHandler有了解过吗?使用场景是什么?为什么执行动画时再 invalidate会导致 idleHandler失效?
Android消息机制,Handler内存泄漏的引用链是什么?里边的GCRoot是什么?
GCRoot 一般包含什么?线程是GCRoot吗?
Looper怎么保证一个线程里有一个的?ThreadLocal 里的存储结构是什么?是map吗?
HashMap的存储结构,为什么用红黑树?红黑树的查找时间复杂度,二叉搜索树的查找时间复杂度
HashMap的扩容机制
做过的性能优化
Java里一个类至少包含哪些方法?
hashCode()方法的作用是什么?有什么使用场景?
Activity生命周期,A页面启动B页面 生命周期,时序是什么样的?
有了解过Android里怎么给数据库加密吗?
一个App进程里至少要包含几个线程?提示:从虚拟机、系统的角度去思考
内存泄漏检测,dump内存后如何分析?
卡顿检测,怎么dump当前堆栈?怎么基于消息循环查看每个消息处理耗时,具体哪个类哪个方法
相册应用里的照片列表页怎么能不卡顿,你怎么来设计?
一个整型数组里找出出现次数最多的元素,不允许利用高级数据结构,时间复杂度
快排算法,时间复杂度,最坏情况下时间复杂度,最坏的情形是什么
一个只包含英文字母的字符串里,找出第一个只出现一次的字符的下标,如果没有返回 -1
两个数组分别是二叉树先序、中序遍历结果,直接返回后续遍历结果
三色球排序
拼多多
聊项目
activity a 启动 activity b 整体的生命周期流程?什么时候 a不走 onStop
activity a 启动 singleTask模式的且栈底已存在单 activity b 生命周期
activity 里有两个 fragment a和b b要用 a通过网络请求得到的数据有几种方式?你会选用哪种为什么?
三台打印机 打印20个任务,输出耗时最短情况下,最长耗时那台打印机的耗时
实现懒汉式的单例模式,valatile的作用,synchronized的作用
K个一组翻转链表
单例存储 HashMap实现一个缓存
项目挑战
性能优化
微信读书
给一个字符串,输出所有有效的ip地址。
view的绘制流程? activity、fragment里哪个方法可以获取到宽高?
为什么 post可以获取宽高?
卡顿的原因是什么?为什么绘制方法里耗时会导致卡顿
view怎么做曝光埋点?
websocket 为什么相比 http效率高?
如果一个网络请求很慢,你觉得可能哪里有问题?怎么排查? dns查找慢有什么解决办法?
flutter热重载原理,是针对单独文件吗?
flutter热修复要怎么做?
你觉得Flutter的优缺点是什么?
做过什么性能优化?怎么找到单例的内存泄漏的?线上怎么监控呢?
小红书
40分钟算法 2道题 + 20分钟 项目经历
二叉树返回每一层的最后一个节点
区间合并
Lazada
性能优化做过哪些
如果你的App是上架东南亚,需要在一些低端机上运行,你打算怎么做优化
小部分重构你是怎么想的
ABTest怎么做的
App的日活,你负责模块的日活
怎么衡量你们App做的好,指标是什么
事件分发
Window 、View 、Activity的关系
二叉树判断是否相同
多线程缓存设计
京东
项目难点
事件分发,怎么确定是哪个子View处理事件的,ListView里怎么确定是哪个子View处理事件
性能优化,为什么用wakeLock,是可重入锁吗?
ANR 处理,ANR产生原理
类加载过程,A类里 static B b = new B(); 什么时候加载
线程池参数
Jetpack用过什么
Android12新特性 11新特性
Glide缓存,生命周期怎么感知的
Kotlin协程
TCP滑动窗口
大顶堆,堆化过程
HTTPS,证书验证过程
Handler机制,Input事件处理流程
Binder线程池最大多少个,Binder A进程是怎么拿到B进程的 iBinder的
快手
上传下载怎么保持稳定性的?比如app被杀了
SDK你觉得怎么算做好,需要注意哪些方面?
SDK怎么保证稳定性?
ANR怎么监控?平时怎么排查ANR
卡顿怎么检测?线上的卡顿怎么看是哪一行代码哪一个方法造成的卡顿?
一个自定义的Activity里 onCreate 里 try catch 然后在里边 new 一个线程执行 线程里边抛一个异常,进入这个界面会怎样?
怎么保证界面不重启?如果是第三方SDK里的线程怎么办,怎么处理掉这个问题
onCreate里打印一个log,然后在前边有两个子线程,也分别打印了一个log,怎么保证主线程的Log是在两个子线程打印完再打印?
如果要保证两个子线程打印的顺序呢?
Android有哪些类加载器?一个自定义的Activity 是哪个加载器加载的?
线程池
5个核心线程、有界队列大小是5、最大线程数10 , 添加10个任务,执行流程是怎样的?再来10个,执行流程是怎样的?
线程池核心线程数的设置一般怎么做?CPU密集型任务,IO密集型任务
okhttp里的线程池怎么配置的?线程可以无限多吗?怎么控制的?
一个项目里有很多的 okhttpClient 如果做到统一监控网络?
有使用过字节码插桩吗?有写过Gradle插件吗?
内存优化
图片的内存占用怎么算
图片在 assets 、sdcard卡、drawable-xx 目录下内存占用一样吗,assets 和 sdcard一样吗
磁盘上一个 1M 和 10M的两张图片 宽高都一样 内存占用谁大
有序链表里删除重复的元素
leetcode-cn.com/problems/re…