校招Java后端面试学习分享
刚经历完互联网的春招实习,面过蚂蚁、华为、字节这三家,在面试中基本上能跟面试官斡旋,目前在等offer当中,之前的文章:Hades:暑期实习面经——蚂蚁CTO线,华为云核心网,字节抖音。之前的文章中有读者以及朋友想让我分享一下学习方法以及经验,因此想写下这篇文章记录下自己的心得体会。
说在前面
看到这篇文章,你可能面临着找实习或工作的选择与挑战,也可能是想为未来做规划。但一旦你开始准备实习或校招了,那你就是一个求职者了,得要面临着各方面的压力与抉择,要做好心理准备。获取与交流招聘信息的渠道包括牛客网、脉脉、leetcode等网站,同时很推荐加一些招聘交流群,最好能有匿名,交流活跃。希望你能从长计议,尽早、合理安排,明确自己的目标与发展方向。同时需要注意,我接下来列出的技术只是个人技术的眼界所及,很多知识体系其实我的理解也不够到位,如果不会也无需惊慌
面试官想考察你的哪些能力?
- 基础知识,也是经常被称为八股,但是需要注意的是他跟八股有着本质区别,很多东西靠背是没用的,得要自己吸收内化,所以需要长线准备。这一块的知识体系我接下来会详细介绍。
- 算法能力,其实也算是基础知识中的数据结构与算法这一板块的内容,但他更考察程序员的编程思维与实践能力,难度会比大学时接触的算法竞赛简单不少,但也需要训练与内化,准备不多的朋友也不用很担心。
- 项目经历,这个其实在面试中很重要,面试官往往一上来会就这简历问你的项目,如果你有足够优秀的项目,能够有技术难点与面试官侃侃而谈,是一个很好的加分项。
- 综合思维能力,这个其实就比较虚了,涉及到面试中各种随机应变的场景,你在项目设计的时候考虑到的疏忽与遗漏,这个需要长期的项目经验积累与总结才能提升。同时要让面试官看到你对于某个技术的带有情感的评价与横向对比,而非浮在表面。
下面我会就这几点能力,详细展开一些本人的看法。同时最后会介绍一下本人习惯的学习方法。
基础知识
这个其实范围很广,但总结来说也就分为课内和课外两种,或者说可以分为三种专业课、热门软件技术、java技术。把语言相关的技术单独列出来是想表明,大厂一般不会对语言做过多限制,更喜欢探讨语言共性的那些东西,只需要吃透一种即可。而专业课、热门软件技术这两个一定要牢固。
专业课
- 数据结构与算法:建议不要将《算法导论》作为学习教材,不具有系统性,而且会很晦涩难懂。个人感觉哈工大编写的《数据结构与算法》这本书还是不错的,同样也推荐网上的浙大或者华科的mooc。
- 计算机组成与体系结构:一般在后端的考察中会相对较少一些,但仍然推荐系统地学习一遍,有利于养成整体思维能力。网上的教材也有很多,个人在学习的时候是按照唐朔飞《计算机组成原理》和王志英《计算机体系结构》来学习的。
- 操作系统:这个在后端的面试中是重中之重,需要反复学习、理解与总结。对于实验部分,大部分校内也会安排实验,但客观评价,大部分内容偏嵌入式开发,了解大致的意思即可。课程本人比较推荐哈工大李治军老师的《操作系统原理、实现与实践》,其中很有多自己的深刻理解,循循善诱,对于难度较大的部分可以适当舍弃。听朋友说南大在b站的OS课程不错,还有就是MIT的OS公开课很厉害,都可以试试。再就是提到《深入理解计算机系统(csapp)》这本书,它适合于在学完了计组和OS之后再回过头来系统地学习一遍,或者学完了他之后在学计组和OS,但如果只学它是不够的,某些被它坑了的学校学生应该要有危机意识(包括哈工大),需要再系统地学习一遍OS,计组可以简略学习。还有就是《现代操作系统》这本书,建议不要将他作为教材,内容太多太杂,而且字很小,本人买回来再也没看过了。 ヽ(ー_ー)ノ
- 计算机网络:基本与OS是同等量级,需要吃透挖深。在实践中会更考察应用层和传输层的理解与应用,最好能深入理解socket编程,后面在讲热门软件技术的时候还会再来提。比较推荐哈工大的计算机网络mooc,业界评价比较高,书籍的话推荐《计算机网络:自顶向下方法》,是一本很不错的书。
- 数据库系统:高校的数据库课程会将这一块的体系分为 数据库概念与sql、管理方法、数据库实现结构这三部分,建议按照这个主线来学,能养成系统的价值观,不要一上来就啃mysql大部头巨著。比较推荐哈工大的数据库mooc,战德臣和邹兆年老师都很不错,书籍的话推荐《数据库系统概念》,虽然我买来并没有看过,全看课件去了hhh
- 软件构造:这门课会教你一些基本的软件开发的理念与设计原则,适用于软件开发启蒙,推荐MIT的软件构造。但这门课仅限于软件开发启蒙,远远达不到校招的要求。
- 离散数学:包括集合论图论、数理逻辑这些,基本上只有图论相关的知识会用到一些,不然基本在后端开发中存在感很低。
- 编译原理:稍微学学就行,不要让他浪费太多时间,不过利于养成整体的计算机素养。推荐国防科大的B站视频,一定不要去看哈工大陈鄞的编译原理mooc!!!
- 软件工程相关专业课:如果你是软件工程专业的话,软件工程导论这种课会教一些软件开发流程与项目管理相关的知识,作一作了解即可。如果有软件架构与中间件这样的课程,可以好好听一下,他可以提纲挈领地让你有软件架构的思想,不过仍然需要自己深挖与实践。
热门软件技术
笔者为了划分出这一部分,是因为这一部分更偏向于企业级应用,而非停在专业课那种理论的程度上,内容会更难更深。绝大部分的内容都可以在B站的黑马和尚硅谷两家学到,二者已经是对标业界较高标准了,将零散的技术串成体系,辅以简单项目,极大地加深理解,足以应付校招甚至社招中的绝大部分知识点。同时也可以看看JavaGuide,可以了解大概的知识体系。
- J2EE开发:基本的软件开发流程,如果时间充足,建议从java基础学起,再到javaweb、springMVC、SSM、springboot,一定要有项目实践。黑马和尚硅谷两家的教程都可。
- 并发编程:这个算是面试的重点了,推荐黑马的java并发编程,一定要细看,每一个视频的实例都要吃透,他从原理、设计模式、应用三个方面都有很深的讲解,其中有消费者-生产者模型、线程池模型、阻塞等待的模型,这些都需要重点学习,是以后与面试官谈判的重点。除此之外可以看看《java并发编程的艺术》,其中重点讲了JMM,是黑马没覆盖到的。《java并发编程实战》《java多线程编程核心技术》基本都被黑马涵盖了。
- 网络编程:可能你在计网这门课中实现过简单的http代理服务器,但用过什么样的服务器模型?一个请求一个线程,还是线程池,抑或IO多路复用?以及Reactor和Proactor的模型有了解过吗?这里需要你深入了解IO多路复用这种模型,同时熟悉一两个用到这种模型的框架,比如netty、redis的通信模型,如果可以,最好用netty写一些demo,如果你会netty了,那么你基本上可以写其他的所有开源框架,zookeeper、dubbo。推荐黑马的netty教程。
- 不一样的计网:传输层和应用层大有可为。https的流程建议熟记,对称加密非、对称加密加密得要能说个大概、http2.0 http3.0、谷歌的SPDY、QUIC、应用层WebSocket建议了解。推荐《图解http》。
- mysql、redis:如果认真学习了数据库系统这门课,mysql学起来会简单很多,推荐尚硅谷的mysql教程,以及《Mysql技术内幕:InnoDB存储引擎》《高性能Mysql》,初学者建议阅读前者,重点是MVCC、索引、锁、事务。redis相对简单很多,可以直接看《Redis设计与实现》,同时注意缓存相关知识点。
- 加分项-分布式系统:分布式理论与算法,CAP、BASE、Paxos、Raft、负载均衡;分布式存储,数据库分库分表、分布式缓存、分布式ID;分布式框架:基于观察-监听模式的zookeeper,用处有很多,Zookeeper八种应用场景_gan_badie的博客-CSDN博客_zookeeper应用场景。RPC远程调用框架Dubbo,要注重zookeeper在其中发挥的作用。springcloud,集大成者,建议先深入学习前两者再来总结一遍,会有更深的体会。消息中间件:RabbitMQ,Kafka,注重理解他在分布式系统中的作用。建议根据相关技术去B站搜索尚硅谷或者黑马两家的视频,或者MIT分布式系统这系列的课程也是很不错的。
- 加分项-Linux:Linux系统的实现与原理,得要在OS的基础上更深入的学习,适合有时间的同学,将其纳入学习计划,长期学习。推荐《鸟叔的Linux私房菜》《Unix环境高级编程》《Unix网络编程》
- 加分项-云原生技术:docker、k8s,最好能熟练使用docker,可以为你以后的开发节省很多时间。同时可以将k8s与分布式系统相关的知识结合着学习。推荐尚硅谷的docker教程、张磊的《深入剖析kubernetes》。
- 加分项-大数据:hadoop spark Lambda架构等分布式计算框架与组件,如果你做过类似推荐系统的项目,可以将这些与前面学过的分布式理论与框架结合起来对比着学习。推荐尚硅谷的推荐系统教程。
java技术
- 集合Collection:建议了解典型jdk源码,包括Vector、Stack、ArrayList、LinkedList、TreeMap、TreeSet、HashMap、HashSet,怎么扩容的怎么设计的,底层怎么实现的。java.util.concurrent包下的并发集合,ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue等,都建议了解源码极其实现。这部分资料比较零散,可以看看网上的博客,东拼西凑,自己再总结一下也差不多了。
- jvm:java虚拟机,是java语言面试的大头,建议系统学习,这方面推荐尚硅谷和黑马的教程,尚硅谷可能过于详细,适合有时间的同学,黑马的简略一些,但该有的实践操作基本都有,建议跟着周志华《深入理解java虚拟机》一起学,更有系统性。切记不要埋头读《深入理解java虚拟机》,不应用实践是记不住的。
- 热门框架源码:
1. spring框架,B站应该会有很多讲解原理的教程,还有手写spring的教程,有时间的朋友可以试试。
2. netty框架,学习黑马的时候可以稍微跟着学一下,注意抓准基本脉络。
3. 并发类,java.util.concurrent包下的类,建议都学学源码,了解基本的并发设计思想。
4. 分布式框架及中间件,rabbitMQ、zookeeper、dubbo,这里可以实现一些简单的demo,了解大致的流程和设计思想即可,极其在分布式系统中的作用与地位,最好再横向对比一些。
算法能力
这里主要对应编程题部分,但归根结底还是数据结构与算法能力,基本上通过leetcode做题就能达到不错的高度,主要包括其中的hot100和剑指offer部分,建议这两个都过一遍,然后总结一下知识点。可以放心的是,这部分的算法相比学生时代接触的算法竞赛会简单很多(比如洛谷中的OJ算法题)。
项目经历
主要包括学科竞赛、项目、做过的开源项目或demo。但要注意,写在简历里面的项目经历最好不要是自己做着玩的简单项目,最好有个凭借(学科竞赛,学校项目,创业项目),当然,现在学科竞赛多得很,在获得技术能力的同时如果还能得个奖项或者保研加分还是不错的。
我在简历中提到了三个项目:

