美团网面试回顾

本贴最后更新于 3036 天前,其中的信息可能已经东海扬尘
前几天写了篇面试京东的总结,浏览量比较多,评论也很多,还被黑客派放到了优选里面,深受鼓舞,决定再写一篇,记录面试美团的过程.

#### 0. 前奏
我才工作一年哎,很多大的互联网公司都不愿意招这种经验比较少的人.bat社招基本都是3年以上工作经验.我的简历都过不了.二线互联网公司也是,对我来说,简历关比较难过.美团是我在boss直聘上联系的.我就专门挑技术负责人发的招聘信息跟他联系(hr不懂技术,筛简历不太靠谱),搞技术的一看就知道咋回事,适不适合,最直接的做法.我们在线简单的聊了一会之后他就让hr跟我联系安排面试.后来hr打电话来,约到了第二天的上午十点面试.

早上七点多起来,准备了一下,整理了思绪就出门了.因为比较看重美团,很想进,所以有点小紧张.路上我告诫自己,不要紧张,正常发挥就行.不要看的太在意.通过这么多次面试,现在临场感确实好了很多,不再紧张了.语言表达能力有提高,感觉面试的过程对自己提升也是有很大帮助的.坐到望京站之后要换公交了,望京研发园那里没有地铁直达,不过地铁站出来后,看到了美团网的大巴,直接坐上去了,反正没有查,哈哈,装作美团网的员工,一本正经的坐到了终点站.美团是租了一整栋楼来办公,在科创大厦c座,一楼有健身房,环境还不错.唯一的不足是没有自己的食堂,楼下的食堂是公共的,唯一不如京东的地方(前几天也拿了京东的offer).其他细节不讲了.开始面试吧哈哈.

#### 1. 一面
一面来的面试官看起来比较年轻,应该不是很资深的这种.进来的时候看见他拿了厚厚一叠白纸,心想,糟了,又得考算法了.心里一紧.哈哈,我的算法一般般吧,算法每次都是给我减分的而不是加分项.

开始第一个问题就是数据库的问题,他问我数据库引擎的东西知道多少,那我就讲了innodb和myisam这两种存储引擎,区别的话那就从b+树说起再扯到磁盘读取,每次的磁盘io耗时情况,b+树的节点因子,我还说b+树的高度都不超过4层,每次的磁盘io很耗时等等,and myisam是非聚集的索引,innodb是聚集索引,这个我之前的博客里专门有对比过,索引的实现原理也有,自认为这部分讲的比较全面吧.但是他还是不太满意 ,问我还有没有其他区别.我确实也想不起来了,他最后就说了行锁和表锁,原来他要的答案是这个,这点我确实不是很了解.不过不影响大体,我说的很多知识点都比较深入,复合索引这些也讲了,面试官也很认真的听,这个问题就这么过了.

然后让我写个sql语句,一张用户表,找出每个城市有多少人,这个一看太简单了吧,`select count(id) as num from user group by city_id`,马上就写出来了,这次美团问我的sql题都很简单.接着一个sql语句是让我删除user表中的重复数据,只保留一条,这个比刚才那个稍微难一点,我的想法是先根据有重复数据的那个字段分组,然后找出id,再用not in去删除,这样的话大数据量有性能问题,不过面试官没说数据量有多大,那我姑且就用这种最简单的方式.其实好点的办法是用not exists,这个性能好点,不会走全表扫描.总的来说,两道sql都很简单.

接着出了一个题,内存限制5m,文件有50m,存的都是整数,让我求出前10个最大的数.
我的第一反应是堆排序,一般这种题用堆排序都能解决.我说了自己的思路.面试官说是对的,还有其他办法吗,我想了好久,没想到其他办法,`一度想起用hashmap,但是一些细节没想好`,大家有啥其他办法吗,可以说说.

又是一道算法题,让我写个快速排序,我就在白板上写了起来,好久没看快速排序,刚开始有点手抖....最后大概写出来了,一些细节上还有问题,不过白板写代码,能写多么完美,哈哈.你写的很完美,那说明你一定是背过代码的人,不过呢,我也记过快速排序的代码,但还是写的不太完善,我这个渣渣,哈哈.

一面大概持续了一个小时,其他问题记不起来了,以后想起再补充.

