Skip to content

Commit

Permalink
update flow
Browse files Browse the repository at this point in the history
update questions
  • Loading branch information
wangjinyi committed Apr 24, 2022
1 parent 039b271 commit b9c573c
Showing 1 changed file with 107 additions and 70 deletions.
177 changes: 107 additions & 70 deletions interview_flow.md
Original file line number Diff line number Diff line change
@@ -1,133 +1,170 @@
# 后端面试流程归纳总结
## 概述
面试是一件非常严肃的事情,几方面来说:1.为公司选择能力满足公司开发需求的人,这是为公司负责; 2.出来找工作都不容易,面试者也希望进入一家好的公司,能和公司一起成长,这是为被面试者负责;3.如果招聘进来的人,最后发现因为面试比较水,而蒙混过关,在实际工作合作的时候,会发现非常痛苦,这是为自己负责。以下是在下归纳总结的面试流程和面试问题。问题和流程都会根据实际情况持续更新。面试从当前**技术能力(50%)**,**沟通能力(20%)**,**学习能力(15%)**,**服务能力(15%)**,四个维度考察。面试原则,**在满足基本用人要求的情况下,尽可能挖掘被面试者的亮点**
面试是一件非常严肃的事情,几方面来说:
1. 为公司选择能力满足公司开发需求的人,这是**为公司负责**;
2. 出来找工作都不容易,面试者也希望进入一家好的公司,能和公司一起成长,这是**为被面试者负责**
3. 如果招聘进来的人,最后发现因为面试比较水,而蒙混过关,在实际工作合作的时候,会发现非常痛苦,这是**为自己负责**

以下是在下归纳总结的面试流程和面试问题。问题和流程都会根据实际情况持续更新。这里分四个维度,两个原则。

四个维度:
+ **技术能力(50%)**
+ **沟通能力(20%)**
+ **学习能力(15%)**
+ **服务能力(15%)**

两个原则:
+ **在满足基本用人要求的情况下,尽可能挖掘被面试者的亮点**
+ **题目需要有区分度,针对不同级别的面试者,分为初,中,高级**

可以简单先以工作年限对应题目级别
工作年限 | 题目级别 | 出题原则
-------- | -----| ----- | --------
1-3年 | 初级 | 知道概念,能够简单使用 |
3-5年 | 中级 | 文复杂应用,并且对底层有一定了解 |
6年以上 | 高级 | 知道部分领域底层原理,底层实现 |

## 面试题基本流程
### 0.看候选人简历
大概扫一眼候选人的项目经历和技能特点,擅长什么。对候选人有个初步了解。
### 1.请面试者做基本介绍(必选)
一般常规问题,主要看下面试者的语言表达能力,初步的沟通能力。这里要求面试官和蔼可亲,至少面带笑容,给候选人呈现出一种比较**轻松的氛围**,期待候选人不会因为太紧张,不能发挥水平。
### 2.热场
### 2.热场(可选)
一般来说,通过做自我介绍,如果面试者比较紧张,可能自我介绍很短,为了能让面试者更能发挥自己水平,回归平常心,需要一些问题,需要一些问题激发他的表达欲
#### 2.1 询问面试者自己的优点和缺点
#### 2.2 询问面试者有没有获得过个人奖项
#### 2.1 询问面试者自己的优点和缺点(可选)
#### 2.2 询问面试者有没有获得过个人奖项(可选)
### 3.技术面试问题(必选)
技术面试流程,最好以时间排序,让候选人介绍最近所做项目开始,
#### 3.1 面试面试者所做项目
考察被面试者的的语言表达能力,这里关注项目的**功能,模块,职责角色**
技术面试流程,先从编程基础开始。

#### 3.1
这里主要考察python的问题,其中装饰器为必考内容,然后针对不同水平的python开发者,选择难度适宜的问题。
##### 3.1.1 一般python问题
```mermaid
graph TB
a[最近所做的项目]
b[对自己收获最大的项目]
c[对自己来说最难的项目]
a[str的10个成员函数] --> d[is和==的区别] --> g[写一个装饰器] --> j[数组分片] --> q[几种推导式] --> s[深拷贝,浅拷贝]
b[python的内置类型,可变,不可变] --> e[python字符串生成方式,a+b+c的缺点] --> h[装饰器的应用场景] --> k[python的多进程,多线程] --> n[更多的collection]--> l[gc的底层实现]
c[dict的底层实现] --> f[列举python的magic func和应用场景] --> i[装饰器和元类的区别] --> o[python代码做性能优化cprofile,line_profiler,memory_profiler] --> p[python的import包管理机制] --> r[O复杂度计算]
```

