2020年Android研发美团面试之旅,鬼知道我经历过什么毒打……

1,415 阅读10分钟

写在前面

目前Android开发岗位确实没有以前那么火爆了,但是只要你确实有真才实学,想要找一份自己满意的工作还是相当容易的。

而如果你是985,211,硕士学历,那么,拿个相当好的Offer更是不在话下;

即使不是上面的条件,只要你好好努力的学习,把每一项的技术点攻破了,同样可以达到甚至是超越上面有着优越条件的朋友。

学历不是特别OK的朋友可以托人内推,给面试机会以后,就是技术的较量了……

搞程序就是这么公平:学历固然对拿Offer有一定帮助,但哪怕你学历再高,技术不行还是得挂。面试从来都是考察你的技术、考察你的思维和解决问题的能力,技术才是打开新世界大门的钥匙!

我常常和身边的人分享,每隔一段时间就要出去面试一轮,面试的目的不一定是为了找到好的工作,而是知道自己的优缺点是什么?知道市场需要什么样的人?

定期的面试可以让你了解当下市场需要哪些技术,也更加容易确定自身的短板在哪,同时,也可以更加有针对性的学习提升,并且在面试过程中遇到了你不会的点,你也可以借机向面试官提问,趁机学习了一波大厂的技术操作

要是运气好,拿到了高薪Offer,岂不是更赚?

同样,因为面试你的也是同行,这样也能够碰撞出不同的思想。

试想?如果你一直待在一家公司,都不知道外面的情况如何的话,那是非常可怕的,至少我这么认为。

好了,废话不多说了。下面是亲身经历的一次面试,这里写出来给大家分享一波,更多的是总结面试中遇到的问题以及以后学习过程中的方向。

面试的公司是美团,美团的同学都非常nice,手动点赞!

技术一共是三面。下面是具体面试的点

一面

  1. 手写算法题。一共有几个,面试官会随机抽一个作为题目。

给出一个序列包含n个正整数的序列A,然后给出一个正整数x,你可以对序列进行任意次操作的,每次操作你可以选择序列中的一个数字,让其与x做按位或运算。你的目的是让这个序列中的众数出现的次数最多。

请问众数最多出现多少次?

  1. Activity的生命周期、加载模式。 什么时候会用到singleTask?
  2. Handler机制 子线程可以创建handler吗? 一个线程是否只有一个Looper? 如何保证一个线程只有一个Looper?
  3. 多线程的方式有哪些?
  4. 生产者消费者模式
  5. wait 和 sleep的区别
  6. String、StringBuffer 、StringBuilder的区别
  7. ANR异常发生条件 如何分析ANR
  8. 自定义View和ViewGroup
  9. 事件处理 分发,拦截,处理。
  10. GC算法
  11. 四大引用 强,软,弱,虚,并说明下合适GC
  12. 动画 View动画,属性动画,帧动画。再说下View和属性动画区别。
  13. JVM 原理
  14. 屏幕适配相关问题

差不多就问了这几个问题,其他的忘记了,其中美团的手写算法在业界算是比较出名,很多小伙伴可能卡在手写算法上。然后就是一些Android和Java的细节性东西,这些基础内容只要有一点工作经验的都基本能说得上来。

二面

  1. Http和Https的区别?
  2. 看过哪些源码?Glide原理?
  3. OkHttp原理?
  4. Retrofit原理?为何用代理?代理的作用是什么?
  5. ButterKnife原理?用到反射吗?为什么?
  6. eventbus的原理。
  7. Handler原理
  8. Binder原理
  9. ANR异常如何查找并分析?
  10. JVM内存模型?性能调优?
  11. 垃圾收集算法有哪些?G1算法?
  12. 加密算法有哪些?对称加密和非对称加密的区别?
  13. TCP的三次握手?两次行不行?为什么?TCP攻击知道吗?如何进行攻击?
  14. 性能优化方面
  15. 会对代码进行review吗?何时review?怎么review?
  16. 项目中遇到的让你棘手的问题?多久解决,怎么解决?
  17. 平常如何学习?何时学习?怎么学习?学习渠道?

二面跟比一面比起来,会更加深入,偏向原理性质。

所以大家平时的编码过程中,要多思考,多看源码,要理解实现方式,而不要一味的去写代码完成需求,长此以往的话未来很容易被后浪淘汰的。

这一节讲的我喉咙都快起火了~

这里必须得感谢一下我毕业后的第一个领导张哥,多亏张哥那会就传授给我正确的学习方式,还一再强调一定要多看源码,不然这里已经凉凉了… (当然,也与我的天才脱不了干系 2333)

