笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《百度网盘Android一二面凉经(2024)》。
面试职位: 网盘主端研发组_Android高级研发工程师
1h = 非算法题(41min)+算法题(11min)+反问(15min)
技术一面
- 面试时长: 65min(提问40min + 代码10min + 反问15min)
- 代码考核: 三线程交替无限循环打印"a"、"b"、"c"
面试问题(40min)
- 自我介绍
- 颜色拾取器
- HSV面板是怎么绘制的?
- HSV和RGB是什么关系
- 播放优化
- 优化前是把整个播放列表都传过去吗?
- 已加载的播放列表比较大, 超过binder传输限制怎么办?
- fd是指向一个文件吗?
- 为什么Binder要限制最大的传输大小?
- Binder的数据交互的流程, 了解过吗?
- 组件化
- 什么工具或什么框架实现的组件化? 组件之间怎么解耦? 怎么进行跨组件的调用?
- 路由框架实现的原理。怎么通过url/path找到对应的组件/接口?
- Kotlin协程
- 在哪些场景下用呢?
- 并发请求, 一个父协程里面多个子协程。其中一个子协程发生异常是否会影响其他子协程?
- 并发请求三个接口, 并发写入数据库, 三个接口一个失败,就全取消, 不要影响数据库的写入。
- 数据库
- 用到的多吗?
- 你们app中对数据库的使用体量大吗?比如好友、IM等场景会使用本地数据库吗?
- xx表很大, 如果有几十万的数据, 想优化查询时间, 该怎么做?添加日期去查询某一天。
- 索引的原理。索引会带来什么问题, 需要再哪些场景去特别关注它的正确使用?
- 本地表建索引对哪些字段去建立索引?
- 线上有没有发现什么问题?字段比较多, 占用内存比较大。OOM、CursorWindow过大这样的问题。
- 我关注的是, 索引不是随便地用, 不符合场景的使用可能造成内存, 插入删除数据操作耗时比较多的问题。每次插入或删除会对索引进行修改。你遇到过吗?
- 数据库的视图(view)
- 数据库的升级/降级
- 数据库降级问题是怎么发现的呢?
- ViewModel和协程scope
- 协程需要一个作用域启动? 怎么获得一个作用域?
- activity的lifecycleScope的生命周期是怎样的?
- activity重建的话, activity的scope协程是什么状态?
- 如果在Activity中使用activity的scope, 就会有一些边界情况发生, 有没有遇到过? 用户切换了系统语言, 或者横竖屏切换了?
- 如果在viewModel的scope启动协程后, 要是有一个持久化信息写入, 不应该受生命周期影响的, 应该怎么做?
- 流量统计
- Http的流量统计怎么实现的?
- 怎么实现对request/reponse对象的获取?
代码考核(20min)
同时启动三个线程。第一个线程无限打印a,第二个b, 第三个c。要求输出"abcabcabc..."这样的无线循环。 有点类似leetcode的这道题 - 1115. 交替打印 FooBar, 只是变成了三线程。
// 用了volatile+自旋。当时现场还编译过了, 有点小激动。
public class Main {
private static volatile int flag = 0;
public static void main(String[] args) {
new Thread(() -> {
while (true) {
while (flag != 0) ;
System.out.print("a");
flag = 1;
}
}).start();
new Thread(() -> {
while (true) {
while (flag != 1) ;
System.out.print("b");
flag = 2;
}
}).start();
new Thread(() -> {
while (true) {
while (flag != 2) ;
System.out.print("c");
flag = 0;
}
}).start();
}
}
面试反问(15min)
招聘岗位候选人的技能图谱, 需要有哪些专精?
- 数据库算是一块。了解基本使用, 你基本满足我们技术栈的要求。
- Kotlin+协程
- 项目经验(整体上、组件化、项目结构)相差不大。网盘属于工具类应用, 你们的app其实跟工具类差不多。歌曲列表在网盘就类似于文件列表, IM好友之类的都差不多。
应聘岗位未来是负责什么业务? 我对于自己欠缺的能力, 想办法去加强一下。
相册业务(面试官所在业务线)。百度网盘的相册服务。一刻相册(专注于图片备份)。
对招聘岗位候选人的资深程度, 职级?
T3~T5, 也考虑高潜(年轻但有培养价值)。
百度网盘技术团队/Android人
相册 + 基础(文件传输、文件列表) + 企业/商业 + 其他的(边缘业务) = 40人(Android)。
应聘岗位所在组多少人
5~6个人。HC有两个。
你在团队里的角色?
迭代负责人。负责百度网盘相册。
百度网盘有哪些跨端方案?与Native的占比。
原生为主, 还引入了flutter, 但仅有这一个跨端方案。只用在了独立的、耦合性较低的模块。
但没有继续推进flutter的打算, 原因是开发成本降不下来, 与其他模块还是存在一些耦合, 没有找到降低成本的好方案。
fluter的动态化(免发版)支持并不好, 不会打算引入动态化的跨端方案吗? 比如RN?
技术路线确实不打算接入RN。
有专门的技术设施建设的组吗?打包编译、内存、性能、功耗监控和优化。
有一个基础架构组, 只做工程提效。其他内容, 每个业务组都可以做, 没有独立的架构组或性能组做这样的事。
目前有两个HC, 出现空缺是因为有同学离开, 业务扩展?
有同学离开。跟iOS人力没对齐。
人员流动不大?缺失了才补?
是的。
几轮面试?
技术3轮。后面是一个高工的面试+老板(实线Leader)的面试。最后再是HR的面试。
技术二面
- 面试时长: 60min(提问60min + 反问5min)
- 代码考核: 无
面试问题(60min)
- 自我介绍
- kotlin
- 空安全的理解
- 协程和线程的区别
- 在界面里执行一个死循环的函数, 界面退出的时候, 死循环会退出吗?
- 协程怎么切线程?
- 已经在跑的任务怎么取消?
- delay函数怎么实现的?
- 持久化工具(DB)
- 数据库怎么做并发?
- 你们的数据库里有多少张表
- 是否有组联内联操作?
- 怎么优化视图查询效率?
- 本地搜索
- Jetpack Compose
- 优点
- 架构MVVM
- LiveData
- 什么生命周期可以收到通知, 什么生命周期收不到?
- 为什么LiveData更新数据都要在UI线程?
- 子线程如何通知livedata更新?
- Gson的性能瓶颈? -> 可以参考《抖音 Android 性能优化系列:启动优化实践》里关于Gson的内容
- 为什么fastjson比gson快?-> 可以参考《FASTJSON2提升Java字符串编码解码性能的技巧》
- okhttp有几级缓存?
- 除了在日常中使用, 有做过什么优化吗?
- 谈一个在过去项目过程中, 最有挑战的项目。背景、难点、技术手段。(说了RN页面打开速度优化)
- 初始化引擎, 初始化网络请求?优化多少?
- 耗时怎么判断?
- 页面展示时机?哪个回调?
- 线下看, 还是线上有监控?
- 最终的优化方案是视图预热?这块页面提升有多少?
- 你为什么选择这个项目?是因为这个项目涉及的技术栈比较多, 比较复杂吗?
- 在这个项目里, 你个人得到什么收获?
- 使用RN真的能提升双端开发效率吗?有哪些地方会发现它的提升并没有这么好?
- 这个方案有规划推广到你们app的所有页面吗?
- 个人与团队相关
- 所在组团队多少人?
- 你在团队里负责什么内容?
- 你们公司所有Android开发人数?
- 你在组里的定位?是某个业务的负责人吗?
- 离职原因
反问问题(5min)
这个岗位做的工作?
网盘相册。一刻相册(单独做一些图像的玩法, 如果做在网盘里会显得太臃肿)。
相册垂类, 主打图像相关的场景, 存储+玩法。
技术栈
工程年限长, 用户量大。技术选型求稳。
一刻比较新。无跨端方案。H5除外。
数据库操作
很多app的业务场景用文件或者sp就够了。但是云存储相关的, 用户储存的文件, 极端的有几个T。数据库量级巨大。
面试流程
后面: 理论上2轮, 基本上就一轮(经理), 一轮HR。
总结
- 第一次面试百度, 虽然最终没有通过, 但是面试体验很不错。在回答问题卡壳的时候, 面试官会耐心地引导。
- 百度网盘Android整体技术方向以Native为主, 有少部分flutter业务。
- 百度网盘对数据库相关知识的考察会比较多, 反问环节也说到本地数据库的量级会非常大。如果想加入百度网盘的话, 建议加强一下数据库相关的知识:
- 数据库组联内联
- 数据库升降级
- 数据库索引使用与常见问题
- 数据库视图使用与性能优化
- 数据库并发