金九银十跳槽季,记一次Android面试(附详细答案)

阿里云双11来了!从本博客参与阿里云,服务器最低只要86元/年!

前言

金九银十跳槽季,不知不觉来新公司也有一年多了,想着想加薪最快的方式就是跳槽的原则,我又一次乘着这个黄金期跳了一次槽。

在过去的八月份,我经历了差不多一个多月的面试,最终拿到了大宇无限平安智慧城市insta 360泰迪熊科技优必选以及几个不太知名的小公司的offer。于是乎我又一次想记录一下这次的面试,一者总结和归纳一下知识点,二者通过总结弥补一下自己的不足之处,三者帮助需要跳槽意向的大家了提供一些跳槽经验吧。

面试前的准备

说实话今年由于很忙,所以准备时间并不长,也不算很充足,前前后后准备了差不多两个礼拜左右的样子我就出去面了。准备主要还是三个方面,第一个,简历;第二个,刷题(包括Java、kotlin、android和算法);第三个,HR的面试通关准备。我下面一步一步的来讲。

1.1简历

简历这块,由于之前我也面试过别人,所以我深知HR或者我自己筛选简历的一些要求和建议。

首先第一个就是看你的标题。很多人写简历根本不写标题,前面写了一大堆的姓名,性别,年纪等,这些不是说不写,只是说你的关键信息点并没有突出出来。咱们程序员都很忙,本身天天加班就很累,为了招人每天还要筛选几十份简历,心态肯定是要炸的。所以你在简历的首行位置就直接突出重点,你的姓名,工作年限,还有应聘的岗位

例如 张三——四年工作经验——Android开发

这让筛选简历的人一眼就能看到你到底符不符合我的招人要求,然后再看你具体的技能和你的联系方式。很多人开头写了一大段乱七八糟的东西,会的各种技能都写进去,就是不写明自己几年工作经验和应聘的职位,然后写一个毕业年限在那里让HR自己去算。说实话,首先HR压根不懂技术,写那么多会的东西反而让HR觉得你不知道是来应聘什么职位的,其次按照30s一份简历的筛选速度,恐怕HR还没找到你的关键点,就已经把你pass掉了。

其次,展示自己的亮点。我明白不是所有人都有好的学校背景、好的公司背景、好的项目经验背书 —— 假如你有,是个优势,但没有的话,聪明的你应该会想办法从其他方面给自己加分。 比如长期维护技术博客、博客言之有物,比如参与开源项目,比如做过一些个人项目等等。当然这些非一日之功,需要你平时的努力(不要想着在求职前随便粉饰包装一下,言之无物的博客或 github 反而会留下不好的印象)。我的理解是,其实招聘方也很苦恼,从 80% 的千篇一律的普通简历中想要筛选出能力好的人非常非常难,这时你能用这些亮点作为敲门砖无疑就能脱引而出。(PS: 有好的博客或 github 千万记得写在简历上且可以写在显眼的位置。在筛选简历过程中曾碰到一个人简历上没写这些,幸好他是朋友推荐特意给我发来了他的博客地址,否则单看他非常一般的简历他就失去了面试机会)

最后,诚实靠谱。可能有人会问,假如我既没有好的经历也没有亮点怎么办?那就踏踏实实把自己的优势写出来,比如擅长 UI、对网络层有深刻理解、有自研 IM 的经历等等。大部分程序员都是靠谱、理性的工科男,简历写得诚恳踏实往往更能得到青睐。不要浮夸甚至造假,踏踏实实把自己基本信息展示出来就好。对写上简历的技术点要有一定了解,简历上写了一堆技术点结果问了却说不熟肯定是很减分的。(PS:慎用“精通”)

1.2 刷题

刷面试题这块其实一开始我并没有刷特别多,也就是简单的看了下一些基础性的知识点。因为我始终觉得看的越多越记不住,而且最重要的是你根本不知道面试官会怎么问,与其盲目的看知识点倒不如先出去找几家小公司面试找找感觉,知道面试官会针对哪些地方询问,再回来针对性的看。

