快手Java后端校招面经+学习建议
我是19届毕业生,因为四月初考研复试落榜,然后一两周突击加固了下数据库和一些面试题,四月中旬投的快手,五一小长假过后一周速通三面+HR面拿的offer,下面我就结合一下自己的面试经历和一两个月的实际工作经验给点面试和面向工作学习的小小建议吧,希望对后人有用。
首先三次面试都是自我介绍+提问+现场写代码+反问的形式进行,流程大概都在一个小时左右,代码是ACM模式的,要自己导包+输入输出,难度上起码对校招生不会太难,是一些常见的数据结构和一些算法一类的。
一面:
一面是在周二下午,我能记住的问题大致包括java的基本数据结构相关:比如ArrayList和LinkedList的区别,对HashMap的了解,然后就是数据库上面一些分库分表的了解,然后面试官知道我是复试落榜生,像一些计算机网络的TCP三次握手和四次挥手这些她没问!!!,然后简单聊了聊大学期间一些项目的事,就进入了现场编程环节。我抽到的题是合并两个有序链表,算是基础中的基础,但也知道了面试时用到的平台不支持控制台输入输出,所以当场把测试数据写死进行测试,可以直接用题目中的示例做测试数据,检验结果也很方便,然后面试官小姐姐再审核了一遍代码逻辑后就询问我有啥问题没有,之后就当面告诉我一面通过,之后HR会联系我预约下一次面试。总结下来一面问的东西偏基础知识,这部分除了数据库是我突击补足的以外,还好大部分是之前学习Java和写项目时积累的一些基础。
二面:
二面约在了当周周五下午两点,这一面我自我感觉发挥得不算太好,但勉强过了。自我介绍完后面试官就单刀直入直接问项目相关的了,主要是问了项目的技术栈,然后就着技术栈开始向实际应用方面靠齐了。先是对Mybatis的一些询问,然后让我试着写写Mybatis的对列表的SQL的拼接配置,然后询问我有没有用过一些Mybatis相关的SQL语句生成的相关工具,紧接着又是问了些数据库分库分表相关的知识,然后问了点Java8新特性相关的流的使用,以上这些我的记忆基本都有点“年久失修”,大部分没能现场完整写出来,只是谈了谈项目中的用法然后征得同意后去本地idea和项目里照着例子写了写贴了上去(这些向面试官说明需要编译器辅助,面试官也会允许你在本地编译器写好贴上去),最后的现场编程环节也因为感觉前面发挥不太好有点紧张,面对最大值栈的问题现场只想到了一个值记录最值,后面面试官已经提醒过我两个栈解决了,但我还是没想出来(虽然事后一下子想出来了确实简单),然后给我换了一道二叉树的前序遍历的循环写法才让我熬了过去。之后反问环节我没有问题这一面就结束了,但这一面没有当场告诉我结果,让我回去等通知。不过还好,之后HR联系我带给了我一个好消息和一个坏消息:过了,但三面在今晚八点。(当时接到电话是六点)。二面给我的感觉是问题都偏向于实际应用,校招生如果没有实习过是没有工作经验的,这种时候课余时间做的一些项目可能会救你一命。
三面:
两个小时准备不了啥了,就直接硬着头皮上了。不过三面与其说是面是面试,我感觉更偏向于像是一场技术授课。我记得到的就是我在简历上写了会Vue,然后他就让我简单向他介绍一下Vue,然后针对Vue提了一些简单但却关键的问题,比如是依靠什么保证数据的实时更新一类的;之后就又问了问我是怎么看socket和JDBC这些的,我的理解是一些接口一类的,之后就是面试官和我讲解这些是属于Java制定规范,就这方面探讨了一下,但其实主要也是我在学。之后还是一道编程的,前两次出题前两次面试重复了,然后就让我尝试用递归的方式去重新解一下第一次面试的合并两个有序数组。写出来后也才向我说明用意,是考察我对递归思想的理解。之后了解到我没有啥问题也是当面告诉我三面通过,HR会预约后续的HR面。三面给我感觉就是知识面的广度和是否能抓住重点了,因为面试我的也是后端开发,会问我前端问题就是想了解了解我简历写的东西是不是都了解(因为我大学期间也没学太多太广,到了三面简历里就只有Vue没有被提到了),以及了解程度怎么样,后面一些聊天我也能感觉到他尝试在考察我短时间内接受新知识的能力,不过目前看了我还算勉强达标。
HR面:
是在周六下午,自我介绍完毕后主要谈了谈期望城市、有没有别的offer,又问了问我对快手商业化有没有了解,这个时候我就直接说我搜集过资料,但网上信息很少,所以这其实是我待会会问的就直接提前进入了反问环节,这时候HR甚至直接告诉了我入职后的部门的职责以及我之后会在的小组的职责,然后我反问了一下晋升条件和转岗条件一类的,最后更是主动出击问了问谈薪是这次面试可以谈还是后续会有单独的面试(因为当时看面经有的HR面后一个谈薪面),然后确定下来offer是大白菜了,问了问我是直接启动offer流程还是先保留,当时我也是五月中旬了做毕设+没工作,心理压力大就直接选择了启动offer流程了。
整体面试体验是很好的,面试官也很亲和,不会太有压迫感,面试整体分为都是处于自然交流的状态,并且一些不懂的面试官会加以引导并且对你回答的误区做一些提醒,然后在应用方面的一些代码演示哪怕希望本地写代码然后贴上去的这样的需求和面试官交流后也基本会允许的(不过不建议在现场编程答题的环节这么提),而且根据入职后的经验来说,面试官的问题大多也确实和实际工作相关,不是单纯的八股文,至于现场编程题,对校招生的难度并不大,更偏向于实际编程能力的检测吧,甚至不限语言,虽然我投的Java岗位,但平时刷题都用的C,所以现场编程直接用的C也可以。对比起其他的面试(多益、4399、中科创达等)来说还是能明显感受到差距的。
入职后经验+学习建议:
之后我七月十二日入职快手,截止至写下这篇文字也算工作了差不多两个月了,简单谈谈一些经验吧。就如面试题,实际工作中分库分表、Mybatis和Java8新特性(主要是简化代码提高效率)这些是跑不了的,但除此之外的其他很多Java八股文里面的JVM、GC这些,在三面时有聊到,但也不是那种问题必须要你答上来的那种,因为在这一两个月的实际工作中是真的完全用不上,但那些一二面中作为主要问题的,一定是工作中会用的。所以接下来我讲讲一些我建议重点学习的知识吧。
数据库:从基础的能写SQL语句到索引到慢SQL语句的优化最后到一些分库分表的维护都需要重点掌握,我入职之后分到的第二个任务就是对项目中的慢SQL进行调优,目的就是让SQL执行时间降下来,面对千万级甚至上亿的数据,全表和索引差距能到十几秒和一秒不到这种程度,所以数据库尤其是索引需要重点掌握。
Java的基础知识:项目中涉及到框架的一般都不难,而且很少让一个新人去做框架底部的改动(后端开发岗),所以大多数时候用到的还是Java代码的基础知识,最重要的是能够读懂源代码的能力以及能够模仿别人写出自己需要的代码的能力;至于SpringBoot这些框架,达到能够使用注解开发就足够了,因为入职知识水平到了门槛,后面你还会继续成长。
框架和一些工具的学习:虽然面试只会检验你是否到了门槛,但入职之后很多时候是不会管你技术到没到的,因为很多时候都只是使用的能力,比如入职第一天会让配置环境,下载idea插件,配置maven,使用git这些基础工具;然后以我这两个月接到的需求为例,比如Mybatis、kafka、rocketMq、ElasticSearch等,当分给你需求时是默认你会使用这些工具的,最好的情况就是去项目代码找别人怎么用的,自己模仿者写。但如果提前对这些工具的使用能有一个了解的话,这个过程会轻松很多。
然后简单分享一下快手内部的环境吧,周边同事都很好相处,和leader、老板说话都不会感觉太拘谨,大家都以同学相称,确实让我感觉自己只是进入社会大学继续攻读程序员专业而已,工作环境也很好,最重要的一点是我的成长很大,一个月的时间就让我感觉到让刚毕业的我和现在的我聊天,不一定能听懂现在我说的一些专业术语也不一定能写出我现在写的代码。
上面都是以我所在的Java后端开发的岗位为出发点,并且是面向快手的建议,希望对各位同学有一丢丢的帮助吧。
#我的实习求职记录#