我的一位朋友系列第一篇 (博主的盆友不大正常的样子),后续会持续记录朋友技术生涯的历程。

记一位朋友的秋招经历

个人情况

喜欢编程,大学期间自学了很多东西,学得比较乱也比较浅,做过很多小型项目,项目经费倒是拿到不少。

大三下学期才开始认真学习 Java 技术栈,然后赶上了疫情,接下来就是秋招。全程并不是很顺利

意外的成功

大三上学期,冬天,抱着试一试的心态,参加了当地 SAP 的宣讲会,顺水推舟地投了简历,进行了第一场笔试、群面、单面。然后稀里糊涂的拿到了管培生 Offer。

这位朋友表示,这意外的成功给他造成了一种错觉:面试也就那么回事。

之后在 SAP 培训的日子心里十分矛盾。SAP 提供了在当地十分优厚的实习工资,而且提供英语、日语培训。当然这是需要出成果的,这位朋友外语较差,他表示深感力不从心。于是在 8 月的最后一个工作日离职了。

毫无疑问,SAP 是个不错的机会,但他还是有些任性地离开了,希望能找到一个开发的职位(话说这个 SAP 的这个 Offer 不是技术岗吗?)。

求职历程

求职意向是 Java 开发方向,目标是进一线城市的大厂。结果是拿到了并不十分完美的 Offer,但他表示基本达到目标。

2020 年 2 月,疫情开始前,是他的第一个技术面通知;到 2020 年 9 月,终于拿到 Offer,这半年的时间,他几度考虑过转行、做最坏的打算。但是一直坚持、准备。

他表示,尤其是听说一起做项目的同学纷纷去了大厂,而且还来给你内推告诉你简单的时候,十分令人崩溃;不好意思拒绝,再加上一点点侥幸心理,结果也只是再多挂一次。

半年的时间里,为学技术看完了至少 130 小时的课程,看了 JDK13 关键类的源码,刷过至少 400 道算法题。他从一面试就紧张得发抖、一问三不知、限时编程题一道也通不过,直到后来能从容应付面试,大部分问题都略知一二,各种常规算法烂熟于心。本篇文章的封面图是从他那里拿到的,是他备战期间的电脑桌面,简单粗暴的压迫感。

从他给的面试记录中看出来,他已参加过 13 家大中小型企业的面试,共参加技术面 25 次,只参加过两回 HR 面,并没有详细的笔试统计。

题外话

一切似乎都好起来了,找到了令自己满意的工作,毕业什么的也没有什么困难,但是他后来却表示,其实是进了一座围城。

面经

经过这位朋友的允许,这里给出他的面试记录(不透漏具体公司名了)。标注 ! 的为当时被问倒的


(!) MySQL
(!) innoDB
LinkList ArrayList
(!) 并发(CAS、LinkList ArrayList 线程安全的实现)
域名解析 - 访问服务器(DNS)
状态码
Cookie Session 无状态协议
(!) 攻击方式、防范
CAS 全称为 Central Authentication Service(中央认证服务)
(!) CAS 全称为 Conmpare And Swap(比较和交换)是用于实现多线程同步的原子指令

(!) sprintboot:AOP(与注解的区别) IOC
(!) MySQL Oracle 区别
(!) MySQL 调优,索引、聚簇索引
(!) innoDB
设计模式:单例模式(写代码:饿汉式、懒汉式)
算法:判断素数的方法、优化、素数筛

自我介绍、项目
类加载器(系统常见类加载器)
session、cookie
Http Get Post
Http Https
(!) 数据库:乐观锁、悲观锁
(!) 接口、抽象类差别
方法重写、重载
StringBuffer, StringBuilder

**2020.03.29**
自我介绍、项目
(!) Union、Union All
(!) MySQL 基础
(!) 一个表拷贝到另一个表
String、StringBuffer、StringBuilder
(!)final、finally、finalize
wait(), Thread.sleep() (效率差不多)
CheckedException, UnCheckedException
(!) ThreadLocal 相关
(!) 大文件中提取出现次数超过 3 的字符串

**2020.04.23**
自我介绍、项目(项目问得较弱)
violtile
非阻塞模型 nio
(!) 多路复用
JVM 内存模型
内存分代,垃圾回收、回收算法(ZGC出现版本?)
对象锁、synchronized、锁升级
静态字段、静态块、构造方法、代码块。
算法:顺时针打印二维数组
(!) 数据库 6 个特性、解释
索引、B+树
(!) 缓存
(!) 消息队列的理解