#### 2. 二面
二面的面试官好高,应该有1.9m,他说他是网易微博出来的.先让我做个自我介绍,大概说了两分钟.完了面试官问我你们第一面聊了啥,我就说聊了数据库/算法这些东西.他说那好,我就问些java基础方面的东西.第一个就问我hashmap了解吗,哈哈,这个嘛,当然了解,源码我看了好几遍,美团点评技术团队博客里有一篇对hashmap讲的很深入,我也看完了,并且基本理解了.所以我就从hash算法开始讲起,怎么样减少hash冲突,hashmap里主要用了`高低位运算`和`取模运算`(用了`&`而不是简单的`/`,性能考虑),再讲hashmap初始化的过程,`capacity`,`loadFator`代表的意思,`resize`触发的条件等等,我基本把我看过理解的知识点都讲了一遍,面试官一直点头,看到面试官比较满意,我心里终于放松了一下,开头还不错

接着问,都说hashmap是线程不安全的,那你觉得为啥不安全,能详细说下吗?这个嘛,知道一些,我说比如有1000线程同时执行put操作,这时候会死循环,为什么呢,因为`capacity`超过`loadFator`的时候,要执行一次resize操作,这时候每个桶中的链表在多线程的情况下next会指向head,构成了一个环,一直处于死循环的状态.面试官听完很满意.其实我可以引导到`concurrentHashMap`的,可能我话比较少,他没问我也就没多说.

`StringBuilder,StringBuffer`的区别,这是很常见的面试题了,我也只是说了大家都知道的那些区别,深入到底层一点的内存如何操作,我也不知道,准备过几天去补上这块.答得中规中矩.

ArrayList的扩容过程,我说了新开辟一片新的空间,把旧的值拷贝过去,再加入新的元素,感觉大家都知道...

再问我数据库优化方面的一些心得,这个我之前的博客里有总结过一些,大体方面就是
1. 合理设计数据库结构,尽量减少磁盘空间varchar, char,tinyint,int,timestamp,datetime这些字段该什么时候用,能用整数表示的字段尽量不要用字符型等等这些
2. 根据业务规则设置合理的索引,要设置的字段过多,可以考虑用复合索引,很多问题都可以通过这种方式解决.顺便讲了一下复合索引和最左前缀原则..拓展话题..
3. 实在数据量大的话,考虑分库分表分区,水平切分,垂直切分都讲了
4. sql优化方面.我讲了如何写sql避免全表扫描,比如存在null的列不要用索引,避免用in,多用between and, not exist,去掉多余的括号,减少运算,去掉重复变量等等.这个根据自己的积累说就行了,知识量很大,不可能说全.

他说他是网易微博的,之前也是做社区类型的,看我做的这个`创业人脉圈`也是社区,就问一些细节.
首先我简历上写了消息列表的优化,他就问这个,我说了我们的方案,就是每次加载消息列表的时候都需要发消息人的头像和最后一句话的内容,这些都从数据库查询的话效果很差,联系人几千人的时候那基本要好几秒,关联的表比较多,我们就用了redis,redis中维护这么一个列表,每次发送消息都更新这个列表,进入消息列表查询的时候直接读取,这样速度就上去了.
然后问我微博里的一个场景,一个有几千万粉丝的大v,发一条消息,如何让这么多的粉丝看到,这里说的不清楚,我理解成了如何保证几千万粉丝都来查询的时候保证性能和稳定性,所以我傻乎乎的说了用缓存,搞个集群,前面设个负载均衡..这种大家都知道的方案.但是最后他的意思如何把消息推给粉丝,他说可以判断在线人数,把消息主动推送给在线人,其他人等上线之后再推.如果一下子推给所有粉丝,那是吃不消的,而且有很多僵尸粉,不合理.哦.这个意思,我没答到点子上.没太理解清意思.他说这个没关系,没答上来不影响面试.看你做过社区就随便问问的.

当多表关联查询很慢的时候,有什么办法加速查询..?
这个我想到的办法就是加合理的索引这样子,面试官说这样数据量上千万的时候还是慢,他说了一种思路,进行多次单表查询,再程序中合并结果.这种思路我也听过,但是没说上来,不知道实际用这种方法情况如何.

我简历上写了用过Spring boot,面试官就问这个跟spring有什么不同,我说了下自己的理解,主要是让我省掉了繁琐的配置,让我们可以专注于业务逻辑开发.

gradle,你们为啥要用gradle,跟maven相比有啥好处,主要是语法糖更强大,项目配置部署的脚本能力更强.具体的自己google吧.哈哈

