总结一下这段时间实习求职记录,祝大家都得到心仪offer
一共历经3次技术面试+一次hr面,终于得到腾讯offer啦。深圳的朋友一个都没得,有腾讯实习的小伙伴,********可以聊聊租房攻略之类的,另外想找找球友(篮球),虽然想到可能实习很忙,但一周打一两次篮球还是ok的吧!
-------------------------好多牛友问,更新下时间线------------------------------------------------
3.11 游戏部门一面,之后一周没反应
3.18 发现回到测评状态
3.19 新部门teg一面,面试完毕后过十分钟约 3.20 二面
3.20 二面
3.27 hr面
3.28 晚oc (之前回复评论区两天记错了,看电话记录是隔一天oc)
3.29 发offer
3.30 红围脖
--------------------------------------后面更新了美团面经-----------------------------------------
实习进展
美团二面刚刚结束,还没出结果;钉钉电话一面(比较轻松,全谈简历上的,还没约二面);其他的如淘天集团还没约面,笔试也还没写;拼多多笔试前正好坐了一个多小时地铁从外面赶回来,时间过了十几分钟,脑袋也不清醒,本以为难度是美团笔试的水平,结果....;蚂蚁简历挂(听蚂蚁师兄说蚂蚁以及开始搞后端高级外包了,c++方向可能还好);快手后端简历挂;还有七八个小厂offer,小厂感觉大多都是走ai方向,和后端结合这样子,纯做后端开发的还遇到的比较少
中小厂感动瞬间
面试期间遇到了好多面试官,有人超级好的。印象最深的一位面试官,现场手撕的时候,一边撸猫,一边花了半个多小时教我手撕前缀树(因为完全没做过这题,甚至没听过),现场给我画前缀树的结构,我写一行他指导一行,像是给中学生上课一样和蔼地提示....最后还是没去,感觉心里还挺对不起他们的,浪费了他们的时间
还有一个印象深刻的是做直播卖货的offer,感觉面试官人也是非常好,就面了半个多小时,纯java技术栈,整体非常紧凑,从一开始就进入状态,双方都没多说一句和技术无关的话。面试官表示并发量还是挺大的,会有一定的挑战性,但是没关系的,我们做技术的每次遇到问题都是对自己的一次提升。其实我个人觉得这个岗位是很能够锻炼到的自己的,如果直播卖货这个方向是放在大厂,比如淘天集团之类的,我估计99.9%的概率自己接触不到这么核心的业务,就算接触到了也是打杂。整体上从开始那一刻好像就和面试官有一种“默契”一样,相互聊着抢购场景下的技术方案,比如限流,分布式锁,分流处理,上流快速判断抢购资格,中游消息队列,下游数据库慢慢处理,以及各种方案的优缺点,有点意气相投、相谈甚欢的感觉,面完hr马上就联系我问我什么时候能来之类的了...也是感觉很抱歉自己其实从一开始就没打算要去,就是因为重来没面过,消除一下自己的紧张后面面大厂用的...
字节黑化过程
好了最后说一下字节,其实从去年开始,我最想去的一直都是字节,准备的都是字节相关面经,字节经常手撕的题全做了几遍,字节的框架hertz、kitex、gorm有些部分源码也读了不少,比如hertz的jwt全过程的源码...自己的一个很牛的师兄也在字节做抖音核心业务,本来想走的师兄的内推,结果在那前几天被boss上的一个hr迷惑了,hr的岗位是上海国际电商的,我说我其实想去杭州找我师兄的,然后她说那就给我挂到杭州那边,我当时也不知道什么意思,没同意也没拒绝,说自己还没准备好,两周以后再考虑。
好了,两周以后来了,我都差点忘记那个hr了,想走我师兄的团队内推,结果简历投递失败-----折腾了挺久才知道就是之前那个hr,已经给我约面了(约的两周以后),不是我师兄那个团队,但是无法投递,表示重复什么的...
好吧,那就面它,我自己完全看不到进度,上午和hr沟通完说下午就可以面,面试官一上来,问知道不知道对象存储minio的存储原理,我当时就懵了,mysql、redis、kafka的存储结构那些我都很熟悉,一问就问到我第一个不会的...然后说看我用了etcd注册中心,问我懂不懂etcd注册中心的原理,和nacos区别是什么,etcd的脑裂是什么,如何解决.....脑裂这些我也知道,但是etcd如何解决我不懂啊。这也不是关键,关键是,我知道我不懂etcd,我只是当注册中心用了一下,面试之前,我让hr更新简历(之前说了,两周之后才面的,两周前的简历刚刚做的,是有一些问题..),新的简历里面已经没有etcd的任何字眼了.....面试过程中想起来平时hr回消息也很懈怠,觉得她是真不靠谱啊....
没办法,接着面,有一说一,字节这个面试官水平确实非常高,他问我,你点赞的时候利用是的golang的map进行限时聚合点赞操作以减小对数据库的访问,但是你做的是分布式架构,那用户点赞和取消操作可能在不同机器上进行,最后操作的其实是不同的map,你这个技术方案是否有问题?当时我就给佩服了,自己没想到这个问题,这确实是一个问题,有点像分布式锁,应该用第三方的中间件比如redis来搞的....然后我说,因为在map聚合点赞之前,有kafka消息队列,只能靠消息队列的有序性解决了,然后承认自己考虑不足...
这还没完,在把数据(视频)上传到minio对象存储过程中,我用了kafka,面试官问我为什么这里要用消息队列呢?我说削峰解耦之类的,用户上传视频之后,kafka生产完消息之后代码里面就直接返回了,让用户可以访问其他功能,不用被卡在这里。面试官:后续怎么知道成功没有?难道用了websocket吗?我说没有,后续用户有点击这个页面,前端会再发送查询请求,看数据上传成功了没有....但是面试官不是很满意:他说软件肯定是多线程的,这个过程中访问别的模块也是没有问题的,所以解耦.....而且你上传视频本来就是要等的,这个站在用户角度是ok的......接着来,面试官:你说削峰,上传视频这个功能一般不会像秒杀之类的服务那样有集中请求,本来是不需要太多削峰或者限流的逻辑的,服务器的处理能力和用户上传视频的并发是匹配的...所以你这个消息队列感觉是为了用才用...
上面这么多就是字节面试卡住的地方了,其他的比如redis集群挂机怎么处理怎么选举、如何分片,多加一台机器数据是怎么变动的之类的都答的还行,题也做出来了,总结起来就是简单的八股都没怎么问,整体难度是我面这么多最难的了
因为hr给我投递的,我看不到进度,第二天一问hr,一面挂了......这么久的字节梦就这样破碎了.....我直接化身志杰黑子!(不过听说字节最近招人很谨慎,师兄那组最近就来了个北大的,飞书也在裁员,tiktok的事件...)
面经
腾讯
最后附上腾讯一面面经(一个半小时,没录音,记录不全(大部分记得住的是答的上来的),全是计算机基础,全八股,也是压力巨大)
1.网络建立连接的过程
2.TCP四次挥手的time-wait
3.数据从网卡发送到内存的过程
4. tcp滑动窗口
5滑动窗口受哪些因素的影响
6.一亿数据取最小100个,你说堆排序,那堆排序的复杂度,构建过程的复杂度等,除了堆排序,还有能够实现的吗
4.x86,x64指令集,对应寄存器....
5.进程线程协程,区别,优点,内核态用户态
6.redis持久化
7.mysql如何保持主从同步
8.用哪些框架了解过哪些框架保证微服务的一致性、原理是什么
9.raft算法
10. 图论的四五个,邻接矩阵等
11. 进程线程、之间的通信,还有五六个操作系统的问题搞忘了是啥
12. 分布式事务
--------------------------------------------------------------------------------------------------
hr面:
- 自我介绍
- 选一个你最有成就感的项目介绍,从项目背景到结果等介绍以下
- 为什么是这个项目,而不是其他的呢?
- 和同学合作过程中,有过意见不一致吗,如何解决
- 导师、朋友是如何评价自己的
- 认为自己有什么缺点
- 确定一下硕士是全日制
- 什么时候来,实习多久
------------------------------------------------------------------------------------------------------
美团
- 自我介绍
- 最近读什么书
- 聊jvm,内存模型之类的,问读完jvm之后觉得有什么变化
- 垃圾回收,各种算法,现在用的哪种,G1具体说说
- 多线程场景题,要ab两个线程结束以后,得到一个值然后c线程才能执行,我回答countdownlatch的解决方案,面试官后面说期望的回答是用future解决
- 线程池相关,参数如何设置,线程执行过程是什么(怎么问的忘记了,就是答核心线程满了,队列xxx然后救急线程那个)
- 项目相关,锁升级
- 还有几个忘记了,最后来了个手撕,指定区间反转链表,秒了
二面:
- 面试官先自我介绍,然后我再自我介绍
- 说项目,比如点赞的key和value如何设计,整体项目描述说了挺久
- 跳表原理,问了比较奇怪的问题,如何通过key找到某一个跳表(我以为问的是如何通过key二分找元素,后面面试官说不是,是key如何找到某一个跳表,我说可能是hash精确计算的)
- 又问了一些怪怪的问题,和3问那个如何通过key找到某一个跳表有点类似,也是问的我们平时习以为常的东西,但是问具体如何实现的
- 你的zset如何设计结构的,分值是什么,如何更新,member具体是什么,可以指定区间删除一些元素吗,问的比较细,还好对自己项目够熟悉
- java的map的key可以为空吗,我不知道这个,我只知道threadlocal的弱引用会把key清除导致内存泄漏之类的,然后说可以为空,面试官问,那为空value值如何存入,我就说不会了,没准备到
- 线程池,知不知道底层用的什么数据结构,我说肯定有阻塞队列,队列这个结构,然后一直在追问,我答有信号量,缓冲区那些,但是不够具体和完整吧,说自己了解的还不够这块
- 手撕,合并区间,做出来了,但是有的地方卡了挺久,做了二十多分钟,和leetcode上有点差别,输入输出,但是大差不差
--------------------------------------------------------------------------------------------------------
小厂(一开始记录了,后面没记了)
手撕笛卡尔积
springcloud和springboot的源码是否看过
秒杀比如一亿个人过来,分布式锁肯定是扛不住,想想其他解决方案
kafka如何实现消息查找,定位,底层是如何实现的看看
- mysql什么情况会出现锁表:(比如死锁:在并发环境下,多个事务之间可能发生死锁情况,即每个事务都在等待对方释放锁,导致所有事务都无法继续执行。为了解决死锁,MySQL 会自动检测死锁并选择一个事务作为死锁牺牲者,将其回滚以解开死锁。)
- MySQL死锁场景,锁行、锁表场景
- 锁行场景: - 当需要确保某个数据行在当前事务中不被其他事务修改时,可以使用行级锁(Row-Level Locking)。 - 在并发环境下,多个事务同时操作同一数据行时,为了避免出现脏读、不可重复读或幻读等问题,可以使用行级锁来避免并发更新导致数据不一致。
- 锁表场景: - 当需要确保整个表的数据在当前事务中不被其他事务修改时,可以使用表级锁(Table-Level Locking)。 - 在执行一些需要对整个表进行操作的DDL语句时,MySQL会自动加上表级锁,防止其他会话对表进行写操作。 - 在某些特定场景下,可能需要对整个表进行操作并确保数据的完整性,这时可以使用表级锁。
- mysql间隙锁 间隙锁(Gap Lock)是 MySQL 中的一种锁机制,用于在多版本并发控制(MVCC)下防止幻读现象的发生。间隙锁实际上是锁定一个范围,而不仅仅是某个具体的数据行。 当一个事务对一个范围进行查询时,MySQL 可能会使用间隙锁来锁定这个范围,确保其他事务不能在这个范围内插入新的数据。这样可以避免其他事务在这个范围内插入数据,导致当前事务读取到不一致的结果,从而保证了读取的数据的一致性。 间隙锁的主要作用有两方面:
- 防止幻读:通过锁定范围,确保在事务读取数据时,其他事务不能在范围内插入新的数据,避免出现幻读现象。
- 防止并发插入:当多个事务同时插入数据时,间隙锁可以确保不同事务之间的插入操作不会相互干扰,保证数据的完整性。 需要注意的是,间隙锁可能会影响系统的并发性能,因为其他事务在锁定的范围内无法插入数据,可能会导致一些并发操作被阻塞。因此,在使用间隙锁时,需要权衡数据的一致性和并发性能之间的关系,避免过度使用间隙锁导致系统性能下降。
- 唯一索引插入冲突,引报出的异常是什么(在 Java 中,如果唯一索引出现插入异常,通常会抛出 java.sql.SQLIntegrityConstraintViolationException 异常。这种异常表示违反了唯一约束条件,即试图向数据库中插入重复数值或者违反唯一性的数据时会触发此异常。在捕获这种异常后,可以根据具体情况进行处理,例如给出友好的提示信息或者进行回滚操作等。)
- redis有哪些异常(超时,)
- 连接异常:例如连接超时、连接被拒绝等,这可能是由于网络问题、Redis 服务器负载过高或配置错误等原因引起的。
- 命令执行异常:当执行某些命令时,可能会出现数据格式错误、命令不支持等异常。例如,当使用错误的数据类型执行命令时,Redis 会返回相应的错误信息。
- 内存异常:当 Redis 服务器的内存用量超过限制时,可能会报告内存溢出异常。这通常是因为数据量过大或者 Redis 配置不当导致的。
- 持久化异常:如果在进行数据持久化(如 RDB 快照或 AOF 日志)时出现异常,可能会导致持久化失败或数据恢复问题。
- 集群和分片异常:在 Redis 集群或分片环境中,可能会出现节点失效、节点挂掉、数据分布不均等异常情况。
- 安全异常:当 Redis 实例的安全设置不当时,可能会受到未经授权的访问或数据泄露等安全问题。 对于以上异常情况,通常需要根据具体的错误信息和日志来进行排查和处理,例如检查网络、服务器配置、数据格式、内存使用情况等,以便解决问题并确保 Redis 服务的正常运行。
- minio分片