如何高效准备后端校招

简介

这是一篇主要介绍后端方向如何准备秋招,准备过程中应该获取哪些资源,以及相关的优质资源从何获取的文章。笔者经历了2022年秋招寒冬的困境,从算法转开发,用不到三周的复习时间,侥幸拿下大厂offer,并在2023年指导新同学在秋招中拿下多家大厂offer,深知选择大于努力的重要性,有时候在正确的方向上稳扎稳打,要好过盲目摸索,达到事半功倍的效果。
本篇文章的目的在于给出一个清晰的校招复习和准备的思路,给出复习中应该重点关注的内容。文章的建议不是最优的策略,你可以按照个人的实际情况加以调整,选择性的阅读。对于每个小节,笔者会说明哪些部分是准备的重点,以及每个部分各自的重点内容有哪些,方便你进行参考,合理调整自己宝贵的秋招复习时间。
在写这篇文章之前,笔者阅读了尽可能多的后端校招路线相关的文章和资源,并且文章中的内容都是基于笔者亲身经历和已经有的成功案例。
本篇文章的内容有点长。当然,如果有时间,笔者非常建议你耐心读完,相较于整个秋招期间需要阅读的资料数量,本篇文章的性价比还是非常高的。文章涉及的资源笔者都曾亲自通篇阅读筛选过,会针对性的给出阅读建议。

  • 如果你是后端方向的校招生,同时目标岗位是java开发,那么整篇文章的内容都非常适合你。
  • 如果你是后端方向其它语言岗位的校招生,例如C++、Go等,那么文章中除java相关内容之外的部分能够帮助到你。
  • 如果你是前端、客户端、算法岗(nlp、cv、搜广推、机器学习等)等岗位的校招生,那么和后端技术栈相关的内容不太适合你,其余内容能够提供一定的帮助。
  • 如果你是测试、基础架构、数据库方向的校招生,请选择性的阅读和后端技术栈相关的内容
  • 如果你是大数据方向的校招生,整篇文章的内容都很适合你,除此之外,我会找时间另外写一篇文章来介绍大数据秋招应该额外准备哪些东西

如果喜欢笔者分享的内容,欢迎关注个人公众号:埼玉同学

算法

虽然算法小节的篇幅不如后续的八股部分,但丝毫不影响其重要的地位。在笔者看来,算法的复习和练习应该占到整个校招复习至少1/3的时间,其余的2/3才是八股和项目。如果你的算法能力不过关,那么即使你八股背的非常好,甚至项目做的极其优秀有时候也会难逃被pass的命运。大部分互联网大厂在面试前都会有笔试环节,且据笔者和身边的校招伙伴观察,是存在及格线这种隐式条件的,也就是说如果你的笔试成绩很拉跨,基本是不可能得到面试机会的。最直观的就是菊厂的笔试,没过及格线直接pass掉,笔者有同学由于没有认真准备笔试,就吃过这个大亏。还有一些厂虽然没有明示笔试成绩的重要性,但是根据这两年的身边同学的面试情况,笔试越好的,通常能越早得到面试机会,如果这些更早面试的人里面把offer拿了,也就没有后面的同学什么事了。再退一步讲,假设你得到了面试机会,如果在面试过程中,面试官给你出的笔试题你不会做,肯定会是你面评的减分项。之前就有google面试中有某位开源大佬因为算法题没做好被拒绝的先例,虽然感觉有那么点不客观,但是算法是互联网技术岗面试“硬性条件”这件事很难被直接改变。
上面花了这么大篇幅说明是希望引起你对算法复习的重视,不是一带而过。很多时候,如果笔试成绩非常好,或者面试过程中出现的笔试题正好是你非常熟悉的,会直接从精神层面给你带来正向反馈,让你后续的面试更有自信。

