经验分享-如何准备面试
目录
自述
我是从毕业实习校招就进的上家公司,一待就待了三年,项目从简单的 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 基础开始,我的小树枝长这样:
一般最常问的就是集合了,按照我的梳理流程的话,我一般会找个总览的图,例如:
然后顺着这个图,把各个类型给捋清楚了,按照总览的类型全部都过一遍,我一般是过了一个知识点后,总结出一些类型的简介、使用场景、特性、优缺点,
例如:
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 环节,容器部分我只记了一个当初觉得比较有意思的问题。
除了集合外 偶尔也有问到新特性的,一般问的是 java8 的新特性,例如 Lambda 参数化传递怎么使用呀,是什么原理呀,有没有用过流处理数据呀,并发流跟自己写并发操作有啥区别呀,平时怎么判空呀等等等等。
这个 Q&A ,可以是你提前准备的一些面试题,也可以是别人分享出来的面经,或者你亲身经历过的面试题。
先别看答案,自己思考下,然后进行一轮模拟回答。
回答完再去对照别人的参考,以及深挖来源出处(自己思考最重要)。
梳理完后可以先把文档关闭,再对自己来一轮场景模拟提问,重复直到自己能回忆起各处细节。
剩下的分支同理,这里只给出梳理分类与思路供参考:
这个基础分支我会列得详细些,但为了避免整篇太过累赘,后面会只简单讲讲大致的分类思路。
这里有个注意的点,网上有些文章作用域用的是旧的,其实新版本有更新过,所以深挖来源很重要,不要一股脑相信别人输出的文章与总结!
↑ 感谢 yes 的文章分享 ↑
例如之前写的设计模式单例篇的双重校验锁,里面有这么一个注释:
/**
* 此处加 volatile 是为了禁止指令重排(通过加内存屏障来禁止)
* 高版本 Java 可以不需要加 volatile 关键字,
* 因为 JDK 内部已经把 new 操作和初始化操作定义为原子操作(存疑)
*/
private static volatile DoubleLockingSingleton instance;
高版本不需要加volatile关键字
,因为我挖不到来源出处,所以在这里标了(存疑)
,因为英语能力还不行,没法挖到java官方哪里出现过,同时还没系统的学过 JVM,尴尬… 有了解的小伙伴可以交流下。
就像刚才说的,有些可能我记忆还不是很深刻的,这里就记得比较全面一些,例如
一般按照这个思路捋下来,整个人都神清气爽了,如果你有稍微过一遍上面的图的话,我相信你已经大致清楚我是怎么进行梳理的了。
分支-扩展
理解思路就可以,后面我就不截这么细了,我把如何分类大致说说。
然后就是一些相对低频,偶尔会问到,优先级比较低的,我把它划分到 扩展
这一大类中:
- 扩展
- 三高(高并发、高性能、高可用)
- 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法则:
经历描述
如何描述你的经历呢?
(项目、管理、为人处世、解决难题、攻克难关等方面)
突发问题
遇到自己没准备的题目懵了,如何应对?
- Think to Talk
说话前先等一等,思考后再出口。 - Talk to Think
养成系统化、逻辑化的表达,例如:- 过去、现在、将来
- 是什么、为什么、怎么做
- 第一、第二、第三展开
最终的反问环节
技术方面的话,可以问问岗位相关和发展相关的,例如想了解下这个岗位的核心工作、解决什么问题、承担什么责任、复杂度与挑战是什么、对员工的培养路径等等你想问的都可以。
甚至硬核一点的,像李运华分享的提问:团队规模、项目情况、加班情况、业务情况、日活月活、活动时的 TPS/QPS、团队的氛围、团队的培训、平时有什么帮助员工成长的、主管最近有什么动作等等。
薪资福利待遇可以不用那么心急,一般到 HR 面的时候,会问你期望薪资待遇,你说可以说想了解下贵公司的薪资结构后你才能有个期望,这样就可以了解到薪资待遇以及其他相关内容。如果忘记问了,发offer前一般也会和你沟通的,这个不用急。
结尾
今天这篇分享了如何准备面试,包括整个面试流程、如何构建属于自己的知识库,我的知识树四大分支,其中三大分支是跟专业相关的问题,最后的一个分支是跟面试有关的非技术通用问题,包括简历、自我介绍、回答问题思路、反问环节,希望对你有用。
如果需要我之前整理过的面试题来充当Q&A,可以回复面试题
获取下载地址。
本次分享重点在于不要背面试题,必须亲自梳理学习并总结,才能掌握这些知识点并且记忆深刻。
今天的分享就到这了,以上是我的经验分享,仅供参考,希望对你有帮助以及参考意义,欢迎交流与分享。