**2020.04.26**
(!) 操作系统,进程线程基础
(!) 下载文件过程中,用户态、核心态的转变
(!) 进程、线程资源共享
(!) 计算机网络 TCP UDP
数据库索引、存储引擎(InnoDB、MyISAM)
HTTP/HTTPS,加密算法(?),HTTP2.0 多路特点(?)
算法:大量数据排序(快速排序 -> 桶排序)
(被提示) 算法:生成圆内均匀分布的点。
(!) 算法:数组中仅有一个数字出现一次,其余三次,求出这个数

**2020.04.27**
算法:原地翻转链表
(!) 算法:牛客原题,枪打出头鸟
(!) 排序栈
数据库索引类别
(!) 为什么使用 B+ 树
Spring AOP IOC
动态代理、静态代理
事务四个特性(ACID 解释)(! 一致性)
事务中存在的问题,处理方法,隔离级别
(!) 操作系统:缺页算法
(!) 计算机网络
CMS 回收器

**2020.05.28**
项目引入 springboot
springboot 注解的使用
(!) AOP、IOC
(!) 动态代理
HTTP 组成,Cookie、Session
HashMap put 过程
线程池,执行时的处理(核心、拓展、阻塞)
锁(synchronized)
MySQL、索引、B+ 树、InnoBD
JVM内存模型
(!) 回收算法,不是回收器
算法:二叉树的层序遍历

**2020.05.30**
自我介绍、项目(关注校外项目)
(!) 项目引入:RESTfull、技术选型、容灾处理
算法:单链表:原地翻转、删除当前节点(!)、倒数第 n 个节点、中间节点,子序列、子串匹配
算法:迭代替换递归、DFS 解释

**2020.06.06**
自我介绍
算法:动态规划上台阶

**2020.07.25**
Java基础:静态方法重写?
多线程的理解
手撕快速排序
线程安全的单例
final、finally、finalize

**2020.07.25**
排序算法、堆排序
分布式场景
常见 IO 流控制
多线程线程池、锁,区别
有限内存 100 文件中统计关键词次数
violtile, transient
垃圾回收算法、回收器
如何设计表
(!) HTTPS、TCP

**2020.07.25**
有限内存,统计大文件中数字的出现频次
(!) 连接池
(!) 两层循环优化
SQL 语句

**2020.08.07**
项目:小程序 Session 失效解决
(!) Redis 使用, Redis 热点数据判定
深拷贝、浅拷贝
HashTable 及集合框架
构造器重写
String 继承?
多线程了解
垃圾回收
GET, POST 区别
数据流中求最小的 10 个数

**2020.08.13**
自我介绍
问项目(前端、爬虫、Demo、Linux 排错)
new String("123") 与 "123" 的 `==`, `.equals()` 区别
内存模型、回收算法、回收器
(!) VUE生命周期
Session, Cookie
撸代码:版本号排序
撸代码:将一组数据整理为树状的层级关系

**2020.08.18**
自我介绍、项目
(!) VUE - Reactor
(!) 前端发展、后端发展前景
浏览器输入地址到看到画面的过程,DNS
JVM、垃圾回收
(!) OOM,如何定位分析问题
(!) 进程与协程
(!) Nginx, Apache 和类似的技术区别、优缺点
Docker, 虚拟机, (!) K8S
Redis 理解与看法
对微服务的理解与看法,与传统开发模式的区别
(!) 云延伸
平常学习技术关注的公众号、新闻
为什么选择后端、后端的未来发展

**2020.08.24**
自我介绍、项目(爬虫)
(!) 类加载步骤
JVM 的组织结构
GC 年龄轮次数、未达年龄轮上限对象晋升
(!) 晋升失败,Promoting faile
(!) GC 问题排查
垃圾收集器
(!) CMS 步骤
TCP 三握四挥、为什么
(!) 半连接队列、针对它的(SYN)攻击与防范
(!) 拥塞控制
(!) Netty(高性能的原理、底层 Channel、Selector)
Buffer API
(!) MySQL 为什么使用 B+ 树
聚簇索引、组合索引
数据库锁、(!) 及语句
四个事务隔离级别
(!) 分库分表
Redis 业务里使用的场景、怎么判定热点数据
雪崩穿透、集群搭建
消息队列解决的问题
(!) MQ 的生产者、消费者、消息传递状态(生产者、消费者消息传递确认机制,ACK 之类的...)
(!) Kafka 消息如何存储
(!Debug) 算法题:两个串的最长公共子串
分布式锁实现方式
分布式锁需要满足的条件、特性
线程池、步骤(! 拒绝策略,漏掉直接丢弃)
JDK 锁框架
(!) 对象头