对于校招算法这部分的优质资源,笔者推荐下面三个:

  1. Hello算法(https://www.hello-algo.com)
    Hello算法是靳宇栋(@krahets)开源的数据结构和算法教程,得到清华邓俊辉教授和亚马逊首席科学家李沐的推荐。笔者阅读全部章节之后也感觉是非常好的一本算法入门书籍,其最大的特点是用清晰连贯的动画和可视化运行的代码让读者更容易理解各类数据结构和基础算法。
    笔者比较推荐Hello算法作为校招算法复习的第一份资料,因为通过这部分的复习也间接的完成了CS基础课数据结构部分的复习。如果你本科的数据结构和算法课程学的不错,可以对自己掌握不是很牢固的部分选择性的进行阅读。如果你通篇阅读,还能补齐一些被忽视的知识点,例如浮点数的编码,笔者在面试时就被问到过知道float和double单精度和双精度的区别吗,底层编码形式是怎样的,相信阅读过后你就能很好的回答这个问题。
  2. 代码随想录(https://www.programmercarl.com)
    代码随想录是由哈工大毕业生、ACM亚洲区域赛奖牌得主-程序员Carl开源的算法题解集合。代码随想录是笔者秋招时期唯一的算法复习资料(因为那时候Hello算法还未开源),涵盖了大部分常见算法题的题解,并对不同种类的算法题给出系统性的解题思路,这对解决同类型的其它算法题很有意义。依然记得初次阅读题解时候的愉悦感,尤其是双指针法、回溯算法、动态规划,在本科的数据结构和算法课上,基本没有接触过,平时练习时也不够系统,阅读完题解再去刷LeetCode,感觉效率和自信一下就上来了(该说不说,动态规划的题真的难,不会的还是不会)。推荐阅读完Hello算法之后进一步阅读代码随想录。
    值得一提的是,笔者为了快速的进行复习,所有初次见过的算法题都是先阅读题解,理解后,再去LeetCode盲敲一遍,中途出错了说明理解不够深刻,就回来阅读第二遍。这与很多人先自己做,不会再看题解的方式大不相同。笔者这样做是为了节约最初思考的那五到十分钟,因为笔者认为,在题解复习时遇到的大部分新题,例如动态规划,不会就是不会,思考的意义不大,在不知道大体的解题思路的情况下,很难短时间得到答案,这时候直接阅读题解就来的更有性价比。通过这种方式,笔者也在五天的时间内阅读并做完了代码随想录全部的题解(除了吃饭和睡觉都在做题),如果时间充沛的话不建议这样尝试,笔者仅是因为距离秋招时间太短,才不得已而为之。笔者认为最好的算法题练习方式是一天两到三题,持之以恒一年以上,基本就有近千道的刷题量了,期间以周和月为周期,重新做一遍之前掌握不牢的题。
  3. LeetCode-Book仓库
    以上的两个资源属于笔者认为算法复习比较好的理论资源,称之为理论是因为它会给从来没刷过算法题或者算法题做的很少的同学以高密度的知识输入。学习了相关知识后,如何进行有效输出变的至关重要,实践是检验真理的唯一标准,所以后续持续的在LeetCode上练习是巩固知识的不二途径。
    不过这时候问题又来了,LeetCode题那么多,天天刷也刷不完,又想短时间尽可能多的复习,那就要做一些精选题。这里推荐Hello算法作者krahets开源的另一个仓库“LeetCode-Book”。推荐里面的“Krahets笔面试精选88题”(https://leetcode.cn/studyplan/selected-coding-interview ),整理了“剑指 Offer”和“LeetCode热题100”的高频笔试题。 其中大部分题在代码随想录中已经见过,可以作为二次巩固,随后就是针对自己薄弱的模块进行复习,例如,如果对图论和动态规划掌握不牢固,可以直接在LeetCode中选择相关主题的题,并选择中等难度以上的题进行练习,简单题没有再次练习的必要,除了增加自信之外,不能实质性提升你的解题能力。时间充裕的话还可以参加LeetCode的周赛,实战检验一下自己的练习成果。

大厂算法笔试的难题中动态规划和图论相关出现频次较高,通常情况下没有思路很难通过暴力解法AC,这类型的题只能通过多练习多总结来不断提升。

CS基础课

1. 数据结构

数据结构是CS最为基础的课程之一,基础到它的排课通常在其它所有基础课之前(编程语言课除外),因为在CS中,数据结构无处不在。数据结构也是面试中最爱考察的知识点之一,这一块的内容大部分在Hello算法中都涉及到,但在笔者写这篇文章的时候,依然有一些重点知识没有被涵盖,包括:红黑树、B树、B+树、哈夫曼树。这些知识点在面试过程中会穿插的被问道,例如考察MySQL InnoDB引擎的索引结构时间接考察你对B+树的理解,为什么不用B树,或者在问Java HashMap底层实现的时候问你红黑树等。值得一提是,对于最小生成树算法(prim、Kruskal等)和最短路径算法(Dijkstra等)这些非常经典的算法,面试中确很少出现,可以不作为重点复习的内容,但是最好看一下原理,万一考到呢。相比之下,排序算法简直就像必考题一样,你的秋招面试中必定会有一次面试被问到排序算法的相关内容,甚至直接叫你手写快排之类的都不足为奇,这基本被认为是基本功。需要提醒的是,对于排序算法,其时间复杂度是需要记忆的,包括最差、平均和最优时间复杂度,以及排序算法之间的比较,各自的优势(例如从时间复杂度和空间复杂度上来说,堆排序都不逊色于快排,为什么实际的应用中快排要更受欢迎;Java的Array.sort底层为什么同时使用插排、快排和归并排序等)等等。对于Hello算法中没有的内容,可以自行google或者百度。容易被忽视的是排序算法稳定性这个概念,相信有很多同学不知道这个概念的含义,以及具体哪些排序算法是稳定,又为什么是稳定的,这些在复习的时候也要注意,在Hello算法中都详细说明了。

2. 计算机组成原理

计算机组成原理比较偏硬件,其实可以不用通篇从头到尾特别复习,鉴于目前网上没有文字版本特别系统的复习资源,如果复习时间非常充裕,建议观看哈工大计算机组成原理公开课(https://www.bilibili.com/video/BV1t4411e7LH?p=63&vd_source=4a3d8b15e503ef4145bcbac891d62547 )。
笔者和同学实际秋招中被问到的相关内容主要有以下两部分:

  • 无符号数有符号数、浮点数表示:了解一下整数和小数在计算机底层分别是如何表示的,涉及原码、补码、反码的知识。
  • 高速缓存Cache:包括L1 cache、L2 cache和L3 cache,也就是常说的CPU三级缓存,快排相较于堆排的优势之一就是能更好利用cache。

3. 操作系统

操作系统部分的复习资料推荐“小林coding-图解系统”(https://xiaolincoding.com/os)。
小林coding的风格一直以图解为特点,并且他所有的系列文章都特别出彩,非常推荐。关于上述计组中CPU高速缓存的内容在“小林coding-图解系统”也有涉及。操作系统的全部内容都需要过一遍,其中的重点内容需要多过几遍,包括:CPU缓存相关内容、虚拟内存相关内容、进程间通信方式、死锁、页面置换算法(最好会手写LRU,提示使用LinkedHashMap实现)、I/O多路复用(select/poll/epoll)、一致性哈希算法(如果有负载均衡相关的问题基本都会问道)。这些重点内容都是笔者和同学在实际面试中遇到的高频面试内容,你可以根据自己的掌握程度进行针对性的复习。其实有的读者能够发现所有的这些高频面试题都是各类主流软件设计中需要考虑到的技术点,越是实际开发中容易遇到的点,在面试中也越容易被问道。

4. 计算机网络

计算机网络的复习资料推荐“小林coding-图解网络”(https://xiaolincoding.com/network)。笔者是从图解网络开始关注小林coding的,图解网络也是笔者认为整个图解系列最为出彩的一部分。

计算机网络的考察频率在笔者看来基本是CS基础中的Top2,仅次于数据库。特别是TCP和HTTP,和排序算法一样,基本是必考点,不用担心复习了确不会考的情况出现,对于TCP和HTTP,即使再细枝末节的内容也会被问道,所以这两部分的全部内容都是重点中的重点,尤其重点的有:TCP的三次握手和四次挥手过程、HTTP和HTTPS建立连接的过程。容易忽视且复习了又容易忘记但是面试偏偏又喜欢考的点包括:HTTP各版本之间的差异、HTTP的状态码(真的会谢,大类不会忘,小类记不住)、TCP/IP网络模型和OSI七层模型(这个小林coding没有,可以看CS-Notes)以及各层常见协议、IP相关的各种协议、IPv4和IPv6的差别、IP地址的分类(这个笔试选择题经常考)。其余的内容建议认真过一遍“小林coding-图解网络”,其中有个关于键入网址到网页显示期间发生了什么的问题也是面试常客,不过笔者感觉“小林coding-图解网络”对这个问题的解答虽然很细致但过于繁琐,以至于你看完之后可能在回答问题的时候不能很好串起来,其实可以大体总结为URL解析->DNS解析(得到IP)->根据IP建立连接(HTTP或者HTTPS以及TCP)->基于连接发送数据->服务器响应->页面渲染。

值得一提的是,笔者认为复习的过程不是简单的平铺直叙形式的复习,这样的复习方式很容易忘记复习的内容,一定要带着思考,带着问题,带着重点去复习。例如在复习HTTPS建立连接的过程中,读者是否思考过为什么对传输信息和密钥要分别采用对称加密和非对称加密两种加密方式,只用一种可以吗?这个问题的答案在“小林coding-图解系统”没有很好的解答,只提到了因为性能的问题,笔者在凤凰架构的架构安全性-传输小节(https://icyfenix.cn)中找到了这个问题的答案。非常有意思的是,笔者是在给同学复习指导时提出的这个疑问,而在几天后的面试中,正好有面试官问了这个问题,这位同学也非常好的回答了出来,这在面试时能够大大提升面试者信心的。所有的资料都无法做到面面俱到,读者也可以尝试着带着问题去阅读,必然也会有自己的收获。

5. 数据库

数据库的复习主要分为两部分,第一部分是SQL,第二部分是数据库理论。
有很多同学在复习的时候会忽视SQL的练习(包括我),相信大部分同学在数据库课程之后已经多年未再拾起SQL,笔者和23届校招同学的笔试或者部分面试环节的笔试中都曾出现过手写SQL题。SQL题如果有复习基本都不是特别难,大多是给一个场景多张表,表之间通过关联、分组、排序等操作完成最终查询。
SQL的语法复习推荐“CS-Notes”的数据库部分(https://www.cyc2018.xyz/数据库)。里面附带了部分练习题,除此之外LeetCode也有专门的SQL练习专题,过一遍足以。
数据库理论的重点复习内容包括:范式、事务、锁、事务的一致性问题、事务的隔离级别。其中除了范式之外的内容都可以在复习MySQL的时候重温,所以这里可以不用特别复习,范式部分的复习同样可以直接阅读“CS-Notes”。

6. 设计模式

设计模式其实不是一个独立的基础课程,但是它是面向对象设计中非常重要的一部分,也是面试中的常客。
设计模式的复习资料同样推荐“CS-Notes”的设计模式部分。包含清晰的UML图例、原理讲解和相应的代码实现。
23种设计模式全部熟练记忆的其实非常困难(因为还要会写对应代码),笔者认为其中最为高频出现是单例模式及其各种实现,特别是线程安全的单例模式,例如双重校验锁,这个是笔者和同学在面试时遇到最多的设计模式相关问题。要能够熟练的手写相关代码。
其余的设计模式笔者认为要根据你的项目和技术栈中可能用到的来重点记忆,例如笔者的项目中用到了动态代理模式,所以相关的代码也需要熟练掌握。其它的诸如工厂模式、责任链模式、生成器模式等也都是编码或者中间件中经常用到的设计模式。

7. Linux

Linux其实也不属于CS基础课,但是已经属于计算机专业必备技能之一。大部分读研的同学或多或少应该都能够简单的使用Linux,除非从来不使用服务器跑代码。有过云服务器部署经验的同学应该也比较熟悉Linux。不过使用和能完美应对笔试差距还是很大的,所以除非你对Linux了如指掌,建议还是阅读下面两个资料之一,过一遍基础知识,特别是重要指令。快速的话大致两个小时就能全部阅读完。

  • cs-note:https://www.cyc2018.xyz/计算机基础/Linux/Linux.html
  • java全栈知识:https://pdai.tech/md/devops/linux/linux.html

CS基础理论课的复习资料和建议到此基本就OK了,读者们到实际面试过程中就会发现操作系统、计算机网络和数据库(或者都可以称为MySQL了)三大巨头是需要不断重复复习的,因为重点内容太多太杂。数据库的话基本都是问MySQL所以按照后续MySQL部分的建议重点复习就行。

后端技术栈

后端技术栈需要复习的内容特别多,所以有必要强调一下重点,并非下面所有的内容都需要复习,因个人的项目经历而异。唯有MySQL和Redis双巨头无论是啥项目,你都要重点复习。

1. Java(其它语言直接跳过)

Java的复习资源太多太多了,但是一定要挑一个的话,笔者还是推荐JavaGuide(https://javaguide.cn/home.html)。一定要解释原因的话,就是非常全,很省心。但是,是的,我要说但是,正如其名字所示,这是一个指南性质的资源,所以很难保证对各个部分都做到细致入微。其实如果你们有阅读过周志明老师的“深入理解Java虚拟机:JVM高级特性与最佳实践”一书,你们会发现市面上几乎所有的和JVM相关内容都涵盖在这本书中,所以如果有时间,非常推荐读一下。JavaGuide中对于各种垃圾收集器的介绍比较的简略,所以这里推荐另一个资料“Java全栈知识体系”的Java JVM部分作为互补(https://pdai.tech/md/java/jvm/java-jvm-x-overview.html),“Java全栈知识体系”的写作风格也非常细致,笔者相信阅读完之后你对JVM的理解能够更上一层楼。其余部分如有必要,读者也可以以JavaGudie为主,根据目录和这份资料一起互补复习。例如泛型、反射、SPI机制、JVM中锁的优化等在“Java 全栈知识体系”有更为详细的论述。
值得一提的是,笔者依然提倡带着思考去进行复习。读者在复习过程中不难发现很多技术点之间进行比较的问题,例如synchronized和ReentrantLock的区别,换个思路,是不是也可以考synchronized、volatile、lock、CAS、Atomic这些并发编程技术之间任意两者之间的区别。考察技术点比较比考察单一知识点更难,需要读者对各个技术点的优势和劣势有深刻的理解。

OK,扯远了,还是强调一下Java部分的重点复习内容,包括:

  • 基础知识:数据类型(float底层了解吗),String相关的知识点,泛型、反射、序列化,以及特别强调一下各种内部类,笔者就曾被考过什么时候用内部类,静态内部类呢,为什么?读者们能够准确回答出来吗,相信很多同学复习的时候会忽略这点。
  • Java Collection集合类源代码:特别是ArrayList、LinkedList、HashMap、ConcurrentHashMap、LinkedHashMap。 但凡涉及源码复习都要仔细,不然阅读源码的意义全无,例如面试官要是考你HashMap底层何时由链表变为红黑树、ArrayList何时扩容时要能够非常精确的回答出来,否则源代码阅读将功亏一篑。
  • 并发编程的重要概念:synchronized、volatile、lock、CAS、Atomic、JUC
  • JUC中的线程池及其源代码:线程池单拎出来是因为其特别重要,一定要做到对线程池初始化有哪些参数,每个参数都是啥都了如指掌,对线程池的源码也要吃透,能够清晰的复述整个线程池的工作流程。线程池是实际工作中必不可少的技术点,用不好很容易导致性能问题,所以也是面试官爱考的点。
  • IO:BIO、NIO、IO多路复用还有AIO,顺便了解一下零拷贝,因为笔者的项目中用到了Netty所以对这一块特别熟悉,如果你的项目中有涉及IO多路复用等技术也建议多了解一点。
  • JVM:内存区域、垃圾收集器和类加载机制三巨头。这一部分的复习要注重原理,要多思考多比较,例如如果面试官考你从关注用户体验和吞吐量上来考虑应该分别用哪些垃圾收集器,为什么?如果没有带着思考去复习,很难回答好这个问题。
  • 新特性和实战:新特性这一块对jdk 8的新特性要比较了解,目前jdk 8还是用的最广泛的。能促使大家把jdk 8升级也就是后续引入ZGC收集器了(15引入,21完善),毕竟ZGC可是号称亚秒级停顿,并且吞吐量不逊色G1,不用再为JVM调参烦恼,谁能不爱。实战其实就是一切调试排错技巧,这些在资料中也都有。

2. MySQL

以秋招快速复习为目的,MySQL笔者只推荐“小林Coding-图解MySQL”(https://xiaolincoding.com/mysql)。本身讲解非常清晰,加上知识点非常全面,足以应对秋招MySQL方面的问题。
MySQL的重要复习内容包括包括:

  • 索引:最重要,也基本是必考点,除了考察索引B+树的结构之外,还会非常容易考察诸如索引下推、覆盖索引、索引失效等知识点。对索引的认知一定要深刻,甚至一提到索引,就能浮现出索引的实际数据结构图(深刻理解索引结构后,在面试官问到InnoDB引擎下单表推荐的数据是多少时才能更加游刃有余的回答,例如从索引中单个数据叶的大小分析到三层索引和四层索引所能容纳数据量,进而从io性能损耗给出较为合理的回答),能清晰的知道聚簇索引和二级索引的结构图差异,从而能够知道为什么会有回表操作,以此又引出诸多索引优化相关的话题。
  • 事务和锁:笔者认为事务和锁是具有强关联的两个模块,所以把它们写到一块了,理解好了各级别的锁,才能更好的理解事务。事务的重点就是隔离级别,这里会涉及到MVCC的概念又会引出日志系统中的undo log。
  • 日志:日志系统其实就是binlog、redo log和undo log三剑客。其中binlog和redo log主要用于保证数据不丢失,undo log主要用于事务回滚和MVCC。其实binlog才是MySQL特有的日志,而redo log属于InnoDB引擎,这里又引申出MySQL引擎的特性,读者复习时都要注意。这里考你一下,知道为什么有binlog了,innoDB还要特意实现一个redo log吗。带着思考阅读小林coding相信你能有答案。

3. Redis

Redis同样推荐“小林coding-图解Redis”(https://xiaolincoding.com/redis)。
缓存在后端技术栈中是个特别重要的概念,因为单机内存大小的限制,像Redis这类分布式缓存技术基本是所有大型系统必备的中间件,而Redis是其中最流行的一种。各个大厂各自实现的分布式缓存多多少少都能从redis中汲取到相似的技术点,工作之后也基本免不了和它打交道,所以Redis的面试频率仅次于MySQL。

Redis的重点复习内容包括:

  • 数据结构:这个部分很容易成为面试中Redis的第一个问题,需要注意的是不仅需要记忆各个数据结构和底层实现,还要记忆哪些场景适合用这些数据结构。
  • 线程模型:这个是一个很容易混淆的问题,首先明确Redis就是单线程模型,这个很重要,然后在网络I/O上后续引入了多线程模型,也仅仅限制于I/O部分,实际执行命令时还是单线程。
  • 持久化:AOF和RDB。这里突击问一下,知道Redis默认持久化策略是啥吗?具笔者所知,有一些大厂内部实现的高性能分布式缓存是默认关闭持久化策略的,因为持久化过程会造成额外的性能开销,在部分缓存数据极大,例如上百G的缓存,进行一次持久化带来的影响是不可接受的。但是这不妨碍持久化是个重要的考点。
  • 过期删除和内存淘汰:这个还是很重要的,策略比较多,但是比较有规律,按类别记忆即可。这里需要重点说一下Redis的过期淘汰是惰性的,这导致其实有时候使用redis ttl过期机制是不精准的过期,如果对时间要求很精确,比如需要ttl一到就必须马上过期的业务场景就不适合用Redis,这就是考察底层原理的重要性。
  • 缓存:缓存雪崩、击穿、穿透三剑客,笔者最开始老是记混。。。你们复习的时候要注意,笔者第一次面试中就把它们搞混了,这个出现的频率也很高。
  • redis 高可用:主从复制、哨兵机制、redis cluster

4. 消息队列

在非单体的后端架构中,消息队列也是一个非常重要的中间件。如果你的项目是秒杀项目一类的话,消息队列就是必须要复习的知识点了。除了一些通用的概念比如消息队列的优势(解耦、异步、削峰),其余的考点基本都是针对特定的开源中间件来进行提问的。比如你项目如果使用了Apache Kafka就会针对Kafka的实现具体展开,这就要求读者根据自己项目使用的具体MQ来相对应进行准备。目前比较热门的MQ主要就是Apache Kafka和阿里的RocketMQ。这里值得一提的是,如果你对某个mq中间件的理解特别深刻,是容易成为加分项的。因为像MySQL和Redis这类考点基本大部分同学都会准备,而MQ相关的如果你的项目不涉及,面试官基本不会问。所以如果你了解的很深刻,和其它同学相比就有了一个优势项。
MQ相关的系统性的免费复习资源比较少,笔者个人学习时是通过阅读技术书籍和看教学视频的方式来更为系统的学习,但是鉴于它又是比较重要的一个部分,所以笔者这里还是推荐两个比较适合秋招快速复习的资源。

  • 第一个是互联网Java工程师进阶知识扫盲(https://doocs.github.io/advanced-java):比较有条理性的梳理了一些重要的考察点,内容较少,可以非常快速的过一遍,这个是笔者秋招的唯一MQ复习资源,因为笔者项目中没有用到消息队列,就没有特别复习,把本来就不多的时间腾给更需要的地方。
  • 第二个是JavaGuide高性能部分的消息队列小节(https://javaguide.cn/high-performance/message-queue):内容更全面一些,并且有具体如Kafka、RabbitMQ、RocketMQ等相关知识点总结,如果你的项目中有用到消息队列,那么可以详细看一看,并且结合一些面经中高频出现的题进行重点准备。

5. Spring

Spring基本也算是java后端技术栈必考点之一。这个“基本也算是”可能有点绕口,但是这么描述的原因是笔者的秋招中Spring出现的次数极低,一只手能数的过来,最多被问到的也就是IOC和AOP的原理,包括笔者指导的同学也是。后面进行复盘,笔者总结主要原因还是和项目有关系,因为笔者和指导的同学都是以RPC作为秋招重点项目,而且项目中不使用Spring,所以面试官在有限的时间内就比较少考察到项目之外的知识点。并且,很多时候你面试的公司例如鹅厂,可能不是以Java作为主要后端技术栈,Spring也就不那么重要。
不过话又说回来,凡事没有绝对,因为笔者同届的舍友,他的项目就是Spring写的,所以就经常被问到Spring的知识点。笔者非常理解很多同学对Spring的掌握程度仅限于会用,很多同学可能从一开始就是SpringBoot入手,笔者在秋招之前也是如此。但是秋招不会考你会不会用(这是一个很矛盾点),可能有的同学甚至都没怎么用过Spring,但是八股背的很熟,就是比Spring用的很溜但是八股背的不熟的同学有优势,这个很无解。不过八股背的熟悉其实侧面也说明了对底层原理的了解更深刻的一些,有些时候我们还是要沉下心来沉淀一点东西。不过谁叫这是秋招呢,所以还是推荐一些又快又好的资源吧!!!

在笔者阅读过的众多Spring相关的免费资源中(官方文档除外),笔者认为“Java全栈知识体系”(https://pdai.tech/md/spring/spring.html)的Spring部分是最系统,讲解也最深入的。全篇内容包括SpringBoot有点长,笔者认为SpringBoot部分偏实践可以先不用看,日后有时间再慢慢补回即可。重点看一下Bean生命周期、IOC、AOP和MVC部分即可。

6. 其余后端技术栈

后端技术栈是个非常庞大的体系,如果要逐一复习的话两个月内根本复习不完,并且系统性的进行复习也非常不值得,这部分内容笔者推荐的复习方式是通过搜索相应的关键字+面经/面试题来进行快速查缺补漏。所以下面的这些技术栈,读者需要根据自己项目是否涉及来进行针对性快速复习,这部分内容笔者主要按照项目特点罗列一下复习的必要性:

  • WEB容器-tomcat:如果项目是Spring Web有可能会考察,通过面经进行复习。
  • ORM框架-mybatis:如果项目涉及Spring Web和数据库操作,那么有很大概率会考察,通过面经进行复习。
  • Netty:如果项目是RPC,那基本是考察重点,这个是笔者重要准备的内容之一,考察频率比Spring还高。
  • Dubbo:如果项目是RPC,推荐了解一下,时间有限肯定没法深入复习,可以快速阅读“互联网Java工程师进阶知识扫盲”(https://doocs.github.io/advanced-java/)中dubbo相关的内容。
  • ElasticSearch:如果项目中用到了ES的检索功能推荐稍微了解一下,通用快速阅读“互联网Java工程师进阶知识扫盲”和ES相关的小节。笔者的舍友因为项目中用到ES就经常被问。

其余还有很多技术栈根本列举不完,例如Zookeeper(在大部分的分布式中间件中都会使用)、NoSQL数据库、分库分表中间件等等。但是考察频率极低,并且你项目中遇到的概率极低,所以不必特别复习。有一个很明显的现象就是,只要你没在简历或者项目中特别说明你掌握了某项技术,面试官一般是不会特别深入的询问的。最多问一句你有用过吗,没有?好下一个问题。并且因为不是非常非常核心的技术点,没有人能在学生时期掌握那么多的技术点,面试官可能都掌握不全,所以肯定能理解,不会成为减分项,如果被问到,没用过就说没用过,千万不要了解一些就说用过,万一被问深入一点就成了你的减分项,因为在面试官角度,用过却没深入了解=没用过。
还有一个技巧是如果被问到不会的技术,可以引导面试官说虽然我不会这个,但是我会那个,将面试的主场慢慢引向对你有利的场景,然后拿出你特别准备的后手。

8. 分布式架构

分布式架构这一块更多的时候是会和场景题结合出现的,是面试官考察你的架构设计能力、思考能力和实际运用所学知识能力的重要手段。这一块笔者个人非常推荐周志明老师的“凤凰架构”(https://icyfenix.cn/)一书,这本书是完全免费开源的,并且配套有对应的代码。笔者后续有读过很多架构相关的书籍资料和文章,但是从中推荐一个的话“凤凰架构”依然是首选,这本书对与架构(不仅仅是分布式架构)有着非常系统的阐述,书中涉及的知识点非常的全面。笔者觉的对于架构书籍而言,系统和全面非常重要。如果你是第一次读架构相关的书籍,那一定会有非常不一样的体验,就像是打开新世界的大门。有点扯远了,这本书全部读一遍相信应对秋招分布式架构相关的问题绝对游刃有余,但是耗时太久(笔者第一遍速读也大致花了两周时间才读完),并且分布式架构对于校招而言并非那么那么重要(指对考察内容而言,占比不大),更多的时候是一些零散的知识考察。所以我们在复习的时候抓住核心即可。这里不太学术的总结一下分布式架构设计的核心目标:相对于单体架构,使用分布式架构主要是为了更好的提升系统的性能和可用性,即设计一个高并发高性能高可用的系统。这里其实就是两个重点,一是高并发和高性能,二是高可用。笔者列举一下这两点分别可能会涉及的面试点,读者们根据面经进行快速复习即可,时间不够,也不用特别看某个资料。

  • 高并发和高性能:即如何提高系统单位时间内并发处理业务的能力,提升QPS或者TPS,并且单次请求的耗时要短,提升用户体验。相关的考察点包括负载均衡(流量分发)和水平扩容、读写分离、分库分表、合理的系统拆分(如使用MQ和分布式缓存)以及极致的系统优化(例如异步请求、数据结构优化、数据库读写优化、IO优化等等)
  • 高可用:即保证各种情况下系统的可用性,也就是常说的TP几个9。相关考察内容包括分布式限流、异地灾备、服务容错、熔断、降级

此外还有一些分布式理论相关的,例如CAP理论、分布式事务、分布式锁等等。这些读者都可以直接百度相关面经进行快速复习。
分布式架构相关的还会出很多场景题,有很多都是大数据量处理相关的题目,大数据处理的一个核心思想就是分而治之,这一块可以参考“互联网Java工程师进阶知识扫盲(https://doocs.github.io/advanced-java/)”的海量数据处理一节。

还有一些场景题是和架构设计相关的,例如设计一个秒杀场景的架构,主要是为了考察对所学后端技术的综合应用能力,以及是否具备设计高性能高并发高可用方案的能力,如果这类问题能答好势必会成为加分项,所以笔者推荐就算个人项目中没有秒杀一类的项目,也可以搜索一些相关的资料做一定的了解。

项目

项目是秋招中非常重要的一个部分,这部分的比重大致需要占到整个秋招复习准备的1/3,当然如果你对你的项目的“质量”有十足的把握,且对项目细节了如指掌,不怕被问倒可以适当把时间分配给算法和后端八股中薄弱的部分。根据笔者和同学的面试情况来看,基本一半的面试内容都是和项目相关,而且越往后的面试特别是主管面或终面,基本就是全部在问项目。然后回到准备项目本身,为了明确是否有必要花费更多的时间在项目准备上,可以根据笔者下面的分析来对照个人的情况,觉的薄弱了就可以多花时间准备。

  • 为什么要准备项目:项目是面试官考察你实践能力的唯一途径,无论是实习项目还是个人项目。这里有个误区就是有的同学认为没有实习经历很吃亏,其实不然,有实习的同学如果实习期间做的项目比较拉跨、实习期间只是做了小功能或者对实习项目的整体架构掌握不够被面试官问住反而会成为减分项。所以无论是否有实习,都需要保证对写在简历上的项目了如指掌,如果有实习且项目做的很好那当然是加分项。同时,需要抛弃项目越多越好的想法,项目是越精越好,而不是越多越好,作为校招生,有两个能拿得出手的项目足以,这里的足以是指面试官足够问了,一些不重要的项目在简历中可以不写或者简单一提。项目足够好,同时你回答的足够好,面试官才觉的你足够好。一个不好的项目可能面试官压根就不想问,一个好的项目由于了解不深刻答的不好=你没做过这个项目(指对于面试评分上)。
  • 是否需要额外准备项目:有很多同学可能本科或者研究生期间参加了很多比赛,做过很多项目,然后简历上全部都是以前做过的项目。这里需要考虑两点,一是你的项目是否设计精良且具备足够多的技术点。二是你的项目是否和岗位性质直接相关。以笔者举例,笔者有很多算法类的项目(包括竞赛和研究生课题),但是笔者面试的是后端岗位,那这些项目就应该挑一到两个重点的写就行,并且在简历里尽量往后排序。同时笔者本科期间的项目非常多且特别杂,但是技术深度不够或和后端开发没有太多关系,这些项目笔者基本都不写。因此,笔者为秋招特别准备了一个RPC项目,具体参考的项目链接就不放了,避免大家最后的项目都大同小异,就RPC项目而言,大家在github上搜索netty,然后那些带RPC字眼的高star项目都可以借鉴,且很多都有配套实现过程的博客,其它类型的项目如秒杀、商城系统、各种轮子类项目大家基本都能在google或者百度上找到相应的链接,根据个人喜好来就行,只要满足技术点够多且有深度即可。
  • 怎么准备项目:
    • 对于实习项目:你是否了解这个项目解决的问题,为什么要有这样一个项目,了解项目的架构吗,对于里面用到的一些解决特定问题的技术点了解吗,如果上面这些问题能够问倒你,说明你对于你实习项目了解不够深刻。面试官一定会对你的实习项目很感兴趣,并且一定不会浮于表面的问。所以在有机会看到整个项目源代码的情况下,尽量阅读源代码,然后和同事多沟通不理解的地方,项目的git记录中一定指向了某段代码是哪位同事写的,带上零食咨询人家,比自己埋头钻研效率要高很多。
    • 对于个人项目:首先先问这个项目是否具有技术深度,然后梳理整个项目全部的技术点,以笔者的RPC项目为例,涉及的技术点包括RPC整体框架的设计、网络通信的设计(这里会涉及netty的使用,从而需要着重准备netty相关的面试题)、序列化方法(需要对细节有深入了解比如用到的序列化方法的底层实现)、注册中心的设计、负载均衡的设计等等。对于技术点中使用到的后端技术栈需要着重准备。

其实写在简历上的项目面试官不知道是不是你做的,实际不是你做的部分,但是问你的你都会,在面试官视角这部分技术你就是会,实际是你做的,但是问你的你不会,说明这部分你没掌握。是不是你做的不是重点,各种秋招开源项目例如秒杀项目、谷粒商城等面试官知道你是看文档或者视频学的,但是这不重要,重要的是你是不是真的掌握了。这就是项目考察的核心。

简历投递

笔者推荐投20家左右的想去的公司即可,如果对自己的简历通过筛选没有信心,可以再翻个倍。对于进入笔试有信心的同学如果投递太多公司,会导致最后笔试面试极其多,影响到正常的秋招准备。

准备时间

笔者推荐至少准备2个月以上,当然越早开始准备越好。笔者开始写这篇文章的时候以为几天就能搞定,最后修修补补写了快三周,所以提前给自己留好充足的时间。算法部分的复习可以尽早开始,持之以恒。

结语

写在最后,能看到这的同学在毅力上已经超越了一部分人,所以这里笔者想说一些鼓励的话,希望给你们一些信心。首先是不要被自己秋招的不足所影响,开源项目、竞赛、实习、论文(对于算法岗)对于秋招而言确实是加分项,但是不是决定性因素,笔者的同学很多都是没有上面任何一项,但是依然拿到了多家大厂offer。笔者个人也是没有实习没有顶会论文。所以对于本篇文章提到的算法、项目、八股掌握到位才是秋招制胜的关键。然后学历上,如果你已经到了笔试环节,笔者想说学历不再是你的限制,不然你连简历筛选都过不了,已经进入赛场,多发挥你的长处。
对那些对于前途感到迷茫的同学,笔者想说,别人能做的到的,你也能做到。每年都有逆袭上岸大厂的同学,他们并不都是985、211。罗曼罗兰说:“世界上只有一种真正的英雄主义,那就是在认清生活的真相后依然热爱生活”。笔者知道很多同学因为学历、实习、竞赛、论文等其它因素感觉自己差别人一大截,但是在认清现状的同时,能否突破现状,脱颖而出取决于你自己。当你胜利之后,过往的一切标签都不再重要。

致那个为梦想拼搏的你。

最后的最后,笔者会持续地在个人公众号中挑一些重点的开源后端技术栈写一些系统性的和面试相关的文章。如果你对笔者写的内容感兴趣,且希望日后继续看到笔者的一些技术和日常分享,欢迎关注笔者的公众号:埼玉同学。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值