Bigo的Java面试,我挂在了第三轮技术面上.........

本文是鄙人薛某这位老哥的投稿,虽然面试最后挂了,可是老哥自己仍是挺优秀的,并且经过此次面试学到了不少东西,我想这就足够了!加油!不要畏惧面试失败,好好修炼本身,多准备一下,后面必定会找到让本身满意的工做。前端

下面问题的不少答案在笔主开源的 github.com/Snailclimb/… (【Java学习+面试指南】 一份涵盖大部分Java程序员所须要掌握的核心知识 )都有,强烈推荐各位小伙伴阅读一下。nginx

背景

前段时间家里出了点事,辞职回家待了一段时间,处理完老家的事情后就回到广州这边继续找工做,大概是国庆前几天我去面试了一家叫作Bigo(YY的子公司),面试的职位是面向3-5年的Java开发,最终本身倒在了第三轮的技术面上。虽然有些遗憾和泄气,但想着仍是写篇博客来记录一下本身的面试过程好了,也算是对广大程序员同胞们的分享,但愿对大家之后的学习和面试能有所帮助。git

我的状况

先说下LZ的我的状况。程序员

17年毕业,二本,目前位于广州,是一个很是普通的Java开发程序员,算起来有两年多的开发经验。github

其实这个阶段有点尴尬,高不成低不就,比初级程序员稍微好点,但也达不到高级的程度。加上现现在IT行业接近饱和,不少岗位都是要求至少3-5年以上开发经验,因此对于两年左右开发经验的需求实际上是比较小的,这点在LZ找工做的过程当中深有体会。最可悲的是,今年的大环境很差,不少公司不断的在裁人,更别说招人了,残酷的形势对于求职者来讲更是雪上加霜,相信不少求职的同窗也有所体会。因此,不到万不得已的状况下,建议不要裸辞!面试

Bigo面试

面试岗位:Java后台开发redis

经验要求:3-5年算法

因为是国庆前去面试Bigo的,到如今也有一个多月的时间了,虽然仍有印象,但也有很多面试题忘了,因此我只能尽可能按照本身的回忆来描述面试的过程,不明白之处还请见谅!spring

一面(微信电话面)

bigo的第一面是微信电话面试,原本是想直接电话面,但面试官说须要手写算法题,就改为微信电话面。数据库

  • 自我介绍
  • 先了解一下Java基础吧,什么是内存泄漏和内存溢出?(溢出是指建立太多对象致使内存空间不足,泄漏是无用对象没有回收)
  • JVM怎么判断对象是无用对象?(根搜索算法,从GC Root出发,对象没有引用,就断定为无用对象)
  • 根搜索算法中的根节点能够是哪些对象?(类对象,虚拟机栈的对象,常量引用的对象)
  • 重载和重写的区别?(重载发生在同个类,方法名相同,参数列表不一样;重写是父子类之间的行为,方法名好参数列表都相同,方法体内的程序不一样)
  • 重写有什么限制没有?
  • Java有哪些同步工具?(synchronized和Lock)
  • 这二者有什么区别?
  • ArrayList和LinkedList的区别?(ArrayList基于数组,搜索快,增删元素慢,LinkedList基于链表,增删快,搜索由于要遍历元素因此效率低)
  • 这两种集合哪一个比较占内存?(看状况的,ArrayList若是有扩容而且元素没占满数组的话,浪费的内存空间也是比较多的,但通常状况下,LinkedList占用的内存会相对多点,由于每一个元素都包含了指向先后节点的指针)
  • 说一下HashMap的底层结构(数组 + 链表,链表过长变成红黑树)
  • HashMap为何线程不安全,1.7版本以前HashMap有什么问题(扩容时多线程操做可能会致使链表成环的出现,而后调用get方法会死循环)
  • 了解ConcurrentHashMap吗?说一下它为何能线程安全(用了分段锁)
  • 哪些方法须要锁住整个集合的?(读取size的时候)
  • 看你简历写着你了解RPC啊,那你说下RPC的整个过程?(从客户端发起请求,到socket传输,而后服务端处理消息,以及怎么序列化之类的都大概讲了一下)
  • 服务端获取客户端要调用的接口信息后,怎么找到对应的实现类的?(反射 + 注解吧,这里也不是很懂)
  • dubbo的负载均衡有几种算法?(随机,轮询,最少活跃请求数,一致性hash)
  • 你说的最少活跃数算法是怎么回事?(服务提供者有一个计数器,记录当前同时请求个数,值越小说明该服务器负载越小,路由器会优先选择该服务器)
  • 服务端怎么知道客户端要调用的算法的?(socket传递消息过来的时候会把算法策略传递给服务端)
  • 你用过redis作分布式锁是吧,大家是本身写的工具类吗?(不是,咱们用redission作分布式锁)
  • 线程拿到key后是怎么保证不死锁的呢?(给这个key加上一个过时时间)
  • 若是这个过时时间到了,可是业务程序还没处理完,该怎么办?(额......能够在业务逻辑上保证幂等性吧)
  • 那若是多个业务都用到分布式锁的话,每一个业务都要保证幂等性了,有没有更好的方法?(额......思考了下暂时没有头绪,面试官就说那先跳过吧。过后我了解到redission自己是有个看门狗的监控线程的,若是检测到key被持有的话就会再次重置过时时间)
  • 你那边有纸和笔吧,写一道算法,用两个栈模拟一个队列的入队和出队。(由于以前复习的时候对这道题有印象,写的时候也比较快,大概是用了五分钟,而后就拍成图片发给了面试官,对方看完后表示没问题就结束了面试。)

