大数据Java

双非本科毕业,凭借最普通的秒杀项目,五面滴滴竟成功入职

2020-08-20  本文已影响0人  用嘴写代码

简介

楼主双非本科,无大厂实习经验。项目就是烂大街的秒杀项目,面试时基本上被所有的面试官忽略了.........我这简历基本上很难过,最后也是被滴滴捞了一下,部门是网约车平台,岗位是后端研发工程师。

所以没有项目就要做好被面试官死怼基础的准备了!!!!基本上就是源码或者底层原理的设计。

在看下面面经之前,我想说一些关于面试事情:

我的面经问题相比别人特别少,一个很大原因是我一直在面试时follow up,基本上不需要面试官问我,我都已经顺便给讲完了(follow up这个我一会解释)

我的面试问题其实跟大多数人差不多,甚至社招都在问这些问题。但是同样的问题,回答出正确答案可能只需要3句话,但是差距就在于你自己的理解或者说对这个问题的思考有多深,最后能答出几十句话(看下面的follow up)

简历上面的必问!!!简历上面的必问!!!简历上面的必问!!!简历上面的必问!!!不是简历上的,没答上还能勉勉强强,如果简历上面的答不上来,就GG了

关于follow up,是对面试问题的回答的一个延伸,切忌不要给自己挖坑,而是引导面试官问一些问题。

举个例子:

面试官:说说如何保证RocketMq消息不丢失?

正常回答:RocketMq提供了一种同步刷盘机制,当消息保存到磁盘上时,才会返回给生产者发送成功。

大神回答:

除了这个刷盘机制,还提供一种异步刷盘机制,消息保存在缓存中,采用异步的方式刷新到磁盘上,可能会出现消息丢失的情况,但是该刷盘机制相比于同步刷盘QPS有很大的提升。(Redis也有类似的刷盘的策略,如果您想听,我想等我讲完给您讲讲这个)

但是我在实际的项目中还是采用的同步刷盘机制,来保证消息一定不丢失。

因为在RocketMq中做了两点的优化来提高QPS 消息存储(顺序写):RocketMQ的消息用顺序写,保证了消息存储的速度。目前的高性能磁盘,顺序写速度可以达到600MB/s, 超过了一般网卡的传输速度,但是磁盘随机写的速度只有大概100KB/s 消息发送(零拷贝):将本机磁盘文件的内容发送到客户端需要进行多次复制,比如从磁盘复制数据到内核态内存;从内核态内存复制到用户态内存;从用户态内存复制到网络驱动,最后从网络驱动复制到网卡中。RocketMq采用Java中零拷贝的技术,让从内核态内存复制到用户态内存这一步省略,直接赋值到网络驱动中

除此之外,RocketMq消息选择保存到了磁盘,而ActiveMQ默认采用的KahaDB做消息存储,这是一种关系数据库。采用文件系统的除了RocketMq还有Kafka/RabbitMQ

由于,普通关系型数据库(如Mysql)在单表数据量达到千万级别的情况下,其IO读写性能往往会出现瓶颈,而且关系型数据库如果出现了宕机或者损坏,就会导致Mq不可用。

RocketMq选择文件系统,是因为做了一些刚才说的优化,所以读写性能上,比关系型数据库会有很多优化;而除非磁盘发生损毁,消息是不会损毁的。

(我想继续给您讲一下RocketMq的文件系统,您看可以吗?如果可以,继续....)

RocketMQ消息的存储是由ConsumeQueue和CommitLog配合完成的 CommitLog:消息真正的物理存储文件是CommitLog,默认一个文件一个G,存储的是Topic,QueueId和Message,一个存储满了会自动创建一个新的。 ConsumeQueue:是消息的逻辑队列,类似数据库的索引文件,存储的是指向物理存储的地址,为了加快消息的读取速度。消费者消费某条消息时,先查询索引获取CommitLog的对应的物理地址。每个Topic下的每个Message Queue都有一个对应的ConsumeQueue文件,文件很小,通常会加载到内存中。如果该文件丢失或者损坏,可以通过CommitLog恢复 IndexFile:也是个索引文件,为了消息查询提供了一种通过key或时间区间来查询消息的方法,这种通过IndexFile来查找消息的方法不影响发送与消费消息的主流程 (别忘了前面还想着给面试官讲讲Redis呢,记得问一下他还想不想听了)

上面这些,讲个十来分钟还是没有问题的,如果很厉害的话,顺便可以对比一下MySQL的磁盘存储,这点我不太熟悉。如果是社招,我觉得多讲一下自己在实际中的应用,说个20-30分钟都不是问题