线上问题排查,这部分感觉必问.我先详细解释了top命令,打印出来的每行什么意思,如何打印dump文件,内存快照这些内容都说了,有看过相关的资料.答得还可以

最后又是算法,给我一个题:一瓶啤酒2元钱,2个空瓶能换1瓶,4个瓶盖能换一瓶,现在有100元,我能买到多少瓶啤酒.
大家可以想象怎么做,我想的就是递归的思路.大概说了一下思路.因为已经12点了,他就没让写代码.我说完思路,他就让我下午来面三面.早上的面试结束了.

这时候也中午了,就跟在美团工作的朋友一起吃午饭了.三面安排在下午两点.

#### 3. 三面
三面照例先是让我自我介绍.我就说了个人的情况,在公司做的项目,个人技术方向这些东西.然后就开始问技术了.

我之前听在美团工作的朋友说,三面都是部门经理,一般情况下技术问的不多,都是聊聊天,看一下你的态度,性格什么的是不是适合团队.我也以为比较轻松...结果我太天真了.面试官上来全是问技术的.

了解http吗,header的大小有多大,有没有一个大概的数字.我说了大约4k吧,接着我就说了http头里的一些东西,比如,`user-agent`,`refere`,`host`,`cookie`,`session`等,后面又扯到了浏览器缓存,他就问我浏览器缓存在http header上有什么体现,我不要缓存呢?我就说了`cache-control: no cache`就可以了,我接着拓展了一下,说了`expires`, `Etag`这些东西,再说说浏览器缓存的工作原理,这部分之前看过,能拓展出来.

让我解释浏览器同源策略,这个还好,举个例子说明了一下,主要是浏览器为了保证安全.那么就有跨域问题,你怎么解决,我就说jsonp, http header里处理都可以,服务端处理就是`access-control-allow-origin:*`,用`*`可能不太安全,可以写成自己限定的几个域名即可.

让我说出前端优化的常见策略,我大概说了这么多.
1. 减少http请求个数,合并js,css代码(我们把js会合一个文件)
2. 静态资源cdn加速
3. 反向代理设置缓存,提高响应速度
4. 使用浏览器缓存,配置`Etag`,`Expires`http头信息
5. 避免重定向

我说完,针对我的回答,他提出了这么几个问题
>* 合成一个文件,文件太大的时候没有影响吗
这个问题,我们现在确实是合成了一个,但是我们项目小,还没出现问题,对于大型项目考虑合成多个比较好,不过我们场景还用不到.
>* cdn为什么能提高速度
因为这些静态资源会部署在网络运营商的网络节点上,请求的时候根据用户网络选择最近的节点去加载资源,路由选择的过程.
>* 浏览器缓存是存在哪里,304,not modify的时候,资源是哪里的
当然是浏览器端缓存
>* 浏览器对http并发数的限制是怎么样的,一般都是多少,我说了十几个吧
这里我说多了,那时候没想起具体是多少个,只记得没那么多,其实每种浏览器不一样,但是都不会超过十个.

我怎么感觉三面问的东西偏前端了....

还问我,还有其他方法吗,我没想起来了,他就说知道gzip吗,哦...原来是这个,我知道一些,他就说怎么配,我就说在nginx里,`gzip:on`就行.这部分就问完了

问了一道sql,和一面考的差不多一种类型,就是求重复数据个数,排序取前n个这种题.没啥难度.用group by, limit, count这些就够了,复杂点就嵌套个子查询.很快就写出来了.

再又是数据库索引相关的提问,索引原理,如何设置索引,怎么看待索引,sql优化方面的事情.这部分答得可以.

线上问题排查也问了,感觉这块必问..

知道`SOA`吗,哇,这是考架构的东西啊,我的第一反应是要给我定级了,问一些拔高的东西

我就说这是面向服务架构,他让我解释服务和微服务的区别,举例子,怎么微才是微,服务怎么拆分,我就说了些我的理解,我举例说,比如我们微信公众号有发模板消息的需求,需求是千奇百怪的,有时候是批量发送,延时很多,每个业务自己发的话很容易出现问题,那么我们就考虑把这个单一功能做成服务.用户定义好发送规则,就调用这个服务来发送,保证服务稳定性,还有一定的解耦作用..通过docker去部署这样的微服务.服务之后通过rpc去调用.我把我知道的都说了.

那你知道常见的rpc框架吗,通信机制是怎么样的,我就说了阿里的dubbo,机制的话,我说了比较多web services的东西,我说早期的rpc框架`web services`也算是一种,说了一下`wsdl`和`soap`,dubbo的不太了解,简单的说了一下,还好他没有追着细问.