由于我不是裸辞的状态,所以面试对我来说其实不是那么着急和有压力。我陆陆续续的面试了差不多一个月左右,面了十来家公司。当然,前面面试的几家公司完全是试试水的状态;每次面试回来我都要做一些笔记让自己知道自己不足。所以这样一来二去后面的状态就越来越好了。针对android这块的面试题目其实主要还是基础性的原理之类的。

不过这里还是要说一下,对于基础复习我这次最大的感触就是,一定要早点做准备同时也要做全面完整的准备。

举个例子, Java 中非常基础的的四大引用。对 Android 开发来说平时可能用弱引用比较多,但真正作为面试题来问时面试官希望你能马上回答出四大引用分别是什么以及各自的使用场景。假如你能马上回答出四大引用的特点及使用场景当然是合格的回答,假如你不止回答出四大引用的特点还能联系到 ReferenceQueue,继而延伸到在 leakcanary 的使用,那就是优秀的回答了 —— 但假如你被提问后一脸懵逼,说自己只记得弱引用,就会比较尬(当然就这个知识点而言,我作为面试官的角色时还会尝试“抢救一下”,由弱引用的使用延伸到内存泄露去,不会直接判定应聘者)。

因为在“面试”这个场景里,面试官会默认你做了足够的准备,对于一些中高端职位基础题其实是作为送分题问的,当然希望你能快速反应、快速回答。而人不是机器,许久没用或者没复习的技术点想要在短时间内回忆起来并归纳成 N 个点说出来难度非常大。 所以基础技术的面试其实就跟应试一样,任你功力再高,也有必要好好复习一下。毕竟“武功再高,也怕菜刀”嘛(不恰当的比喻,哈哈)。

基础复习可以分为两大块,一块是 Android 和 Java 基础,另一块是计算机基础,也就是算法、计算机网络、计算机原理等。对于前一块,经验丰富的你一般花半个月就可以搞定;但对于后一块,时间上就不好估计了(网上有非常完整的各种面经和题库,聪明的你肯定具备最基本的信息检索能力,这里我就不贴链接了)。

这里我把我自己作为反面教材:由于前期对是否要跳槽犹豫不决,所以没能早点进行充分的准备,导致后面碰壁后需要在短期内急急忙忙去复习,其中的压力可想而知。

个人认为比较舒服的姿势是,不管跳槽与否,一些基础的东西在平时就可以有计划地复习,特别是刷算法题 —— 任你算法功力再高,没有经过一定的训练想要在面试这种场景下快速手写出 bug free 的代码也几乎不可能。

Java基础问题以及答案

1.HashMap的内部原理。 主要是内部的hash碰撞、resize()等。还会与HashTable进行对比,说出相同与不同点。作为延伸可能还会问concurrentHashMap的分步锁问题。这里我写过一篇关于hashMap的原理文章。

2.java中创建线程的方式有几种。 一般而言很多人会回答两种,Thread与Runnable。我最早面试的时候也是说这两种,然后面试官问还有别的吗?我当时就没答上来,其实还有一种叫Callable的。这里可能还需要理解下Callable与Runnable的区别以及使用时候的注意事项。java创建线程的三种方式

3.死锁造成的原因、手写死锁。死锁

4.synchronized,ReentrantLock锁内部原理synchronized,ReentrantLock锁内部原理

5.votile关键字。votile关键字

6.线程池ThreadPoolExecutor的使用,内部处理任务的过程以及四种线程池的区别。 线程池原理

7.java中GC回收算法以及年代区分问题等。 JVM垃圾回收

java方面的问题印象中差不多就是问上面几个问题,只要了解了这些java这段问题不是很大。

Android的问题。

1.Handler 相关知识,面试必问。

Android消息机制的原理及源码解析,

Android Handler 消息机制(解惑篇)

这里顺带提一句,很多人对Handler的源码其实都比较熟悉,因为毕竟面试基本都会问,但是即便是熟悉了有些同学一到面试面试官稍微拐弯变着法问一些问题的时候基本就歇菜,这里我找到了一个handler消息机制50题,里面有很多面试官会问的方式方法,可以足够让你查漏补缺了。

Handler消息机制(50题)

2.Activity 相关

Activity的四种启动模式应用场景

Activity启动过程全解析

3.Fragment相关

