WeaponZhi

一次难忘的「小米」面试

历经 33 天,我终于找到了工作。这一个月对我来说可能是一次至关重要的一段时期,所以我有必要好好的记录一下。当然,这里也有很多干货,有关 Android 面试的一些细节问题我也将努力的通过回忆陈述出来。可能篇幅很大,废话较多,但同样细节也会很多,如果看这篇文章的人是最近要找工作的程序员,那么我觉得这篇文章有你想知道的东西,特别是工作经验不是很多的 Android 程序员。

因为我这一次是一次自作主张的裸辞,所以这一个月压力还是非常大的。不过经过努力还是找到了自己比较满意的工作,还有 3 个月的试用期,希望能再接再厉,通过自己的努力能在公司立足下去。具体我离职的前因后果和自己的想法请参考我之前的一篇博文:

一次不妥协的离职决定

一次特别的面试经历

不过,在说到 3 月份这段找工作的经历之前,我想先用这篇文章回顾一下另一件极其重要和有意义的事。

实际上在 12 月的时候,我已经接到过一次面试了,而且是一次很不一般的面试,一来是因为算上最后的终面,一共有 4 轮技术面试,难度非常大,技术范围特别广,我虽然被千虐万虐,但更多的是收获。但导致这次面试非常不一般的原因还有一个:

面试我的公司是 「小米」,面试我的人叫 「Gityuan」

当时在无锡项目组,项目已经上线,事情也不是很多,所以我就把 「某聘」 下载下来,把自己的简历和一些信息上传了上去,但也没有投简历,因为是我第一次用这个软件,而且当时也没有下定决心要换工作,所以填好信息后就没有管过了。

令人惊讶的是,过了两天,小米那边主动打电话了,希望能做一下进一步的沟通。我当时惊呆了,后来我才知道是因为那些互联网招聘软件是一个双向选择的软件,如果有企业通过搜索觉得你符合要求,也会主动联系你的。

不过怎么说,当时知道消息的我非常惊喜,但更多的是紧张,因为这完全出乎我的计划,当初实际上我给自己定了一个比较具体的复习计划,准备等自己准备好后再主动投递简历,这下好了,人找上门了,而且是个大户,自己却一点准备都没有,但也不能随便就鸽了别人,毕竟这么好的机会在脸上怎么说都得尝试下,而且打电话在周四,第一轮电话面试在下周一,临时抱抱佛脚也不是不可以,所以后面几天我就找了一些 Android 的常规面试题看了看,顺便看了一些「数据结构」和「Java」相关的知识。

同时,我也具体的看了下这次「小米」招聘岗位的具体要求,发现岗位是做 「MIUI系统」的相关开发的,并且「算法」和「数据结构」有比较高的要求。看来,有可能会问到一些「Framework」相关的知识,我不禁有点失落,老实说,那时候我对这方面完全没有深入过,每天在赶项目,就算是学习也是学习了很多应用层的一些用法方面的知识。对于源码,一来我的能力还没有达到;二来我的确是没时间研究这些和项目关系不是很大的知识点了,试想当时每天加班到那么晚,项目时间实在太紧,不允许我抽时间去学这些东西,一般只会在做项目过程中遇到问题才去现学现用。

一面

就这样稀里糊涂复习了几天到了周一,因为约好了在下午 2 点的电话面试,我特意和经理请了假,然后中午吃完饭后就在寝室等待。为了让自己保持专注,我特意带了个耳机插在手机上,然后就这样坐着等,那时候感觉每一秒都是那么煎熬,因为那即将是我第一次技术面试

2 点整,电话来了,一个拥有很成熟声音的人打来的,一听就是一个做了多年技术的老手,他先让我自我介绍了下,然后问了下我现在在做的项目的业务,针对这个项目的一些具体功能提出了一些问题,比如框架怎么搭建的,因为我说了用 MVP 模式,所以又问我了一下具体的搭建思路,我就把我对 MVP 的理解,和搭建过程中各种层之间的绑定操作说了下。总体来说感觉第一轮电话面试技术上具体的问的不是特别多,大多是针对当前项目的,或者是了解下你在项目中扮演的角色。

问完了技术上的,他又问了一些关于离职原因的问题,我大概说就是我比较希望能在南京稳定发展,外包公司没有归宿感,我不是很适应,随后又随便聊了一些有的没的,总体的氛围比较轻松自然,然后他就让我等通知了。

