首页 > 技术文章 > 剑指 Offer (1)

lsc2019 2021-03-10 10:27 原文

剑指 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个环节:行为面试环节,对照简历询问项目经验和掌握的技能;技术面试环节,考察编程能力、技术功底以及沟通、学习能力等;最后是应聘者提问环节。
  • 关于技术面试环节的内容是本书的大纲。

推荐阅读