Fragment 生命周期和 Activity 对比

Fragment 重叠, 如何通信

4.Service 相关

进程保活

Service的运行线程(生命周期方法全部在主线程)

Service启动方式以及如何停止

ServiceConnection里面的回调方法运行在哪个线程?

Android中startService和bindService的区别

Android 进程保活的一般套路

关于 Android 进程保活,你所需要知道的一切

5.事件分发原理。这里主要会问事件分发的流程以及进行拦截时候onInterceptTouchEvent返回true时剩下的MOVE与UP如何走,onTouch、onTouchEvent、onClick的先后顺序关系。

谈一谈Android中的事件分发

事件分发机制 郭神出品

事件分发解析 鸿洋出品

6.AsyncTask内部实现原理。 这个在平安二面领导问道过。主要是AsyncTask内部如何实现的,内部处理多任务是串行还是并行处理,为什么是串行处理,如果让其变成并行处理等。

Android AsyncTask完全解析,带你从源码的角度彻底理解

7.LruCache算法如何实现,内部为什么要用LinkHashMap来实现。

彻底解析Android缓存机制——LruCache

8.进程之间的通信方式,IPC原理。 这里会延伸到AIDL和Binder。

写给 Android 应用工程师的 Binder 原理剖析

Android 进程间通信

9.进程之间的优先级。 前台进程、可见进程、后台进程、不可见进程与空进程。腾讯面的时候还特意问了我进程的保活措施。

进程之间的优先级

10.图片的压缩处理以及glide源码 这里会问四种图片格式的区别(ARGB888、RGB565、RGB444、Alpha_8),以及问给出一张以上格式的图片如何计算图片所占的内存大小。

郭神系列 Glide 分析 (这个看了我好久好久)

11.动画总结。 重点是属性动画内部实现原理,差值器和估值器的使用。

动画总结

12.Android中插件化、热更新的原理。 珍爱网面试我的时候问了这个,当时没了解过,很遗憾的没回答出来。

Android 插件化和热修复知识梳理

热修复——深入浅出原理与实现

13.Android的性能优化。 布局优化(include、merge和viewstub标签的使用)、绘制优化(不要在onDraw方法里面创建新的对象)、内存泄漏优化,检测内存的方式和内存泄露造成的原因等。

Android 性能优化最佳实践

Android性能优化全方面解析

14.OkHttp源码解析

OkHttp 3.7源码分析,系列章节

15.EventBus源码解析

EventBus3.0源码解析

16.RxJava

RxJava 名词以及如何使用

Rxjava订阅流程,线程切换,源码分析 系列

我印象中差不多就是问这些东西,其实都是很基础的Android知识,只是问的比较深入,如果不明白内部的实现原理很多问题其实是回答不上来的。所以还是要多看源码才能了解本质问题。

这里顺便说一下,现在Android招人的要求确定是越来越高的,我记得去年我去面试的时候要的还只是单纯会Android的,今天很多公司已经在招不仅会Android还要会kotlin的人员。我在boss直聘上记得有一个HRBP还没问我要简历就直接问我,硬性要求就是你会不会kotlin语言,如果不会那么就根本不用来面试了。不过还好,我去年就已经意识到了谷歌将kotlin设置成为Android的第一语言,很多公司肯定会更进的。所以会一些kotlin还是很有必要的。

另外,现在大前端技术比较火,很多公司都在使用混合式开发框架在搞移动开发。印象中美团技术团队,阿里闲鱼技术团队和今日头条貌似都在使用flutter来进行技术改造。我在面试平安科技智慧城市部门的时候他们问的最多的也是你会混合式开发么?我们现在都在把项目用flutter进行改写,这倒是引起了我的警觉。我为此特意去拉钩和boss上查了一些招聘要求,发现现在光是会用Java写android已经远远满足不了当今社会的招聘需求了,我相信在未来混合式开发应该会越来越多才对。而这个时候摆在你面前的就两条路,要么学,要么干脆转行不做程序员算了。

本着多会一个技能就多一条出入的原则,我已经在开始慢慢学习flutter了,等着说不定明年招混合式开发人员时又可以借此机会跳槽涨一波钱。