第一面问的不算难,问题也都是偏基础之类的,虽然答得不算完美,但过程仍是比较顺利的。几天以后,Bigo的hr就邀请我去他们公司参加现场面试。

二面

到Bigo公司后,一位hr小姐姐招待我到了一个会议室,等了大概半个小时,一位中年男子走了进来,很是的客气,说很差意思让我等那么久了,而且介绍了本身是技术经理,而后就开始了咱们的交谈。

  • 依照惯例,让我简单作下自我介绍,这个过程他也在边看个人简历。
  • 说下你最熟悉的项目吧。(我就拿我上家公司最近作的一个电商项目开始介绍,从简单的项目描述,到项目的主要功能,以及我主要负责的功能模块,吧啦吧啦..............)
  • 你对这个项目这么熟悉,那你根据你的理解画一下你的项目架构图,还有说下你具体参与了哪部分。(这个题目仍是比较麻烦的,毕竟我当时离职的时间也挺长了,对这个项目的架构也是有些模糊。固然,最后仍是硬着头皮仍是画了个大概,从前端开始访问,而后经过nginx网关层,最后到具体的服务等等,而且把本身参与的服务模块也标示了出来)
  • 你的项目用到了Spring Cloud GateWay,既然你已经有nginx作网关了,为何还要用gateWay呢?(nginx是作负载均衡,还有针对客户端的访问作网关用的,gateWay是接入业务层作的网关,并且还整合了熔断器Hystrix)
  • 熔断器Hystrix最主要的做用是什么?(防止服务调用失败致使的服务雪崩,能降级)
  • 你的项目用到了redis,大家的redis是怎么部署的?(额。。。。好像是哨兵模式部署的吧。)
  • 说一下你对哨兵模式的理解?(我对哨兵模式了解的很少,就大概说了下Sentinel监控之类的,还有相似ping命令的心跳机制,以及怎么判断一个master是下线之类。。。。。)
  • 那大家为何要用哨兵模式呢?怎么不用集群的方式部署呢?一开始get不到他的点,就说哨兵自己就是多实例部署的,他解释了一下,说的是redis-cluster的部署方案。(额......redis的环境搭建有专门的运维人员部署的,应该是优先考虑高可用吧..........开始有点心慌了,由于我也不知道为何)
  • 哦,那你是以为集群没有办法实现高可用吗?(不....不是啊,只是以为哨兵模式可能比较保证主从复制安全性吧........我也不知道本身在说什么)
  • 集群也是能保证高可用的,你知道它又是怎么保证主从一致性的吗?(好吧,这里真的不知道了,只能跳过)
  • 你确定有微信吧,若是让你来设计微信朋友圈的话,你会怎么设计它的属性成员呢?(嗯......须要有用户表,朋友圈的表,好友表之类的吧)
  • 嗯,好,你也知道微信用户有接近10亿之多,那确定要涉及到分库分表,若是是你的话,怎么设计分库分表呢?(这个问题考察的点比较大,我答的其实通常,并且这个过程面试官还不断的进行连环炮发问,致使这个话题说了有将近20分钟,限于篇幅,这里就再也不详述了)
  • 这边差很少了,最后你写一道算法吧,有一组未排序的整形数组,你设计一个算法,对数组的元素两两配对,而后输出最大的绝对值差和最小的绝对值差的"对数"。(听到这道题,我第一想法就是用HashMap来保存,key是两个元素的绝对值差,value是配对的数量,若是有相同的就加1,没有就赋值为1,而后最后对map作排序,输出最大和最小的value值,写完后面试官说结果虽然是正确的,可是不够效率,由于遍历的时间复杂度成了O(n^2),而后提醒了我往排序这方面想。我灵机一动,能够先对数组作排序,而后首元素与第二个元素作绝对值差,记为num,而后首元素循环和后面的元素作计算,直到绝对值差不等于num位置,这样效率比起O(n^2)快多了。)

