当了 5 年的面试官,面了上百名中高级的 Android 开发,熬夜总结了这几点经验

611 阅读13分钟

首先呢!做为一个面试官,这几年面过的中高级 Android 开发工程师已经突破了上百人,Failed 的不敢说,但是 Pass 掉的基本是没有看走眼的;

虽然说现在秋招刚过,来的有点些许晚,但是旨在抛砖引玉,谈谈我对 Android 中高级面试的一些看法和体会。

如果,你有更好的看法,希望能在评论区留言,我们一起讨论。

一般来说,大部分面试官在面试所耗用的时间都不是固定的,以我平均的面试时间做个标准的话,基本上是在 45 分钟之间,如果碰到比较优秀的 Android 面试者可能会延长面试的时间。

但是如果是我主动延长面试时间的话,那么首先要恭喜这位朋友了我是对他感兴趣的,不出意外的话,基本上这位朋友应该是稳了。

因为面试本来就是一个输入和输出的过程,面试官主要的职责是要引导面试者在短时间展现他最强的实力,如果一位面试官连这点都做不好,我敢断定这决对不是一位合格的面试官。

那对于面试官,该如何完成一次高效的 Android 面试呢?

面试前的准备

1.简历调查

简历到你手上的时候,你要做好充分的调查分析,不仅仅是对公司负责,也是对自己与候选人时间的尊重,明显不“对劲”的简历,就不要抱着“要不喊过来试试看”的想法了,候选人也许很不错,但如果跟你的岗位不匹配,也不要浪费大家时间,你要想清楚现在需要的人是有潜力可以培养的,还是亟需帮忙干活的。另外如果简历里附带了博客链接,GitHub地址, 相关作品的,可以提前去看看,直接看人家多年积累的文章与代码,比这短短一小时的面试来得靠谱的多。

2.准备面试题

了解清楚候选人背景后,要根据简历,有针对性的准备问题,可以是他作品或做过项目里的某个技术细节的实现方式,也可以是他声称精通的某些领域的相关问题。总之不要等到面试过程中现想问题,特别是刚开始面试别人的同学,往往经验不足稍带紧张导致大脑短路,其实也是很尴尬的,把要问的问题提前写下来,准备充分。

身为面试官,你应该考察的几个点?

1.简历是否真实

这其实是面试第一要务, 面试的过程其实就是看简历是否属实的过程,因为能到面试环节,说明这个人是符合要求的,不满足要求的早就被剔除了,如果他真的如简历描述的那样,100%会招过来,如果人人都如此,那就不需要有面试这种过程了。

需要注意的是这里的真实有三层含义:

  • 是他如实描述了自身经历,很多人只在一些大项目里做一个很小的螺丝钉,但简历里往往夸张这段经历。

  • 二是不知道自己不知道,常见于简历里各种“精通”开头的描述,因为知识体系与视野的局限,明明只是了解很浅却夸口精通,很多时候他并不认为自己说的有问题,而是真的以为自己已然精通,有点井底之蛙的感觉。

  • 三是简历里的真实要与你的期望相匹配,一门技术了解到怎样的程度才算精通,很难有定论,所以这里的“真实" 只能是候选人与面试官标准之间的契合,这种有主观运气成分,也许面试官水平不够错误判断了你,也不用感到不爽,面试何尝不是种双向选择呢。

2.技术的深度

技术的深度一向是我最看重的部分,当今任何一个技术领域都非常宽广,一个人要同时掌握那么多知识并且都深入几乎不可能,那都需要拼学习效率与工作年限了。而你曾经做过的东西,正在做的东西,是绝对可以了解得更深入的,一个对技术有好奇心,有技术热情的人,都不会仅仅停留在这个东西挺好用,而是会忍不住去探究它背后的技术原理,即便不是亲自去看源码,也会花点时间了解别人整理过的经验,所以单凭考察技术上的深度,就可以考察-个人是否对技术有热情 ,是否有技术好奇心等等这些很多大牛认为的所谓“优秀程序员的特征”。

之前曾看到过一句话:“一个人对他所做的事情了解得越深,他就能做的越好”。放在这里再合适不过了。

3.技术的广度

深度是有了,还需要广度吗?我个人的理解是:深度是必要条件,广度是加分项。同样的有技术好奇心的优秀程序员,也不会满足于仅仅局限于自己的一亩三分地,工作之余,也会想要尝试一些其它的领域和方向,因为投入问题也许不够深入,但很多领域知识你知道与不知道,对你个人知识体系的形成关系很大。