另外这里做个推荐,如果想学flutter的同学,推荐可以去极客时间看看由美团高级技术专家的flutter核心技术与实战,我已经订阅了,还是不错的。这里我还真的不是在打广告,极客时间可没给我钱去打这个广告,我是真心根据我面试的经验感觉有这个趋势才去买的课程,如果觉得没需要就跳过就好。

最后问的就是算法。这个算法基本大公司都会问。原因很简单,一个公司觉得你连算法这么难的都会了,那么其他的知识即便现在不会回去看下学习下很快就能掌握。并且我听闻有这么一种传统,在国外类似于Google、Facebook这种公司,一般面试问的就全是算法,而且是很难的算法。只要你算法过关了,那么不管你做没做过Android开发,你都可以去Android部门工作。这里推荐《剑指offer》这本书或者去领克上刷题。

当然这个在即可时间上也有类似的课程,我是去年就已经买了,花了一年的时间看完,然后刷起力扣来确实比以前要得心应手的多了。

1.3面试HR

当我们面试完技术到HR的面试的时候,基本offer就十拿九稳了。但是我相信也有不少同学在面试HR的时候面挂了的。因为毕竟咱们是程序员,跟技术打交道容易,但是聊起非技术的问题来很多时候都是一脸懵逼的样子。好不容易过了技术面,结果死在HR面上有点得不偿失,因此我特意选了一些HR可能会问的问题以及一些回答方式。

当面试官问“你有什么要问我的吗”时,应该说什么?

这是我们大部分面试者都会遇到或者都会被问到的问题。如果你回答 “ 没有 ”,这往往被一些面试官理解为:你对应聘公司、工作岗位没有太大的兴趣。可能会让面试官产生误解,而影响面试评判。

如果你回答 “ 有
”,一时间又容易脑子短路,可能会不知道该问以下哪个问题:

问企业发展?怕面试官觉得这个人好虚,有点不切实际
问薪资待遇、假期福利?又怕面试官觉得这个人没有事业心,入职了也不会呆太久的,整天就想着休息……

那怎么办?

首先,你必须提问

面试往往是互相了解过后,面试者处于被动状态,这个时候面试官将问题抛出,你必须把握住主动权,让面试官知道你是认真对待这次面试,而不是敷衍的流水线面试。

那么,问什么呢?

不管面试官是HR、部门领导,还是老板,以下问题都可以帮你轻松度过难关,而且你还能从面试官的回答中得到很多意外收获:

你在公司的一天是如何度过的?

这个简单的问题可以让对方滔滔不绝的讲述他一天的工作,面试官会说一些比较自豪和有意义的事情,同时也会有一些琐碎的事情。在听的过程中,你也能感受到未来工作中是否有你的兴趣点,以及最无聊的那个部分你是不是可以接受。同时也可以从中推估到你的未来发展,因为升职后也会有一天成为他。我去腾讯面试的时候就问了这个问题,然后他说了下他一天干的活,我才知道腾讯的加班是有多严重,我曾跟他说我每周一二四加班,本以为他会说你加班真多啊,结果没想到他来一句说你加班也不多呀,我们很多都是十二点以后走的。我当时就懵逼。这样比你直接问他公司加班多吗要好很多。

能否给我简单介绍下贵公司业务与战略的未来发展?

在实际运用时,要取决于公司的业务范围。听听面试官的计划,这可显出你关注公司整体和未来的发展。同时也可以从他们的谈论中了解到不同公司在同一个行业的情况,对你准备其他公司的面试也会有所帮助。面试一些小公司的时候我就喜欢去问这个问题,通过这个问题我就大概能清楚知道这些公司适合不适合我还有就是可以知道老板到底是喜欢扯淡还是真正的一个实干家。

贵公司最让你自豪的企业文化是什么?

注意!一般情况下,这个问题比较适合用在面试大公司的职位时,当然现在有不少创业公司也是非常看重企业文化的。通过这个问题,你可以从面试官口中了解到公司的工作氛围和一些非硬件的环境情况,同时也可以在面试官表达的过程中去留意他的肢体、感情的表达。如果从身体语言上都表达出认同公司的文化,那说明该公司在企业文化建设方面做得不错。同时你也可以自我假设一下是否可以融入这种氛围。