三面

  1. 前两轮面试感觉如何?
  2. 热修复
  3. 插件化组件化
  4. 动态化
  5. Kotlin
  6. Flutter
  7. 聊了一下之前的公司和项目
  8. 你觉得小团队好还是大团队好?
  9. 说说自己的优缺点
  10. 发展方向 职业生涯规划 是先讲究宽度还是讲究深度,为什么?
  11. 为什么离职?
  12. 其他小问题:哪里人啊?现在工资怎样?要求如何,何时到岗?有什么问题要问我的吗?

三面面试官可能考虑到之前两轮的原因没有问太多技术问题…

然而我确实已经是强弩之末了,在我感觉中,他竟然上来就是一套连环拳?

  • 你觉得小团队好还是大团队好?
  • 说说自己的优缺点??
  • 职业生涯规划???

行了行了,我不装了,坦白了,我就承认我不行好了吧?

小结

这次面试感觉还不错,美团的同学待人方面很随和。很喜欢这种氛围。

最后的定级就不说了,我始终认为:结果不重要,重要的是过程。只要你有实力,就不用担心,Offer向来都不会亏待那些努力的人!

如果不好好学习,就算背了面试题,又能如何?一样会在面试中PASS。

所以说,平时写代码的时候需要多多思考,不一定用到才去Google,对于一些新的技术,要不断追求同时别忘记了理解原理很重要!基础也很重要!

关于我的学习方式

  • 多总结、多输出

多写文章,输出优质内容

而除了人人皆知的写博客,还可以通过画图的方式将知识串起来

包括流程图、思维导图,先把自己记得的部分在图上画出来(这里推荐Xmind)

比如思维导图我是这么做的:

Android开发知识体系→Java基础知识、Android基础知识、性能优化、NDK……

然后性能优化又细分为启动优化、UI渲染优化、内存优化、APK优化……

长此以往的这样一步一步深入构建,你对于自身的知识掌控度会有质的飞跃!

随便找个培训机构的知识体系图的话,也可以起到自己查漏补缺的作用:

在自己绘制导图的过程中,如果遇到写不上的地方,我想你也知道你要提升哪一块了吧?

这样做还有一个好处:体系化学习

平常大家学(jie)习(jue)知(BUG)识的时候都是碎片化的知识,过后非常容易忘,而如果你用思维导图的形式将这些碎片化的知识整合到一起,甚至是工作中也经常使用,效果就会非常好。

  • 学习一线大厂的各项技术

大厂是我们的技术先驱,不仅仅是各种技术,还有很多令你大开眼界的使用方法,学习这些有利于自己竞争力的提高,深入理解后也可以进一步的提升你的学习效率。

这一方面,通常那些我答不上来的题目,我会直接问面试官,这个应该怎么解或是什么思路,面试后就赶紧记下来,回去操作几遍就差不多了

另外还有万能的群友,平常大家交流的时候也可以学到很多东西。

  • 定期面试

每隔一段时间就要出去面试一轮,面试的目的不一定是为了找到好的工作,而是知道自己的优缺点是什么?知道市场需要什么样的人?

定期的面试可以让你了解当下市场需要哪些技术,也更加容易确定自身的短板在哪,同时,也可以更加有针对性的学习提升,并且在面试过程中遇到了你不会的点,你也可以借机向面试官提问,趁机学习了一波大厂的技术操作

要是运气好,拿到了高薪Offer,岂不是更赚?

同样,因为面试你的也是同行,这样也能够碰撞出不同的思想。

试想?如果你一直待在一家公司,都不知道外面的情况如何的话,那是非常可怕的,至少我这么认为。

这个前面已经说过一遍了,我不要脸的又Copy过来了……

  • 多看大佬的学习笔记,学习大佬的设计思想

之前我跟一位大佬交流后,就拿到了他做的《Android开发核心知识点笔记》

纯目录页都非常非常的长……大佬,不愧是大佬……

现在《Android开发核心知识点笔记》他已经上传到GitHub了,想看的朋友们可以直接前往GitHub

  • 配合各种资料辅助学习

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,大家也可以看看这篇www.jianshu.com/p/af79… 虽然是EDU来的,不过资料确实还是挺不错的。确实比较全面,我现在的这一套资料也是从这整理来的,平常自己也会经常研读。

最后

有段话想分享给大家:

“如果你热爱,那么请继续热爱,你的付出终将获得与之匹配的回报,如果眼前觉得没有希望,不妨再坚持一会,‘今天很残酷,明天也很残酷,但是后天很美好’ ‘冬天都已经来了,春天还会远吗?’ ”

道理就是这个道理,但是“大道理大家都懂”,而那些成功的人,就是把这些道理运用到了工作和生活当中。

共勉!