我这篇文章并不是简单的描述一些面试中的真题,或者总结一些Android的知识,而是一个普通人经历过各种面试后的一个总结与反思。对技术面试这回事有一些体会,在此分享。(从我的角度,当然肯定有不合理的地方,大家借鉴就好)。
从两个月前开始面试,先后面试了腾讯、抖音、美团等,最后只拿到了阿里钉钉一个offer;坦白说,我对我个人在这次求职中的表现并不十分满意,面试前没有做足够充分的准备——数次被面试官出的题目“虐”、应对面试的压力时没能做到沉着冷静、在面试中未能完整地把自己的积累与优势表现出来……所以本篇文章并不能完全算一个“成功者”的经验分享!
简历的重要性就不言而喻了,怎么样写好简历是个技术活,当然如果你有很好的背景(学校或者公司),那么不管你怎么写,基本上都不刷掉你,我们作为一般的人还是需要下一番功夫的。拿我的简历作为例子,大概有以下几个部分:
怎样写简历,这个开源网站不错,教你怎么写简历,而且有一个在线markdown在线网站,可以导出pdf。
另外,我个人在写简历时有一个还未做到的点是及时更新简历。对于几年前的项目早就记忆模糊了,几年后再尝试回忆项目细节写进简历其实很难。所以最佳方案是项目结束后及时把收获更新进简历里。
对于基础复习我这次最大的感触就是,一定要早点做准备同时也要做全面完整的准备。
举个例子, Java 中非常基础的的四大引用。对 Android 开发来说平时可能用弱引用比较多,但真正作为面试题来问时面试官希望你能马上回答出四大引用分别是什么以及各自的使用场景。假如你能马上回答出四大引用的特点及使用场景当然是合格的回答,假如你不止回答出四大引用的特点还能联系到 ReferenceQueue,继而延伸到在 leakcanary 的使用,那就是优秀的回答了 —— 但假如你被提问后一脸懵逼,说自己只记得弱引用,就会比较尬(当然就这个知识点而言,我作为面试官的角色时还会尝试“抢救一下”,由弱引用的使用延伸到内存泄露去,不会直接判定应聘者)。
因为在“面试”这个场景里,面试官会默认你做了足够的准备,对于一些中高端职位基础题其实是作为送分题问的,当然希望你能快速反应、快速回答。而人不是机器,许久没用或者没复习的技术点想要在短时间内回忆起来并归纳成 N 个点说出来难度非常大。 所以基础技术的面试其实就跟应试一样,任你功力再高,也有必要好好复习一下。毕竟“武功再高,也怕菜刀”嘛(不恰当的比喻,哈哈)。
基础复习可以分为两大块,一块是 Android 和 Java 基础,另一块是计算机基础,也就是算法、计算机网络、计算机原理等。对于前一块,经验丰富的你一般花半个月就可以搞定;但对于后一块,时间上就不好估计了(网上有非常完整的各种面经和题库,聪明的你肯定具备最基本的信息检索能力,这里我就不贴链接了)。
这里我把我自己作为反面教材:由于前期对是否要跳槽犹豫不决,所以没能早点进行充分的准备,导致后面碰壁后需要在短期内急急忙忙去复习,其中的压力可想而知。
个人认为比较舒服的姿势是,不管跳槽与否,一些基础的东西在平时就可以有计划地复习,特别是刷算法题 —— 任你算法功力再高,没有经过一定的训练想要在面试这种场景下快速手写出 bug free 的代码也几乎不可能。
社招跟校招的一大差别是,社招中的基础题部分只是前菜,招聘方会非常重视你的项目经历,通过询问项目经历会扩展到对技术、学习能力、沟通能力等的考察。
关于如何复习项目,从面试情况看,可以从总体架构、项目细节、项目亮点、碰到的问题以及场景复述等方面入手。
总体架构和项目细节不用过多解释,前者是从宏观角度向对方介绍你的项目的架构,用最短的时间让对方理解项目通过哪些模块或组件间的协作去实现功能的;后者是对方可能会提出一些感兴趣的点询问你项目细节 —— 所以千万记得认真掌握项目关键细节,否则答不出来会很尴尬。
项目亮点和难题则是面试必备,基本大部分面试都会问到这块,无他,对方不了解你的项目的情况下肯定希望你能展示出可以为自己加分的点。
准备得差不多后就可以开始进入简历投递环节了,我觉得简历投递的途径的优先级是这样的:熟人内推 > 优秀猎头推荐 > 普通网友内推 > 普通猎头推荐 > 官网投递。
假如你的简历光芒闪闪,阿里星那种级别,那随便投递都可以很快有响应,否则投递的途径还是很重要的。
熟人内推当然是第一选择,通过熟人你不止可以知道部门内部的业务发展、晋升、加班等情况,在走流程时也可以通过他直接接触到你的未来 leader。而为什么优秀猎头的内推会比普通网友内推要好呢?我个人的感受是优秀猎头会比普通网友更了解招聘情况且能更积极得帮你催流程,而真正优秀的猎头,在对公司整体信息的掌握上是高于普通员工的。
面试中要沉着冷静、面试前要确认面试时间并提前到……这些啰嗦的小 Tip 我就不说了,聪明的你一定能注意。这里我尝试总结一下碰到过的常见的考察方向(或者说“题型”)。
对于算法的考察,从个人有限的经验上看,貌似难度都是适中的。特别是对于我们客户端开发而言,考察的算法都比较常规。(呃,某些很注重这块的公司除外 —— 当然注重这块也是好事,我们只能去适应公司的风格而不能要求公司适应我们)
算法这块我也是“低手”(这块强的同学可以留言教授一下比较好的学习方案),多学习多练习吧。
这次求职中,比较高频的题目是"第 TopK 大的数"(快排思想、能提到线性查找算法 BFPAT 更佳) 和 “前 TopN 个数” (堆排序、先分治再堆排序)。
就像面试前我们准备的,基础题基本是必问的,就算不深究 Android 的基础,问你一些计算机网络的东西不为过吧。这块我们必须拿出校招时的劲头来,老老实实复习。至于具体的题目什么的我就不罗列了,网上有一堆面经,github 上也有很多整理好的题库。
对 Android 开发来说,可以分成两块,第一块是 Android 相关基础。跟初级开发的面试不同的是,这里的基础不会是简单的“四大组件是哪些”,而是会问你具体的使用和碰到的问题。比如四大组件的考察会结合 ANR(四大组件是否都会产生 ANR、时间是多少等)、进程优先级、启动模式 等等一起问。网上的面经和题库命中概率还是蛮高的,大部分题目都似曾相识,毕竟 Android 常用知识点也就这些。当然不要因此掉以轻心,优秀的面试官是会针对细节深入挖掘的,所以不止要“知道”,还要“理解和掌握”。
另一块是计算机网络、计算机原理等。对客户端开发来说,计算机网络的考察会比较多,TCP 和 UDP 的区别、TCP 的拥塞控制、TCP 的握手与挥手流程、HTTP 与 HTTPS 的差别等等。基本面的所有公司都问到这块了。
这块需要特别注意的点就是你的覆盖面是否足够,因为不同公司的不同部门的不同面试官都可能会有不同的提问姿势。你不完整系统得把基础过一遍,真不能保证你能信心十足(一两个问题被问倒其实没什么,但能不被问倒更好不是)。
我可以举几个例子,比如在问大图加载时顺口问一下“同一个文件,放到 drawable 目录下和放到 SD 卡中,加载到内存时内存占用一样么” (这里涉及到了 Bitmap decode 时的过程以及 Bitmap 内存占用的计算),比如 HashMap put 方法调用时内部的流程是怎样(方法内部的流程、HashMap 的扩容等),比如 Http 1.1 和 2.0 的特点和区别 —— 这些例子都是我或者我朋友真实碰到的面试题,在没经过充分的面试准备之前,你能答出多少呢?
一般这类问题是在问基础题时顺势往底层问,或者是你自己在回答时顺便带出来,比如屏幕绘制原理、几种动画的原理、布局加载原理等等,是体现个人的技术深度的。
我觉得这类题目不是死记硬背可以解决的,作为面试官,自然有办法考察出你是“了解”还是“理解”。
其实系统地复习这些内容本身也是挺有趣的,你会很容易发现技术背后的实现存在深层的联系。所以这块不只是面试题那么简单,它也是我们以后往“资深开发者”走的一个方向。
回答这类问题,主动比被动更好。一般面试官问你很基础的问题时,你当然可以惜字如金只回答对应的答案,但假如你能主动扩展到原理层面、甚至隐晦地表示你看过源码,要我是面试官也会喜欢你(斜眼笑)。
我一开始也没有经验,面爱奇艺时让我介绍项目我就简单介绍了下项目需求是怎样,可以看出面试官并不满意。后面专门向一个牛逼的前同事请教了这个,他的建议是注意项目细节准备,保持自信!后面面其他家时,果然感觉轻松了一些。
面试官拿到我们的简历的时候,是没法核实你的项目细节的(一般公司会到录用后,用背景调查的方式来核实)。更何况,我们做的项目是以月为单位算的,而面试官最多用30分钟来从我们的简历上了解项目经验,我们对项目的熟悉程度要远远超过面试官,所以大可不用紧张。如果我们的工作经验比面试官还丰富的话,甚至还可以控制整个面试流程。
既然面试官无法了解我们的底细,那么他们怎么来验证我们的项目经验和技术?下面总结了一些常用的提问方式。
一般来说,在面试前,大家应当准备项目描述的说辞,自信些,因为这部分我们自己说了算,流利些,因为我们在经过充分准备后,可以知道自己要说些什么。而且这些是基于我们实际的项目经验,那么一旦让面试官感觉我们都说不上来,那么可信度就很低了。
不少人是拘泥于“项目里做了什么业务,以及代码实现的细节”,这就相当于把后续提问权直接交给面试官。下表列出了一些不好的回答方式。
在避免上述不好的回答的同时,大家可以按下表所给出的要素准备项目介绍。
面试前,我们一定要准备,一定要有自信,但也要避免如下的一些情况。
阿里钉钉一面(面试时长80min)
1.自我介绍,对自己项目的介绍,架构图呈现
2.因为说自己以后的发展方向是音视频,所以问了我用过哪些现有框架
3.项目中的一些优化问题,MVC -> MVP,Handler的内存泄漏情况分析等,对MVP和MVVM的理解。
4.项目中的第三方库选择的问题,因为简历中写了我对第三方库选择的问题,比如选ObjectBox和greenDao的问题,图片加载框架问题
5.HashMap和HashTable,引申ConCurrentHashmap的深入,version1.7和1,8的区别,以及高并发下HashMap发生的问题
四大启动模式,以及场景对应
6.Handler的机制介绍,不存在消息时的IdleHandler的运作机制,为什么不能在子线程初始化问题
7.设计模式中的单例介绍,使用场景(Okhttp的Seesion存储等等),在线编写
快排算法
8.OkHttp的源码分析,及整体架构的流程图绘制
9.四大组件的完整介绍,及深入,答了IntentService、LocalBroadcast
10.四大引用的问题和MVP框架相结合进行回答
11.网络中的响应码对大体进行回答,具体回答了200、404、500、304等
12.View绘制流程问题,如何不使用xml,来实现中间位置的定位
13.事件分发机制流程讲解,以及如何实现单击事件和长按事件的判定
14.关于为什么选用mqtt协议的问题,优势,原理等等(没答上来,只说针对性做过测压,以及oceanlink和mqtt的对比)
阿里钉钉二面(面试时长30min)
1.自我介绍,优缺点的,以及未来希望的发展方向
2.目整体介绍,如何做到分压啊之类的问题
3.如果给我阿里、腾讯、头条、谷歌的offer的一个选择(不掺杂地域性的问题),首先直接否定了google我就的一个企业的商业模式进行分析。
我对钉钉这个产品的理解,我的回答是就的是钉钉前身的对标项目微信,已经后期转型的商业模式作出的分析,最后给出的我的结论是一个企业性质的办公软件
4.给出了钉钉一个mac平台的关于共享屏幕的耗CPU的问题
5.让我提问,提的是关于音视频发展方向的问题,具体是一个发展空间。
阿里钉钉三面(面试时长60min)
1.自我介绍呗,还是一样,项目介绍,项目的优缺点对比
2.对MVC和MVP的理解,还有Handler的内存泄漏问题具体是什么,解决方案知道有什么,空数据的时候Handler的阻塞问题,但是我还是没在Looper的源码中找到,这里让我好好再看一下。
3.另外为什么使用MVP,他的优势是什么,内存泄漏是什么样的。
4.http的长连接和短连接这两个概念,怎么去理解。我把它理解为持久化连接是什么,然后对http的3个版本的主要区别做一个介绍
5.http一整个流程,什么Baidu.com输入,经过了什么。比较简单的问题了,必答内容6.DNS、TCP的三次握手、四次挥手,当然我再答一些IP路由、链路还有物理层的内容
7.RecyclerView的一个复用机制,和ListView的一个区别在哪里
8.HashMap、ConcurrentHashMap、Hashtable的问题,数据结构,线程安全啊之类的问题了,当然还是考了version 1.7和1.8。
9.一个app的启动流程,冷启动和热启动,我说底层我不太了解,只知道会有AMS去调一些东西,但是具体内容不知道,后面就是一些初始化和Activitiy生命周期问题了。
10.一道算法题三值之和求目标值,没写暴力,因为大家都会写,但是浪费了很多时间,刚开始是通过二值求和的方式,但是想做成O(n),其实不太可能,后面改成了O(n^2)
HR面
1.你对阿里面试官的印象如何?
2.你从面试官上学到了哪些东西*
3.你每天的生活安排是什么样子的?*
4.你为什么选择来阿里?*
5.你以后的技术规划是什么样的?*
6.你最有成就的项目是哪个?*
7.为什么选择android开发?*
8.你有什么要问我的吗?
学习技术是一条漫长而又艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
此外我也把近期搜集整理的腾讯、头条、阿里、美团、字节跳动等公司2020年的高频面试真题解析分享出来。
把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
【Android学习PDF+学习视频+面试文档+知识点笔记】
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
【Android高级架构视频学习资源】
Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
【Android进阶学习视频】、【全套Android面试秘籍】可以简信我【学习】查看免费领取方式!