《剑指Offer》摘录

文章目录
  1. 1. 前言
  2. 2. 行为面试
    1. 2.1. 简历
    2. 2.2. 自我介绍
    3. 2.3. 常见问题
  3. 3. 技术面试
    1. 3.1. 数据结构和算法
    2. 3.2. 剑指Offer
    3. 3.3. leetcode
    4. 3.4. 白板
  4. 4. 应聘者提问
  5. 5. 模拟
  6. 6. 后记

前言

《剑指Offer》一书从面试官的角度,阐述了面试的流程、面试中的注意事项、简历的准备、常考的数据结构和算法等等面试相关内容。本文从一个应聘者的角度,摘录整理面试中需要准备的内容。

程序员面试,面试的形式有电话面试、共享桌面远程面试和现场面试。无论是哪一种形式,一般的面试流程都包括三个环节:行为面试、技术面试和应聘者提问。

行为面试

行为面试,面试官参照简历了解应聘者的过往经验。面试官会注意应聘者的性格特点,深入地了解简历中列举的项目经历。不少面试官会让应聘者做一个简短的自我介绍,由于面试官拿着应聘者的简历,因此自我介绍不用花很多时间,用30秒到1分钟介绍自己的主要学习、工作经历即可。
这一环节中,作为一个应聘者,最重要的是准备一份简历,一份经得起推敲的简历。其次就是准备一下自我介绍,突出重点和优势。还要想好一些常见问题的答复,增强信心,免得现场磕巴。

简历

1、项目经验
项目经验的描述建议使用STAR模型:Situation(简短的项目背景)–>Task(自己完成的任务)–>Action(为完成任务自己做了哪些工作,是怎么做的)–>Result(自己的贡献)。

Situation:简短的项目背景。比如项日的规模,开发的软件的功能、日标用户等。

Task:自己完成的任务。这个要写详细,要让面试官对自己的工作一目了然。在用词上要注意区分“参与”和“负责”:如果只是加入某一个开发团队写了几行代码就用“负责”,那就很危险。面试官看到简历上应聘者“负责”了某个项日,他可能就会问项目的总体框架设计、核心算法、团队合作等问题。这些问题对于只是简单“参与”的人来说,是很难回答的,会让面试官认为你不诚实,印象分会减去很多。

Action:为了完成任务自己做了哪些工作,是怎么做的。这里可以详细介绍。做系统设计的,可以介绍系统架构的特点;做软件开发的,可以写基于什么工具在哪个平台卜应用了哪些技术;做软件测试的,可以写是手上测试还是自动化测试,是白盒测试还是黑盒侧试等。

Result:自己的贡献。这方面的信息可以写得具体些,最好能用数字加以说明。如果是参与功能开发,可以说按时完成了多少功能;如果做优化,可以说性能提高的百分比是多少;如果是维护,可以说修改了多少个Bug。

举个例子,笔者用下面一段话介绍白己在微软Winforms项目组的经历:
Winforms是微软.NET中的一个成熟的Ul平台(Situation)。本人的工作是在添加少量新功能之外主要负责维护已有的功能(Task)。新的功能主要是让Winforms的控件的风格和Vista、Windows7的风格保持一致。在维护方面,对于较难的问题我用WinDbug等工具进行调试(Action)在过去两年中我总共修改了超过200个Bug(Result)。

对于每个项目经验,都应该考虑清楚下面的问题:

  • 你在该项目中碰到的最大问题是什么,你是怎么解决的?
  • 从这个项目中你学到了什么?
  • 什么时候会和其他团队成员(包括开发人员、测试人员、设计人员、项目经理等)有什么样的冲突,你们是怎么解决冲突的?

在介绍项目经验时(包括简历上介绍和口头介绍),应聘者不必详述项目的背景,而要突出介绍自己完成的工作及取得的成绩。

2、掌握的技能
除应聘者参与过的项目之外,面试官对应聘者掌握的技能也很感兴趣,他有可能针对简历上提到的技能提出问题。描述技能掌握程度时要注意“了解”、“熟悉”和“精通”的区别。

“了解”指对某项技术只是上过课或者看过书,但没有做过实际的项目。通常不建议在简历中列出只是肤浅了解一点的技能,除非这项技术应聘的职位的确需要。