**2020.08.26**
(!) 虚拟机内存模型:元空间
(!) MQ 原理:镜像、避免消息丢失、队列实现
(!) Redis 底层使用的数据结构
(!) 元空间

**2020.08.27**
自我介绍
实现 JVM 的过程、实现的事情、难点、学到了什么
(!) 虚拟机的 Type1、Type2 大方向
项目
小程序特点、前后端理解
增删改查、缓存架构
缓存穿透、击穿、雪崩
可扩展的架构方式
学习的动机
(!) 大数据
binlog、数据库间的数据同步
序列化、反序列化
如何对程序进行优化、定位问题
基于函数定位问题

**2020.09.12**
自我介绍、博客、竞赛
Redis 分布式锁
(!) Redis 跳表
(!) 跳表、红黑树差别
介绍 SpringCloud
(!) Dubbo
MyBatis、Hibernate
实习(如何处理需求:主线、业务流、数据流)
JVM 内存模型
(!) 代码缓存区、JVM 编译过程、混合编译、解释执行过程
前端、刷题情况

**2020.09.12**
自我介绍、博客
(!) 域名的各种记录区别
登录服务器演示
(!) 文件、文件夹权限修饰符含义
如何友好化查看文件大小(允许临时查文档)
如何查看进程、查看栈信息
查看机器内存
(!) 如何查看内核数量
top 的 load average 含义
(!) 负载均衡算法
项目、维护、分工、需求如何做
(!) SpringMVC 相关、流程
实现要求的一个函数(思想、错误处理、参数验证)
MySQL 存储用户名、Emoji 处理
浏览器输入 URL 到得到响应的过程
图像识别验证码实现
平常如何学习技术
平常如何翻墙
用户登录模块的实现
(!) 用户密码的处理
如何使用 HTTPS
线程安全的单例
职业规划

**2020.09.12**
未来一年的规划
大学之后的整个规划
面过哪些公司、其他 Offer
考虑哪些公司
为什么选择北京
之前如何学习技术知识
如何、为什么找到项目
做项目遇到的困难、如何解决
成绩情况
(!) 对公司的了解、吸引的点
(!) 对互联网公司选择的倾向
对行业的考虑、对公司的考虑
其他的考虑
能接受的工作强度
家人是否支持到北京工作
学长的反馈

**2020.09.15**
自我介绍、项目
算法:图中的岛屿数量(! 优化)
(!) 线程进程区别
锁、synchronized、轻量级锁、重量级锁
锁升级过程,无锁、偏向锁等(对象头锁标记)
(!) 操作系统虚拟内存、置换
(!) 磁盘文件、内存映射
TCP、UDP 区别、使用场景
TCP 拥塞控制
(!) 重传由哪一层控制
TCP、HTTP 报文格式等
HTTP 包大小
HTTP2.0、1.1 区别
RabbitMQ 结构
(!) RabbitMQ 广播,应采用的模式
(!) RabbitMQ 实现延时队列
(!) RabbitMQ 矢性队列
Redis 集群模式
Redis 在主节点挂掉后哨兵如何推选新的主节点
Redis 使用场景
Redis 做缓存时存在的坑
(!) Redis 哨兵与 cluster 的区别
Redis 一致性 hash
SpringBoot 切面使用流程、相关注解
如何保证多个线程对某个变量的访问修改安全
(!) JUC 锁比重量级锁性能高的原因
项目中遇到的困难
生活中遇到的困难
学习方法、博客搭建情况
社团工作、如何开展工作
其他的语言(! 区别)
面试官评价:较好的基础、有深入的方面、多做项目

**2020.09.21**
自我介绍、项目
RabbitMQ 与 Kafka 区别
Redis
MySQL 提升查询速度、索引
(!!) 算法:归并两个排序数组、删除重复出现的节点

**2020.09.21**
自我介绍、项目
(!) 隔离级别
(!) HTTPS 过程
Java 中的锁、volatile 作用
如何实现生产者消费者模型
(!) 阻塞队列中的线程管理
(!) Redis 指令
(!) Linux 连接建立的状态

**2020.09.24**
自我介绍、项目(重点关注项目)
算法:字母按出现频率重排序
测试:微信加好友功能测试用例

**2020.09.27**
抽象类、接口
线程状态
对象克隆
深拷贝、浅拷贝
(!) 实例化线程的几种方式
(!) SpringMVC 过程
算法:合成指定面值的最小纸币张数
项目简介、MySQL 简介