三年Android开发经验,挥泪整理字节跳动、微软中国凉经,你不看看吗?
前言
虽然面试已经过去大半年,但是依旧能回忆起当初面试场景,所以凭着记忆给大家分享一段面经。2020年疫情期间我总共面试了6家公司分别是阿里巴巴(已入职)、网易云音乐(已拿offer)、趣头条(已拿offer)、图灵视频(已拿offer)、字节跳动(跪在最后一轮技术面)、微软中国(跪在第二面)。由于时间隔了蛮久,就拿两个印象比较深面试经历分享给大家,分别是阿里巴巴跟微软中国面经。
1.1 阿里巴巴(已入职)
拿到阿里offer对我来说比较意外,因为从面试到最后确定发offer前后经历了一个月时间,当时投递阿里并不奢求能进。阿里面试总共经历了5轮面试,两轮电面、一轮笔试、两轮视频面。
一面
投完简历后隔了2天,在19:30,接到了来自杭州阿里一面电话,一面1.5小时,面试官是P7大佬,下面是一些技术方面的问题:
Android中View的事件分发流程以及如何解决滑动冲突
阐述下Android中的消息机制,结合Looper, MessageQueue, Handler以及为什么Handler能实现线程间的切换
内存泄漏发生场景有哪些以及解决的办法?LeakCanary有使用过吗?能大概说下它实现的原理吗?
说说你最熟悉Android第三方库(这里分别说了Glide图片加载库,包括生命周期绑定以及Glide的三级缓存等)
说说你印象中技术挑战最大以及收获最多的一个项目(这个环节持续时间比较长,建议先从整体介绍,再局部细节介绍。面试官问了很多相关细节)
看你写了很多Kotlin的文章,请说下Kotlin中的扩展函数本质原理是什么?(这个问题实际上还是比较简单的,因为只要反编译过Kotlin扩展函数的代码都知道回答)
有研究过Flutter吗?说下Flutter与ReactNative它们跨平台方案有什么本质不同?有在实际项目中使用Flutter吗?你是如何解决Flutter混合栈跳转问题的呢?
一面结束后说之后有个笔试题目邮件。
二面
试题目是java代码模板,只需要把具体实现写到函数中即可,题目是设计一个逻辑表达式计算器,因为我之前写过一个四则运算计算器的实现,其中对于括号的处理是类似的,所以花了一小时就把代码撸出来了并把所有示例中的case都跑过了,然后再花了半个小时检查代码后就提交了。
三面
第三面相对于二面隔了近一周时间才联系,本以为自己挂了,所以没怎么关注了。也是在晚上接到了一个来自杭州的电话,问我现在是否方便开始三面面试。其实是一点准备都没有,突然就来了三面。三面面试官是P8大佬,P8大佬全程都没有问具体Android相关技术点,而是给了几个技术场景问我该怎么解决。我给出一种解决方案后,他又接着追问还有其他方案吗,把你知道的方案都说出来。第三面虽然没有很多具体技术细节点,但是这一个小时却是我最烧脑的一轮面试。过了一个多小时,最后问了个稍微轻松的问题:看了你的博客写了很多文章,你觉得持续分享技术文章的动力是什么?
四面
第四面依然是一周之后,这次是在早上接到约第四面视频面试的电话。第四面的面试官是P9大佬,约在了当天晚上22:30,心里想阿里P9大佬都这么忙的吗。当天21:00就在电脑面前候着,特地把电脑桌前书整理了下,确实挺紧张的,没想到过会冲进阿里最后一轮技术面。视频面试的P9大佬比较成熟稳重型,但是看着比较有亲和力。先是做了简单的自我介绍以及自己目前研究技术和一些项目经验。和P9大佬聊天整体还是比较轻松的,持续了40多分钟,下面列举问的几个问题:
给了一个项目场景,谈下你的项目架构是怎么样的,最好是能当场画出架构图的那种。(这个节点聊了挺多,其中还涉及到一些DDD方面互相交流,感受颇深)
看到简历上写了很多关于Kotlin的,那你对比一下Kotlin和Java,你觉得Kotlin的优势有哪些,可以从语法、工程性等多个方面列举一些。
对于一门新技术落地的,你是怎么去推广到团队中使用的。
说下你认为技术最有收获或挑战的项目,遇到了哪些问题,你是怎么解决的。
说下你平时都是怎么去学习技术的。(我记得当时正好我共享屏幕给面试官,无意中打开我在掘金上博客,然后就说平时写写技术博客总结学习技术,他貌似很感兴趣,叫我给他介绍一下我写的博客, 我挑了一篇文章给他大致介绍一下文章的内容)
虽然持续只有40分钟,大佬也没直接告诉我结果,但是明显感觉还是比较舒服满意的。面完四面,我知道技术面基本过了,最后就是HR面了。
五面(HR面)
第五面HR还是比较快的,第二天就收到了HR视频面试邀约,约的依旧是晚上。从网上了解到阿里HR面试也是非常严格,我提前做了准备。关于HR这块由于涉及到一些保密性问题,这块就不展开了。HR面试结束后,大概隔了两天谈了薪资待遇然后就收到了口头offer,随即就收到了offer邮件。
1.2 微软中国-苏州(挂在第二面)
微软的面试是这几家公司中体验最好,最高效。首先是在boss上投递中文简历,我面试的是Mobile Engineer-Android/Outlook Mobile 英文要求是middle。简历经过初筛后,会有微软专门HR联系你并详细介绍微软和面试的岗位要求和情况,并且告诉你需要准备哪些东西。其中就包括中文简历、英文简历、英文自我介绍以及面试中会涉及考核的点(其中包括过往的工作、换工作的原因、Coding代码三个方面)。面试下来总的感觉微软对英语看重大于技术,特别是对于英语口语还是比较看重的。
面试准备
英文简历我就在github上参考了一些大佬的英文简历模板,然后写自己具体内容,英文简历全部采用markdown写的。关于英文简历对编写有任何疑问的,都可以给我留言。然后就是准备英文自我介绍,150~200字。
一面
微软第一面也是视频面试,面试官是中国小哥,首先用英文简单介绍自己,然后又用英文简单介绍我的家乡。前面英文交流结束后,接着就开始技术的面试,不过比较人性化点的是技术面试是中文。技术问题问的不多,全程半小时,像是一个摸底面试。
请简单说下Android中View加载流程
请简单说下Android中事件分发机制
请简单说下Android中的Handler作用,请结合MessageQueue、Looper以及各自工作原理
请简单说下ThreadLocal的实现原理
平时是怎么学习Android技术的
最近在研究Android哪方面的技术
二面
微软第二面就是Test Project的环节,其实就是给了gif页面的效果,包括项目中使用到的图片,mock数据json,要求一周时间完成这个效果,并把最后的可安装应用程序包和源码一并发到邮箱。对于项目的要求是:
尽量不要使用第三方库,希望自己能独立解决问题
使用Java代码,能使用Kotlin更佳
必要的正确代码注释以及测试用例
对于第二面页面效果,实际上在之前项目有写过类似的,并且Kotlin那时候已经比较熟练了,所以直接用Kotlin撸起,并把之前写的代码拿过来直接用,只花了一天半就完成了效果发了过去了,没想挂了。当时还挺纳闷的,因为效果确实实现了,去问挂了的原因,原来是代码中少了必要的注释以及必要的测试用例,没想到最终败在了细节上。后面HR小姐姐问是否再尝试其他Android岗位,因为她说一面面试官对我评价还是很不错的,当时因为已经接了阿里offer了,就婉拒了。
经验分享
我也算是一线公司都踩过点的码农了,以前Facebook也踩过一次,现在就说说我自己的一些感受。
在扇贝的时候我作为面试官接触过几十个面试者,能左右我是不是通过这个人的,主要因素还是这个人对技术的热爱程度。因为有这种极客精神,做任何技术上的事情都是时间上的问题,所以面试过程中要尽可能表现出对技术的热爱。
那除了这种因素外,我们怎么做才能更大概率的进入一线公司呢?
还有一个比较重要的因素就是知识的深度。我认为深度优于广度,广度通过看各种文章都能了解,但一旦碰到实际问题,这时候往往靠的是自己的知识深度。比如,Java程序猿都知道Java是跨平台的,因为会编译成和平台无关的字节码,但是有多少人会知道是怎么编译的?如果不知道虚拟机运行原理,就不可能做出手淘的Atlas容器框架。再比如,很多人知道四大组件职责都是什么,还会些性能优化,但是如果不知道Framework层系统服务原理,就做不出插件化框架。
因为一线公司业务的复杂度也决定了业务的深度,如果没有较好的深度探究能力,是很难胜任的,所以知识的深度也很重要。
极客精神加上某一领域知识的深度能力,就可以达到一线公司标准了。面试中非理性因素也有较大比重,但是这种东西是我们没办法掌控的,如果因为这种因素失败了,也没必要气馁。我认为能力是和回报成正比的,就算此刻没发生,下一刻也会出现,只要掌握了我们该掌握的能力,总有一天会进入我们理想的公司。
本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…