自学内容网 自学内容网

百度网盘Android一二面凉经(2024)

百度网盘Android一二面凉经(2024)

百度网盘

笔者作为一名双非二本毕业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业务。
  • 百度网盘对数据库相关知识的考察会比较多, 反问环节也说到本地数据库的量级会非常大。如果想加入百度网盘的话, 建议加强一下数据库相关的知识:
    • 数据库组联内联
    • 数据库升降级
    • 数据库索引使用与常见问题
    • 数据库视图使用与性能优化
    • 数据库并发

原文地址:https://blog.csdn.net/R3lish/article/details/140508165

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!