先介绍一下求职者背景
求职者是15年土木工程毕业的渣本孩子,到北京后开始从事 Android 开发,至今两年多。非常感谢我的前领导,我告诉他要离职时他对我说:“小吴啊慢慢找别急,找到满意的再走,你一直留下来也是可以的”,然后我就拖了很长的一段时间。由于没跳过槽,在面试过程中也吃了很多亏,当然也学到很多知识和技巧,本文主要介绍一些技巧性质的东西,对于很多公司或者说很多面试官的不一样,面试题也是差异较大,所以面试题将不做细讲,只要掌握了技巧就能以不变应万变。
面试过程
下面按照面试时间顺序进行排序,只大致描述下经过。
1、NewsDog(未收到offer)
这是我跳槽过程中面试的第一家公司,是在 AndroidWeekly 上投的,也算是慕名而去的吧,里面有一个出过两本 Android 经典书籍的大牛,名字就不说了嘿嘿。说实话两年前就面了两三家然后就上班了,现在可以说没有说明面试经验而言,也没做什么准备。
一面:是收我简历的哥们,先一般都是自我介绍,然后开始聊大量性能优化的东西,包括布局优化、overdraw、内存优化、平时用到的工具。然后看了我们公司的 app,问如果现在叫你再优的话你想下你会怎么做。说到 leakcanary 的时候他问了我它的原理。我记得最后聊到了 Handler 机制,包括一些很细节的东西。一面应该这样就算勉勉强强过了吧~。
二面:这次是业界熟知的那个大牛,没想到那么年轻,他说只比我大一岁,我当时感到非常惭愧。也是聊了很多性能优化的东西,然后问我什么牛逼,擅长什么,我真的当时一脸懵逼,我在想我擅长什么?我想说,但是又想,我靠,我在他面前这些是不是太 low了,反正最后的结果就是什么都没说~~。然后他说来聊聊安卓的架构吧~,我菊花一紧,这该从何说起啊..我支支吾吾的瞎说了点。可能是看出了我的窘迫,然后他开始聊下一个了,又是 Handler 机制的,大致聊了下原理,然后他打开了 mac 里的一个纯文本编辑器,让我试着写出大致的 Handler 原理代码,这个说实话我应该能写,当时真的非常紧张,我写着写着不想写了~,善解人意的面试过再次开始解围,从这一刻开始我想我已经有一个得分了。接下来其实就是一个教学过程了,真的非常感谢他!他从我的简历开始说,哪里应该注意,哪里不该怎么写,哪里怎么写比较好,接着是聊面试,他感觉我很多东西都知道,但是就是有点乱,让别只看别人博客,自己要多看源码,分析源码。接下来他打开了源码,开始分析 Handler 机制,说了一些我平时忽略的东西。最后聊了生活和学习,问了期望薪资,并很明确的告诉我,他们需要再对比下,说我今天表现一般,但是还有机会。当然最后是没拿到 offer 啦~。
总结:其实通过这次面试暴露了我很多的不足,比如性能优化上其实经验不多,架构上表现平凡,更重要的一点是我发现我逻辑上很乱,知道的东西说的东拉西扯甚至表达不出来,这点非常致命,,当然当时面完我还没意识到,因为我当时还没形成分析面试过程和总结面试的习惯。
2、Powerinfo(未收到 offer)
这是一家创业公司,做视频SDK相关的东西的,算是非常喜欢的一家了,也是在 AndroidWeekly 上投的,说实话面试过程自己非常受打击,但是对自己帮助也是非常非常的大。
一面:主要三个部分组成:笔试、Hr 面试、机试。Hr 问的超级详细,整个过程非常长,我记得大概是三个小时左右吧,可以看出的是该公司非常认真的对待求职者。
二面:握手后我们相互的自我介绍了下,然后开始聊一面的一个笔试题,一个逻辑思维的。没错,我当时的鲁莽选择了个错误答案,然后开始让我分析每一个答案,当时实在有些不适应,心里根本没看进去题,一直在想我靠完了,尼玛我肯定不行,最后结果不言而喻。然后又是一个分析问题的题,接着是一个小算法,写完叫我算下它的复杂时,最后聊了下我开源中用到的 FFmpeg。整个过程我又是思维不活跃,说话调理不清晰,我想他对我的印象也是如此吧。他基本没问安卓的东西,更注重解决问题的思路,但是我面试过程感觉任督二脉都堵住了,从让分析第一个题开始我就心跳加速,根本没法思考了,结果嘛肯定就跪了啊,错过了一次非常好的机会。
总结:这次面试对我打击非常大,本来犹豫要不要今年回四川的,现在明确不回去了,感觉 自己和别人差距还很大,北京能人更多,我需要留下来再看看。技术先不说,交往沟通的技巧、分析问题的能力、思考问题的方式,感觉都差了很远,这些是致命的。面试完我一周都一蹶不振,美女当前也无心问柳。然后开始总结这两次面试,列出一条一条的问题,并思考自己该如何做,接下里很长一段时间都没有再投递简历。
3、花椒直播(未收到 offer)
经过了一段时间,渐渐的从阴影中了出来,投递了花椒直播,很庆幸得到了一次面试机会,他们在 360 大楼里面,需要刷身份证才能进去,逗比的我早上兴奋过度带了张港澳通行证就杀过去了,快到了才发现,结果就是我又回来了,然后改约到了下@@,冥冥之中预示着什么呢?
一面:简单聊了下我发现在面试官是做播放器的,native 层的,他们也是想找这方面的,我意识到简历写过了(后来回去又修改了下),简单了下 JNI ,FFmpeg,直播相关的推拉流,面试官明显不太满意,他们想找个专业底层的,最后说你等等。
二面:这次是 Java 层的面试官,也是聊了推拉流相关的一些东西,接着让分析 View 绘制过程,当我说道 ViewGroup 可能不会调用 onDraw 时,他问我为什么,我说有个标志控制,然后问我影响这个标志的条件有哪里?额..,好吧,我不太清楚...。接着说了下他们团队构成,给了些建议和评价,他认为我有点盲目的看源码,很多不知道为什么,如果有个人能站在更高的角度来指导一下我这样会非常有利。这次的评价还可以,也让我自信了一些。最后说你下午来的真不是时候,我们今天有发布会领导走不开,你先回去,后续如果有需要再联系你,当时还年轻,不知道这是客套话还高高兴兴的回去了呢@@。
总结:先说结果吧,结果就是我等了几天实在觉得不对就问了他们HR,他告诉我面试官说想找经验更丰富的孩子,好吧~。这次面试后回去再看源码时我也更仔细了,对那些关键的东西会去看看具体原理,然后最大的收获是边自信了很多,不再惧怕面试了。
4、新华移动传媒(offer)
一面:这次是电话面试,先简单卖弄了下自己,接着开始聊项目中中的东西,聊了听过 IM 相关的东西(面试官以前腾讯QQ的),接着聊直播聊视频,聊兴趣,我说想玩音视频相关的时候,他说他们现在有个项目就是搞这个事的,大致又聊了下项目,由于总公司在杭州所以他们需要集中约时间过来面试。
二面:面试地点在新华社里面,面试官说需要给我定级,于是从基础开始了,包括 Android 基础和 Java 基础,像几种启动模式的应用场景之内的,然后是源码相关的一些东西,接着是视频相关的东西,最后面试官非常的耿直,直接说给你交个底,如果你喜欢就来吧。很耿直的面试官,点个赞。
三面:这次是 HR面试,顺带说一句 HR非常漂亮,加了微信哦,杭州果然产美女啊。聊离职原因啊,说自己优缺点啊,兴趣爱好啊,还有,有女朋友么?我当时想问:“那请问你有男朋友么”,当然这种想法在坐怀不乱的我脑中一闪而过,接下来我可是要报价的了,不能被迷惑呢。聊完薪资明显她感觉我要高了,但是我算了下差不多,就坚持了。
总结:这次面试明显不紧张了,说话也非常有调理,都是第一、第二、第三...这样表述的,语速也没以前那么快了,给人感觉更严谨成熟。不足就是谈薪资我没谋划好,没有个计划,这也是很致命的,当时也没意识到。
5、好未来(未收到 offer)
加他们老大一起总共是三面,总体感觉面试过程舒服程度一般。
一面:来了两个人,一个兄弟不知道技术怎么样,我聊到 Sophix 的时候他不太清楚,然后就走了,留下了另外一个。这兄弟一直跟我聊项目,问我项目中的功能实现,包括业务实现,我感觉他居然怀疑某些功能不是我做的,对于这点有些哭笑不得,这么大的项目做了两年了,肯定有一些业务细节有些遗忘,比如一个按钮的显示规则这种的,全是业务的,聊了很久。
二面:这兄弟是做后台的,先是查了我学校排名(我不小心看到了他电脑屏幕),然后问我 CSDN 的博客都是你原创的么,我说写了原创肯定就是原创啊,老被人怀疑的感觉非常不爽。接着是些不痛不痒的 Java 基础,然后开始聊数据库,问我一些 SQL 语句,查询啊、新增字段啊之类的,接着问我 Linux 命令、vim 命令。
三面:面试的是项目组老大,技术聊的不多,主要是聊个人的兴趣爱好啊,个人规划,离职原因,然后问了期望薪资。我说了个价,他马上问是税钱还是税后,说实在的我不知道现在行情,不知道要多少合适,但是直觉告诉我要少了。最后就问什么时候入职了,我说一个月后,他就没说什么了。
总结:这次面试虽然技术上没得到什么帮助和指点,但是从没得到 offer 来看原因很可能是入职时间说的太长,他们那边明显想找个尽快入职的,还有价格不能要太低,这样反而不好。
6、支付宝校园生活(未收到 offer)
接到面试电话有点意外,毕竟是支付宝相关的业务,然后就开始有点点忐忑了~,不过还好,我早已不是一二面时那个羞涩的少年了。
一面:这是一个发际线比较高的大哥,一看就比较有逼格那种,不如意料,这大哥知道的很多,而且不浅,我们聊的很随意,一般是我说道哪个知识点然后他就开始延伸,比如我说用了热修复,他就问热修复原理,我大致说了,然后继续深问,直到我扛不住~。当然性能优化这种必问的也是不少的,还有 okhttp 框架流程、快排描述、Acticity 生命周期,包括周期这间的区别,叫从多方面考虑、Http等等。我感觉经常 get 不到他的点 。。。
总结:这次问的问题我确实不怎么吃得住,深入一点可以,再深入一点可能就有点不行了,平时应该往更深的地方思考,就好比 Activity 生命周期大家都知道,但是为什么这么设计,这么设计的好处可能就不是都去思考过的了。
7、汽车之家(offer)
经过前六次的战役,现在的我面试的时候基本可以做到比较淡定了,由于不紧张,思路也慢慢变的清晰,反应也恢复到了平时的状态。
笔试:汽车之家是必须笔试的,题目和两年前大同小异(我刚来北京的时候就去面过~),都是些 Java 基础和 Android 基础,HashMap 啊,String 之类的。
一面:一个30岁左右的男子,面带微笑,看着非常的稳重。我自我介绍完了后开始聊我以前的项目,包括 JSBridge 的一些细节、热修复的原理、原图加载原理、项目中的性能优化等等,然后介绍了他们的项目,一个小时下来非常愉快,由于马上12点了于是他给我留了电话,叫我一点半打电话给他然后安排二面。
二面:二面我记得是移动端的老大,问了些 Java 基础、Http、项目中都做了些什么、为什么土木转计算机、离职原因等等。
三面:面我的人看着应该有40多,一脸祥和,一看就是久经沙场的老将,场据说是项目老大,问了我的职业规划、对框架的理解、怎么搭建一个高解耦的直播框架(解耦各种第三方sdk)。
四面:问了些生活上工作上的琐事,当然最重要的是砍价,汽车之家工资一般吧,但是福利非常不错,工作也轻松,没有加班风气。
总结:到现在我发现只要一面表现要了后面的面试就容易了些,但是还是不要掉以轻心,老大不喜欢的话你直接领导再想要也没用,到此我已经体会到了平常心的好处,让人能从容的交流,这样才能尽可能多的展现自己。
8、蚂蜂窝(未收到 offer)
这家公司是做旅游攻略起家的,我个人非常喜欢户外,所以果断就投递了,这家公司总监非常有意思,后面会说到。
笔试:这家公司的笔试题一定要认真做,后面面试会和你聊的,大部分是 Java 基础和 Android 基础,值得一提有一个小算法题,是给出了算法条件和结果,让你写这个算法。大致是这样的:有一个数组 array1 = [x2,x3,x11,x12,x14,x6,x7,x8,x4,x5],array2=[x4,x6,x3,x11],结果:[x5,x7,x8,x2,x12,x14],大概是这样的。
一面:先是聊面试题,聊了很久。然后开始聊自定义 View、View 绘制、事件分发等等,面试官挺擅长 View 绘制和事件分发,我们从理论聊到了实践,从实践聊会理论,然后分析一些系统控件的实现,我就慢慢想,他也不急,就一直等着我。最后请教了他的学习方法,我发现他对问题非常好奇,一旦有疑问就会刨根究底把这个东西完全吃透,这也是非常值得学习的地方。
二面:先是性能优化、键盘冲突的处理、截取照片中部分图像的方法原理、项目中负责哪些东西等等,想截照片那个我确实不知道,但是我分析了下,发现好像确实是我说的,无非就是很多像素,然后从数组中取出相应的像素重新生成一张 Bitmap。
三面:这次是技术总监,由于太晚了,简单聊了下给我留了一个题让我回去做,做完和他微信视频聊天辩驳,最后给我送了一份饭来让吃了再走吧~,好吧这个题其实是一个概率论的题,他要求弄出理论计算和 Python 实验两种。结果就是经过几次视频我的答案也不是他想要的,他也提示了我,但是我始终觉得我的有道理,所以最后就不了了之。
总结:这次面试我又发现一个现象,东西没做过或者不会其实还好,如果你得分析出来结果或者大致原理,那么面试官会非常喜欢,就好比二面的那个截图,这个方法对我后面的面试帮助很大,当然如果想要 offer 还是不要太倔强了,顺着总监一点应该还有点机会的,不过至今我任然坚持我看法@@
9、豆果美食(offer)
说实话我是豆果的忠实用户,所以就过段投递了,豆果氛围非常好,领导也很 Nice,当然人家用户量也是好几千万。
笔试:没有算法,都是些常规的 Android 基础和 Java 基础,没什么好说的。
一面:一个很年轻的小伙,但是实力很强的,他整个面试过程完全没按照我简历来。我们聊得最多的是 Framework 的东西,他比较擅长这个。比如 Handler原理、Activity 启动过程、进程启动过程、Android 系统启动过程、Java 虚拟机与 Dalvik 区别、Dalvik 与 Art 区别等等,我发现我们两个很像,学的东西大同小异,所以聊得很来,后来我们加了好友。
二面:简单自我介绍了下,然后聊我做的东西,这次也聊了键盘跳跃的处理、原图处理、性能优化等。
三面:一上来问了我很多基础的,View 绘制流程,onMeasure 与 onLayout 的几个参数的分别是干嘛的,接下来都是聊职业规划个人兴趣还爱之类的了。
四面:这次是 Hr,简单了解了下我的情况后开始谈薪资,说实话待遇我不是很满意,算下来年薪和我现在差不多,不过豆果还是非常有潜力的!
总结:这次面试自我表现还行,该说的都说了,但是薪资谈的一般,给自己一个薪资计划的,不然后面会有很多不愉快的事。
10、阿里高德事业部(未收到 offer)
这次面试其实我有点虚,都有点犹豫去不去的,但是我知道不去我肯定会后悔,所以硬着头皮就冲过去了,事实证明这次面试对我帮助是最大的,挺佩服面试官的,感觉比我还清楚自己的优缺点,只是可惜最后还是未尝所愿。
一面:这次面试的内容非常的多,我只能记得大致了,显示聊我项目中做的东西,聊到 IM 的时候问到了数据库,问我怎么封装的,我说没怎么封装,他说那你现在想一下,我想了很久只能想到反射,但是问题是字段怎么映射呢,后来他提醒了一种方式,用注解,好吧...,聊到 leakCanary 我大致说了原理,当我说道退出 Activity 时调用 dump 的时候,他问了句,那每次都会调用 dump吗,dump很耗时的,它用什么办法在没内存泄漏的不 dump。问网上很多人说
Handler 内存泄漏,为什么会泄漏,怎么引用的。还有很多小问题,像多线程同步的、binder 通信的。到最后他跟我说了下来这边我将会负责什么,然后问我感不感兴趣,说实话满感兴趣的,让后他觉得我优点就是学习能力还行,缺点就是很多东西没串起来,举一反三还达不到。这关就这样过了。
二面:据说是他的领导,领导应该对我的简历不太满意,简历聊了下,问了下 http 、对高德了解多少、做地图的关键点是什么。然后说你学习能力还行,但不是科班的,经验不是很多,应该也能做,但是可能会慢一点点,然后就没了。
总结:通过这次面试我又自信了很多,相信自己还是可以的,至少慢慢努力还是有用的,毕竟这是高德啊,也为后面去其他大一点的公司面试打下了基础。然后我还学会了在面试中思考不会的东西,经常能在不会的情况下找到一些线索。一面的面试过最后也加了我微信,告诉了下我面试没通过的原因,并表示有机会再叫我,这点让我挺感动的!很少有面试过能做到这样吧。
11、京东商城(offer)
京东总部有点远在亦庄那边,一早就出门了,下午还有其他的面试,导致一天都没吃饭,面试也非常考体力啊。
不算Hr总共是四面,前三面主要主要是聊我项目中做的东西和他们项目是做什么的,也会问些 Java 基础和 Android 基础,第四面是定级,会跟你聊你学的最深的一块儿,其中有个哥们问了个小算法,10点半开始进京东大厦,面完差不多是1点。
12、美团(未收到 offer)
美团对基础非常看重,每一面都有一个小算法题,一二面基本都是聊基础,但是说基础的同时也不缺深度,感觉非常不错。
一面: String相关的问了很多、HashMap 的原理、Java 的引用类型、Activity 启动模式、Activity 生命在各种情况下的生命周期、二分查找、单例模式、Handler 机制、系统中用 Handler 的地方等等等等,看着都是些常见的,但是问的非常的细,很多都是平时容易忽略的东西。面试官人很好,一直告诉我不要紧张,因为我一直在喝水,我其实是非常饿,最后让等二面的时候再次嘱咐我不要紧张,二面尽量往你会的方向引导,真的很感谢那个面试官。
二面:二面聊的比较多的是 Java 相关的,基础是一方面,然后聊到热修复的时候随便问到了我 类加载器与Java 虚拟机的双亲委托模型,也是有一个算法,写完后让我继续优化这个算法,我是真优化不动了,面试官一看就是很耿直的人,告诉我老大今天开会让我回去等电话,这次我觉得应该不是委婉的拒绝。
三面:等了很久,终于等到了 Hr 的电话安排我去三面,三面的面试过那天刚好在校招,于是我就被带到校招的地方去了,我觉得在面试过看到我简历那一刻开始就没打算要我了,整个过程非常短,基本没聊技术,自我介绍环节都省略了,简单聊了下然后让我做一个算法题,我写完后正犹豫,他有收卷的意思,然后就说让回去等,我心里知道肯定没戏了...
13、陌陌科技(offer)
陌陌的产品我非常喜欢,我以前也是做社交类的东西,所以感觉蛮适合我的,里面几个面试官也很 nice.
一面:面试官是优化组的组长,跟我聊很多优化的东西,我确实不是专业的,可以说面的一塌糊涂,我感觉没戏了,我一想反正来了,于是就请教了他很多问题,主要是架构的,他很耐心的给我讲了陌陌的组件化,最后说去叫迭代组的来面我吧。
二面:先是 Java 基础相关的问题,那后聊了我项目中的一些东西,IM 啊、图片加载啊之类的,很多都记不清了。
三面:面试官是 Android 组的老大,我来聊了很多 jni 相关的东西,我记得他问了一个问题:“我看你项目中用了 GIF图是吧,GIF图怎么解析呢?”我不知道,于是我用视频那套分析了下,然后他表示认可,还有好多其实都不知道,但是高德的面试过教会了我多分析多联想多能举一反三。
四面:这次是hr面试,谈了离职原因,期望薪资,我以为就通过了呢,没想到还有一面,叫我回去等电话安排总监给面试。
五面:这是一个看着很年轻的技术总监,但技术应该很不错的,我们聊了很多数据库方便的定西,IM 与 视频的也不少,大概聊了半个小时吧,最后也没给答复,让回去等。
总结:这是这次跳槽的最后一次面试,对自己表现还是挺满意的,其实一面真的挺煎熬的,我确实很多不知道,一面面试官是专业性能优化的,我确实还查了一点,聊架构我也一塌糊涂,但是我当时没气馁,虽然暴露的体无完肤我还是坚持把我知道的说了,不知道的问了,也没表现出怯场。
需要掌握的技能点
列下我在面试遇到比较多的。
- 基本算法,其实基本没遇到和难的算法,都是给定一个实际场景然后写个小算法,比如叫把 String 的 IP 地址转成 int 值,IP 是 192.168.0.1 这种,对应 int 值是 19216801。
- Java 中常用类的源码,如 常用的数据结构(HashMap问的比较多)、String、StringBuilder
等等,可以看看 《Thinking in Java 》 - Java 虚拟机、Art、Dalvik 他们的区别。
- 性能优化,这是个很大的点,但是基本是必问的。
- Java GC 原理、GC Root 的概念、Java 引用类型。
- Android 的基础知识,强烈建议理解性的阅读《Android 艺术探讨》,很多问题的答案都可以在这本书上找到,像 View 绘制流程、事件分发流程、Handler 机制、IntentService、HandlerThread 这些可以边看边跟源码边做笔记。
- 多线程中,线程安全。
- 线程池,需要理解里面各种参数的含义,适用场景。
- 进程间通信、线程间通信。
- JSBridge 相关的东西。
- 自己在项目中用到的东西,既然写在简历上了就要知道它的原理,越清楚越好。
面试总结
总共这次面试,我个人总结了几点。
- 我个人认为简历不要乱投,只投递喜欢的公司和职位,不然只会浪费时间。
- 不管面对什么样的人,千万不要怯场,不然根本没法表现出自己水平,既然让你来面试了,说明简历还是有过人之处。
- 把基础打牢固,平时开发中多总结,多想想为什么。
- 不要放弃每一次面试机会(因为你投递肯定是因为喜欢),我中间有好几次都不想去,但是理智告诉我必须求不然会后悔。
- 事先了解职位要求。
- 面试过程中语速慢些,说话要有调理,开始的对白可以预先准备好,因为一开始基本都是自我介绍,你可以介绍完自己,又介绍自己公司业务,随带介绍自己做的东西,把你觉得面试官可能感兴趣的放后一点点,一般面试官都会问问的,然后这可以顺带再继续说说。
- 总结每次面试,这次问到不会,就不能在下次也不会了,如果面试失败,要分析失败的原因。
- 遇到不会的就说不会,但是不能就这么完了,一定要思考,分析问题的能力感觉面试官是非常看重的,你思考过程中可以把你思路说出来,能说多少就多少,千万不要不好意思。其实科学研究也是猜测加实验证明的过程。这点非常重要的!
- 对自己做过的东西一定要非常熟悉,了解实现的原理,比如做过热修复,你肯定需要知道热修复原理,做过大图浏览,肯定要知道内存问题、分块加载、矩阵变换。
- 面试前要对期望薪资做个评估,高了其实你面试ok的话 HR 可以给你砍下,低了吃亏的不只是你自己,HR 也替你着急,因为低了的话就算给了你 offer 很可能你不会去的,这样他们就白干一场。合理的要工资既是对自己的负责也是对招聘公司的尊重。