Java后端实习面试经验分享

7616

前言:

先简要介绍下本人情况,本科北理,gpa排名好像是48%(数据结构6学分课因为当时没学过C++,看不懂教材代码最后恶补一周勉强60出头,加一堆思政课论文不会写最后出分全是80%那种),大三上靠离散数学、计组、计网这种小镇做题家最擅长的考试科目考了90+侥幸混了学校一个奖学金,考研勉强一战上岸本校(和室友摆的要死,中午十一点起,晚上八点准时启动游戏),本科没了解过前后端任何框架,毕设简单的数据挖掘加jframe硬造前端,不过个人其实蛮喜欢编程,特别在面向对象课学了java后,以及自学了C#做了个简易游戏demo(当时一个多月经常熬夜到4点code,经典兴趣驱动了),然后软件体系结构课了解了些设计模式(虽然因为那课最后是要分析区块链源码给我恶心坏了),这么看本科确实没啥突出。研一忽然有强烈危机感,然后狠狠恶补了java后端加vue前端的知识,然后因为一门课设又自学了点openharmony的前端开发,然后因为家里人被短视频宣传怕我以后找不到工作,催我找实习,然后就猛猛投简历,最后战绩如下沟通了116家,其中26家让我发简历过去,26家里面2家给我笔试,2家线下面试,1家线上面试。(比例居然都是0.2左右,太合理了)。

简历截图

笔试(一)

