十年老IT知识分享 – 经验分享 | 如何准备面试(构建知识库)

经验分享-如何准备面试

目录

目录

自述

我是从毕业实习校招就进的上家公司,一待就待了三年,项目从简单的 SSM,到 SpringBoot,再到 Spring Cloud 都接触了一遍,想着不能再继续呆在舒适圈了,于是就尝试出来寻找机会。

去年6月起,背了些面试题,直接出去莽了几波,被吊打着回来的,于是又回舒适圈待了几个月,拿个年中和年终,顺带去考了个架构师(差几分,没过)。

今年重振旗鼓,经过了一些准备,拿了几个还算可以接受的 offer,所以在这里分享下自己对于准备面试的一些思考,希望对你有一些参考作用,如果能让你少走点弯路就更好了。

面试流程

按照我的经验来讲,面试一般是这个流程:

线上技术面(八股文) -> 线下技术面(项目实战)-> Boss 面 -> HR 面

一般就先线上面一轮,通常是问八股文,如果按照我的分享去梳理的话完全不是问题。

线下面的话,一般会问一点八股文,然后大部分问的项目相关,最后的老板面和人事面,就偏向非技术方面的问题。

当然,如果有些公司比较小或者流程比较简单的话,也可能就只有线下一面。

今天这篇文章是以我微薄的经验来进行分享,都是面的小厂,大厂的话刷算法题是不可避免的,这里就不提算法方面的了。

如何准备

首先,盲目的背别人准备好的面试题是没意义的,如果你本身基础不是那么扎实,短时间内背面试题去面试,首先记忆效果就上不去,经常一道题得背几次才能记住。

即使记住了,可能面试官拐个弯,或者延伸出另外的知识点,可能立刻就懵了,所以死记硬背不可取

收集过的面试题:死记硬背不可取

我的做法是:梳理自己的知识系统。竖立起一棵只属于你的专属知识树,围绕着这棵树逐个构建起各个分支。

当你系统的学过某个知识点的时候,把重点难点都给梳理成一个知识导图,把真正把知识固化成自己的东西。

我在梳理知识系统的时候用的是思维导图,思维导图相当于笔记来说,更加可观,而且不用像笔记那样记得那么详细,可以随时随地跳转到某个层级,如果没用过的小伙伴推荐尝试一下。

用结构化的笔记 app 也可以,如 Notion、wolai、flowus 这种关联比较强的笔记 app,

或者一些新兴的双链笔记如 Obsidian、Notion 等
但导图相对这些笔记 app 来讲更简单针对性强门槛更低有全局预览

在这里说明下,我并不是指别人整理好的面试题就一无是处,你在梳理自己的知识系统的时候也可以配合网上的一些面试题来“拷问自己”,通过这种方式来复习以及确认你是否掌握了这个知识点。

文章末尾会给出一些我之前收集的面试题,方便大家一起构建属于自己的知识系统。

这个知识导图是需要你自己一直去维护更新的,知识树是活的,需要生长、减枝、修正才能保证知识一直是在最新的状态。

这个方法不止可以用来面试,也可以当做自己的知识库以及知识地图。

思维导图如果节点过多的话可能会有点卡,我是按照下面四大分支去划分为4个思维导图文件的,然后想深入学习某个方面的就重新起一个单独的文件,然后再补充重点到根文件里,例如这样:

拆分文件

除了以上这些内容,可能还有很多我没有记录进这棵知识树中的内容,比如面向对象、重构、代码坏味道、规范等,这些比较散乱的知识点或者个人看法我就没有加上去。

如果你觉得我这样划分挺好,你可以参考着构建你自己的知识图谱。也可以按照你自己的想法去构建属于你自己的知识树。

梳理完后记得自己进行场景模拟提问,直到不看答案能回忆起各处细节为止。

如何梳理-知识树

授人以鱼不如授人以渔,这里我不会给出我的梳理好的导图,理由上面已经说了,背别人梳理出来的面试题是一件事倍功半的事情,这里不推荐傻傻的背面试题(也包括我的知识导图)。

