啊!!终于轮到我来写面经了!!经过了这么多天的煎熬,准确来说是从寒假就开始备战的春招,知道3.31在腾讯大厦走出来时才算结束。这期间多谢关璐姐的内推,内推期间真的是一直在烦她,也是她给了我这次内推机会,真的很感谢了~下面我来着重说一下我的面试经历。
我面试的是腾讯的移动客户端开发。自己是主攻安卓和java,当时提前批感兴趣的事业群写了WXG,但是很可惜的是,WXG到后面才开始捞人的,所以在这之前我已经被现在的部门(SNG的腾讯音乐给捞了)。整个面试过程为两次电话面试,一次现场技术面,一次现场HR面。
准备阶段:投递简历的时候看到腾讯的事业群都莫名的振奋,觉得每一个都是行业里的榜样了,心里默默许了个小愿望:希望自己能进入其中一个部门。关于简历,我还是向我室友彬学习的,除了把自己的项目写上,还要写自己擅长的知识点,比如多线程开发,网络请求,优化等等。我主要是在两个项目(Feca和逛周下的功夫比较多,这两个都是创新赛的十强)的框架方面准备的比较多。一个是Volley网络请求框架和Fresco图片加载框架,一个是Retrofit网络请求框架搭配Rxjava使用。这两个框架不仅要明白各自的特性,还要和其他的框架形成对比,知道优势和缺点在哪,并且要看一下原理,毕竟会用是一般人都会的,原理才是筛人的标准。此处要特别感谢我的室友彬哈哈,他向我提出了一个很好的问题:”如果让你设计XXX,你会怎么设计“。没错,不仅要会用这些框架,要经常思考,如果不用框架,自己设计实现功能要怎么实现,这也是面试官可能会问的。
因为我是半路出家学习java和安卓的,所以可能平时开发的时候并不会去看源码和原理,大多数就是实现了就好了,所以有些东西云里雾里。关于这个弱项,我是在寒假期间看了一本《安卓开发艺术探索》,它是一本安卓工程师的进阶书,但是确实非常适合准备安卓面试的人看,深入浅出比较好懂,而且知识点很全面,例如IPC,四大组件工作过程,消息机制,多线程,View原理,性能优化,常见异常的处理和分析都有包含,而这些也恰恰是面试官常问的东西。而且这本书会带着我们看源码,看了源码还是很有帮助的~而且也不至于面试官一问深了就不知所云了。
关于java我是真的无能为力,如果要系统的看书学习的话,我是来不及的,所以我是分块学习,比如java语言基础和特性算一块,java数据结构算一块,java多线程算一块,java虚拟机算一块。当然还有很多内容我是实在没时间看了。一块一块的看,并且针对着面试题复习(这里要感谢兴宇师兄帮助我)。
另外为了给自己增加经历,我还在寒假去面试了触宝公司的安卓开发实习生,触宝其实不算是小公司,在最新的科技部评选中被评为了”独角兽“公司,也即将上市。当时去面试比较宽松,和面试官聊了大概两个小时,什么都聊,甚至聊到了人工智能。学期初到现在也是花了很多精力在这个实习上,不过还是有回报的,感觉实习了之后还是学到很多东西的,这个经历和期间学到的东西也对我的面试有很大帮助。
另外简历上我会把自己的奖学金,比赛得奖再写一下,算是起到锦上添花的作用。
融合关璐姐和室友认为比较重要的知识点:
IPC,四大组件工作过程,消息机制,多线程,View原理,性能和布局优化,常见异常的处理和分析,GC,框架原理,内存泄露原因及处理,OOM,ANR,java基础,数据结构,算法(基础的要掌握),操作系统,计算机网络(这两门课也是基础的要掌握)
第一次电话面试:大概投递过了三四天,我就被捞起来了,然后当时在公司实习着,突然来电话,一看是腾讯,吓的我快跑出去接(因为总觉得在一个地方工作还招聘着另一个地方不太好),然后开始面试,面试官比较严肃:
面试官:先自我介绍一下。
我:大概说了下自己来自哪个大学,什么时候开始学习安卓,为什么感兴趣之类的,没说获奖情况。
面试官:说一下项目吧。
我:把逛周简单介绍了一下,接下来就该进入我准备的环节了, 我说我用Volley框架进行了网络请求。
面试官:为什么使用Volley,而不是用其它的?
我:因为考虑到逛周不需要下载大文件,而是频繁的和服务器进行较少数据的交互,这符合Volley的特点,而且Volley使用简单,并且封装了4个请求线程,使得能够并发请求,而且不会因为无止境的开线程造成的资源浪费。
面试官:那除了Volley你还用过其他的请求方式么?
我:Feca用的Retrofit和RXjava,retrofit的好处是利用注解来标明请求方式,比较简明,并且链式操作美观优雅和rxjava配合起来,能够方便的切换线程。(在这里要强调一下,我其实这个时候没仔细准备retrofit,只是知道一些优点。后面室友彬给我普及了一波retrofit原理是动态代理,才大概懂了一些)
面试官:(感觉比较满意)那你图片加载为什么用Fresco呢?
我:因为考虑到逛周要请求大量的图片,所以一开始不用框架的时候,会产生OOM,当时考虑到Fresco不是在应用内的内存中存储图片,而是在本地开了一块匿名共享内存,所以根源上解决了OOM的问题,并且实现了三级缓存,可以有效的减少网络请求的流量,而且可以方便的加载gif图等多种图片格式。(只回答优点是不够的,因为不可能所有的优点都让一个框架占了,在这里幸亏我和我触宝实习的leader交流过,他告诉我fresco体积太大,对于包体是非常不利的)不过Fresco也有缺点。
面试官:(饶有兴趣)那你说说它的缺点
我:Fresco的缺点就是它的体积太大,因为要支持这么多功能,它里面封装的内容也就会多,引入fresco会使包体增加4-5Mb空间,apk的大小对于用户来说非常重要,毕竟我们都喜欢下载小一点的app,而且多一兆的体积,对于应用推广的成本也就多很多。不过鉴于当时是参加比赛,为了方便而不是商业化,而且逛周的图片加载真的很多,所以我们还是选择了Fresco。
面试官:OK,那你有用到列表么?
我:有的,我用了RecyclerView.(在这里要提醒一下,RecyclerView和ListView真的是非常重要的知识点!!)
面试官:那你说一下RecyclerView对于ListView的优点吧。
我:1.支持多种布局(例如线性,网格,瀑布等)2.动画特效 3.局部刷新 4.不用自己实现Viewholder,解耦比较好.(还有一个支持多种列表元素我当时不知道,后面室友彬告诉我的,有一个viewtype,可以指定多种元素和多种viewholder)。然后顺便回答了一下如何优化listview,比如复用view啊,不能在getview中执行大量的耗时操作呀,要开线程,还有滑动的时候不要加载图片(因为快速滑动时会造成很多个getview的执行,这样子开如此多的线程对于资源来说开销太大!!!)
面试官:(可能是因为我不仅回答了Recyclerview还顺便把listview给答了,突然没啥能问的了)那你有什么问题想问我么?
我:(这种问题一般我都会问有没有定期的技术分享交流会,公司氛围如何)
面试官:你能接受在深圳工作么?
我:(当然是回答可以啦!)
一面到此就结束了。总体问的都是准备过的东西,所以没什么好担心的。
第二次电话面试:大概离第一次电话面试过了两天,第二次电话就来了,这一次的面试官感觉就是个leader,说话非常diao。
一开始还是自我介绍之类的,这里就略过了。
面试官:介绍一下你的项目吧。
我:(怎么又是项目,我就按照第一次的思路讲了一遍)
面试官:如果你不用图片加载框架,你如何设计实现加载图片功能?
我:(这种问题果然来了,幸亏之前准备了一下)1.使用BitmapFactory先压缩图片,再放置到相对应的ImageView上。2.实现缓存,比如可以用LRU缓存机制。
面试官:LRU是什么意思?
我:最近最少使用(操作系统学的)
面试官:那LFU呢?
我:(完了,操作系统没学,要不编一个?反正肯定也是什么最少使用,但我太紧张了实在编不出来,于是回答了不知道)
面试官:最少频率使用,看来你操作系统没学好啊。
我:(好吧,你说没学好就没学好吧)
面试官:学过编译原理对么?
我:嗯...(大事不妙啊,编译原理我是靠着期末刷题才混过考试的,而且我看的面经一般不会问编译原理啊!!)
面试官:那你给我介绍一下词法分析和语法分析的过程吧。
我:(实在忘记了,但大概是什么记得一点点,就每一个用了一两句话描述了一下)
面试官:(感觉不满意)那你给我说一下编译原理在你安卓开发过程中带给你的启示吧。
我:(哪有什么启示啊。。。我感觉我都碰不到编译这一块,完蛋了)就想了半天没想出来。
面试官:你编译原理也没学好啊,期末多少分。
我:95......
面试官:(露出了不信的声音)中山大学的学生如果基础课没学好的话,和普通的学校没什么差别了。那你计算机网络的知识有在开发中用过么?
我:有的(准备把计网的课程项目说一下)。我实现过网络层的DV寻路算法。
面试官:你给我讲一下吧。
我:(按照我的思路给他讲了一遍,我觉得应该蛮清楚的了)
面试官:我没听懂。你把我当作不会计算机网络的人吧。
我:(是不是我讲的太复杂了,那我简化到3台路由器,就A,B,C之间的寻路,总该懂了吧,然后又讲了一遍)。
面试官:(尴尬的安静2s),今天的面试到此结束。(猛的把电话挂了!!!留我一个人凌乱在电话另一头)
第二次就这样不愉快的过去了,估计是面试官觉得我基础课不好好学,而且还不会迁移思考吧。。哎。。讲道理还是挺难过的。觉得自己凉了。不过第二天发现自己从复试状态变成了”集体面试环节“,突然慌了,集体面试不是非技术岗的么??我怎么进到这个环节了?后来麻烦关璐姐帮我问了一下,才发现面试官把我移入这个状态是待定。
接着就是为期一周的杳无音信。。。。。。。。。。
突然一周后的一天接到了电话,邀请我去深圳现场面试。挂掉电话的我,又一次紧张的不行,真的很紧张,因为随着实习的时间推移,我的任务越来越多,几乎没有时间准备面试了,心情很不好。觉得自己什么都没搞好,而且还有助教的任务要搞,以及自己的课程都耽误了。总体来说就是黑暗的一周。
现场面试:在去深圳的前一天,我和leader说我回学校有些事情,早早下班回来准备了。然后在某个腾讯面试QQ群里有人加我说他也是明天去面试SNG音乐的移动开发岗,他说他是研究生。我心里:凉凉。我为什么要和研究生一起面试,然后他研究生期间的项目经历和实习经历都挺好的。。。觉得自己完了。
在学校粗略的过了一遍操作系统,计算机网络,数据库的索引方式,以及几道典型的算法,其中多谢泳锋教我海量数据处理和堆排序。然后就是心惊胆战的睡了一晚。第二天早上踏上去深圳的征程。
高铁很舒服,不过下来还要坐好久的地铁到深大站。然后走一千米左右就到了腾讯大厦,大厦很气派,增加了我的向往。进去后负责签到的小姐姐给我了一张饭票,可以中午在这吃,我就去了腾讯的食堂吃了一餐饭,讲道理一般般哈哈哈,和学校食堂差不多的感觉。然后吃完就去候场了。我的时间是15.00面试,然而我12.00就到了,HR小姐姐有点惊讶,问我”你怎么来这么早?吃饭了么,后面有零食,可以去随便拿些吃“。让我觉得这个小姐姐还是很贴心的但是现场的氛围真的很恐怖,特别是那个叫号器,每一次”咚咚咚~请XXX同学到面试官房间面试“我都害怕到不行,从12.00到15.00真是坐立难安。
终于15点一到,准时响起了”咚咚咚~“让我去面试,于是我就过去面试官房间面试,每一步走的都快要昏过去。
推门一进去,是一个比较年长的面试官,感觉资历就很深。
一开始还是自我介绍,项目经历。下面我只挑不一样的说。
面试官:你是根据什么来为你的应用挑选框架的呢?
我:我觉得最主要的还是这个应用的特点,究竟是需要重量级的文件数据传输,还是轻量级的传输,另外要和框架的特性来结合。
因为我和面试官坐的很近。。下面的面试感觉和聊天交流一样。。。说了几种图片框架的区别和原理,又聊了一下几种网络请求框架,又聊了图片不用框架怎么设计。(所以框架真的挺重要的!!!) 然后一切正常流程之后突然画风一转!他把电脑转给我,你做一下这三道题。我一看,凉了,三道算法题,我算法很差啊!
但是吉人自有天相。。我定睛一看,第一道有点像海量数据插入时去重,刚好前一晚和泳锋讨论过位图法,每一个数字用两位来表示,初始化为00,如果插入过一次就是01,如果再插入一次就是10,再插入就不管了,然后最后把不是00的下标取出来就是去重后的数组了。(现在想想用一位就可以了。。。失误失误)
他让我代码实现一下,我就用c++瞎写了一通,他看了看就说你接着去候场时等候吧。我一脸懵逼,不用做后面两道了么?直接让我去等?心里还是开心的,因为接着做可能也就不会了。。。
ps:第二道题是反转字符串,不使用库自带的函数。
然后回到候场室过了没10分钟,突然我又被叫到了,小姐姐说继续去下一轮面试,我实在担心问了一下是HR面还是技术面,她告诉我是HR面,这时才松了一口气。HR面就问了问职业规划,性格,为什么你是山东的却要来南方,在学校参加那些活动,实习的情况,怎么看待他们的音乐产品,平时怎么学习安卓等等等等。。。也问了半个多小时。然后说到这里所有的面试环节就结束了。
现在就是静心等结果吧,不管能不能进感觉都是一次煎熬又奇妙的经历。
PS:恐怖的叫号屏幕
ps:4.2号早上,我让内推我的师姐查了一下状态是“offer报批中”,静心等待,希望所有的努力都可以开花结果
4.3号,状态显示为“已录用”,松了一口气,同一天下午收到offer,部门为SNG事业群QQ音乐娱乐啥啥啥没听清。
结语:其实在一年前甚至半年前我根本不敢想自己可能会面的上,但是一切努力都不会白费的,早点准备,比别人早起步,就会比别人有优势或者缩小和比自己厉害的人的差距。祝大家都能得到自己心仪的offer。