至于四面那个Redis的Hash数据结构源码,我是对比着Java的HashMap说的,讲完都快20分钟了。如果问索引或者SQL优化,在不打断的情况下,感觉能说个30分钟。

如果觉得这个follow up的思路讲的可以,希望可以帮忙转发一下,这样可以让更多的人看到

一面(30min)

Redis

主从复制的架构

主从复制底层原理

Zset的跳跃表(将这个的时候,顺便对比了平衡树树,包括一些实现源码最后也说清楚)

手写SQL(不会)

手写算法题

给一串数组,一个整数,判断有连续几个比整数大,连续几个比整数小

二面(50min)

RocketMq

如何保证消息不丢失

Redis

水平扩展的底层原理

JVM

GC的语言会有内存泄漏的问题吗?

什么时候会内存泄漏

GC对程序的影响在哪(说了fullGC)

高并发

线程池都有哪些(提一下阿里巴巴的规范)

ThreadLocal都用在哪些场景

集合

LinkedList是双向链表还是单向的

HashMap和treeMap的区别?

手写算法

给100个篮球,放进10个不同的框子里,有几种方案?(深搜和DP我都写了)

问了看过哪些源码?

Redis、Spring、RocketMq、Java集合

问了CAP理论(不会,简历没写)

问了Netty(不会,简历没写)

问了职业规划

三面(70min)

三面应该更多考察实际的能力,面试官很和蔼,就相当于在闲聊。这一面答的很烂,很多操作系统的东西不知道,智力题也没算正确....差点以为挂了

都看过哪些书,最推荐哪本?

网络都分几层,都有哪些协议,分别在哪些层?

自己有服务器吗?为什么要整个服务器?

自己用的什么系统的电脑?

为什么不考研?

聊了聊项目都解决了什么问题,我是怎么解决的。

进程和线程的区别?

进程分配的内存空间有限制吗?

线程分配的地址xxx的(不会)

时钟和分针下一次重合的时间(算了很久没算出来,说了下思路)

Redis的端口号,用的什么协议,都用过什么东西连接的Redis

都知道哪些消息队列,都有什么区别?

项目都解决了什么问题,怎么解决的?

为什么操作系统端口号有限制?

一个Windows的程序能在Linux程序运行吗?

JDK和JRE的区别?

四面(60min)

第一个算法是给一个数组,假如[1,2,3,4],该数组求和为10,让返回一个数组[10-1,10-2,10-3,10-4],第一个数组求和减去对应位置。限制是不允许用减号。

第二个算法是计算根号三,精度不限,要求运行出结果。

最后还剩了点时间,就简单考察了一下基础,问了我Redis的源码,问的是Hash的数据结构。

最后就让我问问题,跟我闲聊问我有没有考研的想法以及都面了哪些公司了。面试官很好,后面安慰了我学历不好没关系,让我在自己能把握的地方做好就行。

HRBP面试(30min)

问了我对滴滴的看法

问我北京那么多公司

哪些公司算是一线公司

问我如果阿里腾讯给我offer,我会选择哪个

问了北京那么多公司,哪些公司在我眼里是一线互联网公司

问我为什么要做我简历的项目

问我家人和女朋友支持来北京吗

什么样的人在我眼里是大佬?

问我会c++嘛

愿意用c++写程序嘛

问我性格的缺点

问我竞赛中一次当leader的感受和收获

问我为什么要发表出租车相关的论文

问我为什么要举办我们学校第一届建模队

如何选择下一届建模的队长

还有就是问我喜欢滴滴什么地方

感觉很在意我作为一个leader的表现,很不想提,不想让hr感觉我喜欢管人.....

没有问我对评级的想法,我自己主动问了我的评级,没给我说。

让“努力”成为自己的背景(如何学习?)

1、看视频进行系统学习

我明白自己真的算是菜鸡中的战斗机,自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:

2、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

Spring源码深度解析:

Mybatis 3源码深度解析:

Redis学习笔记:

Spring Boot核心技术笔记:

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

总结

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。

文章内容中涉及到的Java面试题、源码文档,技术笔记等学习资料,均可以免费分享给大家学习,只需你动动手多多支持即可!

——转发评论文章以后,关注一下我,私信口令“面试”即可免费领取。

码字不易,希望可以让更多人看到.....2020不容易,希望大家都能拿到自己想要的offer!

上一篇 下一篇

猜你喜欢

热点阅读