美团网面试回顾

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

#### 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 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • guobing
    作者

    boss 直聘上是这样的,有些招聘信息是技术负责人发的,联系比较快.

  • 其他回帖
  • sbz

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

  • guobing
    作者

    :bowtie:大王来巡山~

  • junze

    感谢分享 涨姿势了 我是 php 党 面试也经常问 MySQL 算法 HTTP NoSQL 这些

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

推荐标签 标签

  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 58 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 67 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 134 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • Jenkins

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

    53 引用 • 37 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 407 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 94 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 51 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    179 引用 • 995 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 62 关注
  • OnlyOffice
    4 引用 • 3 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    125 引用 • 169 回帖 • 1 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 31 关注
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 816 回帖 • 1 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 1 关注
  • Solo

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

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

    1434 引用 • 10054 回帖 • 490 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1387 回帖 • 283 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 664 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 362 关注
  • Postman

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

    4 引用 • 3 回帖 • 3 关注
  • FreeMarker

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

    23 引用 • 20 回帖 • 463 关注