下面就来分享我是从哪些方面开始梳理属于自己的知识树的。

我的这棵知识树有4个大分支,分别是:基础、扩展、实战、其他

分支-基础

作为开发必须要懂的内容,兼经常会问到的基础八股文,问到的频率超高,这里我把它划分到 基础 这一大类中,包括以下几项:

  • 基础
    • Java 基础、多线程、JVM
    • Spring、SpringBoot
    • Spring Cloud 等全家桶
    • 数据库、分布式事务
    • 缓存(Redis)
    • MQ
    • ES 等
我的知识导图-基础分支

相信出来面过几次的小伙伴都有所体会,以上这些基础内容,几乎每次面试都会问到,我甚至经历过按照上面这个顺序从头到尾都问一遍的…

基础的这一大分支里,从 Java 基础开始,我的小树枝长这样:

Java 基础

一般最常问的就是集合了,按照我的梳理流程的话,我一般会找个总览的图,例如:

集合容器
Collection 与 Map

然后顺着这个图,把各个类型给捋清楚了,按照总览的类型全部都过一遍,我一般是过了一个知识点后,总结出一些类型的简介、使用场景、特性、优缺点

例如:

简介、使用场景、特性、优缺点

Tips:

按照你舒服的方式去记,不一定要参考我的内容,只要记下来,并且你看到的时候能回忆起完整的内容即可。

或者用这样的方法:先完整丰富地记录笔记,在记住后慢慢删减,例如最开始记 ArrayList,你可以记得比较丰满一点:

ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供的语法糖,所以这里的数组是一个Object数组,以便能够容纳任何类型的对象。
size(), isEmpty(), get(), set()方法均能在常数时间内完成,add()方法的时间开销跟插入位置有关,addAll()方法的时间开销跟添加元素的个数成正比。其余方法大都是线性时间。
自动扩容 balabala……
Fail-Fast机制 balabala……
容量 balabala……
优缺点 balabala……
以上第一二段文本拷贝自 pdai.tech,文章此处当示范用,自己在写的时候切勿直接复制粘贴,重新总结表述一遍!

慢慢缩减到:

实现 List 接口的动态数组,线程不安全,加 transient 序列化部分复制
自动扩容 bala
Fail-Fast 机制 bala
容量 bala
优缺点 bala

这样的话,你以后看到这些自己亲手精简过的内容,也能做到回忆起较完整的内容了。

最后是每个分支必备的 Q&A 环节,容器部分我只记了一个当初觉得比较有意思的问题。

加载因子为什么是0.75?

除了集合外 偶尔也有问到新特性的,一般问的是 java8 的新特性,例如 Lambda 参数化传递怎么使用呀,是什么原理呀,有没有用过流处理数据呀,并发流跟自己写并发操作有啥区别呀,平时怎么判空呀等等等等。

这个 Q&A ,可以是你提前准备的一些面试题,也可以是别人分享出来的面经,或者你亲身经历过的面试题。

别看答案自己思考下,然后进行一轮模拟回答
回答完再去对照别人的参考,以及深挖来源出处(自己思考最重要)。
梳理完后可以先把文档关闭,再对自己来一轮场景模拟提问,重复直到自己能回忆起各处细节。


剩下的分支同理,这里只给出梳理分类与思路供参考:

这个基础分支我会列得详细些,但为了避免整篇太过累赘,后面会只简单讲讲大致的分类思路。

多线程
JVM
Spring

这里有个注意的点,网上有些文章作用域用的是旧的,其实新版本有更新过,所以深挖来源很重要,不要一股脑相信别人输出的文章与总结!

↑ 感谢 yes 的文章分享 ↑

例如之前写的设计模式单例篇的双重校验锁,里面有这么一个注释:

/**
 * 此处加 volatile 是为了禁止指令重排(通过加内存屏障来禁止)
 * 高版本 Java 可以不需要加 volatile 关键字,
 * 因为 JDK 内部已经把 new 操作和初始化操作定义为原子操作(存疑)
*/
private static volatile DoubleLockingSingleton instance;

