《剑指Offer》摘录

前言

《剑指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、天池的同时,开启刷题模式。

0%