第一家是用unity开发的游戏公司,算是中厂,有一款我没有玩过但听过的游戏,笔试基于牛客的oj平台,四个算法题,用C++(nnd玩阴的,我复习了一周C#还以为要考项目啥的)。我上次做算法题还是七个月前,结果可想而知4个题ac两个,一个有思路写一半没时间了。

第一题是链表,给个数组交换相邻数字位置,给了链表头指针,要求不能创建新的节点,比较简单,就是我琢磨这个oj平台花了五分钟,它有核心代码和acm代码两种模式。

第二题是递归(也可能是动规,我是用递归做的)给了个数字比如12345,问有几个用12345五个数字生成的比12345大的新数字。我当时思路就很简单,硬造出所有数字然后比就行(事实证明确实这样没问题,ac了),不过我犯了个很脑残的错误,正常遍历数组条件判断是

for(int i=0;i

{

if(xxx)

do yyy;

}

我不知道为啥想成

for(int i=0;i

{

do yyy;

}

很明显如果xxx为false,压根不会进循环,这个错单看比较容易,比较坑的是他嵌套在一个循环里,还是个递归函数,我调试了一个小时发现生成的数字永远只有两位(当时心态要炸了),好在最后可算找到了(ac)

第三题也是个和数字相关的题,我打算用第二题递归相同方法找所有满足条件数字,但时间来不及了。

第四题没咋看题,但题目很长,还有业务场景(显然不是我这种菜鸡能碰瓷的)

笔试当天晚上就给我发邮件拒绝(并非意外)

笔试(二)

第二家公司是大厂的一个业务子公司,java后端。

笔试考是单选加多选加编程加简答。每种题型不做完不能看到下种题型的题目。时长一小时。

选择题主要考java基本常识(真的很基本属于我没复习都能闭着眼睛做的那种)和linux操作命令(这个确实不太了解,可能做对了个七八成)加点数据库知识。

编程题很简单,但是描述很抽象。原文是把【0,1,0,3,12】转化为【1,3,12,0,0】的数组,不能使用其他数组,在原数组上变更,我当时有点懵,心想直接swap就行?,不过想应该没这么简单,然后试图理解题目的意思,然后怎么想到排序那边去了,然后仔细回忆快排的知识,很不幸忘记了,那算了直接选择排序算了,正准备写的时候才发现函数名字叫moveZero(真的难蚌),开始用的双头指针(好像是这样叫的)o(n)把0都移到后面,测试没过,才发现数组元素相对顺序还不能变(nnd,玩阴的),然后又重新写用的n方的复杂度硬移0元素也ac了。

简答题给了一个1NF的表,要求用sql找出所有课程都及格的学生的名字,(丸辣,我sql全让ai帮我写的),但也不能空着,我非常实诚地写实际应用中不会有1NF这种表,有太多数据冗余,然后给了个我奶奶看了都知道不对的sql。

然后提交后,没有音讯了(不是哥们,多少告诉结果给个痛快),听学长说这是大厂基操,流程会拖很长,and学长说投大厂要谨慎,投了一个岗就不能再投它的其他岗位,然后它又会拖就很容易给你卡死。

面试

第三家公司规模比较小,可能三四十人的样子,同样java后端。这是我第一次面试,以为可能会和考研复试一样,大家在外面排排站,喊名字就进去一个。但实际情况就我一人,然后公司员工看上去都挺年轻,然后就一点不紧张了。

进去面试的会议室,只有一个面试官可能30左右,然后看了很亲切,一直和我笑。先是看我简历聊了些基本信息,然后就开始出算法题了(我丢,怎么又反套路,亏我还在地铁上一直看八股,这不对吧)

第一个题他原话是这个题比较简单,给俩个数字字符串要求比较大小,我当时眼睛绝对瞪大了,这不直接integer.parse秒了,我说了integer,parse直接做出来了,然后我又想奥,可能字符串太长超过int了,那行那我就先比较长度再从前往后比较吧,但比较长度又想到欸会不会有前导0,那行我再substr下,又问能返回bool吗,他说可以但你这样真的完备吗,(该死,还有相等),行那我返回大的那个吧,等我做完,他说这其实是个陷阱很多的题,你考虑前导0很好,但有没有考虑正负号,小数,既然小数那还有后缀零,以及可能字符串是abc不是数字(丸辣,我当时脑袋直接懵了,主要确实惯性思维了,leetcode上对输入都有明确说明,他就口头说了下我还真下意识以为就纯整型了),他说其实这就是前后端通信协议不统一的问题(我当时听到真的感觉要说一句太牛了,因为我介绍基本信息的时候提到了之前的servlet项目没用响应码导致整个前后端通信都很复杂)。

第二个题让我想一种方式既能数组随机查询又能链表方便增删。首先想到是用数组,数组还存下个元素下标,然后我以为一种就够,结果他说嗯然后不说话了,行吧,我又想到用链表做基础,然后用数组存数据,然后修改数据时用函数手动修改同步两种数据结构,然后他说嗯然后又不说话了,该死,两种还不够,但我实在想不出来了,我从队列,栈,树到图都想了,但就不知道为啥脑一抽在草稿纸上画了棵树,然后说我实在想不出来了。然后他指着我画的树说你把这个画出来其实就以及很好了,只是你还没想明白(后来我和我考研二战同学说这个题,他脱口而出B+树,我丢,考研的东西早忘记了),不管怎么说也算给了个解决方案。

然后他追问你能想到什么场景会用你刚才创的数据结构,(啊?)我想了一会儿,说买奶茶那种排队可能要用,虽然可能插队不太合适(说这个主要脑子里面走马灯想到昨天买蜜雪冰城排队时候看的那个显示屏),然后又想了下说操作系统的进程调度可能会用到这个(他说好像看源码它还真用了,阿米诺斯,又蒙对了,不过我感觉对他的崇拜又多了,毕竟花心思研究这些底层东西的人凤毛麟角)

最后他问我有没有什么要问他的,我就说因为我第一次实习,所以学的方向覆盖比较广,但不深,前辈有没有什么推荐的方向,然后我还有没有需要加强的地方(当时我都以为这个面试寄了)。他说这个还是要看个人,然后根据个人兴趣给了些推荐。具体就是如果想把东西打理井井有条就学运维,想创造东西就研发,然后研发方面,想和人打交道就选前端,想和数据打交道就选后端。(讲道理,因为这个hr确实太亲切了,我面到后面把他当老师来看了)

然后面试结束,他也没有问我具体项目细节,也可能是因为介绍的时候已经说的比较明白,然后后端的一些专业名词说的比较多,也算体现了点专业性。

整体面试流程可能三十到四十分钟,然后可能面试结束过去不到二十分钟,我地铁才刚坐三站hr就发消息问我有没有兴趣实习,然后我自然同意了,毕竟三个面试里就它给的最多,感觉工作氛围也还不错,而且那个技术hr真的折服我了,再加上真的不想一天面两场,就把之后两场面试推掉了(虽然感觉还是应该多多实践,但当着别人面做算法题感觉压力还是太大了,不如回去狠狠睡觉)

总结

讲道理其实我感觉我表现挺差的,不过可能因为一直在和hr交流我的思考有加分,然后因为我的回答里面有一直在呼应我的项目,所以hr知道我确实有java后端开发的经验。(不过运气真的拉满了,我到现在都不理解我为什么要画那棵树,我一北理自动化加本校保研的哥们说他实习的时候7家面试只有两家offer,希望一年后正式找工作也运气这么好吧)最后因为之前发了鸿蒙开发的项目,可能看到这篇博客的人也有学习鸿蒙的,听我一句劝,孩子们,快跑,我实习计划投三个岗,java后端,unity开发和鸿蒙,结果你猜怎么着,鸿蒙在实习僧压根没有岗位,在boss倒是有四五个但压根没有理我,简历都发不出去。

后续

入职一星期感觉状态良好,把上级派的活做完就可以干自己的事情了,主要就是看抓包请求和响应,到对应代码稍微根据需求改改就行,不过得做好心理准备,因为你会看到巨多的代码,项目规模远非平常课设可比(可能和之前分析区块链源码规模差不多),得会全局搜索以及查看函数用法。如果想java后端实习,一定至少得学习到servlet后端开发的层面,SSM稍有了解即可,你要是会微服务那就更好(不过我看b站视频说最好别说自己会微服务,不然面试官问你底层你打不上就寄了)