高版本不需要加volatile关键字,因为我挖不到来源出处,所以在这里标了(存疑) ,因为英语能力还不行,没法挖到java官方哪里出现过,同时还没系统的学过 JVM,尴尬… 有了解的小伙伴可以交流下。

Spring MVC 与 SpringBoot
Spring Cloud
分布式事务

就像刚才说的,有些可能我记忆还不是很深刻的,这里就记得比较全面一些,例如

TCC 详细笔记
数据库
Redis
MQ
ElasticSearch

一般按照这个思路捋下来,整个人都神清气爽了,如果你有稍微过一遍上面的图的话,我相信你已经大致清楚我是怎么进行梳理的了。


分支-扩展

理解思路就可以,后面我就不截这么细了,我把如何分类大致说说。

然后就是一些相对低频,偶尔会问到,优先级比较低的,我把它划分到 扩展 这一大类中:

  • 扩展
    • 三高(高并发、高性能、高可用)
    • Netty (三高底层基础)
    • Linux
    • 网络相关
    • 安全相关
    • 设计模式
    • 数据结构
    • 其他领域(如UML)

三高 就比较偏向架构与整体了,一般是需要从整体去考虑。

比较初级的话一般会问:从整个链路上讲,都有哪些方案来实现三高。比如前后端的预处理与延后处理、缓存、池化、批量处理、数据库方面、无锁化等等等等,整个展开讲就太多了,鉴于能力有限,为了不误人子弟,这里就不展示我的导图了,仅抛砖引玉。

Netty 可以说是整个三高体系的基石了,贯穿各类中间件,沟通的桥梁,不过面初中级问的比较少。

Linux 的话,面试一般旁敲侧击你对 linux 的深度到哪了,如果你对 linux 了解不深的话,可以记一些常用的命令(例如一些基本操作、系统性能监控、查看等),这样别人问起来起码不会一脸懵逼。

网络 的话:七层/四层模型、TCP 握手挥手、HTTP 协议、Socket 套接字、网络 IO 模型等。

这里还有有一个很常问的知识点:浏览器请求全过程

安全的话,一些基本概念是一定要掌握的:XSS、CSRF、DDoS、SQL 注入、文件上传安全等。

设计模式 的话也是很常问,要掌握设计原则,以及常见的设计模式,一定要掌握几个实战过的设计模式,这个经常会问到的。

数据结构,这个单独问的比较少,一般是在问其他方面的时候顺带就问了,比如问 Java 容器数据结构,问 MySQL 的索引树,问算法题时涉及到的等等。

其他领域,这里我用来放一些比较偏软件工程的东西,例如 DDD、UML,这里特别提一嘴 UML,最好会画一些基本的图,可以在言语回复无力时,或者口头表达不出来时,直接画图给面试官看,我遇到过个别面试官让在白板上画图的。


分支-实战

除了八股文之外的,也有一些关于项目实战的问题,我把它划分到 实战 这一大类中:

  • 实战
    • 操作系统相关
    • 业务问题相关
    • 系统设计相关
    • 生产实战相关

操作系统相关,很好理解,有时会问一些关于系统排查方面的问题,例如 CPU 100%了要如何处理?进程 kill 不掉了怎么办、硬盘要满了咋整,内存爆满溢出咋整….

业务问题也很好理解,可能会问到你讲的项目中一些业务问题,或者一些较通用的问题如何解决,比如 TPS 不达标咋整…

系统设计相关的话,我之前收集过一些例子,我直接列出来:

系统设计例子

生产实战相关,这里的话平时要多做一些储备,例如列举一些你常用的设计模式,用在哪,怎么做的,一些 Java 方面的问题排查例如内存溢出、性能问题、线程死锁等,性能相关的问题如用户量、TPS/QPS 等、微服务调用链路等,如果平时遇到的机会少的话也可以自己创造些机会,例如把上面的问题都思考一遍,也可以自己做做压测、在做普通的 CRUD 时思考下如何更好的实现等。


