如何面试软件工程师?
work 已发布
面试内容
Guideline
- 问题应有梯度,由浅入深,可以测量出应聘者的能力等级
- 问题应有明确的目的
- 考察点:
- 专业能力,判断能否胜任本职位,发现实际的经验
- 基础知识,判断对整个计算机科学的理解,底子是否够厚,判断发展潜力
- 综合素质,判断发展潜力
- 理性思维,判断发展潜力
一、基础知识
六项基本功
计算机体系结构
- CPU:乱序执行、多级流水线、寄存器
- 存储器的层次结构:为了弥补存取速率远远落后于CPU的计算速度的不足
操作系统
- 进程、线程:执行单元
- 调度器:管理 CPU,公平性、QoS
- 网络子系统:管理网卡及实现协议栈
- 虚拟内存:管理内存
- 文件系统:管理磁盘
- 死锁避免:管理共享资源
数据库
- 存储引擎:B+树
- DDL:Data Definition Language
- DML:Data Manipulation Language
- 数据库表的设计范式
- 事务的四个属性:A(原子性)、C(一致性)、I(隔离性)、D(持久性)
计算机网络
- OSI 7层模型:应用层(表示层、会话层)、传输层、网络层、链路层、物理层
- 重点考察对 TCP 的理解
- 相较于 UDP,如何做到可靠? ACK+重传(timeout 重传、丢包重传)
- 连接建立、连接断开的过程
- 流量控制,主要考虑接收端的处理能力
- 拥塞控制,主要考虑造成不必要的网络拥堵,进而导致瘫痪
算法与数据结构
- 常见数据结构及其算法复杂度:堆、栈、队列、平衡二叉树、链表、哈希表
编译原理
- 词法分析
- 语法分析
- 语义分析
- AST构造
- IR生成
- IR optimizer
- 生成目标码
考察点多且杂,需要耗费大量的面试时间,推荐刘未鹏的方法:列所读书单
二、发现实际的经验
三项必备能力
1. coding
入门级:排序、链表操作、二分
考题:
链表倒排、链表倒数第 K 元素、两个有序链表归并排序
考察点:coding
进阶级:算法题
考察点:coding & problom solving
2. 应届生,考察对编程语言的理解
C++ 的话,考题:
- 多态的实现,虚函数表、虚指针
- Effective C++、More Effective C++ 中的 best practice
[题目欠缺] 2. 对社招,考察 design 能力: 实际系统的设计
考察:
梯度:方案可行->常见性能热点的优化(qps/latency)->估算理论性能上限
3. problem solvig
算法与数据结构
考题:
- 有序数组中,给定 k 的出现次数
- next_permutation
- 连续子数组的最大和
追问细节
判断依据:一个负责任的工作在一线的工程师,必然对自己所从事工作的细节了如指掌
没经验就答不上来
内存问题如何解?多线程问题如何解?cpu 利用率高如何解?
加分项
- 对并发的理解,多进程、多线程、协程、csp、actor、immutable
- 对面向对象的理解
- 对单元测试的理解
- 抽象、泛化的能力,如 STL 的算法模板,需要每种类型支持一定的操作符即可
- cpp 程序员,解决问题的三板斧:
- debug,解 bug,事半功倍
- trace,解多线程问题
- profiling,性能调优
三、综合素质
- 进取心 | 自律能力 | 毅力 | 对工作的热情
- 平时访问哪些网站?
- 技术博客,你最喜欢的技术博客/网站? [herb sutter、阮一峰、DDJ(2014年底关站了!不在发布新内容,老内容仍然 accessible)]
- stack overflow
- 去年读了多少本技术书籍?最喜欢的是哪本?从中学到了什么?
- 有自己的开源项目么?业余时间编程么?
- 事业心。工作是事业,还是谋生手段?
- 深入的钻研精神,有恒心和毅力深挖问题,解决难题;
- 扎实的基本功,编程多面手,学习和动手速度快,能快速完成原型开发验证;
- 缜密的思维,善于发现代码隐藏的漏洞,想到出人意料的分布式 Failover 场景;
- 技术完美主义者,写出具有美感代码的 topcoder,改进晦涩代码;
- 善于精准把握用户需求,提出解决方案,推进各项工作,创造良好合作氛围;
四、理性思维
无标准答案,能看到优缺点,合理即可
- 对异常与 errorcode 的理解
- 为最喜欢的编程语言增加一种功能,增加什么;减少一种功能,减少什么
Reference
History
面试方法
面试官分工
| 目标/角色 |
初试(电话面试) |
复试 |
终试 |
| 知识 |
O |
O |
X |
| 经验 |
O |
O |
X |
| 能力 |
X |
O |
O |
| 意愿、动机 |
X |
O |
O |
| 个性特征 |
X |
X |
O |
| 价值观 |
X |
X |
O |
O: 必须考察的目标,要给出书面的评价
X: 如果有考察到,可以将收集到的信息分享给其他面试官
终面面试官至少高于候选人2级
有效的面试流程
准备阶段
- 你是否对岗位要求,职责有清晰的认识?
- 你是否认真阅读候选人简历,了解候选人经历,知晓之前的面试评价?
- 你是否知道本轮面试主要考核重点?
- 你对候选人的疑惑是什么,感兴趣的经历是什么?
- 你是否预留足够的时间,调整好自己的状态?
面试阶段:行为面试法【见下】
评估反馈阶段
结构化表达:
- 候选人层级、录用意见
- 基本信息
- 工作经验:以案例支持
- 软性技能:以案例支持
- 不足之处
- 待下轮考察内容/后续动作
- 其他补充信息(可选)
行为面试法
一、理论基础
行为面试法是基于行为的连贯性原理发展起来的。其假设前提是,一个人过去的行为能预示他未来的行为。正如一个经常迟到的人,下次开会还会迟到一样。
二、面试方法:
行为面试中常用的一种技巧叫STAR面试法,分别为:
Situation 情景:我当时的所面临的情景
Task 任务:当时的任务是什么
Action 行动:我采取了什么样的行动
Result 结果:我达到了什么样的结果
三、问题设计:
面试中,面试官需要尽可能地收集完整STAR。因此行为面试法要求面试提问者目标明确,追求细节。
行为问题设计层次
| 问题层次 |
提问方式 |
问题示例 |
| 基本问题 |
针对某个话题进行起始问题 |
这个项目看起来不容易,你是怎么做的? |
| 二级问题 |
针对上一个回答提问“为什么” |
你为什么用这个方法呢? |
| 三级问题 |
针对二级问题的回答,问“什么” |
通过这个事情,你学到了什么? |
行为问题与其他问题对比示例
| 能力项 |
行为问题 |
假设问题 |
引导性问题 |
| 聪明 |
你提到业务发生变化了,那你怎么应对的呢? |
假如让你学一门新技术,你会怎么做? |
你觉得自己聪明嘛? |
| 乐观 |
你提到业务受挫了,那时候你怎么做的? |
如果遇到挫折,你是怎么应对? |
你是乐观的人,还是悲观的人? |
| 皮实 |
上一份工作被老板批评过吗?(有),是什么原因?你当时怎么想的? |
如果被老板不分青红皂白的批评,你会怎么办? |
你是不是挺害怕老板批评你的? |
| 自省 |
如果让你再做一次,你觉得哪些地方可以改进? |
如果同事反对你的建议,你怎么办? |
总是和同事起冲突,你会不会觉得烦? |