有时候选择比努力更重要
1. 前言
去年11月份公司裁员,时隔2年再次进入求职阶段。
花了1个多月的时间进行准备,之后开始面试,时间横跨了2021年末和2022年初,前前后后一共面试了10几家公司(厦门为主),大一点的有字节、铃盛、美图、亿联、欧科云链等。
本文主要对本次求职遇到的面试题及一些情况进行记录,希望能对未来的自己和看到本文的人有所帮助。
2. 面前准备
2.1 主要工具
- 印象笔记(电脑 + 手机)
- 百度脑图
- Sublime Text
- AndroidStudio
- Anki(贝塞尔曲线记忆工具)
2.2 复盘、更新简历
离职后,我并没有立即开始找工作,而是花了一些时间对自己在上家公司的整个经历做了一个复盘:一方面可以知道自己这些年都做了些什么,遇到了哪些有意思的人和事,在其中扮演着什么样的角色;另一方面也可以对面试中可能遇到项目和公司相关的面试题做一个准备。
- 对上家公司的经历进行复盘(加法 / 一个礼拜左右)
- 过团队成员和工作中有交集的人员
- 过全部的需求记录笔记
- 过自己的全部代码提交记录
- 输出脑图,技术部分按项目、版本和需求进行划分
- 标记重要的技术点
- 添加必要的链接及备注
- 更新简历(减法 / 3天左右)
- 过全部的技术点
- 筛选比较有价值的或跟主流技术比较贴近的内容
- 更新到简历
- 输出简历面试点
2.3 准备的面试题
- 简历面试点
- 前同事分享的面试题
- 网络搜集的面试题
2.4 准备的算法
主要以 EPI 为主(详见:EPI——刷算法题的另一种选择),夹杂几道 LeetCode 上的题目。
3. 面试记录
3.1 计算机网络
- 三次握手
- DNS 解析、劫持
3.2 数据结构
- HashMap
- 扩容机制
- 如果已知容量上限,如何初始化
- 为何是乘 2 扩容
- 底层原理
- 说一下 put 的流程
- 红黑树特性
- 扩容机制
3.3 算法
- 迭代法计算 Activity 中 View 的节点数(机试)
- 本质为迭代法遍历多叉树
- bfs 解法
- 借用队列逐层遍历多叉树
- dfs 解法
- 前序和后续都可以
- bfs 解法
- 前同事反馈他之前也遇到过
- 可在安卓项目中编写验证,建议自己写写看
- 本质为迭代法遍历多叉树
- 最少硬币数(无限硬币 / 动态规划 / 笔试)
- 并发排序伪代码(笔试)
- 单链表删除倒数第 k 个节点(机试)
- 最多可以参加的会议数(机试)
- 有序数组转二叉搜索树(机试)
- 只用一个 for 循环迭代法打印出九九乘法表(笔试)
- A、B 两个线程轮流循环打印(口述)
- 搜索关键字(字符串联想 / 机试)
- 输入一是一个句子包含标点符号 word
- 输入二是一个字符串前缀 pre
- don’t 字符串拆解为 don 和 t 两个单词
- 其他字符【,.】等需要过滤掉
- 输出以 pre 开头的全部单词(字母升序),空格分隔
- 数字拆解为连续数字(连续数字之和为数字本身),从最少的开始(机试)
- 输入为一个数字
- 用例一
- 输入9
- 输出
- 9=9
- 9=4+5
- 9=2+3+4
- Result=3
- 用例二
- 输入10
- 输出
- 10=10
- 10=1+2+3+4
- Result=2
- n 进制字符串(1 < n <= 26)的下一个不可构成回文的子串(机试)
- 输入一为进制 n
- 输入二为字符串
- 示例一
- 输入
- 3
- cba
- 输出
- NO
- 输入
- 示例二
- 输入
- 5
- cba
- 输出
- cbd
- 输入
3.4 设计模式
- 单例
- synchronized 方式实现线程安全单例的最高效方式
- 安卓常见设计模式
3.5 Java
3.5.1 功能特性
- 动态代理
- 原理
- JNI
- 如何实现
- 如何调用 Java 代码
- table overflow 问题
- 如何处理异常
- 四大引用
- 什么场景下使用,软引用与弱引用的区别
- 线程安全
- 如何保证原子性、有序性和可见性(如何实现线程安全)
- synchronized 的锁升级过程
- 锁的信息存储位置
- 类锁和对象锁的区别
- 泛型的类型擦除
- 运行时还是泛型吗
- 类加载机制
- 为何设计成双亲委托
- 安卓的类加载器
- 注解、APT
3.5.2 虚拟机
- 垃圾回收
- 判断对象可回收的方法
- GcRoot
- 内存泄露场景中的 Handler 属于哪一种 GcRoot
- 新生代的 Survivor 为何有两个
- JVM 内存结构
3.6 Android
3.6.1 基础
- Application、Activity、Context 的关系
- Dialog 可以使用 Application 吗
- Fragment 传参为何使用 setArguments 而不是构造方法
- 约束布局对比相对布局的优势
- Parcelable 对比 Serializable 优势
- 在非UI线程刷新UI会怎样
3.6.2 系统源码
- Handler
- Handler、Looper、MessageQueue、Thread 对应关系
- Looper 的 loop 方法 CPU 为何不会飙到 100%
- Handler 发送延时消息(xxxDelay)的原理
- 处理下条延时消息时,如果消息时间还没到会怎么样
- IdleHandler 什么时候处理
- 怎么发送优先级消息(首次遇到)
- 怎么在线程中使用 Handler,getLooper 返回 null 问题(本质是问 HandlerThread 的原理)
- 事件分发机制
- TV 开发中是否有 onInterceptKeyEvent API(没有)
- 滑动冲突解决
- RecyclerView 缓存机制
- 创建 Service 的过程
- 创建 Activity 的过程(Activity 的启动流程)
- A 启动 B,A 和 B 的生命周期
- A 启动 B,A 的 onPaused 一定在 B 的 onCreate 之前吗
- Binder
- View 的绘制机制
3.6.3 三方库源码
- Robust 热修复
- 插桩时机
- Tinker 的热修复原理
- ARouter
- 原理
- 编译期的映射表是怎么维护的
- LeakCanary
- 内存泄露检测原理
- OkHttp
- 源码
- 连接池
3.6.4 性能调优
- Apk 打包过程
- R 文件生成时机
- 三方库 dex 打包时机
- 内存泄露
- 怎么判断
- 实际经验
- ART 虚拟机的垃圾回收机制与 Java 的有什么区别
- 拿到测试提供的堆转储后怎么分析内存泄露
- WebView 内存泄露有遇到过吗
- 保活
- Low Memory Kill App 时,进程优先级
- ANR
- 原因和处理
- 主线程同时 post 5 个 Runnable,里面都休眠1秒,会触发 ANR 吗?为什么?
- 卡顿
- 如何检测
- 一个列表包含视频、图片、文本等,滑动的时候明显卡顿了,你会怎么分析
- 过渡绘制
- 启动优化
- Apk 瘦身
- 网络优化
- App 全局异常捕获
3.6.5 高阶课题
- 是否有音视频相关经验(只简单用过 ExoPlayer)
- 是否了解 OpenGL ES(不了解)
- 自定义控件
- 封装一个钟表控件,需要重写哪些 API
- 指针的移动用动画实现,要怎么设计
- 同家公司的两个APP,一个已经登录,另一个启动的时候,要获取已登录的信息并让客户选择是否使用它进行登录,android怎么实现?
- 请描述一下单点登录
- 是否了解 RN、Flutter 的比较深的知识点
3.7 其他
- 自我介绍
- 英文版自我介绍
- 未来 2~3 年规划
- 平时怎么学习的
- Android 的持续学习
- 个人的优势
- 之前有没有遇到什么技术难点,最终没有解决的?
- 之前的工作中,有没有哪些技术上有难度的内容?
- 在 XXX 你做过的贡献比较大的内容都有哪些?
- 你在 XXX 的评级是怎么样的?
- 有没有哪些同学的能力是在你之上的?具体哪些方面比你强?
- 实际工作中,有没有哪些事情是在你职责之外的?
- 你有没有什么想问的?
4. 视频面试的注意事项和几种类型
视频面试邀约邮件中有一个视频面试链接,首次视频面试的同学,收到链接后就可以直接点击进去查看效果(链接可以重复进入,不限次数 / 苹果电脑需要授予摄像头和麦等相关权限),有的工具还可以测试效果。
- 飞书
- 字节
- 集成了算法编写功能,界面类似牛客网
- Ringcentral
- 铃盛
- 算法通过候选人的屏幕共享,可以用自己电脑的IDE
- 亿联会议
- 亿联
- 面试官用会议室硬件和你视频面试(类似 Zoom 的效果)
- 腾讯会议
- 欧科云链
- 微信视频聊天
- HR 拉群
- 其他公司
5. 总结
- 面试的顺序至关重要,最想去的公司一定要放在最后面!!!!!!
- 内推优先,如果没有认识的人,可以尝试使用脉脉
- 首次视频面试的同学,收到邮件后就可以先点击链接授予相关权限,避免面试前几分钟才点造成的手忙脚乱
- 视频面试时,多数面试官是不开摄像头的
- 不开摄像头不是最糟的场景,个人遇到过:刚开始自我介绍,面试官就不断调整屏幕的方向(可能信号不好?),极度影响面试的心态
- 华为的算法机试是 ACM 模式,输入输出需要自己控制,用例未通过时不会给出未通过的用例
- 遇到不会的问题,可以坦承未深入了解,然后主动介绍另一个同级别的技术点
- 千万不要一句不会完事
- 以热修复为例,被问到 Tinker 时,我会说未深入了解,自己可以介绍下项目中使用的 Robust
- 只有收到 offer 才是真的,千万不要因为收到口头 offer 或是 HR 说面试已通过只是在等 HC (尤其是还未谈薪的场景)等原因,就停止面试
- 同一家公司,部门跟部门是完全独立的,千万不要因为 A 部门的面试经历影响 B 部门的面试及谈薪(A 部门岗位给不到薪酬,不代表 B 部门岗位给不到 / 不要完全相信 HR / 同公司的 HR 之间的关系跟你想的不一样)
- 分享个人反问环节常问的几个问题
- 针对这个岗位,如果存在一个理想的候选人,他会具备哪些技术栈和软技能?
- 如果有一个候选人和咱们公司最终达成了意向,咱们对这个候选人前几个月的表现有什么样的期待?(试用期)
- 麻烦帮忙指出我没答对或者答得不够好的地方,如果有什么建议,也欢迎提出(如果可以的话,请对我这次的面试表现做一个简单的评价 / 可选 / 终面不建议 / 终面的面试官一般拒绝给出面评)
- 长时间处于失业状态,心态的调整至关重要