#### 3.2 开放式摸底问题
开放式问题,可以回答得非常简单,也可以非常复杂,通过该问题摸清被面试者技术水平所处层次(**初级,中级,高级**),我在这里针对不同水平层次的面试者,准备了3套题目,可以认为从左到右,依次对应**初级,中级,高级**
开放式问题,可以回答得非常简单,也可以非常复杂,通过该问题摸清被面试者技术水平所处层次(**初级,中级,高级**)
```mermaid
graph TB
a[请求http从浏览器发起到浏览器收到响应经历了哪些步骤,组件]
b[发现http响应很慢,怎么排查原因]
c[发现http响应不稳定,时对时不对,怎么排查]
a[请求http从浏览器发起到服务器收到请求,生成响应经历了哪些步骤,网络协议,组件]
```

#### 3.3 数据,存储与缓存
存储与缓存作为现代web开发的以数据为核心的理念,作为首先必须问的问题。
##### 3.3.1 redis的问题

### 3.3 计算机网络网络,网络协议问题
#### 3.3.1 网络HTTP问题/python web问题
结合上面一个http请求问题,可以引申到HTTP+python web的问题。
```mermaid
graph TB
a[redis的常用数据类型] --> d[redis的数据如何持久化]
b[redis的应用场景] --> e[redis的zset底层实现]
c[redis缓存淘汰策略] --> f[说出redis底层的实现技术特点]
a[HTTP的方法/HTTP的状态码] --> d[session,cookie区别] --> g[列举HTTP的header中控制缓存的option] --> j[RESTFUL API]
b[GET/POST区别] --> e[前后分离场景如何鉴权/跨域] --> h[发现http请求网络不通,你会如何调试] --> k[web框架django/flask/fastapi/tornado]
c[HTTP/nginx反响代理] --> f[django应用分库分表] --> i[django/flask的request底层实现区别]
```
##### 3.3.2 mysql的问题
##### 3.3.2 TCP/IP协议(可选)
TCP/IP的问题一般比较基础,任何一本TCP/IP书籍都有详细阐述,但是因为工作原因,部分开发可能忘记了。根据过往面试经验,一般只有过运维或者搞过C/C++开发的,对这部分较熟悉。
```mermaid
graph TB
a[alter与update的区别] --> d[事务的4个特征ACID] --> g[如何优化SQL] --> j[列举mysql中的索引]
b[where与having的区别] --> e[列举索引失效的原因] --> h[解释悲观锁,乐观锁] --> k[innodb的底层实现]
c[事务的隔离级别] --> f[mysql主从复者的原理] --> i[什么是回表] --> l[事务的底层实现]
a[ICMP协议作用] --> d[TCP/IP网络分层] --> g[TCP三次握手]
b[TCP四次挥手] --> e[TCP和UDP区别] --> h[解释Nagle算法,拥塞控制算法,TCP_NODELAY作用]
c[什么是TIME_WATI状态] --> f[什么是粘包] --> i[解释TCP滑动窗口协议,流量控制]
```
##### 3.3.3 缓存和数据库
缓存是个非常宽泛的概念,从CPU的L1 L2 L3 cache, nginx文件缓存, redis缓存, 程序上下文缓存, CDN技术,http cache, 这些都是缓存 这里主要考察面试者对缓存理解到哪个技术层次

#### 3.4 存储/队列
存储数据库和消息队列作为现在程序开发中,最常见的开发组件,可以针对面试者简历,选择其中2-3个组件问。
##### 3.4.1 redis的问题

```mermaid
graph TB
a[列举缓存类型] --> d[列举使缓存生效的办法] --> g[缓存击穿]
b[项目使用的缓存技术,为什么使用] --> e[为什么要设置缓存的失效时间] --> h[http header的缓存类型]
c[如何判断缓存是否生效] --> f[缓存雪崩] --> i[如何保证数据库和缓存双写一致性]
a[设置key的过期时间] --> d[redis和数据库区别] --> g[redis的字符串和python的str有什么区别] --> j[如何用redis实现热门访问记录]
b[列举redis的常用数据类型和应用场景] --> e[redis的数据如何持久化] --> h[如何使用redis实现广播] --> k[哨兵模式]
c[redis为什么这么快] --> f[redis变慢的原因] --> i[redis的zset底层实现] --> l[redis分布式锁原理]
```
#### 3.4 python的问题
这里主要考察python的问题,其中装饰器为必考内容,然后针对不同水平的python开发者,选择难度适宜的问题。
##### 3.4.1 一般python问题
##### 3.4.2 mysql的问题
```mermaid
graph TB
a[str的10个成员函数] --> d[is和==的区别] --> g[解释装饰器] --> j[深拷贝,浅拷贝] --> m[解释GIL]
b[python的内置类型,可变,不可变] --> e[python字符串生成方式,a+b+c的缺点] --> h[装饰器的应用场景] --> k[python的多进程,多线程] --> n[gc的底层实现]
c[dict的底层实现] --> f[解释上下文管理器] --> i[装饰器和元类的区别] --> l[yield的实现原理] --> o[python代码做性能优化cprofile,line_profiler,memory_profiler] --> p[python的import包管理机制]
a[alter与update的区别] --> d[事务的4个特征ACID] --> g[如何优化SQL] --> j[列举mysql中的索引]
b[where与having的区别] --> e[列举索引失效的原因] --> h[解释悲观锁,乐观锁] --> k[innodb的底层实现]
c[事务的隔离级别] --> f[mysql主从复者的原理] --> i[什么是回表] --> l[事务的底层实现]
```
##### 3.4.2 python web或者其他python应用
##### 3.4.3 mongodb的问题(可选)
```mermaid
graph TB
a[web框架] --> d[url路由] --> g[框架中间件] --> j[提高web服务器并发量] --> m[web框架的网络处理架构,同步,异步]
b[wsgi,asgi协议] --> e[orm的优点缺点] --> h[你如何组织你的web项目] --> k[web项目的异常处理] --> n[pyhon web单元测试]
c[xpath] --> f[numpy,pandas] --> i[协程原理] --> o[python运维 ansible, fabric] --> p[pyqt]
a[mongodb的基本数据类型] --> d[explain命令的作用] --> g[索引的优劣]
b[pipline管道的作用] --> e[pipline的阶段] --> h[mongodb的事务]
c[实际项目为什么使用mongodb] --> f[mongodb的orm] --> i[mongodb的mapreduce操作]
```