面试完后,技术官就问我有什么要问他的,我就针对这个岗位的职责和项目所用的技术栈作了询问,而后就让我先等下,等他去通知三面的技术官。说实话,二面给个人感受是最舒服的,由于面试官很亲切,面试的过程一直积极的引导我,并且在职业规划方面给了我不少的建议,让我受益不浅,虽然面试时间有一个半小时,但却丝绝不以为长,整个面试过程聊得挺舒服的,不过由于时间比较久了,不少问题我也记不清了。

三面

二面结束后半个小时,三面的技术面试官就开始进来了,从他的额头发量分布状况就能猜测是个大牛,人狠话很少,坐下后也没让我作自我介绍,直接开问,整个过程我答的也很差,并且面试官的问题表述有些不太清晰,常常须要跟他重复确认清楚。

  • 对事务了解吗?说一下事务的隔离级别有哪些(我以比较了解的Spring来讲,把Spring的四种事务隔离级别都叙述了一遍)

  • 你作过电商,那应该知道下单的时候须要减库存对吧,假设如今有两个服务A和B,分别操做订单和库存表,A保存订单后,调用B减库存的时候失败了,这个时候A也要回滚,这个事务要怎么设计?(B服务的减库存方法不抛异常,由调用方也就是A服务来抛异常)

  • 了解过读写分离吗?(额。。。大概了解一点,就是写的时候进主库,读的时候读从库)

  • 你说读的时候读从库,如今假设有一张表User作了读写分离,而后有个线程在一个事务范围内对User表先作了写的处理,而后又作了读的处理,这时候数据还没同步到从库,怎么保证读的时候能读到最新的数据呢?(听完顿时有点懵圈,一时间答不上来,后来面试官说想办法保证一个事务中读写都是同一个库才行)

  • 你的项目里用到了rabbitmq,那你说下mq的消费端是怎么处理的?(就是消费端接收到消息以后,会先把消息存到数据库中,而后再从数据库中定时跑消息)

  • 也就是说你的mq是先保存到数据库中,而后业务逻辑就是从mq中读取消息而后再处理的是吧?(是的)

  • 那你的消息是惟一的吗?(是的,用了惟一约束)

  • 你怎么保证消息必定能被消费?或者说怎么保证必定能存到数据库中?(这里开始慌了,由于mq接入那一块我只是看过部分逻辑,但没有亲自参与,凭着本身对mq的了解就答道,应该是靠rabbitmq的ack确认机制)

  • 好,那你整理一下你的消费端的整个处理逻辑流程,而后说说你的ack是在哪里返回的(听到这里个人心凉了一截,mq接入这部分我确实没有参与,硬着头皮按照本身的理解画了一下流程,但其实漏洞百出)

  • 按照你这样画的话,若是数据库忽然宕机,你的消息该怎么确认已经接收?(额.....那发送消息的时候就存放消息能够吧.........回答的时候内心千万只草泥马路过........行了吧,没玩没了了。)

  • 那若是发送端的服务是多台部署呢?你保存消息的时候数据库就一直报惟一性的错误?(好吧,你赢了。。。最后硬是憋出了一句,您说的是,这样设计确实很差。。。。)

  • 算了,跳过吧,如今你来设计一个map,而后有两个线程对这个map进行操做,主线程高速增长和删除map的元素,而后有个异步线程定时去删除map中主线程5秒内没有删除的数据,你会怎么设计?

    (这道题我答得并很差,作了下简单的思考就说能够把map的key加上时间戳的标志,遍历的时候发现小于当前时间戳5秒前的元素就进行删除,面试官对这样的回答明显不太满意,说这样遍历会影响效率,ps:对这道题,大佬们若是有什么高见能够在评论区说下!)