看了下手机,通话时间 50 分钟左右。

挂了电话后,我就去上班了,然后大概到了 4 点,我又接到了电话,电话里说希望我做一份笔试题,笔试题待会发到我邮箱,时长 30 分钟,做完直接把答案回复到发送邮箱即可。

能让我做笔试题,至少证明我刚刚的电话面试应该算通过了。不过,这种笔试方式难道不怕做题人上网查资料作弊吗?

我心中产生了疑问,我决定先看看题目做试试,如果做不出来再查查,可能对方会给出一个非常难的问题,就是想让你不会,然后考验一下你的应变能力和解决问题能力也说不定呢。

过了两分钟,邮箱收到了题目:

「请写出代码计算二叉树的最大深度,分别用『递归』和『非递归』的方式实现」

好吧,不是很难,主要就是定义二叉树类和一些成员变量,递归的话比较简单,非递归可以用层次遍历思想,配合队列进行循环操作即可。写了 20 分钟左右,最后小修小补了下,就把邮件发过去了。

到此,一面算结束了。

二面

笔试题发了后,大概过了 3 天,我才接到二轮面试的电话。当时因为过了好几天都没接到通知,我都以为已经没希望了,所以后来都快淡忘这个事了,所以这次接到电话又是一个措手不及。当时还在工作呢,所以我赶紧跑到一个楼梯口来进行电话面试了。

这个时候大概是下午 1 点 40 左右。

打电话过来的听起来是个非常有活力的小伙子,声音非常嘹亮,充满自信。一开始几个问题和上次电话面试差不多,自我介绍以及项目上的一些架构问题。问完这些后,他可能也感觉这次问的可能问过了,所以他开始问一些纯技术问题了。

首先是一个触控问题,「如何实现多点触控」,然后又设定了一个场景,「如果 3 个指头同时向下滑动,3 个指头的速度如果有偏差该怎么办,用什么办法来确定这个监听事件」。因为当时我确实没有接触过这方面的知识,所以也实话实说我没有研究过,没想到的是,他好像反而更希望听到我没接触过,接着问我

「那么,你想想如果说你,可能会用什么办法来处理呢?」

听到这个问题,我当时在电话那头当真是一脸茫然,头脑飞快的思索着,并说出了自己的想法,他也时不时的「嗯,嗯」两声作为回应,然后针对我的想法也提出了一些问题。整个过程非常紧凑,思考时间非常短暂,加上又是自己不熟悉的领域,所以回答的支支吾吾,同时胃部也因为紧张剧烈的翻涌着。

这不是面对面的面试,电话面试如果你一直没声音低头思考,你自己都会觉得非常尴尬。所以这种高强度的电话技术面试考察的是你的解决问题以及应变问题的能力,同时也会考察出你的思维敏捷度。

这个问题结束后,后面还问了几个非常有质量的问题,列举下:

  • String 为什么要设计成不可变的?
  • fragment 各种情况下的生命周期
  • Activity 上有 Dialog 的时候按 home 键时的生命周期
  • 横竖屏切换的时候,Activity 各种情况下的生命周期
  • Application 和 Activity 的 context 对象的区别
  • 内存泄漏相关的问题,比如在项目中的一些内存泄漏案例,怎么解决的,然后问了几种内存泄漏的情况,问了下该怎么预防,还问了平时用什么工具检测内存泄漏。针对你回答的,他会继续深入问,直到你实在回答不了为止。比如我说到 Activity 和 弱引用了,他就针对这两个问题深入了很多。
  • 项目中遇到的重大问题以及当初是怎么解决的。

最后他又问了两个「数据结构」的算法问题,一个是链表逆序,另一个是求二叉树两个节点最短路径。特别是第二个问题,他给了非常多的限定条件,总感觉好像有意给我制造了难度,然后考察一下我的思维方式,这个问题上也探讨了非常久。

通话总共用时 1 小时 30 分钟,自我感觉回答的不是特别满意。

第二轮感觉面试官更偏向于考察你解决问题的能力,以及一些思维活跃度和应变方面的能力。同时,还考察了一些平时开发时候是如何优化应用的,技术上,更偏重基础,没有问任何的第三方工具的使用。

后来和几个同事讨论了下,发现的确如此,做移动端的如果基础好,应用层各方面的知识你将会学的很快,第三方工具或者代码库的使用确实没什么值得问的。

三面