#### 3.5 Celery/rabbitmq问题
Celery作为python编写的一个简单、灵活且可靠、处理大量消息的分布式系统,在处理耗时很长的阻塞任务,几乎是python唯一选择。而后端的broker可以采用RabbitMQ等消息队列实现。
##### 3.4.4 elasticsearch的问题(可选)
```mermaid
graph TB
a[使用过celery吗,为什么使用celery] --> d[解释worker,beat,celery worker调试] --> g[消息队列消息堆积,怎么办]
b[消息队列的作用] --> e[rabbitmq的持久化包含哪些的数据持久化] --> h[rabbitmq集群如何开启高可用]
c[列举使用过的消息队列] --> f[rabbitmq如何保证消息的生产和消费] --> i[rabbitmq集群出现网络分区,如何恢复]
a[简述索引<index>,文档<Document>,映射<Mapping>] --> d[text类型和keyword类型的区别] --> g[PUT与POST的区别]
b[为什么要使用ES] --> e[ES中如何实现分页的] --> h[query和filter的区别]
c[集群的健康状态包括几种] --> f[ES中执行数据删除操作,发现空间并没有释放,为什么] --> i[TF-IDF算法的核心原理是什么,为什么在索引为多分片,数据量少的情况下会出现评分异常的情况,如何解决]
```
#### 3.6 网络,网络协议问题
TCP/IP的问题一般比较基础,任何一本TCP/IP书籍都有详细阐述,但是因为工作原因,部分开发可能忘记了部分细节,我觉得这是可以理解的,但是面试者既然知道来面试,我觉得花点时间把这部分知识重新看一下,并不过分。
##### 3.6.1 TCP/IP协议

##### 3.4.5 rabbitmq的问题(可选)
```mermaid
graph TB
a[ICMP协议作用] --> d[TCP/IP网络分层] --> g[TCP三次握手]
b[TCP四次挥手] --> e[TCP和UDP区别] --> h[解释Nagle算法,拥塞控制算法,TCP_NODELAY作用]
c[什么是TIME_WATI状态] --> f[什么是粘包] --> i[解释TCP滑动窗口协议,流量控制]
a[什么vhost] --> c[rabbitmq开启了持久化,但是丢数据,原因] --> e[rabbitmq的持久化<交换器,队列,消息>]
b[什么是死信队列,死信队列作用] --> d[rabbitmq如何实现延迟队列<TLL+死信队列>] --> h[消息消费模式选择]
```

##### 3.6.2 HTTP相关问题
HTTP协议是我们重点考察的部分, 核心是RESTFUL。
##### 3.4.6 kafka的问题(可选)
```mermaid
graph TB
a[解释HTTP协议] --> d[HTTP的方法/HTTP的状态码] --> g[什么是cookie,session] --> j[RESTFUL API的特点]
b[解释HTTPS协议] --> e[GET,POST区别] --> h[什么是JWT,场景,特点] --> k[RESTFUL API的缺点]
c[什么是跨域] --> f[GET协议可以带BODY吗] --> i[HTTP代理] --> l[RESTFUL API和GraphQL]
a[Kafka都有哪些特点] --> d[如何创建topic] --> g[如何查看topic list]
b[如何监控kafka消息堆积] --> e[Kafka的那些设计让它有如此高的性能] --> h[Kafka中是怎么体现消息顺序性的]
c[为什么选择Kafka] --> f[聊一聊你对Kafka底层存储的理解] --> i[Kafka中的延迟队列怎么实现]
```