......还有其余问题,但我只记住了这么多,就这样吧。

面完最后一道题后,面试官就表示此次面试过程结束了,让我回去等消息。听到这里,我知道基本上算是宣告结果了。回想起来,本身这一轮面试确实表现的很通常,加上时间拖得很长,从当天的2点半一直面试到6点多,精神上也尽显疲态。果真,几天以后,hr微信通知了我,说我第三轮技术面试没有经过,这一次面试以失败了结。

总结

以上就是面试的大概过程,不得不说,大厂的面试仍是很是有技术水平的,这个过程当中我学到了不少,这里分享下我的的一些心得:

一、基础基础基础!重要的事情说三遍,不管是什么阶段的程序员,基础都是最重要的。每一个公司的面试必定会涉及到基础知识的提问,若是你的基础不扎实,每每第一面就可能被淘汰。

二、简历须要适当的包装。老实说,个人简历确定是通过包装的,这也是个人工做年限不够,但却能获取Bigo面试机会的重要缘由,因此适当的包装一下简历颇有必要,不过切记一点,就是不能脱离现实,好比明明只有两年经验,却硬是写到三年。小厂还可能蒙混过关,但大厂基本很难,由于不少公司会在入职前作背景调查。

三、要对简历上的技术点很熟悉。简历包装能够,但必定要对简历上的技术点很熟悉,好比只是简单写过rabbitmq的demo的话,就不要写“熟悉”等字眼,由于不少的面试官会针对一个技能点问的很深刻,像连环炮同样的深耕你对这个技能点的理解程度。

四、简历上的项目要很是熟悉。通常咱们写简历都是须要对本身的项目作必定程序的包装和美化,项目写得好能给简历加不少分。但必定要对项目很是的熟悉,不熟悉的模块最好不要写上去。笔者此次就吃了大亏,个人简历上有个电商项目就写到了用rabbitmq处理下单,虽然稍微了解过那部分下单的处理逻辑,但因为没有亲自参与就没有作深刻的了解,面试时在这一块内容上被Bigo三面的面试官逼得最后哑口无言。

五、提高本身的架构思惟。对于初中级程序员来讲,平常的工做就是基本的增删改查,把功能实现就完事了,这种思惟不能说很差,只是想更上一层楼的话,业务时间须要提高下本身的架构思惟能力,好比说若是让你接手一个项目的话,你会怎么考虑设计这个项目,从总体架构,到引入一些组件,再到设计具体的业务服务,这些都是设计一个项目必需要考虑的环节,对于提高咱们的架构思惟是一种很好的锻炼,这也是不少大厂面试高级程序员时的重要考察部分。

六、不要裸辞。这也是我最朴实的建议了,大环境很差,且行且珍惜吧,唉~~~~

总的来讲,此次面试Bigo仍是收获颇丰的,虽然有点遗憾,但也没什么后悔的,毕竟本身面试以前也是准备的很充分了,有些题目答得很差说明我还有不少技术盲区,不懂就是不懂,再这么吹也吹不出来。这也算是给我提了个醒,你还嫩着呢,好好修炼内功吧,毕竟菜但是原罪啊。

开源项目推荐

做者的其余开源项目推荐:

  1. JavaGuide:【Java学习+面试指南】 一份涵盖大部分Java程序员所须要掌握的核心知识。
  2. springboot-guide : 适合新手入门以及有经验的开发人员查阅的 Spring Boot 教程(业余时间维护中,欢迎一块儿维护)。
  3. programmer-advancement : 我以为技术人员应该有的一些好习惯!
  4. spring-security-jwt-guide :从零入门 !Spring Security With JWT(含权限验证)后端部分代码。

公众号

相关文章
相关标签/搜索