比如你要实现一个功能, 在你当前熟悉的技术领域上很困难或者效果不佳,在你就要放弃时你的同事告诉你,这用一个简单Sqi语句就可以实现啦,为什么要搞得那么麻烦?这个例子虽然举得很蹩脚,但是我想意思大家应该已经明白了。知识越有厂度,头脑里的技术体系就越备,同样的问题,你就可以想到N个解,思考一下就得出最优解了 。

如果你听都没听过一些东西,就会经常说出“这个好难搞啊”、"这根本就不可能”其实有的时候真是知识的局限问题,所谓的从0到1难,也是这个意思。

4.逻辑思维能力

这也是我比较看重的一点,这里并不是指那些臭名昭彰的脑经急转弯问题,而是通过交流观察,判断一个人表达观点逻辑是否清晰,回答问题是否有章法,这个很难描述,但如果你细心观察,你会发现很容易通过一些简单的交流,就可以看出一一个人是否逻辑清晰。

有时候你会觉得某个人表达沟通很不错,其实不是沟通的问题,是他说出去的话,经过了他大脑的条理清晰的整理,让你很容易就能明白。这种习惯不是一朝一夕就能养成的,所以面试过程中这点装不出来。

另外一个人如果逻辑清晰,而且反应又敏捷,语速很快,那是大大的加分项,恭喜你,碰到一个聪明人了。

                             

那对于面试者,面试官通常会问哪些深度与广度并存的 Android 面试题呢?

因掘金平台的推荐机制,这里只列举我曾经面过的几类很经典的 Android 面试题,不过我已经把这些年来收集所有大厂的 Android 中高级面试题整理成核心知识上传至我的【Github】

如有面试需要的朋友,可以点击“【Github】”参考复习

第一章 Android组件

  • 1. Activity的4大启动模式,与开发中需要注意的问题,如onNewIntent() 的调用;

  • 2. Activity A跳转B,B跳转C,A不能直接跳转到C,A如何传递消息给C?(美团)

  • 3. Activity如何保存状态的?

  • 4. 请描诉Activity的启动流程,从点击图标开始。(B站)

  • 5. APP是怎么启动的?

  • 6. 启动一个Activity的流程分析

  • 7. Service的生命周期是什么样的?Service两种生命周期以及区别

  • 8. 你会在什么情况下使用Service?

  • 9. startServer和bindServier的区别?(美团)

  • 10. Service和Thread的区别?

  • 11. IntentService与Service的区别?

  • 12. ContentProvider如何自定义与使用场景是什么?

  • 13. BroadcastReciver的静态注册与动态注册的区别?

  • 14. 广播的分类与工作原理

  • 15. 可以再onReceive中开启线程么,会有什么问题?

  • 16. 什么是有序广播?

  • 17. Application、Activity、Service中context的区别?能否启动一个activity、dialog?

  • 18. Fragment的生命周期? (美团)

  • 19. Fragment的构造函数为啥不让传参?(B站)

  • 20. Fragment add与replace的区别,分别对Fragment的生命周期影响(美团)

第二章 View System

  • 1. View绘制流程与自定义View注意点。(东方头条、美团)

Android中的每一个UI控件都是集成自View,然后这些View都具有相同的绘制流程,必须经过measure,layout和draw. view的绘制流程是在Window添加过程中,ViewRootImpl类的setView方法开始的

  • 2. 在onResume中可以测量宽高么

  • 3. 事件分发机制是什么过程?(东方头条)

  • 4. 事件冲突怎么解决?(东方头条)

  • 5. View分发反向制约的方法?(字节跳动)

  • 6. 自定义Behavior,NestScroll,NestChild。(东方头条)

  • 7. View.inflater过程与异步inflater(东方头条)

  • 8. inflater为什么比自定义View慢?(东方头条)

  • 9. onTouchListener onTouchEvent onClick的执行顺序。(58 京东)

  • 10. 怎么拦截事件 onTouchEvent如果返回false onClick还会执行么?(58 京东)

  • 11. 事件的分发机制,责任链模式的优缺点 (美团)

  • 12. 动画的分类以及区别(车和家)

  • 13. 属性动画与普通的动画有什么区别?(车和家)

  • 14. 插值器 估值器的区别(车和家)

  • 15. RecyclerView与ListView的对比,缓存策略,优缺点。(美团)

  • 16. WebView如何做资源缓存?(字节跳动)

  • 17. WebView和JS交互的几种方式与拦截方法。(字节跳动)

  • 18. 自定义view与viewgroup的区别

  • 19. View的绘制原理

  • 20. View中onTouch,onTouchEvent和onClick的执行顺序

  • 21. View的滑动方式

  • 22. invalidate() 和 postInvalicate() 区别

  • 23. View的绘制流程是从Activity的哪个生命周期方法开始执行的

  • 24. Activity,Window,View三者的联系和区别

  • 25. 如何实现Activity窗口快速变暗

  • 26. ListView卡顿的原因以及优化策略

  • 27. ViewHolder为什么要被声明成静态内部类

  • 28. Android中的动画有哪些? 动画占用大量内存,如何优化

  • 29. 自定义View执行invalidate()方法,为什么有时候不会回调onDraw()

  • 30. DecorView, ViewRootImpl,View之间的关系,ViewGroup.add()会多添加一个ViewrootImpl吗

  • 31. 如何通过WindowManager添加Window(代码实现)?

  • 32. 为什么Dialog不能用Application的Context?

  • 33. WindowMangerService中token到底是什么?有什么区别

  • 34. RecyclerView是什么?如何使用?如何返回不一样的Item

  • 35. RecyclerView的回收复用机制

  • 36. 如何给ListView & RecyclerView加上拉刷新 & 下拉加载更多机制

  • 37. 如何对ListView & RecycleView进行局部刷新的?

  • 38. ScrollView下嵌套一个RecycleView通常会出现什么问题?

  • 39. 一个ListView或者一个RecyclerView在显示新闻数据的时候,出现图片错位,可能的原因有哪些 & 如何解决?

  • 40. Requestlayout,onlayout,onDraw,DrawChild区别与联系

  • 41. 如何优化自定义View

  • 42. Android属性动画实现原理,补间动画实现原理

