本文是鄙人薛某的投稿(博客主页:https://www.cnblogs.com/yeya/)。虽然面试最后挂了,但是老哥本身还是挺优秀的,而且通过这次面试学到了很多东西,我想这就足够了!加油!不要畏惧面试失败,好好修炼自己,多准备一下,后面一定会找到让自己满意的工作。相信老哥总结的这篇文章对大部分人都会有一点帮助!
下面问题的很多答案在笔主开源的 https://github.com/Snailclimb/JavaGuide (【Java 学习+面试指南】 一份涵盖大部分 Java 程序员所需要掌握的核心知识 )都有,强烈推荐各位小伙伴阅读一下。
前段时间家里出了点事,辞职回家待了一段时间,处理完老家的事情后就回到广州这边继续找工作,大概是国庆前几天我去面试了一家叫做 Bigo(YY 的子公司),面试的职位是面向 3-5 年的 Java 开发,最终自己倒在了第三轮的技术面上。虽然有些遗憾和泄气,但想着还是写篇博客来记录一下自己的面试过程好了,也算是对广大程序员同胞们的分享,希望对你们以后的学习和面试能有所帮助。
先说下 LZ 的个人情况。
17 年毕业,二本,目前位于广州,是一个非常普通的 Java 开发程序员,算起来有两年多的开发经验。
其实这个阶段有点尴尬,高不成低不就,比初级程序员稍微好点,但也达不到高级的程度。加上现如今 IT 行业接近饱和,很多岗位都是要求至少 3-5 年以上开发经验,所以对于两年左右开发经验的需求其实是比较小的,这点在 LZ 找工作的过程中深有体会。最可悲的是,今年的大环境不好,很多公司不断的在裁员,更别说招人了,残酷的形势对于求职者来说更是雪上加霜,相信很多求职的同学也有所体会。所以,不到万不得已的情况下,建议不要裸辞!
面试岗位:Java 后台开发
经验要求:3-5 年
由于是国庆前去面试 Bigo 的,到现在也有一个多月的时间了,虽然仍有印象,但也有不少面试题忘了,所以我只能尽量按照自己的回忆来描述面试的过程,不明白之处还请见谅!
bigo 的第一面是微信电话面试,本来是想直接电话面,但面试官说需要手写算法题,就改成微信电话面。
第一面问的不算难,问题也都是偏基础之类的,虽然答得不算完美,但过程还是比较顺利的。几天之后,Bigo 的 hr 就邀请我去他们公司参加现场面试。
到 Bigo 公司后,一位 hr 小姐姐招待我到了一个会议室,等了大概半个小时,一位中年男子走了进来,非常的客气,说不好意思让我等那么久了,并且介绍了自己是技术经理,然后就开始了我们的交谈。
面试完后,技术官就问我有什么要问他的,我就针对这个岗位的职责和项目所用的技术栈做了询问,然后就让我先等下,等他去通知三面的技术官。说实话,二面给我的感觉是最舒服的,因为面试官很亲切,面试的过程一直积极的引导我,而且在职业规划方面给了我很多的建议,让我受益匪浅,虽然面试时间有一个半小时,但却丝毫不觉得长,整个面试过程聊得挺舒服的,不过因为时间比较久了,很多问题我也记不清了。
二面结束后半个小时,三面的技术面试官就开始进来了,从他的额头发量分布情况就能猜想是个大牛,人狠话不多,坐下后也没让我做自我介绍,直接开问,整个过程我答的也不好,而且面试官的问题表述有些不太清晰,经常需要跟他重复确认清楚。
对事务了解吗?说一下事务的隔离级别有哪些(我以比较了解的 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 微信通知了我,说我第三轮技术面试没有通过,这一次面试以失败告终。
以上就是面试的大概过程,不得不说,大厂的面试还是非常有技术水平的,这个过程中我学到了很多,这里分享下个人的一些心得:
1、基础!基础!基础!重要的事情说三遍,无论是什么阶段的程序员,基础都是最重要的。每个公司的面试一定会涉及到基础知识的提问,如果你的基础不扎实,往往第一面就可能被淘汰。
2、简历需要适当的包装。老实说,我的简历肯定是经过包装的,这也是我的工作年限不够,但却能获取 Bigo 面试机会的重要原因,所以适当的包装一下简历很有必要,不过切记一点,就是不能脱离现实,比如明明只有两年经验,却硬是写到三年。小厂还可能蒙混过关,但大厂基本很难,因为很多公司会在入职前做背景调查。
3、要对简历上的技术点很熟悉。简历包装可以,但一定要对简历上的技术点很熟悉,比如只是简单写过 rabbitmq 的 demo 的话,就不要写“熟悉”等字眼,因为很多的面试官会针对一个技能点问的很深入,像连环炮一样的深耕你对这个技能点的理解程度。
4、简历上的项目要非常熟悉。一般我们写简历都是需要对自己的项目做一定程序的包装和美化,项目写得好能给简历加很多分。但一定要对项目非常的熟悉,不熟悉的模块最好不要写上去。笔者这次就吃了大亏,我的简历上有个电商项目就写到了用 rabbitmq 处理下单,虽然稍微了解过那部分下单的处理逻辑,但由于没有亲自参与就没有做深入的了解,面试时在这一块内容上被 Bigo 三面的面试官逼得最后哑口无言。
5、提升自己的架构思维。对于初中级程序员来说,日常的工作就是基本的增删改查,把功能实现就完事了,这种思维不能说不好,只是想更上一层楼的话,业务时间需要提升下自己的架构思维能力,比如说如果让你接手一个项目的话,你会怎么考虑设计这个项目,从整体架构,到引入一些组件,再到设计具体的业务服务,这些都是设计一个项目必须要考虑的环节,对于提升我们的架构思维是一种很好的锻炼,这也是很多大厂面试高级程序员时的重要考察部分。
6、不要裸辞。这也是我最朴实的建议了,大环境不好,且行且珍惜吧,唉~~~~
总的来说,这次面试 Bigo 还是收获颇丰的,虽然有点遗憾,但也没什么后悔的,毕竟自己面试之前也是准备的很充分了,有些题目答得不好说明我还有很多技术盲区,不懂就是不懂,再这么吹也吹不出来。这也算是给我提了个醒,你还嫩着呢,好好修炼内功吧,毕竟菜可是原罪啊。
推荐阅读
【原创】如何使用云服务器?希望这篇文章能够对你有帮助!
Java 2019 年生态圈报告
为了你,我又又又把Java学习路线和方法更新了一遍
新手也能看懂的 SpringBoot 异步编程指南
【原创】程序员写博客很重要吗?
一些不错 Java 实践推荐!建议阅读3遍以上!
Github 上热门的 Spring Boot 项目实战推荐
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。