非科班渣硕转Java后端春招实习之旅(附面经)
个人背景
浙江某211传统工科硕士(没错就是机械),为了恰饭,去年四月多开始all in Java。研究生阶段除了上课以外基本就是在给导师做事情了,主要就是写一些桌面的控制软件,业余时间还基于这个软件自己扩展做了个Web服务,再加上一个烂大街的秒杀,构成了我简历上的3个项目。从今年二月开始就陆续投了些简历,到目前为止算上意向书,拿了阿里、腾讯、字节、美团四个offer。
春招情况
阿里巴巴:今年阿里的部门提前批抢人很早,最早我记得十二月就有了。我是大概二月份开始面试,面了阿里云中间件、网络产品、淘系、CBU、蚂蚁金服、盒马等部门的提前批,大概十几面吧,所幸都过了,最后考虑到自身的实力可能还是有所欠缺(在大佬们面前不自信),所以选了面试评价相对较好的CBU录了系统走完流程,最后也在前两天拿到了意向书,总共4轮技术1轮hr。总体而言,阿里的面试考察比较全面,不同部门可能风格不一样,但大体上都是从工程问题入手,开始挖基础,越挖越深直到不会。。。不过也不要害怕答不上来,没有一个人可以cover所有领域(但也不要一连几个都说不会),表现出该有的技术热情和态度,以及较为扎实的基础,感觉问题不大。
腾讯:腾讯一开始啥都不懂投了WXG,果然成了炮灰,也是这次春招之旅的唯一一挂。后面被PCG捞起来了,2轮技术1轮hr,也拿到offer了,不过因为那时候手里有美团和字节了,就给拒了。因为腾讯面的偏少,所以经验不多,但总的来说,因为公司技术栈还是以C++为主,所以面试内容比较偏向操作系统、网络等基础,这也是我这样的非科班所薄弱的地方。
字节跳动:字节跳动可以说是我最早投递的公司了,奈何投了两次日常实习,简历都过不了 T T。后来找了牛客网上的大佬帮忙内推了商业变现岗暑期实习,走了正常的笔试流程,随后3轮技术+1轮hr,顺利拿到offer。不得不说,字节效率是真的高啊,好感度爆棚,我记得我是周五1面,紧接着的周一2、3面,周四下午hr面,晚上offer就到邮箱了,我惊呆了。。字节跳动面试最喜闻乐见的就是手撕算法了,我是每轮技术面一道sql一道算法,基本都是秒了其中一道,另一道得想一会(大多卡sql,没有想到会问这么多sql,准备不充分)。由于我报的岗位Java用的也比较多,所以也会问问Java方面的东西,其他就是一些操作系统,网络,以及分布式相关的内容了。
美团:u1s1,美团虽然最近名声不大好,但是面试体验还是值得肯定的,我投的到店事业群平台技术部,面试官还是非常奈斯的,水平也很高,回答不出也不会难为你,还会鼓励你自信一点。我只走了两轮技术面试,就直接收到oc了,当时因为字节和阿里还在流程中,所以让给了一点时间考虑下,后来字节offer下来了,就挺难为情的拒绝了美团。
其余就是已经笔试或者投简历了,但是还没有开始面试的一些公司了,例如百度,网易,华为等。估计也不会进行下去了,想给自己稍微放个假,放松放松自己紧绷到现在的神经。
学习心得
再简单说一下一些学习上的心得吧。我觉得转行而言,首先需要明确的是你的学习方向。很多人都觉得算法很高大上,所以一股脑的钻了进去,搞cv、机器学习,包括我的一些研究生同学也是如此。我不否认会有很厉害的人,能在较短的时间内从零开始取得不错的成就,但是大多数人都只是普通人。今年,算法岗简直就是神仙打架,对于一些转行算法的同学来说,机会少之又少,可能会陷入一个两难的局面。在选择方向之前,一定要综合考虑这条路是否适合自己,是否具备可行性,这也是我选择走Java后端的原因。
明确自己的方向后,就需要规划学习路线了,如果有人带那再好不过了,但像我这样一个人扛下了所有(哭),就需要去主动获取一些学习的资源,例如知乎、牛客网等等,很多优秀同学的学习路线都是可以借鉴的,然后根据自己的实际情况,动态的制定学习计划。比如我的学习路线是:Java基础——Web相关知识——数据库——框架——缓存——中间件——分布式,中间夹杂着学习一些Java并发、虚拟机等一些必需掌握的知识。此外,借某不知名阿里淘系梁姓大佬(博客地址:https://liangjiacheng.cn )的一句话,先bfs,再dfs。当知识广度差不多了,就需要在某些领域内深入研究下去了,可以是某些开源框架的实现原理,底层源码等,这个就要根据自己兴趣了。
最后,就是一定要坚持,切忌三天打鱼两天晒网。一定要自己push自己,虽然过程可能比较枯燥,但是当取得成果的时候,一定是很有成就感的。此外,可以写一些自己的技术博客,面试的时候也是挺加分的,也欢迎大家到我的博客看一看,博客地址:https://www.mybulinbulin.cn
面经
最后附上一些面经以供参考:
2.6 阿里CBU技术部一面(38分钟)
1.自我介绍
2.聊聊并发
3.怎么解决并发(乐观锁悲观锁)
4.讲讲乐观锁悲观锁(互斥锁,cas)
5.线程池讲讲
6.juc用过啥(countdownlatch,concurenthashmap)
7.垃圾回收讲一下,算法,过程(可达性 gcroot 三个算法)
8.索引原理讲一下(小册结构三连)
9.springboot和spring区别
10.nio和netty区别?bio呢(我???)
11.springcloud有用过吗(没,了解过dubbo)
12.dubbo用来干嘛的(???服务调用的)
13.有其他中间件在学习吗
14.成绩排名咋样?研究生期间有没有获奖?
15.这项目干啥的
2.7 阿里cbu二面(1小时11分)
1.分配对象内存怎么分的
2.堆讲讲
3.四种引用讲讲
4.threadlocal
5.http请求流程(没搞懂想问啥,绕了半天)
6.单点登录了解吗
7.系统怎么感知
8.一致性hash了解吗
9.快排说一下
10.平常怎么学习
11.有上线项目吗(装作有)
12.有什么成品吗(没。。)
13.深挖项目,挖哭
14.有了解什么新技术吗
15.有写技术博客吗
16.服务跑得慢怎么排查
17.实际项目里有排查过吗,有印象深的bug吗
18.有什么学习计划吗,在什么阶段达到什么水平
2.15 阿里cbu三面(33分)
1.自我介绍
2.自己挑个项目讲讲(balabalabala)
3.netty原理
4.netty为什么这样设计
5.nio多路复用代码口述一下
6.布隆过滤器是啥?原理?项目里怎么用的
7.缓存雪崩怎么解决的?
8.为什么要多级缓存?
9.缓存数据库一致性?怎么解决的?
10.分布式锁怎么实现的
11.zookeeper怎么实现分布式锁
12.为啥能保证成功获取
13.数据库索引是什么原理
14.为什么用b+树
15.索引具体是怎么储存的
16.联合索引讲下,怎么储存的
17.线程状态讲一下
18.wait和block什么区别
19.幂等性解释一下
20.rocketmq事务消息原理,代码实现
21.tcp协议介绍下
22.三次握手详细讲
23.为啥是三次
24.滑动窗口原理?具体怎么实现的?
交叉面忘了复盘了,不过不难。。
hr面就谈笑风生了,实话实说就行,hr都是***湖了,能看出什么时候在装。
3.16 美团平台技术一面 1小时
1.自我介绍
2.为啥转行
3.怼项目
4.缓存雪崩有哪几种解决措施
5.为啥用布隆过滤器,优缺点,除了布隆过滤器还有其他什么解决方案
6.为啥要心跳,心跳连接怎么实现的,怎么理解可用性
7.项目难点在哪
8.为啥自定义协议,优点缺点
9.java运行时区域,各自功能
10.异常体系,怎么理解的
11.jdk源码看过哪些版本,1.7 1.8除了map还有啥印象深刻的地方
12.红黑树优缺点,为啥不用平衡树,jdk还有哪里用到了红黑树
13.递归运行到多少层会stackoverflow???
14.对象的内存分配策略
15.编程题,遍历一遍得到a+b=m的所有组合
16.提问
3.21 美团二面(50分钟)
1.自我介绍
2.自己优势体现在哪里,举例说明下
3.学过哪些计算机课程
4.讲讲操作系统,如果自己设计,涉及哪些部分
5.进程线程区别
6.线程同步方式
7.内存管理,为啥要虚拟内存
8.操作系统有内存大小限制吗,64位支持多少内存)=
9.java多线程了解一下
10.重排序出现的场景
11.volatile怎么禁止重排序的
12.syn和lock,syn底层实现原理
13.兴趣爱好,有没有关注什么开源项目,博客网址发一下
14.算法:n种颜色,m个球,球的排列顺序固定,求最短的包含所有颜色的子数组左右索引,要是考虑首尾相连呢?
15.反问
3.20 腾讯 wxg 一小时(挂)
1.六道算法 40分钟
1) 洗牌算法:对52张牌洗牌,要求尽量洗乱,而且原牌不能在原位置上重复
2) 现在有n个微信群,每个群里面有2到m个人,设计一个数据结构存储这些信息,要求该结构能快速找出每一个人所在的所有的群Id。
3) 数组a[N],存放了数字1至N-1,其中某个数字重复一次。写一个函数,找出被重复的数字。时间复杂度必须为O(N), 空间复杂度不能是O[N]。
4) 现在有一个微信群,里面有n个人,每个人的id用整数int标示,现在要求找出id是对称数字的人出来,如3, 121, 12321。 请实现改查找函数,不能把整数转为字符串来判断。
5) 给定一个字符串,如“1234”,请实现一个函数,把这个字符串转成10进制整型,不能用系统函数
6) 有一个二叉树,每个节点的值是一个整数。写一个函数,判断这棵树中是否存在从根到叶子节点的一个路径,这个路径上所有节点之和为某一个值。存在返回1, 否则返回0。
2.讲讲设计模式,单例,工厂
3.java多态讲讲,底层如何实现的
4.mysql索引原理,为啥不用其他数据结构
5.自定义的协议,如何校验
6.说说java从写代码到编译到运行,cpu 内存 硬盘干了什么事???
3.27字节跳动一面(1小时)
1.自我介绍
2.sql(有点简单,忘了)
3.算法:逆波兰表达式(给四则运算,求逆波兰表达式)
4.说说你最近在学什么(答raft zab)
5.那你就讲讲raft吧,选举,宕机,一致性写……
6.令牌桶算法说一下,怎么实现的
7.缓存穿透,缓存击穿、缓存雪崩
8.消息队列怎么保证可靠性投递
9.怎么保证消息队列高可用,主从复制怎么实现
10.数据库索引了解吗,怎么实现的
11.事务隔离级别有哪些,解决了什么
12.Java垃圾回收讲一下
13.G1和CMS讲一下,流程,什么时候stw
14.反问
3.30字节跳动二面(1小时)
1.自我介绍
2.了解了下学习情况,学了哪些
3.sql,需要用到自连接。。没写好
4.算法:下一个排列(lc原题,直接搜名字)秒了
5.TCP/IP几层,三次握手,四次挥手讲讲
6.TCP为什么可靠
7.TCP超时重传怎么个流程,重传时间怎么计算的
8.close-wait讲讲,如果发现服务器有大量close-wait,你觉得可能的原因是什么(没讲好)
9.TCP每个数据包大小怎么决定的,怎么计算的(没讲好,就说了个网络越好,数据包越大。。)
10.那你讲讲TCP拥塞控制吧
11.微服务有在学习吗,流量怎么控制,状态机了解吗
12.分布式一致性算法了解吗,讲讲ZAB,如果三个节点,主节点宕机了怎么办,怎么保证数据一致性
13.设计模式有了解吗,讲讲你熟悉的(策略、工厂、反应堆……)
14.操作系统进程调度算法
15.数据库索引原理,具体在数据页中数据怎么存放的
16.为什么要用自增id主键,如果用业务列比如手机号有什么问题
17.反问
3.30字节跳动三面(1小时)
1.自我介绍
2.给面试官讲了讲3D打印(笑)
3.挖项目
4.linux指令(wget scp awk netstat top等等)
5.领域驱动设计了解吗
6.看过的源码(JDK,Netty)
7.说说Netty中你印象深刻的源码
8.sql:a表两列aid bid, b表bid,bid外键,查出b表中不存在于a中的bid,墨迹了会做出来了
9.算法:田忌赛马,口述思路
10.项目中用到的设计模式,你怎么理解的
11.问了问实习时间
12.反问
4.2字节跳动hr面(半小时)
谈笑风生