前言
这个文章主要是笔者今年的校园秋招android岗的面试经历,希望对正在秋招的和准备明年春招的大四、研究生、甚至是博士生的小伙伴们,有所帮助。大家可以参考一下。
- 个人背景:广东某一本大学大四软件工程专业学生,大二开始学习的android。学校里主要讲的是一些基础的东西,android的知识主要是靠自己课外花时间自学。
- 秋招结果:鹅厂offer,其他公司投了将近10家。感觉和java的同学相比,今年android秋招还是相对比较容易的,可能是因为今年android的同学比较少的缘故吧。投的公司也基本上都是大厂,面试也感觉没有往年的难,几个公司甚至笔试都省略了,估计他们是真的有点缺人吧。
面试经历
因为很多面试时间有点久了,所以许多细节都记不清楚了,只能挑一些印象深的讲,希望大家海涵。
腾讯
拿offer了,最终也决定是它了。面试流程是笔者投过公司里最繁琐的,当然,面试质量也是其中最高的。
一面
很多细节都记不起来了,7月下旬面的,真的太早了。QQ视频的方式面的,加了面试官QQ。在学校里,找了一个没人的小教室,结果没有WIFI,还得自己开热点。。。
视频开了,结果没看到面试官的人,对面是黑屏,看不到人,但有声音,因为对面试没影响,就没管,然后就开始了。
面试官: 先简单介绍一下自己吧
笔者:(扯了一大堆)大四软件工程学生,大二的时候学习的android,后续又陆陆续续学了一些相关的东西。平时学习的话,我主要是通过关注了一些技术的公众号、买一些技术书籍来看和上网查资料来进行。一般遇到问题的话,我喜欢先翻源码,因为“源码是最好的老师”吧?其次我会上它的官网去查,实在找不到的话,再用搜索引擎。搜索引擎的话,我感觉google搜出来的质量要比某度搜出来的要高;而且,一般来说,英文的搜索结果质量要高于中文,许多问题的答案都是在overstackflow这种网站上找的的。因此,我一般喜欢用google进行英文查找,这样效果是最好的;当然,不排除有的时候,中文的搜索结果也不会太差。比如,一般来说,像源码分析一类的文章,只有中文的,好像老外对这个不感兴趣吧?。。。
面试官: 看你简历上写了很多的框架,有看过它们的源码吗?
笔者: 说了一下Retrofit、Butterknife和郭婶的Litepal,提到了一下java的预编译(Butterknife有用到)和反射(Butterknife和Retrofit)。吐槽了一下前两个框架,说反射性能消耗过大。
面试官: 根据你提到的这些问题,有想过怎么解决吗?实现过吗?
笔者: 考虑过使用预编译去代替反射,然后说了一下java预编译的内容,并和C语言的宏做了一下对比。自己也尝试过,但没成功,因为java的预编译必须有注释,而注释的使用范围有限。
面试官: 读过OkHttp的源码吗?
笔者: 没有,主要看过Retrofit的,知道它是基于OkHttp来的,但没看过OkHttp的
面试官: 好吧(语气好像有点失望),对于Activity的启动过程知道多少?
笔者: 说了一下Activity的启动过程,5.0和8.0之间的区别,顺便说了点插件化、热修复的内容。也没太多,主要是外来的Activity如何通过启动时的验证问题(自己也没弄过,但之前看了一些相关的文章)。
面试官: 应该是对我知道插件化、热修复的内容比较满意,又问了Service的启动过程
笔者: 没说很好,因为没想到会问这个,之前看的内容也记不大清楚了
面试官: 没关系,很多面试者都是这样的,知道Activity,但不清楚Service的。关于TCP的三路握手,知道多少?
笔者: 说了一下TCP的三路握手和断开时的四路握手。面试官又追问为什么这样设计。
中间还问了许多内容,但真的记不起来了。。。
面试官: 知道进程和线程区别吗?
笔者: 按照Linux的进程与线程内容说的,毕竟android是基于Linux的,应该也差不了多少。然后提到了用kill命令向进程发送信号
面试官: kill不是用来杀死进程的吗?
笔者: (吃了一惊,以为自己搞错了,但又思考了一下)那是它的默认调用,事实上,kill命令可以加上一些参数,来实现向进程发送一些其它的信号。然后手写了一个kill发送其它信号的例子,拍照发给了他,并向他解释
面试官: (沉默了一会儿)那我再问你一个算法题吧,如何知道一个链表里是否有环?
笔者: (刚好在书上看到了,所以马上答出来了)追击问题,去用。。,(只说了一下原理,没有写代码)
面试官: 好吧,今天面试就到这里。你有什么问题吗?(一小时了,估计他也厌烦了)
笔者: 您觉得我有哪些不足吗?(感觉没戏了,因为很多东西,笔者答得不是很好)
面试官: 总的来说是不错的,但一些基础部分,还是需要巩固。说了很多,记不大清了
二面
过了差不多一星期,然后来的消息,通知二面。也是加面试官QQ,然后QQ视频。
面试官在一个小房间里,白色的桌子,人有点胖,拿了一个mac的笔记本电脑。开始还是自我介绍,和第一次说的差不多。
这次忘的更多了,只能说几个印象深刻的
面试官: 如何知道一个应用是否发生了ANR?
笔者: (有点惊讶,没想到会问这个)说了一下ANR的定义,然后在面试官的提醒下,说出来了怎么发现ANR
面试官: Flutter有多少的了解?
笔者: 这是Google的一个新技术,主要目的是打通android和ios的壁垒,一套代码,多处运行。而且,Flutter野心极大,好像pc端,也想涉及。但具体内容的话,没有用过。新技术方面,主要用过Kotlin,然后说了一些Kotlin的内容
面试官: 关于Kotlin的协程,知道多少?
笔者: 很蒙蔽,不知道什么东西,自然也不会。。。
面试官: 发了一张图片过来,是段代码。让对两个有序链表进行合并
笔者: 写了最通用的解法,写得很慢,因为记得有个更优解,但一时想不起来了。期间一直在问面试官细节,但他都不说话。写了一大推,参数判断啥的,能写的都写了,写了很久,最后拍照发给他。
这个应该不是最好的,我记得Leetcode有个更好的解法,之前看到过,但一时想不起来了。
面试官: 没说什么。泛型呢?
笔者:(好像面试官口音的问题,开始以为是啥新技术,搞了半天,才知道是泛型)说了一下java泛型的实现原理,然后和C++的模板进行了一下对比
面试官: 最后让问个问题,问的和一面差不多,自己有什么不足。
三面
差不多又是一个星期,然后有消息。但这次是电面,结果时间不好,那段时间在实习,电话来的时候,还在车上,结果那天还有点堵车。最后跑回家的,打电话给面试官,开始面试。
听声音应该不是很年轻,声音也比前两位面试官和蔼多了,感觉更亲切。让笔者不要太紧张。
问的问题不是很多,挑几个重要的讲:
面试官: jvm有多少的了解?
笔者: 说了下jvm的内存模型什么的,然后问到了类加载机制,没说得很好
面试官: java的引用类型,知道多少?有何应用?
笔者: 这个是常考点了,自己复习的也比较好,说的很流利。应用的话,主要说了用来解决内存泄露什么的,然后又说了内存泄露的一些东西
面试官: 简历上的项目经历,能说一下吗?又遇到什么问题吗?怎么解决的?
笔者: 主要提到了自己大二时参加的一个学生项目,当时有大牛带,还是可以说许多东西的。
问题的话,提到了最近自己写的一个小东西,java和kotlin的混编。问题是,kotlin里找不到java的一个方法,IDE里面没问题,编译时报错。最后发现原因,编译器在编译时,编译顺序为:Kotlin、java预编译、java。而java里,我用了一个预编译框架,生成那个方法,因为编译顺序的问题,编译时,kotlin里自然找不到那个方法了,因为那个时候,该方法还未生成。
解决方法的话,当然是不用那个框架了,有点水。。。但可以解决问题
因为面试官提到说等下还有另一个面试,所以这次电面,只弄了三十多分钟;而前两次,都是一个多小时。
HR面
几乎又是一个星期,刚好那天还有其它事,实习请了假,可以专心准备面试。上午十点,电话面试。
起初笔者以为仍然是技术面,所以当天还在看一些技术的文章,所以电话打过来的时候说是HR面的时候,还有点吃惊,没想到这么快。
面试官: 为什么想加入腾讯?
笔者: 扯了一些平台对个人发展的重要性。然后指出腾讯是一个足够包容的公司,容得下不同的看法,个人很喜欢这点。之前看过一个黑腾讯的文章,热度很高,腾讯官方知道后,只是简单提醒作者不要中伤他人,还允许其文章在QQ、微信上转载。
面试官: 个人的兴趣爱好?
笔者: 说了下喜欢看书,平时不怎么玩游戏(手残党,基本都只能坑队友,所以玩得少)。最近在看一些英文小说,所以自认为英语能力还不错。
面试官: 有女朋友吗?
笔者: 没有。。。(单身狗的无奈,有点奇怪为什么问这个)
面试官: 成绩如何?
笔者: 个人成绩不是很好,因为自己对于大学课程,目标是可以及格,顺利毕业就行了。其他的精力,花在学习技术上面了。比如,自己学习Linux的时候,装Win10和Ubuntu的双系统,就花了将近一个月(游戏本装Ubuntu是个大坑。。)
后面还问了下报道时间啥的,然后就差不多结束了。这点小伙伴们要注意一下啊,公司只会取你说的最早时间,不会管后面的其他时间的。所以,你说的最早的那个时间,就是你的报道时间了(于是乎美好的大学时光便将提前结束了。。)
奇安信(360)
来学校开了宣讲会,本来跟笔者没关系的,没有招android的。笔者的一个做java的好友想去面试,但胆子太小,把笔者一起拉去了,于是投的Linux开发。
笔试
一半C++,一半Linux知识。C++的基本上没答出来几个,Linux的大部分猜出来了,自己开发环境就用的Ubuntu,所以Linux相关的知识比较熟悉。算法题也是java写的,虽然这个岗位是用C++
技术面(2轮)
因为做android的,对C++很多东西不熟悉。直接告诉面试官,是听了宣讲会,感兴趣才来的(不可能说是陪别人来的吧。。)
主要问的一些Linux知识,和自己android的项目经历。整体还是很容易的,估计是照顾笔者不熟悉C++的缘故吧?
HR面(挂了)
因为面试官提及她是负责全国招聘的,不只是广东区域的,所以问了她其他分司有做android的吗。然后面试官就提到了成都的分公司有做android逆向,可以帮笔者问一下。
于是就问了面试官许多成都分公司的事情(这个大家要注意啊,估计笔者HR面不通过的原因就是这个。。)
- 那位java好友:顺利拿了offer。但因为java后台是在南京和北京的分公司,广东只有做PHP的,于是转PHP了。他本人是广州土著,所以不想出广东省。
VIVO
一轮技术面,一轮HR。过了,但最后放弃了offer。
技术面
主要问了项目经历和一些android基础,期间笔者还说了十几分钟的Kotlin知识,结果面试官说不用Kotlin。。。
感觉技术面只有一轮还是太少了,笔者感觉自己很多东西说得也不是很好。
HR面
小姐姐很漂亮,说话也很亲切。主要问了笔者一些实习期间的经历(写简历时刚开始实习,所以没写上去),说了一下自己实习期间的收获,主要是团队开发与个人单干的区别,团队精神啥的,技术上的东西没说到,可能HR小姐姐也不知道吧,就没提及。。。
美团
没有笔试,直接一面。因为没有认真对待,主要个人还是想留在广东,所以一面后直接结束。
貌似美团今年android有点缺人,招聘信息上android岗都是红色的。
在成都面的,成都这边的话,感觉大厂也挺多的(腾讯的天美、微信事业群,阿里的蚂蚁金服,美团,抖音);缺点的话,感觉竞争压力有点大,很多陕西、重庆的小伙伴也过来面试了,貌似他们那里没有什么合适的互联网大厂
主要问了android的消息机制、jvm内存模型、Object类、HTTPS与HTTP的区别,最后手写一道算法题(对一个数组位移N位)。因为没有认真准备,所以走了个过场,就结束了。
网易
两轮技术面,一轮HR,目前还没有消息。不过就算过了,肯定也会拒绝的,因为已经决定去鹅厂了。
最有印象的就是,网易的秋招,本科生非常多,感觉至少有50%;其他公司,基本上除了笔者,其他全是研究生,加上笔者,可能就两三个本科生。当然,和其他公司相比,网易的笔试感觉是最难的,几道算法题除了得到结果,不做优化的话,都会超时。
另外的话,网易的HR小姐姐是所有面试公司中,颜值最高的,很惊艳。
技术面
基本上和网上差不多,没什么可讲的。
印象深刻的是,二面的面试官问的几个问题
面试官: 你喜欢用Google,是怎么弄的
笔者: 用的Shadowsocks,但具体原理不太了解
面试官: 为何不考研
笔者: 家里条件不允许,可以的话,想出国,去美国。但现在的局势下,好像未来10年,都没什么希望了。。。
面试官: 个人的未来规划
笔者: 短期是先提升个人能力,争取尽快成为中级开发人员;后面的话,希望能自己写点技术书籍、开个技术公众号啥的,和大家分享技术;更长远的话,希望可以参与一些大型开源项目的开发,为开源社区贡献自己的力量。。。
HR面
也没什么,但有个问题印象很深刻,这也是大家面试时的需要注意的
面试官: 你对个人的薪资待遇,有什么要求吗?
笔者: 这个的话,个人倒不是十分地在意,最起码,能保证我每个月的饮食住房等基本开销就行了。比起这个,我更关心个人的成长问题。比如说,工作2年之后,我的技术水平有多大的提高,是否和刚毕业一样,没有什么改变呢?这些问题,才是我关注的重点。
其他公司
因为各种原因,自己主动 提前结束面试的
- 小米:没有笔试,直接一面。时间冲突,拒了。
- 华为: 鹅厂的事情定下来了,就没考虑再去面试其他公司了,浪费别人和自己的时间,而且答应了的事情,自然应该做到,没必要三心二意。拒了一面。
- OPPO:理由同上,没有参加笔试。
个人学习
英语
迈向中高级程序员的必备技能,没什么好说的。主要要求的是你的读写能力,听说的话,基本不会用到。基本要求(不要求一步到位,但需要逐渐精进):
- 阅读源码、github、overstackflow、android官网、官方文档等的内容
- Google查阅东西,一般来说,技术问题的答案质量排序为:Google英文、Google中文、百度(真的不是在黑。。。)
- 代码命名:好的命名可以抵过一大堆的注释
- 英文原著阅读:能到这一步的话(,要很久,不要急于速成),就程序员而言,英文能力基本就够用了
Linux
作为一个程序员,不会Linux,感觉就像无照驾驶,更别说android是基于Linux而来的了
- shell
简单的shell脚本编写和常用的几个命令要掌握吧,比如find、grep、kill、ps。。。 - Linux C编程
NDK编程之前的基本技术储备,对于理解android底层的一些东西,也有很大的帮助 - vim
学会之后,可以解锁一个浏览器插件——Vimium;相比鼠标在浏览器里点点,这玩意儿的装逼程度,急剧上升
技术公众号
公众号的缺点的话主要是知识比较零散,优点的话是随时随地可以查阅。不需要每次的文章都看,挑你自己需要的就行了
- 这里推荐几个大佬的公众号:郭霖、玉刚说、后厂村刘皇叔、大飞码字。。。
不仅是技术,大佬们很多非技术方面的东西,也是值得学习的
书籍
极重要的学习方式,相比其他东西,书籍的内容更加系统化和全面。当然,所花的时间和精力也是极大的。一本书,几个月到半年,都是常态,更不要说一些书,需要反复研读了。这里推荐几本笔者读过的,认为质量比较高,或者有特定价值的书:
- 《第一行代码》
android入门第一书 - 《Android开发艺术探索》
把这本书的内容吃透,你面试的android知识,基本上就没问题了 - 《Effective Java》
java程序员分两种,看过这本书的,和没看过这本书的。 - 《UNIX环境高级编程》《UNIX网络编程 套接字联网API》《UNIX网络编程 进程间通信》
Unix三部曲,看完之后,你对Unix、Linux、操作系统和计算机网络,都会有一个全新的认识 - 《Android C++高级编程 使用NDK》
NDK开发入门用,缺点的话是书有点老,上面的项目构建还是make,而现在都用cmake了 - 《Kotlin实战》
入门kotlin用,未来可能替换Java进行android开发,虽然现在国内没有几个公司用(笑。。。) - 《漫画算法》
算法零基础同学的福音,相比其他算法书,这本书更适合用来进行算法入门,java编写 - 《Java编程思想》
笔者实习时的老大和现在鹅厂所在部门的老大都提到的一本书,重要性不言而喻。国内也有英文版,还比较便宜,有能力的小伙伴可以尝试一下。
其他问题
- 面试官: 我们部门的研究生很多,你一个本科生,有什么想法吗?
笔者的小伙伴遇到过的一个问题,别扯什么学历无用论,完全作死的节奏。提供一个例子,大家可以参考一下:
对于这个的话,其实我本人到不觉得是一个劣势,反而感觉是一个非常好的机会。正所谓,近朱者赤近墨者黑。能和这么多优秀的人一起共事,我相信:对我个人的能力也是一个极大的锻炼,会对我个人的成长产生极大的帮助。所以,我也希望能有机会在这样的工作环境下工作。
- 大厂有学历歧视吗?
大概率有,笔者面试的公司里,基本以研究生为主,本科生都很少。而且,不知什么原因,也只见过一本的同学,二本、三本的同学,都没遇到过。当然这不代表这些同学就没机会了,你的能力够强,还是有可能进大厂的。人家让你过来面试,就是有招你进来的想法的,剩下的,就看你自己的造化了。 - 多余的话
另外笔者发现一个很严重的问题,许多研究生的小伙伴,虽然技术上很厉害,但面试的时候太沉闷了。比如面试官问一个东西A,如果不会,就直接说不会了;而一般情况下,你如果不会A,说与之相关的B,也是可以的。
面试官又不知道你的技术水平如何,你如果不主动去说,然后又运气不好,连续遇到几个不会的问题,就直接再见了。因为你这样给面试官的感觉,就是你什么都不会,面试官不会去再花时间来问你更多问题的。面试官的时间也很宝贵,而且那么多面试者,不可能每个人都能面面俱到的。
所以,面试的时候,一定要主动点。可以的话,一定要多说。比如说道知识点A的时候,最后也最好能把相关的知识点B也提一下。