经过了一段紧张刺激的电话面试,我当时的心情是非常复杂的,还没缓过来,正准备和同事分享一下刚刚的面试经历,又一个电话来了,第三轮面试就这样开始了。

好吧,还没坐下来又去了小走廊,打来电话的是个女的,声音听起来比较严肃,问的问题没有像刚刚第二轮那样范围那么广,探讨的地方也很少,大多数是那种读文档式的出题。不过感觉对方还是非常有气场的,总是一而再的问我「是这样吗?」,「你确定?」,搞得我有时候自己本来确定后来都拿不定主意了。

几个印象比较深的问题有:

  • 序列化的作用,以及 Android 两种序列化的区别。
  • List 和 Map 的实现方式以及存储方式。
  • 静态内部类的设计意图。
  • 线程如何关闭,以及如何防止线程的内存泄漏
  • Linux 的一些常用指令

这轮面试虽然来的很突然,但节奏还是比较快的,你问我答,会的会,不会的就不会,心态可能因为经过了这么多轮了,倒也比较平静。

通话时间 40 分钟左右,然后晚上吃饭的时候,给我打电话说下周会给我做终面。一切好像还算比较顺利。

终面

终于,终面来了。依然是电话面试,但我这次做了准备,提前在一个没人的小会议室等着了。

这次是两个人同时面试,一个声音有点像二轮那样很自信的那种,一个比较沉稳,感觉是个非常厉害的人。

开始跟我聊的是那个很自信的那个人,聊了一些技术问题,但不是很多,可能是因为前面技术面试经过了 3 轮,差不多我啥水平也了解了,他主要问了一些我离职原因,然后职业规划和技术上的发展规划。

然后就到了第二个人,后来我才知道,他是 「Gityuan」,不过当时我没想到。

他问了几个很深的技术问题,都是跟 Framework 相关的,比如问我对 ANR 有多少了解,毕竟他就是研究这方面的真正大牛。然后就问了我几个常规问题,但这几个问题对当时的我来说并不常规:

  • 你对能加入「小米」这样的一个机会,你是怎么看待的
  • 你自我推荐下自己,讲一下我们如果要你,你能给企业带来什么样的价值,你有什么样的优势
  • 你的职业规划是什么
  • 你对「小米」公司是怎么看的
  • 你有什么问题需要问我的吗
  • 你对薪资的要求

这几个问题质量非常之高,当时我就感觉到,到终面了,这几个问题可能直接影响到我的成败。

事实也证明了,我的失败可能和这几个问题有着极大的关系,正是我在其中问题答得非常不好。

自我价值那个问题,我就说的有点语无伦次,把自己一些性格上的优点列举了下就草草了事,对方肯定不想听到你这样的回答的,这种话谁都可以说,但不一定就是你的价值。这样的互联网公司,更多看中的可能是「发展潜力」、「事业心」以及「态度」。

提问那个问题,我问了很多一些和自己切身利益有关的问题。后来我仔细的想了下,这些问题问了没问题,但如果不问一些类似技术提升,技术发展这样的有关自身提升有关的问题,可能不太好。要让企业感受到你来这上班不一定是为了那点工资的。

然后,薪资问题我觉得我过于失败了,我直接说了一个他招聘信息上工资范围的最低数额,但实际上他这个职位给的是工作经验 3 年左右的人的,我却天真的以为他这样开,我就应该这样报。后来我才越来越感觉到,我能通过那么多轮,甚至最后有一些机会成功很大的原因正是因为我经验不多,但几次面试下来面试官感受到了我的学习能力,觉得我对技术有追求,有激情有冲劲,这才不断的赋予我机会。

但我当时没有察觉,自以为是自己能力强理所应当得到的待遇。的确,我当时没有正确的认清自己。

结果与总结

后来,我收到了面试未通过的通知。说不失落肯定是假的,面对这样的一个企业,面对这样的一个机会,我甚至已经快要达到了,却在临门一脚被踢回来,这种感觉着实不好受,当然,这次面试的难度和严格是最高的,甚至算上之后 3 月份的所有面试,这次「小米」的面试依然是质量最高的。

这次「小米」的面试经历非常宝贵,让我全方位的审视了自己,我认清了自己现在处于什么阶段,并了解到了自己技术上的不足也明确了自己以后努力的方向,也第一次的近距离接触了大公司的面试,知道了大公司对于人才具体有哪些能力上的要求。

小之 wechat
欢迎关注我的公众号「WeaponZhi」