由于之前没有看过相关理论,导致面试的时候吃了很多亏,看完《剑指offer》的第一章,有一种恍然大悟的感觉......
面试的三种形式
1. 电话面试;2.视频面试;3. 现场面试。
注意:思考清楚再开始编码;拥有良好的代码命名和缩进对齐习惯;能够进行单元测试;能够对代码中的问题进行调试。
面试的三个环节
1. 行为面试;2. 技术面试;3. 应聘者提问。
1. 行为面试
面试开始的5-10分钟。面试官会注意面试者的性格特点,深入了解简历中列举的项目经历,一般不会问特别多技术难题,给面试者调整情绪,进入面试状态。首先面试官会让应聘者进行一个简短的自我介绍,由于面试官手中有简历,所以用30秒到1分钟的时间介绍自己的主要学习、工作经历即可。如果面试官对你的某一段经历或者项目感兴趣,就会有针对性地提问进行详细了解。
项目经历。描述项目的STAR模型。1). Situation: 简短的项目背景。比如项目的规模、开发软件的功能、目标用户。2). Task: 自己完成的任务。注意区分“参与”和“负责”的区别,如果写了负责,可能会问项目的总体设计、核心算法、团队合作等问题,这些对于简单参与的人来说是很难回答的。3). Action: 为完成任务自己做了哪些工作,是怎么做的。这里可以详细介绍。做系统设计的可以介绍系统架构的特点;做软件开发的可以写基于什么工具在哪个平台下应用了哪些技术;做软件测试的可以写是手工测试还是自动化测试,是白盒测试还是黑盒测试。4). Result: 自己的贡献。最好用数字进行量化。如果是参与功能开发,可以说按时完成了多少功能;如果做优化,可以说性能提高的百分比是多少;如果是维护,可以说修改了多少bug。
注意:在介绍项目经验时,应聘者不必详述项目的背景,要突出自己完成的工作和取得的成绩。
应聘者应掌握的技能。描述技能掌握程度时要注意区分“了解”、“熟悉”和“精通”的区别。“了解”是指对某项技术只是上过课或者看过书,没有做过实际的项目,通常不建议在简历中列出只是肤浅地了解一点的技能,除非这项技术应聘的职位的确需要。“熟悉”是指使用某项技术已经有了较长的时间,通过查阅相关文献可以独立解决大部分问题。“精通”是指对某项技术使用非常得心应手,对于其他人的问题也有信心解决。
回答为什么跳槽?应该避免负面情绪,和一下几个方面的原因:老板太苛刻;同事太难相处;加班太频繁;工资太低等。比较推荐的回答是:现在的工作做了一点时间,已经没有太多的激情了,因此希望寻找一份更有挑战的工作,然后具体论述为什么会厌倦目前的职位,以及为什么对面试的职位感兴趣。
2. 技术面试
面试官一般希望面试者具备以下几个方面的素质。
1. 扎实的基础知识。至少掌握一两门熟悉的编程语言,面试官会从应聘者的在面试过程中写的代码跟跟进的提问判断对于编程语言的掌握程度。熟练掌握链表、树、栈、队列、哈希表等数据结构,比如对于链表的插入和删除了熟于心、对二叉树的各种遍历算法的循环和递归写法了如指掌。熟悉各种查找和排序算法,重点掌握二分查找、归并排序、快速排序、动态规划、贪婪算法。
2. 高质量的代码。面试官会格外关注边界条件、特殊输入等看似细枝末节但实则至关重要的地方。代码不仅仅能够完成最基本的功能,还要能能够适应特殊的边界条件和参数。要解决上述问题,需要在动手写代码之前想好测试用例,考虑好所有可能的输入。
3. 清晰的思路。有时候面试官会有意出一些比较复杂的问题考察面试者能否在短时间内形成清晰的思路并解决问题,如果面试者草率地开始写代码,这样写出来的代码容易逻辑混乱、错误百出。可以采用画图、举例和分解问题等方法来解决问题。
4. 优化效率的能力。首先要知道如何分析效率,比如对于斐波那契数列,类推的方法要比递归的方法时间效率更高。其次要熟知各种数据结构的优缺点,并选择合适的数据结构解决问题。最后要掌握常用的算法如查找和排序等。
5. 优秀的综合能力。应聘者在介绍项目经历或算法思路的时候是否观点鲜明、逻辑清晰来判断其沟通能力的强弱,通过应聘者说话的神态和语气来判断是否有团队合作的仪式。询问应聘者最近在看什么书、从中学到了哪些新技术,了解应聘者的学习愿望和学习能力。跑出一个新概念,观察应聘者是否可以在较短的时间内理解这个概念并解决相关问题。知识迁移能力,先问一个简单的问题,再问一个很复杂但与前面的简单问题相关的问题。抽象建模能力和发散思维能力。
3. 应聘者提问环节
推荐问的问题是与应聘职位或者项目相关的问题,需要对应聘的职位或项目背景有一定的了解。一是面试前做足功课,二是在面试过程中留心面试官说过的话,从中找一两个点,向面试官提问。