第三章 Android FrameWork

  • 1. Android中多进程通信的方式有哪些? 进程通信你用过哪些?原理是什么?(字节跳动、小米)

  • 2. 描述下Binder机制原理?(东方头条)

  • 3. Binder线程池的工作过程是什么样?(东方头条)

  • 4. Handler怎么进行线程通信,原理是什么?(东方头条)

  • 5. Handler如果没有消息处理是阻塞的还是非阻塞的?(字节跳动、小米)

  • 6. handler.post(Runnable) runnable是如何执行的?(字节跳动、小米)

  • 7. handler的Callback和handlemessage都存在,但callback返回true handleMessage还会执行么?(字节跳动、小米)

  • 8. Handler的sendMessage和postDelay的区别?(字节跳动)

  • 9. IdleHandler是什么?怎么使用,能解决什么问题?

  • 10. 为什么Looper.loop不阻塞主线程?Looper无限循环为啥没有ANR(B站)

  • 11. Looper如何在子线程中创建?(字节跳动、小米)

  • 12. Looper、handler、线程间的关系。例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米)

  • 13. 如何更新UI,为什么子线程不能更新UI?(美团)

  • 14. ThreadLocal的原理,以及在Looper是如何应用的?(字节跳动、小米)

  • 15. Android 有哪些存储数据的方式?

  • 16. SharedPreference原理,commit与apply的区别是什么?使用时需要有哪些注意?

  • 17. 如何判断一个 APP 在前台还是后台?

  • 18. 如何做应用保活?

  • 19. 一张图片100x100在内存中的大小?(字节跳动)

  • 20. Intent的原理,作用,可以传递哪些类型的参数?

  • 21. 如果需要在Activity间传递大量的数据怎么办?

  • 22. 打开多个页面,如何实现一键退出?

  • 23. LiveData的生命周期如何监听的?(B站)

第四章 性能优化

  • 1. 内存优化,内存抖动和内存泄漏。 什么时候会发生内存泄漏?举几个例子(美团)

  • 2. Bitmap压缩,质量100%与90%的区别?(东方头条)

  • 3. TraceView的使用,查找CPU占用(东方头条)

  • 4. 内存泄漏查找 (酷我音乐)

  • 5. ANR是什么,怎么解决?ANR查找(美团)

  • 6. CPU波动

  • 7. 当前项目中是如何进行性能优化分析的

  • 8. 冷启动、热启动的概念(酷我音乐)

  • 9. View层次过深怎么优化,选择哪个布局比较好?(美团)

  • 10. 怎样检测函数执行是否卡顿 (字节跳动)

第五章 开源框架

  • 1. LeakCanray 2.0为啥不需要在application里调install?(B站)

  • 2. OkHttp的原理(B站)

  • 3. Glide缓存机制(B站)

  • 4. Android如何发起网络请求,有用过相关框架码?OkHttp框架解决了你什么问题?(美团)

第六章 NDK


  • 1.Jni了解吗?有没有自己使用过,只要编译成功Hello World也算,与JAVA相比效率如何?(美团)

  • 2.C++中引用和指针的区别。

总结

说了这么多,但是最重要的还是那句话,面试跳槽加薪虽然是我们每个人都所期待的,但是你也要有与之相对的能力,如果你没有,千万别浪费了我们两个人宝贵的时间,望谨记;

Github地址:github.com/733gh/xiong…