#### 3.7 linux,虚拟化技术


#### 3.6 linux,虚拟化技术
因为后台工作的关系,要求必须会使用linux,这里主要从一般命令使用,考察面试者如何查看,分析linux文件日志,管理日志入手,看面试者对linux熟悉程度。
#### 3.7.1 虚拟化docker问题
#### 3.6.1 linux问题
```mermaid
graph TB
a[解释进程,线程] --> d[进程查看命令] --> g[如何查看端口被占用] --> j[如何查看日志]
b[父,子进程] --> e[tar命令] --> h[文件拷贝的方法] --> k[awk,sed命令]
c[僵尸进程] --> f[找到占用空间最大的目录,文件] --> i[如何查看linux系统日志] --> l[管理linux服务器集群]
a[解释进程,线程] --> d[进程查看] --> g[tar命令/zip] --> j[文件权限]
b[父,子进程] --> e[grep命令,如何查找文件内容] --> h[如何查看端口被占用] --> k[awk,sed]
c[僵尸进程] --> f[找到占用空间最大的目录,文件] --> i[如何查看linux系统日志] --> l[管理/监控linux服务器集群]
```

#### 3.7.2 虚拟化docker问题
当前后端开发,虚拟化docker容器技术已经成为主流,不再神秘,这里要求必须会docker。
#### 3.6.2 docker问题
当前后端开发,docker容器技术已经成为主流,不再神秘,这里要求必须会docker,针对中高级,可以增加k8s的问题
```mermaid
graph TB
a[虚拟机和容器区别] --> d[如何启动一个docker容器] --> g[docker网络模式] --> j[docker-compose]
b[容器的优点] --> e[如何进入到一个docker容器] --> h[docker镜像打包优化] --> k[docker如何做到资源隔离和资源控制]
c[容器的两大关键技术] --> f[docker容器启动失败,问题排查] --> i[docker容器的通信原理] --> l[容器启动后,提示找不到服务,怎么解决]
a[虚拟机和容器区别] --> d[如何启动一个docker容器] --> g[如何制作一个docker镜像] --> j[如何查看docker容器日志]
b[容器的优点] --> e[定位容器挂载目录] --> h[docker镜像打包优化] --> k[docker网络模式/docker0的作用]
c[容器的两大关键技术] --> f[docker容器启动失败,问题排查] --> i[docker容器网络通信原理] --> l[解释docker最佳实践]
```

#### 3.8 分布式,微服务,架构问题(可选)
分布式,微服务等服务器技术已经被越来越多公司采用,针对中高级开发,需要问架构问题。

```mermaid
graph TB
a[CAP理论] --> d[为什么很多分布式系统要求节点数量,奇数,偶数] --> g[单体应用和微服务的特点] --> j[mysql/redis主从复制是分布式系统吗]
b[分布式系统数据一致性] --> e[你的项目在分布式架构中采用了哪些高可用技术,为什么] --> h[微服务系统如何避免过度划分,设计] --> k[微服务的日志采集/调试/跟踪]
a[面向对象和面向过程的区别] --> c[如何做到高内聚低耦合] --> e[CAP理论] --> g[举例说明一次技术选型的考虑] --> i[单体应用to微服务]
b[简述贫血模型和充血模型] --> d[举例说明应用设计模式在项目中的提效] --> f[举例说明几种设计图在开发和设计不同阶段的作用] --> h[微服务系统如何避免过度划分,设计] --> j[实际项目如何保证数据库和缓存数据一致性]
```

#### 3.9 算法笔试(可选)
算法这块,我个人觉得口头阐述,不如直接编辑器编写,这里为了控制时间,要控制好难度,最好15-20分钟内写完。
```mermaid
graph TB
a[二分查找] --> c[快速排序] --> e[实现一个轮训round-robin]
b[翻转二叉树] --> d[链表有环] --> f[最长公共子串]
```


### 4.请介绍自己满意的项目(可选)
如果在前面技术面试中,可能因为候选人的项目经历和面试官本身熟悉的技术领域和方向不太匹配,这里可以给候选人一个机会,来弥补介绍自己的机会
如果在前面技术面试中,可能因为候选人的项目经历和面试官本身熟悉的技术领域和方向不太匹配,这里可以给候选人一个机会,来弥补介绍自己的机会。
```mermaid
graph TB
a[介绍自己做的项目]
b[介绍自己收获最大的项目]
c[介绍对自己来说最满难的项目]
```
### 5.询问面试者有什么问题(必选)
作为面试快结束的标志。这里需要注意,不要随便对候选人做什么承诺,或者对公司不切实际的描述,不涉密。
## 结语
Expand Down

0 comments on commit b9c573c

Please sign in to comment.