其实可以看到,难度是循序渐进的。从简单的代码重构,到javaweb开发,再到更有挑战性的聊天系统。同时需要注意,做项目可能只是运用一个技术,上手即可,切记要在后来研究一下你所使用的技术的底层原理,比如如果你用了spring,得会spring基本的原理和思想,如IOC和AOP,整个的请求处理流程;如果你用了netty,你需要说出背后的IO多路复用以及责任链模式;如果你用了zookeeper+dubbo,你应该跟面试官谈谈分布式协调算法和高可用高可靠高性能的理论。切记,不能只会调api。
要注意的是,不要仅仅只会简单的web应用,例如商城、管理系统,面试官往往是会看不上眼的。就比如本人的第二个项目,华为只是顺带着问了spring和Mybatis,更多的,字节三面都有问到这个项目的区块链、智能合约和凸包匹配算法。相对来说,面试官可能更喜欢你造轮子,以本人作为例子,比如http/https代理服务器,阻塞队列和线程池的原生java实现,netty的多Reactor多线程的通信模型模拟实现,基于netty和WebSocket的仿RabbitMQ消息队列实现,基于redis、lua脚本、rabbitMQ的秒杀系统实现,这些都是面试的时候不错的谈资,但相对来说难度也会很大。
综合思维能力
某种意义上说,这也是在做项目的时候需要培养的能力,即方案的设计能力、代码调试能力、问题的解决能力、计算思维与素养。这方面往往会对应着面试中的场景题和项目难点。其实某种意义来说,他们更考察系统架构的思维和素养,而非仅仅是后端。
- 场景题:比如说,海量数据如何排序?海量数据如何寻找中位数?海量请求如何有条不紊的进行?大容量存储怎么完成?这些需要多看看这方面的面经,综合之前学过的基础知识,更重要的是分布式高并发方面的知识,才能给出一个比较好的回答。
- 项目难点:这部分可能是你在做项目的时候,囿于眼界或者能力,根本没考虑到或者无法解决的问题,这个时候有这丰富经验的面试官往往会与你进行一个深层的交流。比如我在蚂蚁CTO线一面的时候,面试官问我,如果用户量大了,这个系统可能根本无法运行,各个模块之间耦合死了,你一开始预期的用户量是多少呢?我说没有过预期,后续可以迭***。然后他说,需要注意到,后期很可能迭***不了的,需要一开始就有预期。我觉得他说的很有道理。还有一个例子就是字节二面的时候,面试官揪着我的聊天消息签收这一点,说如果网络断开连接了怎么办,消息有可能会重复发送,客户端如何感知,如何设计一个可靠的消息传输又不会太复杂。这个确实我在设计的时候把这个问题忽略了,面试官很敏锐地重拳出击,但这时候不要慌,根据学过的计网、见过的软件系统,跟面试官切磋切磋想法,就算不成熟也没事,要让他看到你的思考。
如何准备校招面试?
咱们都是经过高考的人了,甚至很多朋友都经历过考研,学习一个东西的步骤无非是:学习基本概念 -> 使用并实践 -> 反思与总结,可能很多时候,如果只是背八股,只会停留在第一阶段。下面说一下本人的准备过程。
- 信息渠道:招聘是一场信息战,你应该在准备面试前对你要面试的公司与岗位有个清晰的了解,有没有坑,具体能招多少人,发展前景怎样,技术栈是什么,慎重考虑之后再投简历。渠道包括牛客网、脉脉、leetcode、Boss直聘这些。
- 学习方法:在上面学习的模式上,对于编程的学习,我觉得应该再加两个步骤,总的应该是:学习基本概念 -> 使用并实践 -> 深入学习原理 -> 反思与总结 -> 横向对比与升华,如果有余力以及时间的话,甚至可以手写一些demo。
- 时间安排:这个得要看个人习惯,有的人喜欢把时间规划到每一个小时,但我更偏向于有个大致的时间安排,因为我很可能学一项东西入了迷就是学习一天,但不管怎样,既然要面临求职了,就得有高效的学习计划,把每个技术点都提进日程。
- 生活习惯:少睡懒觉,摈除惰性,少熬夜,但要注意劳逸结合、注重饮食与运动,压力大了就去跑跑步健健身,一天学到晚反而会使得效率变得很低。
- 压力排解:在准备和进行面试的过程中会有着各方面的干扰,网上的消息也是半假半真的,要敏锐警觉,但又要坚定从容。及时排解压力,可以找对象或者好朋友倾诉一下,但也不要老是说,否则也会给别人带来困扰的哦。
常见的面试技巧?
- 容貌衣着大方整洁,拥有时间观念,注意基本的礼仪,保持谦逊,甭管你有多牛逼,千万不要怼面试官,你做的东西放人家那儿应该只是个小儿科。
- 尽量在面试中由自己把握节奏,面试官一开始的提问往往是广而泛的,这时候需要你有条不紊地往你熟悉的地方去带,如果不是那种压力面,人家应该不会轻易打断你,但也要注意话题的时长,一般最长五六分钟就可以了,及时结尾。
- 注重与面试官交流,如果你实在不会,人家一般会给一些提示,要顺着他的提示给出自己的一些思路,就算不成熟也没事,除非是大块的知识点的空白,否则不要直接说不会。但也一定不能不懂装懂,否则会死的更惨。
简历怎么写?
简历这一关也是很重要的,网上有很多简历优化教程,总结来说无非是突出重点、简洁明了、排版优美。尤其注意会啥写啥,不会的一定要在面试前补上,不能乱吹牛逼。
写在最后
这篇文章基本上是倾尽了本人所能,介绍了Java后端的基本学习方法与技术路线,即使是寒冬,也希望你能找到自己的价值定位与人生追求,加油!
#学习路径##实习##秋招##春招#