Android 面经分享:快手、字节跳动、百度
2.跟谁学,面试内容相对比较简单,就这简历上写的几个框架问了一些,面试官也非常坦诚,因为要价比较高,二面移动组 leader 明确说了给不到这个薪资,然后评定为工作不稳定性风险较高没有了后续。
快手直播
字节跳动直播中台
快手直播目前来看是一枝独秀遥遥领先其它的,据说技术储备上也是业界领先的。直播营收也是快手的一大核心营收来源,字节跳动来说的话是去年才成立这个中台部门,今年准备去核心发力的,发展和想象空间无论对业务还是技术可能都更大一些,然后中台又分为了业务和技术,刚好分到了技术部门,因此在选择上更倾向去字节这边。
面试难度与风格
两家技术面试都是有三轮,前两轮主要是对于 Android,Java,计算机基础知识的考察,第三轮面试则是 leader 面,面试内容偏系统设计,算法与沟通能力,前两轮面试中,难度上来说快手难度要高一些,印象比较深的是快手的三面还有字节的二面和三面,快手三面是个 Facebook 回来的大佬,提问的问题还有面试中的引导做的很棒,聊的很舒服。字节这边二面是真技术大佬,顿感自己简历上做的东西太 low 了,三面是个帅帅的小哥,人很热情沟通也很好,除了面试之外,在技术发展和职业上也给了一些建议。
美团主 App
手机百度
微信客户端
美团问的问题比较多的结合项目来展开,而且开放性问题居多,不是可以在网上随便搞一个题库可以搜索到答案的,这点我觉得挺好的,可以有效防止各类通过短期培训班背题拿到 offer 的问题。美团三面面试官风格很独特,偏计算机基础,考察基本功,几乎是回答的每一句话都要跟进深挖到底,你可以选择沉默,但说的每一句话都将成为下一个面试题。同时跟面试官就现在的跨平台和现在各大超级 App 中小程序容器研发做了探讨,也讲了其对于这一技术趋势的看法。
手机百度,面完了两轮技术之后,开始了经理面,技术面试偏计算机基础一些,经理面主要是在讲自己创业相关的事情,经理面聊完之后,又加了一轮技术面试,搞了道动态规划算法题目,然后讲了下个人规划和职业选择还有对百度的看法。
微信。微信本身人手应该不是很缺,加上微信如此克制的产品迭代,对于招聘要求非常高,知识的考察偏少,主要是在对于项目的考察,强调系统化,你的技术需求上游是什么?你做的技术优化线上带来了什么反馈,如何持续跟进的,如何去做优化的,然而。。。要求上倾向资深有比较系统化项目经验的人。
================================================================
对于面试的准备,算法建议对着牛客网刷下《剑指 Offer》和《算法》,然后之前项目中用到的第三方框架,了解其核心实现流程和框架特色与一些实现比较巧妙的细节。对于 Java 基础,推荐《深入理解 Java 虚拟机》《Effective Java》《Java 并发编程之美》,Android 推荐阅读《Android 开发艺术探索》和《Android 源码设计模式解析与实战》,Android 这两本都是点到为止,没有特别的深入,可以作为一个目录纲领,引子,借此做更深入的学习。除此之外对于之前所做过的项目,写在简历上的项目都要做深度的挖掘和探索,发掘抽离其中的知识点和亮点。
Handler 实现机制,同步屏障,IdleHandler
Looper 可以在子线程创建吗
Handler 如何实现对于消息的定时发送
HandlerThread 的实现原理
事件传递机制,结合滑动冲突具体场景解决问题
View 绘制流程,从 Vsync 信号到 ViewRootImpl 到最终 View 的 draw
Apk 打包流程(点击 Android Studio 的 build 按钮后发生了什么)
Apk 安装过程
内存泄漏,Handler 如何导致 Activity 内存泄漏,如何做检测,引用的链路到 GCRoot
Fragment 生命周期
Activity 各类启动模式下的切换状态后显示状态
屏幕反转 Activity 的生命周期变化
Dialog 弹起背后的 Activity 生命周期发生何种变化?
一个应用启动过程,如何与 AMS,PMS 交互
EventBus 的实现原理,粘性事件是如何实现的?为什么要用 EventBus,其优势在哪里?
Retrofit 的实现原理结合动态代理来问
Picasso 与 Glide 的区别(缓存的差异性)
Volley 与 Okhttp 的差异性,Okhttp 的实现与其优势
多进程的数据库与文件操作该如何实现?
Android 签名,V1,V2
Glide 中生命周期如何实现的
Glide 如何加载一个 Gif 图
对于 Android 中内存使用中注意的点(围绕内存泄露与内存优化讲)
MVP,MVVM,MVC 的差异性以及适用场景
Android APK 为什么不可以在 IOS 上运行,如何设计可以让其运行?
Android 系统设计为什么要用虚拟机不直接执行机器码?
通过虚拟机运行和直接执行机器码的差异性其各自的优势在哪里?
Dalvik 和 ART 的区别
Native 生命周期如何通知到 Web?
了解 Android 中的 ANR 吗?
了解 Android 中的 OOM 吗?
RecyclerView 中的缓存实现原理
RecyclerView 中 ItemDecoration 的实现原理
Activity,Window,WindowManager,ViewRootImpl 如何看这几个的关系
广播动态注册和静态注册的差异是什么?
Android 中进程通信的方式,Binder 的优势是什么?
SparyArray 和 ArrayMap 的实现原理?
使用过 Koltin 吗?
使用过 RxJava 和 Retrofit 吗?
Web 与 Native 的通讯方式
SurfaceView 和 TextureView 的区别
Surface 为什么要用双缓冲机制?
Bitmap 大图加载的优化策略?
SharePreference 的 commit 和 apply 的区别
HashMap 和 HashTable,ConcurrentHashMap 的差别
ConcurrentHashMap 的 1.7 和 1.8 版本差异
LinkedHashMap 实现原理
ArrayDeque 实现原理
Java Object 中有哪些方法?equals 和 hashCode 方法什么时候会被重写?
Java 中悲观锁与乐观锁,举例并说明其相关实现?
CAS 实现原理
synchronized 和 ReentrantLock 的实现差异
synchronized 对不同方法的修饰,持有的锁对象的差异
ThreadLocal 实现原理
volatile 用法
说一下对于泛型的理解
泛型擦除
什么情况下不会出现泛型擦除
说一下对于线程安全的理解,Java 中线程安全与不安全的集合类有哪些?
Java 的垃圾回收机制
JVM 中内存分配机制
Java 类加载机制
平时项目中对于锁的应用
Java 线程池默认提供了哪些类型?分别适合什么场景?
Java 线程中 interrupt()、interrupted()和 isInterrupted()分别代表什么意思?
动态代理与静态代理
对于客户端来说,各大厂基本不会有难度太大的题,难度基本在《剑指 Offer》和 LeetCode 中等难度水平,基本还是都可以做到手写 bug free 的,对于实现复杂的,面试官也会给予提示或者只是让你讲一些思路就好了,除了百度之外,其它都是需要手写的。因为百度无需手写,考察思路,所以难度上会偏难一些。
二维坐标系中有一些点,找出一点直线覆盖尽可能多的点
链表表示一个数字,求两个数字相加之和,返回一个链表
链表反转
二叉树的最低深度路径打印
无序数组中查找两个和为某一个值的数字,返回索引值
二叉树的后续遍历,非递归实现
字符串中最长不重复子串
背包问题(最大容量与最大价值)
动态规划与递归的差异性,什么问题可以用动态规划,什么问题不可以
排序算法类型与复杂度,有没有更优的优化空间
排序算法复杂度中 nlgn 中的 lgn 是怎么来的
堆排序相关,堆排序中的堆与堆栈中堆的差异性
两个字符串,求其最长子串?例如 abc1234,123bc(暴力方法的复杂度,动态规划的复杂度)
什么是完全二叉树?
对于算法问题,需要找到最优解,手写达到 Bug free 的水平,同时对于各种解决方式都能够给出时间复杂度,同时给出时间复杂度的计算过程。
TCP 三次握手,四次挥手
DNS 解析过程
Http 和 Https 的区别
Https 的建立连接过程
什么是死锁?如何产生?如何消除?
TCP 拥塞控制与流量控制实现?
弱网下网络请求的处理策略,结合直播场景
了解哪些设计模式?
工厂设计模式的优点在于什么?
外观设计模式和策略模式的是如何在项目中应用的?
有使用过哪些加密算法?
怎么理解原子性和可见性?
如何保证原子性?
Https 中数据传输是对称加密还是非对称加密?
补码表示方式,int 最大值加 2 后等于多少
LruCache 实现
生产者,消费者模型
微信录音模块设计
设计一个日志系统
设计一个图片加载框架,你会如何实现?
手写一个单例实现
设计一个小程序容器,有哪些点需要注意的?
如何设计 Web 与 Native 通信的鉴权
HR 面
对于 HR 面基本主要是聊一些过往经历,看一下求职意愿,我觉得业务部门决定要人了,HR 挂人的概率应该是很小的,然后是聊一下薪资期待,说白了就是围绕其自己的 KPI 来跟你周旋,价格压低同时保证你有足够的入职意愿。吐槽一下,某公司的 HR 素质是真的爆炸,问我创业亏了多少钱?女朋友在北京吗?(特码的是准备要包养我?)
Leader 面
你期望的工作内容是什么?你觉得你可以给公司带来什么?当然这个不同公司的面试风格差异性还是挺大的,上述面试的公司感觉素质都还是挺高的,给予面试者充分的尊重。这个环节除非是觉得你的工作内容和薪水期望跟他们可以提供的差距较大,一般都是可以通过的。
===================================================================
通过上述问题可以看出,对于面试过程除了原有项目的考察,对于知识点的考察上,主要是 Android 基础知识,Java 基础知识,计算机网络,系统设计,算法,结合上述面试题目和自己准备过程中的一些学习记录,下面通过一个脑图的方式进行一个梳理。
以下是自己结合自己的面试整理出来的,当然并没有完全覆盖到所有的 Android 知识点,大家可以结合自己的日常项目和一些书籍自己在整理汇总。
对于 Android 这块,从打包到安装,再到一个 App 的启动,到一个页面显示出来内容,再到我们的手指去触摸屏幕对屏幕带来了改变,对这个流程可以跟进相应的源码,顺着这个流程来自己捋一遍,即使不是为了准备面试,作为 Android 知识的储备对开发工作也是有很好的提速作用的。当把上述流程梳理完成,再考虑对于其中每一个环节的各个击破,对流程的把控对于我们对应用进行系统性的优化也是非常有价值的。
Java 这块除了对一些基础知识的考察之外,主要是对于 Java 虚拟机,和多线程场景下对于锁的控制,还有对于其中集合类的一些相关实现和优化的点。流程上是对于一个.java 文件如何被编译成.class 文件,然后 JVM 如何去加载这个二进制流并进行执行,内存如何做分配,分配之后,如何为对象分配空间,执行字节码。
算法这一块建议把《算法》查找与排序读一下,同时跟着《算法导论》学习一下时间,空间复杂度的计算,常见的题目类型为图上这些,在我之前的博客中有写动态规划一期,包教包会。
对于系统设计这块,因为之前做过小程序容器和云游戏,所以会被问到,其它应该不会被抓住问的,其它的部分应该是在三轮面试中比较高频会被问到的。
评论