当前位置: 首页 > 后端技术 > Java

【面对面分享】工作两年多,面试Bigo(Javapost)居然在第三轮技术面试中失败了...

时间:2023-04-01 14:28:33 Java

背景前段时间,家里发生了一件事情。我辞职回家了一段时间。事后,我回到广州继续找工作。前几天去面试一家叫Bigo的公司(YY的子公司)。面试职位是3-5年的Java开发,最后倒在了第三轮。在技??术方面。虽然有点遗憾和泄气,但还是觉得还是写一篇博客记录一下我的面试过程比较好。也算是和各位程序员的一次分享。希望对你以后的学习和面试有所帮助。个人情况先说说LZ的个人情况。2018年毕业,二等学历,现居广州,是一名很普通的Java开发程序员,有两年多的开发经验。其实这个阶段有点尴尬。比初级程序员稍微好一点,但达不到高级水平。另外现在IT行业已经接近饱和,很多岗位至少需要3-5年的开发经验,所以两年左右的开发经验需求其实比较少。这是LZ在找工作的过程中深有体会的。.最可悲的是,今年的大环境不好。很多公司都在不停地裁员,更不用说招人了。残酷的处境对于求职者来说更是雪上加霜。相信很多正在找工作的同学也都经历过。所以,除非万不得已,建议不要裸辞!这次失败后,找了很多Java面试题来刷刷刷,也找了现在在阿里工作的师兄师姐。他们发给我一份《Java面试突击宝典》,里面有现在面试必考的知识点。兄弟姐妹们据说都是通过这篇文档进入阿里的,希望自己看完也能进入阿里,哈哈哈哈!现在也免费分享给阅读本文的Java程序员朋友们。如果您需要,可以【点击这里】获取!Bigo面试面试职位:Java后台开发经验要求:3-5年一面(微信电话面试)Bigo的第一面是微信电话面试。本来想直接电话面试的,但是面试官说需要写算法题,所以改成了微信电话面。自我介绍首先了解一下Java的基础知识。什么是内存泄漏和内存溢出?(溢出是指创建过多对象导致内存空间不足,泄漏是指无用对象没有被回收)JVM是如何判断一个对象是否为无用对象的?(在寻根算法中,从GCRoot开始,如果对象没有引用,则判断为无用对象)寻根算法中的根节点可以是什么样的对象?(类对象,虚拟机栈的对象,常量引用的对象)重载和重写有什么区别?(重载发生在同一个类,方法名相同,参数列表不同;重写是父子类之间的行为,方法名和参数列表相同,方法体中的程序不同)有没有重写有什么限制吗?Java有哪些同步工具?(Synchronized和Lock)两者有什么区别(之前写过一篇文章对比两者,根据以上知识点大致讲了下。文章地址:JavaConcurrentProgramming:Synchronized,Lock,ReentrantLockandReadWriteLock)ArrayList和LinkedList的区别?(ArrayList基于数组,查找快,增删元素慢,LinkedList基于链表,增删快,查找效率低,因为需要遍历元素)这两个集合哪个占用更多记忆?(视情况而定,如果ArrayList展开,元素没有占据整个数组,会浪费很多内存空间,但一般情况下,LinkedList会占用相对多的内存,因为每个元素都包含指向前后端节点,说一下HashMap的底层结构(数组+链表,链表太长链表就变成红黑树),为什么HashMap不是线程安全的,HashMap做了什么问题1.7版本之前有(扩容时多线程操作可能导致链表形成循环),然后调用get方法会死循环)你了解ConcurrentHashMap吗?告诉我为什么它是线程安全的(使用段锁)以及哪些方法需要锁定整个集合?(读size的时候)简历上说懂RPC,那么RPC的全过程呢?(从客户端发起请求,到socket传输,再到服务端处理消息,如何序列化等)服务端获取到客户端要调用的接口信息后,如何找到对应的实现类?(反射+注解,这里我不是很懂)dubbo负载均衡有多少种算法?(随机、循环、最少活跃请求、一致性哈希)你说的最少活跃数算法是什么?(服务商有一个计数器,记录了当前同时请求的数量,数值越小,服务器的负载越小,路由器会优先考虑这个服务器。)服务器如何知道客户端需要调用算法?(socket在传输消息的时候,会把算法策略传给服务器)你用过redis做分布式锁吧?你是自己写的工具类吗?(不是,我们用redission做分布式锁)线程如何保证拿到key后不死锁?(给这个key加一个过期时间)如果过期时间到了,但是业务程序还没有处理,怎么办?(呃……可以在业务逻辑上保证幂等性)如果多个业务使用分布式锁,每个业务都要保证幂等性。有没有更好的办法?(啊。。。想了想,没头绪。面试官说,先跳过吧。后来才知道redission本身有watchdog监控线程,如果检测到key被持有,就会重新设置过期时间)你那边有纸笔,写一个算法,用两个栈模拟一个队列的进出。(因为之前复习的时候对这道题有印象,写的比较快,大概五分钟左右,然后拍了照片发给面试官,看完对方说说没有问题就结束面试了。)第一题不难,都是基础题。虽然答案并不完美,但过程还是比较顺利的。几天后,Bigo的hr邀请我去他们公司进行现场面试。Ermian到Bigo公司后,HR小姐姐约我去会议室。等了大约半个小时,进来了一个中年男人,他很有礼貌,说不好意思让我等了这么久,然后自我介绍是技术经理,开始了我们的谈话。按照惯例,我简单介绍一下自己,过程中他也在看我的简历。说说你最熟悉的项目。(先从我上家公司最近做的一个电商项目说起,从简单的项目描述到项目的主要功能,以及我主要负责的功能模块,blahblahblah……)你对这个项目太熟悉了,然后根据你的理解画出你的项目架构图,并告诉我你参与了哪一部分。(这个题目还是挺麻烦的,毕竟我已经离开很久了,而且我对这个项目的结构有点模糊。当然最后还是硬着头皮画了一个大概的思路,从前端开始访问,然后通过nginx网关层,最后到具体的服务等等,同时也给服务做了标记modulesIparticipated)你的项目使用了SpringCloudGateWay,既然你已经有了nginx作为网关,为什么还要使用gateWay呢?(nginx用于负载均衡,也作为客户端访问的网关,gateWay是业务层访问的网关,也集成了fuseHystrix。)fuseHystrix的主要作用是什么?(防止服务调用失败造成的服务雪崩,可以降级)你的项目用到了redis,你的redis是怎么部署的?(啊……好像是哨兵模式部署的)说说你对哨兵模式的理解?(对sentinel模式了解不多,所以只说了sentinel的监控,像ping命令一样的心跳机制,以及如何判断一个master是否下线。。。)那为什么要用sentinel模式呢?为什么不将其部署在集群中?一开始听不懂他的观点,就说Sentinel本身就是多实例部署的。他解释了一下,说的是redis-cluster的部署方案。(额...redis环境是由专门的运维人员搭建部署的,应该优先考虑高可用....我开始有点心慌,因为不知道为什么)哦,那你呢觉得集群没有办法实现高可用?(不是……不是,我只是觉得sentinel模式可能保证主从复制的安全性……我不知道我在说什么)集群也可以保证高可用,你懂的怎么做保证主从一致性?(好吧,这里我真的不知道,所以我可以跳过)你必须有微信。如果让你设计微信朋友圈,你会如何设计它的属性成员?(嗯……需要有用户表、朋友圈表、朋友表等)嗯嗯,你也知道微信有近10亿用户,所以肯定涉及到分库分表,如果是你,分库分表怎么设计?(这道题考了很多点,我的回答其实很一般,而且面试官在这个过程中连续提问,导致这个话题聊了将近20分钟。限于篇幅,我会这里就不细说了。)边差不多就搞定了,最后你写个算法。有一组未排序的整数数组。你设计一个算法,将数组的元素成对配对,然后输出最大绝对值差和最小绝对值差的“对数”。.(听到这道题,我第一个想到的是用HashMap来保存,key是两个元素的绝对值差值,value是对的个数,如果相同则加1,如果不相同,赋值为1,然后finally对map进行排序,输出最大最小值,面试官写完后说虽然结果正确,但是效率不高,因为遍历的时间复杂度变成了O(n2),然后提醒我想想排序我有一个想法,我可以先对数组进行排序,然后做第一个元素和第二个元素的绝对值差,记录为num,然后计算第一个元素循环和后面的元素,直到绝对值差不等于num位置,所以效率比O(n2)快很多。)面试完技术官问我想问他什么,我问了关于这个岗位的职责和项目中用到的技术栈,然后让我先等等,等他通知三边的技术官。说实话,第二次面试给我的感觉是最舒服的,因为面试官很亲切,而且面试过程一直很积极的指导我,给了我很多职业规划的建议,让我受益匪浅,虽然面试时间持续了一个半小时,但是一点也不觉得长。整个面试过程还是挺舒服的,但是因为时间长了,很多问题都记不太清了。三边两边结束后半个小时,三边的技术面试官开始进来了,从他额头和发量的分布就可以猜到他是一头大牛。他没有多说话。他坐下后没有让我自我介绍,直接问问题,全程没回答好,而且面试官的问题表达有点不清楚,经常需要跟他重复一遍才能确认清楚。你懂业务吗?再说说事务的隔离级别(我把Spring的四个事务隔离级别都用Spring的方式描述过了,我比较了解)。如果你做过电子商务,你应该知道下订单时需要减少库存,对吧?假设有两个服务A和B,分别操作订单表和库存表。A保存订单后,调用B减少库存失败。这时A也会回滚。这个交易应该怎么设计?(服务B的库存缩减方法没有抛出异常,调用方也就是服务A抛出异常)读写分离你理解了吗?(前额...大体的理解就是写的时候进入主库,读的时候读从库。)你说读的时候读从库。现在假设有一个读写分离的表User,然后在一个事务范围内有一个线程。User表首先进行写入处理,然后进行读取处理。此时数据还没有同步到从库。怎么保证读取的时候能读取到最新的数据呢?(听了有点懵,一时答不上来,后来面试官说想办法保证在一个事务中读写使用同一个库。)你的项目使用rabbitmq,所以可以说说mq的consumer端是怎么处理的?(也就是consumer收到消息后,会先把消息存入数据库,然后定时从数据库中运行消息)也就是说,你的mq是先存入数据库,然后才是业务逻辑就是从mq中读取消息然后处理吧?(是的)所以你的信息是唯一的吗?(是的,使用了唯一性约束)如何确保消息可以被消费?或者如何确保它会存储在数据库中?(这里开始慌了,因为我只看了MQ接入的部分逻辑,没有亲自参与,根据自己对MQ的理解,回复说应该是基于ack确认机制rabbitmq的。)好吧,那你可以梳理一下你的consumer端的整个处理逻辑流程,然后说说你的ack是从哪里返回的(听到这里我心凉了,我真的没有参与到那部分mq访问,硬着头皮按照自己的理解画了流程我看了一下,但是漏洞百出)按照你画的,如果数据库突然宕机,你怎么确认你的消息已经收到?(嗯……那发消息的时候把消息存起来就好了……接听的时候,心里千头万绪的泥马擦肩而过……好吧,没意思就这样吧。)如果服务在发送端部署在多个设备上?当您保存消息时,数据库一直报告唯一性错误?(好吧,你赢了。。。最后强行挤出一句话,你说的是这个设计真的很烂。。。)算了,跳过吧,现在你设计一个map,然后有两个Threads操作这张地图。主线程高速添加和删除map的元素,然后一个异步线程定时删除map中5秒内主线程没有删除的数据。你会如何设计它?(这个问题我没答好,简单思考了一下,说可以给map的key加上时间戳,遍历的时候发现当前时间戳之前不到5秒的元素删除了。面试官我显然对这样的回答不太满意,说这样遍历会影响效率,ps:对于这个问题,大家有什么意见可以在评论区交流哦!)...还有其他的问题,但是我只能记得这么多,就这样吧。做完最后一个问题,面试官说面试过程结束了,让我回去等消息。听到这里,我知道这基本上是公布结果了。回想起来,我这一轮面试的表现真的很一般,时间拖了很久,从当天的2:30一直拖到6:00,心力交瘁。果然,几天后,hr微信通知我第三轮技术面试失败,这次面试以失败告终。综上所述,以上就是面试的大概流程。不得不说大厂的面试还是很有技术含量的。在这个过程中我学到了很多东西。以下是一些个人经验:1.基础!根据!根据!重要的事情说三遍,不管程序员在哪个阶段,基础是最重要的。每个公司的面试肯定都会涉及到基础知识的问题。如果基础不扎实,可能第一面就被淘汰。2、简历需要妥善包装。说实话,我的简历肯定是打包过的。这也是我工作时间不长,却能拿到Bigo面试机会的重要原因。因此,有必要妥善包装自己的简历,但切记不能脱离实际。比如你只有两年的经验,却坚持写了三年。小厂也可能侥幸过关,但大厂基本很难,因为很多公司在录用前都会进行背景调查。3、熟悉简历上的技术要点。简历包装可以,但是一定要熟悉简历上的技术要点。比如你只是简单的写过rabbitmq的demo,就不要写“熟悉”之类的词,因为很多面试官会针对一个技能点问的比较深入。像连环枪一样培养自己对这个技能点的理解。4、简历上的项目要非常熟悉。一般我们在写简历的时候,都需要对自己的项目进行一定的包装美化。一个写得好的项目可以为简历加分不少。但是你必须对项目非常熟悉,不熟悉的模块最好不要写。作者这次吃大亏了。简历上有个电商项目,写到我用rabbitmq处理订单。虽然我对订单那部分的处理逻辑略有了解,但是因为没有亲身参与,所以没有深入了解,在面试的时候,我被比哥三边的面试官逼得说不出话来。5.提高自己的架构思维。对于初中级程序员来说,每天的工作就是基本的增删改查,实现功能。这种思维不能说不好,但是如果只是想更上一层楼,就需要在工作时间升级自己的架构思维能力,比如让你接手一个项目,你如何会不会考虑设计项目,从整体架构,到引入一些组件,再到设计具体的业务服务,这些都是设计项目时必须要考虑的环节,很好的锻炼了我们的架构思维,而这也是很多大公司面试高级程序员时考察的重要内容。6.不要说任何裸露的话。这也是我最朴实的建议,环境不好,还是好好珍惜吧,呵呵~~~~总的来说这次Bigo的采访还是比较有收获的,虽然有点遗憾,但是也没有遗憾,毕竟我在面试前已经做好了充分的准备。如果我没有回答好一些问题,那说明我还有很多技术盲点。如果我不明白,我就不明白。这也算是给我敲响了警钟,你还年轻,还是好好练练内功吧,毕竟美食是原罪。复习资料和更多Java学习笔记+面试真题,需要的可以【点此】获取!