分支-其他

最后一些非编程的问题,这里划分为 其他 这一大类:

  • 其他
    • 简历
    • 自我介绍
    • 职业发展
    • 通用的回答问题思路
      • 保洁八大问
      • 经历描述
      • 突发问题
    • 反问环节

这方面展开讲的话也太多了,这里抛砖引玉吧,

简历

简历方面的话,就不要太花里胡哨了,我的话就直接写 MD 格式然后导出成 PDF,啊哈哈…

一般就分为几大板块:个人信息,技能清单,工作经历,教育经历/自评/致谢(可选)

偷偷给你看下我的技能清单和工作经历,仅供参考,我也不知道效果怎么样,啊哈哈…

请教过大佬,大佬说简历重点在于:尽量突出你做过的技术攻关、难题攻关、亮点方面(我这方面还有待加强,仅供参考)。

技能清单(仅供参考)
工作经历(仅供参考)

自我介绍

自我介绍,每次面试开头都会有的一个环节,主要是表达自己对这个职位的适合程度,包括个人信息,岗位匹配的相关经验、岗位匹配的个人能力、想加入公司的意愿等。

职业发展

职业发展,大概率会问,可以从三要素去梳理:当下(AsIs)、愿景(ToBe)和过程(How)。

例如我想当一个架构师,目前我是什么情况,怎么定义架构师,成为架构师需要什么能力,需要付出什么样的努力,遇到的困难,现在正在做的努力等等。

通用回答问题思路

保洁八大问

这里有一个很强大的神器:保洁八大问

什么是保洁八大问?
保洁八大问里完全没有一个问题是考问知识和技能的,都是一些日常问题 ,例如:
举例说明你是怎样用事实促使他人与你达成一致意见的。
用人单位用类似的问题来判断候选人潜力。

这方面的资料很多,上某乎随便搜搜都有一堆可供参考的学习资料,这里做抛砖引玉。

我相信稍微准备一下的话,HR 的各种问题都难不到你。

例如你可以从保洁八大问中学到一些回答问题的思路,像 STAR法则

STAR法则

经历描述

如何描述你的经历呢?

(项目、管理、为人处世、解决难题、攻克难关等方面)

经历描述

突发问题

遇到自己没准备的题目懵了,如何应对?

  • Think to Talk
    说话前先等一等,思考后再出口。
  • Talk to Think
    养成系统化、逻辑化的表达,例如:

    • 过去、现在、将来
    • 是什么、为什么、怎么做
    • 第一、第二、第三展开

最终的反问环节

技术方面的话,可以问问岗位相关和发展相关的,例如想了解下这个岗位的核心工作、解决什么问题、承担什么责任复杂度挑战是什么、对员工的培养路径等等你想问的都可以。

甚至硬核一点的,像李运华分享的提问:团队规模、项目情况、加班情况、业务情况、日活月活、活动时的 TPS/QPS、团队的氛围、团队的培训、平时有什么帮助员工成长的、主管最近有什么动作等等。

薪资福利待遇可以不用那么心急,一般到 HR 面的时候,会问你期望薪资待遇,你说可以说想了解下贵公司的薪资结构后你才能有个期望,这样就可以了解到薪资待遇以及其他相关内容。如果忘记问了,发offer前一般也会和你沟通的,这个不用急。

结尾

今天这篇分享了如何准备面试,包括整个面试流程如何构建属于自己的知识库,我的知识树四大分支,其中三大分支是跟专业相关的问题,最后的一个分支是跟面试有关的非技术通用问题,包括简历、自我介绍、回答问题思路、反问环节,希望对你有用。

如果需要我之前整理过的面试题来充当Q&A,可以回复面试题获取下载地址。

本次分享重点在于不要背面试题,必须亲自梳理学习并总结,才能掌握这些知识点并且记忆深刻。

今天的分享就到这了,以上是我的经验分享,仅供参考,希望对你有帮助以及参考意义,欢迎交流与分享。

正文完