美团网面试回顾

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

#### 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~
  • 面试

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

    324 引用 • 1395 回帖 • 2 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
guobing
会当凌绝顶,一览众山小 北京

推荐标签 标签

  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 733 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖 • 2 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 191 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • API

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

    76 引用 • 429 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 476 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1458 回帖 • 118 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 610 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 4 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 519 关注
  • 单点登录

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

    9 引用 • 25 回帖
  • FreeMarker

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

    23 引用 • 20 回帖 • 437 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 10 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 58 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 12 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • Spark

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

    74 引用 • 46 回帖 • 561 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 25 关注
  • QQ

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

    45 引用 • 557 回帖 • 181 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 152 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    109 引用 • 54 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 703 关注