剑指 Offer
本书内容 7 章
- 第 1 章:面试的流程
- 第 2 章:技术面试时需要用到的知识点,编程语言、数据结构、算法
- 第 3 章:写出高质量代码的 3 个要点,规范性、完整性、鲁棒性
- 第 4 章:编程面试中解决难题的常用思路,画图、举例和分解
- 第 5 章:优化代码的时间、空间效率
- 第 6 章:总结面试中的各种能力
- 第 7 章:两个面试案例
1. 面试的三种形式
面试的三种形式:电话面试,共享桌面远程面试(少),现场面试
1.1 电话面试
双方见不到对方,因此应聘者应尽可能用形象的语言把细节说清楚。
不要不懂装懂给、答非所问,不清楚、没听懂面试官的问题时敢于多提问。(英文面试:Pardon)
1.2 共享桌面远程面试
最关心 编程习惯 和 调试能力
-
(1)思考清楚再开始编程,(2)良好的代码命名和缩进对齐习惯,(3)能够进行单元测试(最优秀的 测试在前、开发在后)
-
代码不对后,调试:设置断点、单步跟踪、查看内存、分析调用栈。(大量开发软件实践经验)
1.3 现场面试
参加面试前:
- 规划好路线、出行时间
- 得体的衣服(舒服干净)
- 注意邀请函里的流程(流程长可以准备提神的饮料或食品)
- 准备几个反问问题
2. 面试的三个环节
面试的三个环节:行为面试,技术面试,应聘者提问
2.1 行为面试环节
-
一般5-10分钟,深入地了解简历中列举的项目经历。自己注意调整情绪,进入面试状态。
-
简短的自我介绍:30秒到1分钟,介绍自己的主要学习、工作经历即可。
-
如果对经历或项目感兴趣,会针对性提问,详细了解。
2.1.1 应聘者的项目经验
准备简历描述项目时,用STAR模型描述自己经历过的每一个项目。
- Situation:简短的项目背景。
- Task:自己完成的任务。要详细写,使面试官一目了然。注意区分“参与”和“负责”。
- Action:为完成任务的自己做了哪些工作,是怎么做的。详细介绍,如 架构特点、使用的工具/平台/技术、何种测试方法。
- Result:自己的贡献。写的具体些,最好用数字加以说明,如 按时完成多少功能、性能提升百分比、维护修改了多少个Bug。
可能追问的额外问题:
- 项目中碰到的最大问题是说明?是怎么解决的?
- 从这个项目中学到了什么?
- 什么时候会和其他团队成员 有什么样的冲突,你们是怎么解决冲突的?
TIPS:介绍项目经验(简历上和面试口头上)时,不必详述项目背景,而要突出自己完成的工作及取得的成绩。
2.1.2 应聘者掌握的技能
描述技能掌握程度时也要注意“了解”、“熟悉”和“精通”的区别。
- 了解:对某项技术只是上过课或者看过书,但没做过实际的项目。通常不建议列出,除非应聘职位的确需要。(e.g., Autodesk 与 图形学课程)
- 熟悉:简历上大部分技能的掌握程度应是“熟悉”。在实际项目中使用某项技术已有较长时间,通过查阅文档可以独立解决大部分问题。
- 精通:对技术使用得心应手,项目开发工程中可以解决他人请教的问题。不要把轻易使用“精通”,提高了面试官的期望。
2.1.3 回答“为什么跳槽”
不要抱怨,不要流露出负面的情绪。
尽量避免以下4个原因:
- 老板太苛刻。
- 同事太难相处。
- 加班太频繁。
- 工资太低。要留下好印象,等HR面再谈。
通常给出的答案:现在的工作做了一段时间,已经没有太多的激情了,因此希望找一份更有挑战性的工作。然后具体论述为什么有些厌倦现在的职位,以及面试的职位为什么有兴趣。
2.2 技术面试环节 (本书大纲)
一小时的面试中,技术面通常占据40-50分钟。
关注的5种素质:
2.2.1 扎实的基础知识(第二章重点介绍)
编程语言、数据结构和算法
-
数据结构:链表、树、栈、队列和哈希表等,以及它们的操作。
链表和二叉树相关问题很多,熟记:链表的插入和删除节点,二叉树的各种遍历方法的循环和递归写法。
-
算法:注重 查找、排序等算法。
在了解各种查和排序算法的基础上,重点掌握二分查找、归并排序和快速排序。
2.2.2 高质量的代码(第三章重点介绍)
正确的、完整的、鲁棒的高质量的代码
越简单的问题,面试官的期望值越高,希望能完整地解决问题。 P12、13
- 完成基本功能
- 考虑边界条件、特殊输入(如空字符串)及错误处理
2.2.3 清晰的思路(第四章重点介绍)
在面试中遇到难题,有3种办法分析、解决复杂问题:
- 画图使抽象问题形象化:分析链表与二叉树,可以画结构图。
- 举例使抽象问题具象化:试着用一两个具体例子模拟操作过程,类似以前做选择题找特例。
- 分解使复杂问题简单化:很多基于递归的思路,包括分治法和动态规划。
2.2.4 优化效率的能力(第五章重点介绍)
优化时间效率和空间效率
- 首先知道如何分析效率,如:斐波那契数列推用一个循环求出f(n)比使用递归调用树减少复杂度。
- 熟知各种数据结构的优缺点,如:数组可以根据下标用O(1)时间完成查找,那么可以用简单的哈希表解决很多问题。
- 熟练掌握常用的算法,查找和排序,如:有序数组用二分查找可以降低O(n)到O(logn),排序算法还可以解决其他问题。
2.2.5 优秀的综合能力(第六章重点介绍)
除了编程能力和技术功底,还需展示自己的软技能,例如沟通能力和学习能力。
- 项目越来越大,沟通越来越重要。
- 考察学习能力:询问最近看什么书学到了哪些技术,抛出一个新概念然后理解并解决问题,知识迁移 即从简单问题到复杂问题。
- 抽象建模能力,发散思维能力,创新精神等。
2.3 应聘者提问环节
P17 - P19
迅速想出问题难度很多,所以在面试前做些功课,为每轮面试准备2-3个问题。合适的问题能体现对公司、职位的兴趣。
不适合在技术面试环节问的问题包括:
- 不要问和自己职位没有关系的问题,如“公司未来五年的发展战略是什么”
- 不要问薪水
- 不要立即打听面试结果
推荐的问题:与应聘的职位或者项目相关
- 面试前做好功课,搜集公司成立时间、主要业务、职位要求等相关信息
- 面试中留心面试官说过的话,如 面试官会介绍职位相关的项目时,包含其他渠道无法得知的信息例如项目进展情况。可以从中找出一个点,然后向面试官提问。
小结
- 重点介绍了面试的流程:电话面试,共享桌面远程面试和现场面试
- 面试的3个环节:行为面试环节,对照简历询问项目经验和掌握的技能;技术面试环节,考察编程能力、技术功底以及沟通、学习能力等;最后是应聘者提问环节。
- 关于技术面试环节的内容是本书的大纲。