如何设计一个web框架?
这部分属于发散思维,我感觉我答得一般,我就主要说了首页要处理协议,通讯协议的处理,编码,字符串过滤,拦截器这些东西,再者就是实现类似loc的东西....说了一些,我承认这部分说的不好...

最后问我一道算法,吓我一跳,你猜问了什么,他竟然问了`kmeans`算法,这是数据挖掘里的最简单的算法,但是一般人也不会去学,面试的时候问绝对是比较牛逼的话题.让我说说思路,并在白板上演示一下.这部分的话,我之前大学有选修过数据挖掘,还记得一点,慢慢就想起来思路了(感觉当年修了这门课).
最后让我写出伪代码,不要细节,大概思路流程表达清楚就行,最后还是写出来了.坚持好重要,中途一度没有信息,我以为自己要挂了,但是咬紧牙关,最后还是写出来了,相信自己真重要....

这个说完,面试官就对我比较满意了,压力小了很多.再加上之前http部分说的也行,我的感觉慢慢好起来了,要通过了的节奏.

到这里基本就面完了,面试官让我说说自己的学的技术或者有什么想问他的,我就先说了自己看过的书,一些知识点`深入理解java虚拟机`,`java并发编程的艺术`这些书.然后就问他一些问题,关于项目组的情况,美团的工程师文化,进来能接触到的技术,分工太细会不会接触到的技术比较单一,如何看待和其他几家的竞争关系等等,这部分也没啥特别的

最后问了我的发展方向,我说我想在数据库和中间件方面有深入的发展,对这些比较感兴趣,还问了我的期望薪资.这时候感觉已经面试通过了

面完感觉还可以,面试官说你等一下,让hr跟你聊聊.过了一会hr就来跟我聊了
#### 4. HR面
hr先问我感觉面试情况怎么样,我说我觉得挺不错,很多都答上来了,我比较满意了,hr接着说刚跟面试官沟通了一下,面试情况确实不错,我们现在来沟通一下你的基本情况.先问我为啥离职,我就说离家近什么的.再问之前做过什么项目,对公司有什么期待,发展方向是什么的,最近拿了几个offer,回答中规中矩吧
offer我就说了京东和神州专车,最近拿到了他们的offer,神州催着让我回复,你们能不能给我一个信号能不能过什么的.hr说可以,今天晚点会通知你面试结果.offer细节可能要等两天时间.大概就聊完了

晚上的时候hr打电话来,说通过啦.美团的面试到此结束了.

总结:
>* 前期的准备很重要,为了面试我也准备了好久,目前为止的面试都很顺利,成功率很高.来北京面试了四家,三家都已经拿到offer了.
>* 多提高自己的语言表达能力,多主动的表达一些自己的东西,不要每次都让面试官挖掘
>* 面试是实力加运气,我感觉我这次运气比较好.问题也没有特别难
>* 平时多学习,努力的人运气不会太差
>* 一定要相信自己,坚持,算法想不出来的时候再加把劲,说不定就想出来了,就算想不出来完整的,把自己的思考过程表达出来,思路清晰一点,而不是只是说我不会,这样面试官也没法接招.
>* 数据库索引,主从复制,事务,优化,jvm调优,感觉这些事必问的了.需要面试的同学可以专项准备一下,我都是每个专题专项复习的.都记了博客,方便查询

----
才工作了一年的渣渣,想面试bat都没有机会,简历都被刷掉了,哎,继续努力~
over~
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • sbz

    学习了,对了你是怎么学的呀,工作一年就这么牛,分享一下你的学习方法呀

  • 其他回帖
  • zonghua

    感觉博主很厉害的样子

  • someone

    good 老同学有出息啊

    1 回复
  • 终于看完了,准备去哪里呢?

    1 回复
  • 查看全部回帖
guobing
会当凌绝顶,一览众山小 北京

推荐标签 标签

  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 559 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 164 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 159 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 7 关注
  • 电影

    这是一个不能说的秘密。

    121 引用 • 604 回帖 • 1 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 464 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 535 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 161 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 15 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 683 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 53 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    288 引用 • 734 回帖 • 2 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 159 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 410 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1114 回帖 • 125 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1737 回帖 • 1 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖 • 3 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 1 关注
  • 自由行
    4 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖 • 1 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 512 回帖