美团网面试回顾

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

#### 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
    作者

    没有,带什么录音笔。。

  • 其他回帖
  • sbz

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

  • 招聘信息 还可以分为 HR 发的和技术人员发的么?

    1 回复
  • tzr

    楼主我想问下你面试的时候有带一只录音笔录下整个过程吗,如果没有录音笔,那我好羡慕你的记忆力,真棒。

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

推荐标签 标签

  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 5 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 2 关注
  • 导航

    各种网址链接、内容导航。

    40 引用 • 173 回帖 • 1 关注
  • RYMCU

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

    4 引用 • 6 回帖 • 52 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖 • 1 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    167 引用 • 1513 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 530 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    408 引用 • 3575 回帖 • 1 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 787 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 673 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 483 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 1 关注
  • RabbitMQ

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

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

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 134 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • OnlyOffice
    4 引用 • 3 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 511 关注
  • OkHttp

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

    16 引用 • 6 回帖 • 65 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 41 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    153 引用 • 3783 回帖 • 1 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 764 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 304 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注