⼜到了传统的“⾦九银十”换⼯作的⾼峰期,在互联⽹寒冬下,抓住机会就显得尤为重要,特别是现在移动开发已经严重饱和的情况下。那作为 Android ⼯程师的我们应该从哪些⽅⾯去准备呢?例如,不太熟悉的技能要不要写在简历上、要复习哪些 Android 组件的知识、刷算法题⽬有没有⽤,可能在⾯试前你都会仔细考虑这些问题。
下⾯我就结合我⾃身的经验和理解,帮你梳理⼀下关于简历、⾯试和算法⽅⾯需要准备的内容,分享⼀些我的⼼得体会,让你在寒冬下也能拿到大厂的Offer(ps:本文不会过多的讲解Android面试题,而是从宏观的角度分析Android面试的一些软技能,如果要看面试题可以参考:史上最全的Android面试题集锦)。
简历
简历在⾯试过程会起到⾄关重要的作⽤,因此我们需要⾮常注意简历的撰写。在⾯试的过程中,⾯试官通常会⾮常关注你简历中的⼯作经历、项⽬介绍、技能特⻓这三部分的内容,如果你⾯试的公司没有固定题⽬的话,那很多问题都会围绕你简历⾥这三部分内容去问。因此我们的简历一定要做到简明扼要,并做到有深度有广度。
同时,需要注意的⼀点是相关技能的书写,⾸先你要让⾯试官明确你⾯试的定级是什么,然后有准备的进行优化。很多时候⼀个职位对应了很多个职级,在投简历的时候,你的简历需要让⾯试官给你⼀个⽐较明确的定级,否则⾯试过程会⽐较被动,也会影响⾯试官对你的判断。因此这部分的内容需要突出⾃⼰的特⻓,也要写⼀些现在公司相对关⼼的问题,⽐如你对插件化、热修复、组件化、性能优化等很熟悉,就可以明确的写上,但如果不是很熟悉那么尽量不要去写。
除此之外,项目部分也是简历至关重要的组成部分,这部分内容一定要突出⾃⼰的贡献和项⽬的难点。很多同学可能在公司⼀直做需求的开发,会觉得⾃⼰的项⽬经验没有亮点,难度也没有那么⼤,会觉得在这部分内容上⽐较吃亏。其实,每个需求开发你肯定会对这个需求有⼀个⾃⼰的设计,在这个过程中你会考虑如何对现有代码的影响最⼩,如何快捷清晰的实现功能,这些都可以作为项目介绍的内容,然后考虑⼀下如何把你的这些设计和思考体现在简历上,同样也是个不错的说明。
除此之外,你还可以写一些平时的学习和分享经验,比如开源了个什么库,博客记录平时开发的一些心得体会,这些都会成为你面试的加分项。
面试
对于 Android ⼯程师来说,⾯试开始的时候都会问⼀些Java、Android 的基础知识和算法。针对 Java 的基础知识,我建议你看⼀下《码出⾼效:Java 开发⼿册》、《深⼊理解Java 虚拟机》和《Java 并发编程的艺术》这三本书。对于 Android ⾯试题,⼤多都是跟系统原理有关的内容,但也有很多没有准确答案的问题,⽐如四⼤组件的原理这样的题⽬,需要你从⼀个宏观的⻆度去解释⼀下四⼤组件,或者你也可以拆分开,然后⼀个个去讲解。
同时,在⾯试前你需要提前准备⼀下,调整一下心态,避免回答问题的时候没有条理,导致⾯试官对你的逻辑思维能⼒和语⾔表达能⼒产⽣不好的判断。在Android面试中,经常会问题⼀些 Android 基本概念,对应这些基本概念⼀定要理解清楚,⽐如 Handler.postDelay 的机制、触摸事件机制、⾃定义 View、如何计算 View ⼤⼩、容器控件如何对⼦控件进⾏布局、数据库基本操作、Binder 机制、LMK 机制等。
如果你用到一些开源框架,那么⾯试官也可能会问⼀些开源框架的原理,我建议你也要多了解⼀些优秀的⽹络框架、图⽚加载框架、⽇志记录框架、EventBus、AAC 框架的原理。对于相对复杂的插件化和热修复来说,热修复可以去看⼀下《深⼊探索 Android 热修复》这本书,插件化可以去看下《Android插件化原理解析》这个系列的⽂章。
最后,就是性能优化相关的内容,涉及的内容也比较多,我之前有进行专门的总结和介绍,最近⼏年公司对性能优化关注很多,有的同学可能做过专⻔的性能优化或者⾃⼰开发过⼀些⼯具总结过⼀些⽅法论,这样⽐较好答⼀些。但是⼤部分同学可能平时都在关注业务需求开发,性能优化的实战可能并不是很多。我建议你可以从业务开发过程中找⼀些点来说,⽐如在做⼀些公共的业务组件时需要在启动时初始化,那么就需要注意初始化过程中的性能;⼜或者在做⼀个列表⻚⾯的时候,在复杂的列表 View 下如何保证滑动性能。相信你在平时开发过程中都会有⾃⼰的考,可以结合具体的情景讲出来。
一般基础面试过之后,⾯试官会从项⽬⼊⼿,问一些关于项目开发的内容,所以你需要在⾯试之前针对你之前开发过得项⽬做详细的准备。⽐如⾯试官会让你介绍⼀下你的项⽬,你需要体现出这个项⽬的难点、你在项⽬中的贡献、项⽬的具体实
现等,有可能还会问到⼀些具体的细节,所以建议是实事求是去讲,但⼀定要对⾃⼰的模块⾮常清晰。除了技术⾯试以外,有时还有可能会考察⼀些软技能,⽐如⾯试官会考察你跨部⻔协作能⼒、沟通能⼒、时间管理、任务分配和职业规划等。
⾯试和考试一样,更多的还是要靠平时的积累和临场的发挥,因此不定时的总结是很重要的,因为很多内容不经常使⽤的话过⼀段时间之后就会忘掉,这样就会出现原本⾃⼰做过的东⻄,因为忘记了细节,结果在⾯试过程中没法很好地展现出来。就⽐如插件化、热修复这样的技术,其实原理相对来说⽐较简单,但是在开发的过程中会遇到很多很多的坑,如果没有⼀些关键点的⽂字记录,过⼀段时间之后可能就忘记了某段代码是⽤于什么⽬的。所以在做完⼀次需求之后尽量多总结项⽬中的难点,使⽤到的框架以及这个框架的原理,以及其中花费时间最⻓的地⽅。另外,Bug 最多的地⽅也要做总结⼀下原因,这样在⾯试前就不⽤把代码再翻⼀遍,了解⾃⼰的项⽬细节就可以做到游刃有余了。
对于复习,我们要对⾃⼰所从事的工作有一个全面的了解,我是通过画脑图来进⾏这个过程的,我会整体默想⼀遍⼤概的知识体系,画成类似下图。回想每个知识点可能考到的内容,记录下⾃⼰模糊的地⽅,然后去看⽹上同学们总结的⾯试题,再对每个题⽬都做⼀下回答。这是⼀个持续迭代的过程。当你预想的问题都可以回答上来的时候,就需要深⼊挖掘⼀下技术细节和深度了,⽐如我⼯作中开发了⼀个 PLT Hook ⼯具,这个⼯具可能是我参考开源项⽬并封装修改过来的,但对其中的细节并没有很了解,这个时候你就要对这个开源项⽬所涉及的内容做⼀次系统学了。
另⼀⽅⾯,面试是一个相互学习的过程,比如我比较擅长的内容,面试官就不一定擅长,所以面试时往自己熟悉的方向走是一个不错的选择,这样会在面试找那个提⾼⾯试官对⾃⼰的级别评价。⽐如⼤部分⼈回答 GC 的问题都是按照《深⼊理解 Java 虚拟机》⾥的内容复述⼀遍,这种回答基本也是可以的。不过毕竟 Java 虚拟机和 Android 虚拟机的 GC 还是有些差别的,如果⾃⼰阅读过 Android 虚拟机 GC 相关资料或者⾃⼰分析过源码的话,可以从 Android 虚拟机的⻆度解释 GC,⽐如Android 虚拟机⾥ MarkSweep 算法的增量回收、并⾏回收等,后台 GC 和前台 GC、VisitRoot 的执⾏过程、GC 的触发⽅式、TLAB 的处理、ConcurrentGC 的原理、堆的Trim 过程、内存碎⽚的解决、Reference 的处理、finalize 函数调⽤等展开讲。如果你对Android系统的某个机制很熟悉的话,可以把话题引到这上⾯去,然后⼀层层对这个知识点深⼊讲解,这样可以提升⾯试官对你的等级评价。
算法与数据机构
算法与数据机构基本是面试中的压轴环境,曾经,我到字节面试就是因为算法和数据结构不及格而面试失败。因此,如果要去大厂,算法是⼀定要复习的,在很多⾯试的过程中都会穿插算法题。⾯试的算法题⼀般不会很难,可以分为基础的数据结构,⽐如数组、链表、栈、队列、⼆叉树、堆的使⽤,这⼏种常⻅的数据结构的基础操作⼀定要很熟悉,⽐如链表逆置、删除、获取第 K 个元素、判断是否有环等,
⼆叉树翻转、深度遍历、层级遍历、求树深度、公共⽗节点等。另⼀种是常⻅的搜索、排序算法,这两类算法出现频率很⾼,⼀定要知道它们常⻅的⼏种实现⽅式,⽐如排序⽅式有冒泡、快排、插⼊、归并、堆排序等。注意这⾥⼀定不要简单地去记忆算法实现,因为⾯试的时候可能不会直接让你写出对应的算法,会出⼀些使⽤搜索或者排序算法来实现的题⽬,这类题⽬你可以去 LeetCode 上通过标签过滤出来。
另⼀部分的算法题则侧重于实战,主要集中在贪⼼、动态规划、分治算法、深搜⼴搜等,这⼀类的算法相对需要⼀些技巧性。但⾯试算法题通常不需要太多⾏代码就能完成,⼀般都是在⼏⼗⾏内就能完成的,所以你可以优先去找⼀些经典题⽬来做,⽐如爬楼梯、最⼤⼦序和、最大矩形问题等。但也会有⼀些相对复杂的题⽬是⼏种算法结合在⼀起的,⽐如⼆叉树的最⼤路径和就是深度搜索和动态规划⼀起使⽤的题⽬。除此之外,也可能会遇到通过其他问题引申出的⼀些算法题⽬,⽐如
HashMap 可能会引申出红⿊树的实现等。
对应算法和数据结构,我建议看一下下面的系列文章:
0. 数据结构和算法面试题系列—C指针、数组和结构体1. 数据结构和算法面试题系列—字符串
2. 数据结构和算法面试题系列—链表
3. 数据结构和算法面试题系列—栈
4. 数据结构和算法面试题系列—二叉堆
5. 数据结构和算法面试题系列—二叉树基础
6. 数据结构和算法面试题系列—二叉树面试题汇总
7. 数据结构和算法面试题系列—二分查找算法详解
8. 数据结构和算法面试题系列—排序算法之基础排序
9. 数据结构和算法面试题系列—排序算法之快速排序
10. 数据结构和算法面试题系列—随机算法总结
11. 数据结构和算法面试题系列—递归算法总结
12. 数据结构和算法面试题系列—背包问题总结
13. 数据结构和算法面试题系列—数字题总结
总结
今天我们并没有涉及太多具体的⾯试题,而是从宏观层面说明如何准备⾯试,⽽⾯试的准备其实是在我们平时⼯作过程中⼀点⼀滴积累的,复习只是作为⼀种在⾯试前巩固知识的⼿段。复习的过程主要是我们对知识点的整理和总结,你可以想⼀下在⾯试的时候可能会遇到的问题,以及该如何去表达。
但是我想说,虽然“临时抱佛脚”的准备可能有时有⽤,但是在短时间内靠“突击”是很难理解到某个知识点更加深度层次的内容,⽽且知识⾯的⼴度也是需要时间和经验去积累的。所以不管你是否需要⾯试,在平时⼯作过程中都需要多思考、多训练、多总结,在有需要的时候才可以厚积薄发。