简历中我们描述技能的掌握程度大部分应该是“熟悉”。如果我们在实际项目中使用某项技术已经有较长时间,通过查阅相关文档可以独立解决大部分问题,那么我们就熟悉它了。对应届毕业生而言,毕业设计所用到的技能可以用“熟悉”;对已经工作过的,在项目开发中用到的技能,也可以用“熟悉”。

如果我们对一项技术使用得得心应手,在项目开发过程中,当同学或同事向我们请教这个领域的问题时,我们都有信心也有能力解决,这个时候我们就可以说自己精通了这项技术。应聘者不要试图在简历中把自己修饰成“高人”而轻易使用“精通”,除非自己能够轻松地回答这个领域里的绝大多数问题,否则就会适得其反。通常如果应聘者在简历中说自己精通某项技术,面试官就会对他有很高的期望值,因此会挑一些比较难的问题来问。

3、修改
对简历提问,一个问题扣一个问题,不断对简历进行修改和完善。

自我介绍

未完待续。。。

常见问题

为什么跳槽?P9
避免以下四个原因:老板太苛刻,同时太难相处,加班太频繁,工资太低。
理想答案:现在的工作已经做了一段时间,已经没有太多的激情了,因此希望寻找一份更有挑战的工作。然后具体论述为什么有些厌倦现在的职位,以及面试的职位我为什么会有兴趣。

最近在看什么专业书?从中学到了哪些新技术?P16

技术面试

面试官在通过简历及行为面试大致了解应聘者的背景之后,接下来就要开始技术面试了。一轮一小时的面试,通常技术面试会占据40-50分钟时间,这是面试的重头戏,对面试的结果起决定性作用。虽然不同公司的不同面试官的背景、性格各不相同,但总体来说他们都会关注应聘者的5中素质:扎实的基础知识、能写高质量的代码、分析问题时思路清晰、能优化时间效率和空间效率、学习沟通和知识迁移等能力。

在这一环节中,作为一个应聘者,最重要的是学好数据结构和算法。为了做好这一点,建议先做完《剑指Offer》上的题目,因为上面的题目都是最具代表性的。然后刷leetcode,刷的越多越好。

数据结构和算法

数据结构和算法,需要掌握:
数组、字符串、链表、树(链表和树最常考)、栈、队列、哈希表、查找(尤其是二分查找)、排序(尤其是归并排序和快速排序)、分治法、动态规划、贪婪算法。

这些知识点,在大学时期已经学习过,考研也复习过,就不再研读大部头著作。在刷题的时候,顺便复习吧。

剑指Offer

《剑指Offer》中的面试题都是用C++实现的,C++确实是准备面试的首选语言,但是,根据职位的不同应该有所侧重。比如,前端肯定js,安卓肯定java。而机器学习岗,肯定是python了。所以,《剑指Offer》中的题目,针对C++的,小编会直接略过,其他大部分题目,会用python实现。

刷题地址:https://www.nowcoder.com/ta/coding-interviews
备注:这个刷题地址的题目比原书少了一些,但是刷着方便,支持各种编程语言。而且不差那几题,实在想刷全,之后补上就是了。

leetcode

leetcode,之前用java完成了几题,在此清零。在刷完《剑指Offer》后,使用python重新开刷。

刷题地址1:https://leetcode.com/problemset/algorithms/
刷题地址2:https://www.nowcoder.com/ta/leetcode

白板

1、理清思路:画图、举例、分解
2、写出步骤
3、考虑时间空间复杂度
4、特殊情况:边界条件、特殊输入、错误处理
5、优化

  • 思考清楚再开始编码
  • 良好的代码命名和缩进对齐习惯
  • 单元测试(建议先写)
  • 调试

应聘者提问

  • 您觉得我还有哪些专业知识需要学习补充?
  • 您所在的部门从事哪些研究?使用哪些技术?如果能进入贵公司,会不会提供培训?

模拟

未完待续。。。

后记

《剑指Offer》的主体内容,其实就是讲算法。我们听说过技术过时,却从来没有听说过算法过时。不仅没有过时,而且因为机器学习、大数据的要求,算法变得越来越重要了。
任何时候学习算法都不晚,当你觉得为时已晚的时候,恰恰是最早的时候。接下来,参加kaggle、天池的同时,开启刷题模式。