基于候选人简历内容,自动生成面试题、笔试题、追问路径与评分标准,帮助面试官快速完成候选人评估准备。
技能内置 5 个难度等级:
| 等级 | 工作年限 | 核心要求 |
|---|---|---|
| ------ | ---------- | ---------- |
| 实习生 | 应届/在校 | 基础概念、学习能力、项目参与真实性 |
| 初级 | 1-3 年 | 独立完成需求、技术栈熟练度、代码质量 |
| 中级 | 3-5 年 | 复杂业务处理、性能优化、跨模块协作 |
| 高级 | 5-8 年 | 架构设计、系统治理、技术决策 |
| 资深 | 8 年以上 | 技术战略、组织效能、业务技术融合 |
收集以下信息(带 * 为必填):
分析简历,形成"简历画像":
技术画像:
项目画像:
风险识别:
根据目标级别,按以下维度生成题目:
按题型生成:
每道题必须提供 3 个版本(版本A/版本B/版本C),方便面试官根据候选人情况选择。每个版本包含:
3 个版本的设计原则:
## 候选人画像
- **工作年限**:X 年
- **目标级别**:实习生/初级/中级/高级/资深
- **岗位方向**:XXX
## 核心技术栈
- **语言**:XXX
- **框架**:XXX
- **中间件**:XXX
- **数据库**:XXX
## 重点项目
1. **项目名称**:XXX
- **角色**:XXX
- **技术亮点**:XXX
- **量化成果**:XXX
## 亮点识别
- XXX
## 风险点与待验证项
- XXX(建议通过 XX 方式验证)
## 建议重点验证方向
1. XXX
2. XXX
## 一、项目经历考察(融合行为协作)
### 题目 1:[考察主题,如"Redis缓存设计"]
**【版本A】标准版**
**具体问题**:
你在项目中使用 Redis 做缓存时,是怎么设计缓存更新策略的?
**出题原因**:
考察候选人对缓存一致性的理解,以及是否真正处理过实际业务场景。
**重点考察点**:
- 技术能力:缓存一致性策略(Cache Aside/Write Through等)
- 行为协作:是否与产品/业务方沟通过期策略
**参考答案**:
1. 首先应该说明选用的策略,最常用的是 Cache Aside(旁路缓存)
2. 需要说明缓存穿透、击穿、雪崩的应对方案
3. 应该提到过期时间的设置策略和业务场景的结合
4. 如果涉及分布式锁,说明使用场景和实现方式
**追问方向**:
- 技术追问:如果缓存和数据库数据不一致,你们是怎么发现的?怎么处理?
- 行为追问:这个过期策略是你定的还是和业务方一起定的?如果业务方要求数据实时性很高,你怎么沟通?
- 压力追问:你说你们系统QPS很高,能说一下具体多高吗?缓存命中率是多少?
**回答质量判断**:
- **优秀**:能清晰说出策略选择原因,主动提及三种缓存问题及解决方案,有具体数据支撑
- **合格**:能说出基本策略,知道缓存穿透等问题,但解决方案不够完善
- **风险**:只说用了Redis做缓存,说不清楚更新策略,或说"用的框架自动处理"
**建议评分**:15分(满分20分)
---
**【版本B】深入版**
**具体问题**:
你们系统中 Redis 缓存和数据库是如何保证最终一致性的?有没有遇到过不一致的情况,当时是怎么发现和解决的?
**出题原因**:
深入考察候选人对分布式系统一致性的理解,以及问题排查和解决能力。
**重点考察点**:
- 技术能力:分布式一致性、问题排查、监控告警
- 行为协作:推动问题解决的能力
**参考答案**:
1. 说明具体的缓存更新策略,以及为什么选择这种策略
2. 描述可能出现不一致的场景(如更新失败、并发竞争等)
3. 说明监控手段:如何发现不一致(对账、校验、报警)
4. 说明解决方案:重试机制、补偿机制、人工介入流程
5. 提及预防措施:事务、分布式锁、消息队列等
**追问方向**:
- 技术追问:你们有没有做缓存和数据库的对账?是怎么做的?频率如何?
- 行为追问:如果发现了数据不一致,但影响范围不确定,你会怎么处理?
- 压力追问:如果老板说"缓存绝对不能和数据库不一致",你会怎么回应?
**回答质量判断**:
- **优秀**:能系统性地描述完整方案,包括预防、发现、解决全流程,有实际案例
- **合格**:能说出几种不一致场景和基本解决方案,但对监控和对账描述不清
- **风险**:否认会出现不一致,或说"我们没遇到过这种情况"
**建议评分**:20分(满分20分)
---
**【版本C】基础版**
**具体问题**:
你们项目里为什么要用 Redis?用它做了什么事情?
**出题原因**:
验证候选人是否真实使用过 Redis,了解其对基础概念的掌握。
**重点考察点**:
- 技术能力:Redis 基础使用场景
- 行为协作:在团队中承担的角色
**参考答案**:
1. 说明使用 Redis 的业务场景(如缓存热点数据、Session存储等)
2. 说明选择 Redis 的原因(速度快、数据结构丰富等)
3. 提及使用过程中的注意事项(如内存限制、持久化等)
4. 说明自己在其中的具体工作
**追问方向**:
- 技术追问:Redis 是什么类型的数据库?和 MySQL 有什么区别?
- 行为追问:这个 Redis 是你自己搭的还是运维搭建的?遇到问题找谁?
- 压力追问:Redis 是单线程的,你们怎么知道性能够不够用?
**回答质量判断**:
- **优秀**:能清晰说明场景和原因,主动对比其他方案,提到实际使用细节
- **合格**:能说出基本使用场景,但细节不够丰富
- **风险**:说不清楚具体做了什么,或场景明显不合理
**建议评分**:12分(满分20分)
---
**【面试官选用建议】**
- 候选人基础较弱或简历描述较模糊 → 选用 **版本C**
- 候选人表现正常,需要标准考察 → 选用 **版本A**
- 候选人表现优秀,希望深入挖掘 → 选用 **版本B**
## 二、基础能力考察
[同上格式,每个题目提供3个版本]
## 三、场景设计考察(中级及以上)
[同上格式,每个题目提供3个版本]
## 四、代码能力考察(手写代码)
**总时长**:10-20 分钟
### 题目 X:[如"实现一个LRU缓存"]
**【版本A】标准版**
**具体问题**:
请手写代码实现一个简单的 LRU(最近最少使用)缓存,支持 get 和 put 操作。
**要求**:
- 使用你熟悉的编程语言
- get 和 put 操作时间复杂度为 O(1)
- 考虑容量限制,超出容量时淘汰最久未使用的数据
**参考思路**:
1. 使用 HashMap + 双向链表实现
2. HashMap 存储 key 到链表节点的映射
3. 双向链表维护访问顺序,头部为最近使用,尾部为最久未使用
4. get 时移动到头部,put 时如果已满则移除尾部
**参考答案**(Java示例):
class LRUCache {
class Node {
int key, value;
Node prev, next;
Node(int k, int v) { key = k; value = v; }
}
private int capacity;
private Map
private Node head, tail;
public LRUCache(int capacity) {
this.capacity = capacity;
map = new HashMap<>();
head = new Node(0, 0);
tail = new Node(0, 0);
head.next = tail;
tail.prev = head;
}
public int get(int key) {
if (!map.containsKey(key)) return -1;
Node node = map.get(key);
moveToHead(node);
return node.value;
}
public void put(int key, int value) {
if (map.containsKey(key)) {
Node node = map.get(key);
node.value = value;
moveToHead(node);
} else {
if (map.size() >= capacity) {
Node toRemove = tail.prev;
removeNode(toRemove);
map.remove(toRemove.key);
}
Node newNode = new Node(key, value);
map.put(key, newNode);
addToHead(newNode);
}
}
private void moveToHead(Node node) {
removeNode(node);
addToHead(node);
}
private void removeNode(Node node) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
private void addToHead(Node node) {
node.next = head.next;
node.prev = head;
head.next.prev = node;
head.next = node;
}
}
**评分标准**:
- 能写出基本结构(5分)
- 正确处理get/move逻辑(5分)
- 正确处理put/淘汰逻辑(5分)
- 代码规范、边界处理(3分)
- 复杂度分析正确(2分)
---
**【版本B】进阶版**
**具体问题**:
请实现一个支持过期时间的 LRU 缓存,每个 key 可以设置独立的过期时间,过期后自动清理。
**附加要求**:
- 支持为每个 key 设置过期时间(TTL)
- 过期数据需要被清理,不能一直占用内存
- 考虑并发安全性
**参考思路**:
1. 在基础LRU上增加过期时间字段
2. 使用优先队列或定时任务清理过期数据
3. 使用读写锁保证线程安全
4. 访问过期数据时检查并清理
**评分重点**:
- 过期机制设计(8分)
- 并发安全处理(7分)
- 内存回收策略(5分)
---
**【版本C】简化版**
**具体问题**:
请实现一个固定大小的缓存,支持插入和查询操作,当缓存满时新数据替换最旧的数据。
**要求**:
- 使用数组或链表实现即可
- 不需要考虑O(1)复杂度
- 能运行通过基本测试
**参考思路**:
1. 使用数组存储数据,记录插入顺序
2. 查询时遍历查找
3. 满了之后从头部或尾部替换
**评分重点**:
- 能完成基本功能(15分)
- 代码逻辑清晰(5分)
---
**【面试官选用建议】**
- 候选人算法基础较弱 → 选用 **版本C**
- 标准算法考察 → 选用 **版本A**
- 希望考察设计和优化能力 → 选用 **版本B**
## 编程题
### 题目 X:XXX
**难度**:初级/中级/高级
**建议时长**:XX 分钟
**题目描述**:
XXX
**示例**:
输入:XXX
输出:XXX
**解题思路**:
1. XXX
2. XXX
**评分点**:
- 基础实现(X分):XXX
- 边界处理(X分):XXX
- 复杂度优化(X分):XXX
**参考答案**:
代码示例
参考 references/level-guidelines.md 了解 5 个级别的详细出题深度要求。
参考 references/tech-questions.md 获取常见技术栈的出题参考。
共 1 个版本