团队、公司现在面临的最大挑战是什么?

这个问题比较安全,也是一个可以引起面试官兴趣的话题。一来这个问题不会暴露你对公司的不了解,二来也能让你对未来工作的挑战或困难有一个提前的预期。除此之外 ,这类问题用的好,会很容易增加印象分。特别当面试官是外国或海归人士时,比较直接一点绝对不是坏事儿!

对于未来加入这个团队,你对我的期望是什么?

如果面试官将会是你的直属上司,那么这个问题会让你的利益相关者一开始就有一个感觉,你是一个非常在乎他或者团队,并且愿意倾听的候选人。这样对于快速的培养起一段专业的合作关系是很有帮助的,同时也可以更理解他对你的期望值。也可以初步判断出他是一个成果导向,还是过程导向的上司;是一个由上至下思考,还是一个下至上思考的领导。如果把握准确会更会令面试官觉得:你是一个会做好准备并且有同理心的人,这绝对是加分项。

我期望参与团队合作达成共同目标,您可以给我举一个公司中团队合作的实例吗?

这一问题也是要根据你面试的企业情况来定夺,如果面试的是大企业,同时又是外企,那么合作对于他们来说是必须的,因为很多事情你一个人是不可能完成,所以自然会非常看重你对合作的态度。通过这个问题,可以让面试官知道你有强烈的合作倾向。同时从回答中,你也可以感受到这个公司团队合作的情况如何。

通过刚才的面试交流,您觉得我还有那些不足?

这几乎是我面试都会回问的问题。通过这个问题,我就能够知道自己在他们眼里的不足之处,回去可以做好的修改。例如,我在面珍爱网的时候,他们给我的评价是基础还行,但是深度不够并且对自己未来的职业规划不清晰。因为我回答了我想做大前端,然后转管理。他们就觉得你一下想做技术一下又想做管理,这目标不清晰。所以后来我就直接说自己想做大前端,就没有说再后来转管理的事情了。

写在最后

最后,其实我想谈谈如今Android开发的一些看法。从我这次面试来看,其实Android的市场需求还是挺大的,远没有到达天天外界宣传的凉凉甚至找不到工作的地步。我接到了很多公司打来的面试电话,而且由于我不是裸辞的状态,我很多公司都选择不去面试。并非是我求着给机会去面试,而是我选择机会去面试。当然,Android的热度确实不如以前那么高了。但是这也很正常,毕竟任何东西在一片狂热之后总会稳定下来趋于平静嘛。前年的VR、AR火爆,可现在还有谈论AR、VR的么?去年的共享经济火爆,共享单车、共享雨伞,共享充电宝,甚至还有共享女友。光是单车就是20多家品牌,到现在呢?两个巨头,摩拜被收购,ofo半死不活,热度早已退去。今年又变成了区块链火热,但是现在的热度貌似也褪去了。做技术切记心浮气躁,要保持一定的学习态度和积极的学习姿态。有空可以去多学点东西真的对你没有坏处,就像我学了kotlin和现在又在看flutter一样,语言都是共通的,只要会了一门语言其实其他的语言真的只是语法糖不一样而已。保持一颗终身学习的心,这不仅仅只是对于一名技术人员来说,而是对于所有人都应该如此。

有句话说得好,判断一个人老去的标志是什么,那就是不再愿意接受和学习新鲜事物了。

以前百度的一个经理给我说 技术就是造汽车入行早的人是造轮子的操作系统就是发动机 ,后来的人就是喷漆和换轮胎。不要想着怎么重新造个轮子。你应该想着比别人怎么换轮胎更快!因为你造的轮子怎么好,不适合那辆车没啥意义,而你补轮胎更快会让这辆车行驶更快。我听了之后真的是恍然大悟。好好沉淀自己,多看看基础和原理,不要心浮气躁,市场真的没有我们想的那么严重。高级人才在任何时候都是稀缺物种。

有兴趣也可以关注一波我的公众号,晨雨细曲。这里会分享我的职场,生活,做事技巧和方法。

https://juejin.im/post/5d8b9387f265da5ba12cd2f0

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论