内容:
1、技术面试的形式
2、技术面试的大致环节
3、技术面试应具备的素质
4、技术面试的经验建议
参考:
《剑指offer》第二版 - 第一章
《Java程序员面试笔试宝典》- 第一章、第二章
1、技术面试的形式
技术面试大致上可以分为以下形式:
- 电话面试
- 共享桌面面试
- 现场面试
(1)电话面试
电话面试:面试官通过打电话的方式考查应聘者
注意事项:
- 主动选择通话时间
- 主动选择通话地点
- 准备齐全:纸和笔、简历、必要的工具书、水
- 保证手机电池能至少连续通话1个小时
- 语速不要太快、尽量用形象化的语言把问题细节说清楚
(2)共享桌面面试
共享桌面面试: 指利用一些共享桌面的软件,应聘者把自己的电脑桌面共享给面试官,然后面试官观看应聘者编程和调试的过程
这种面试中面试官最关心的是应聘者的编程习惯及调试能力,应该做好以下几方面:
- 思考清楚再开始编程
- 良好的代码命名和缩进对齐习惯
- 进行单元测试
(3)现场面试
现场面试:一般是通过在线笔试或者上面两个面试过程之后应聘者去公司现场或者公司安排的地方进行面试
注意事项:
- 规划好出行路线并估算出行时间(不要迟到)
- 准备好得体的衣服(程序员穿舒服干净的衣服就行)
- 注意面试邀请函中的面试流程
- 准备一些必要的问题
2、技术面试的大致环节
技术面试的大致环节可以分为以下三项:
- 行为面试
- 技术面试(核心)
- 应聘者提问
(1)行为面试
行为面试:面试开始的5到10分钟,面试官会注意应聘者的性格特点,深入了解简历中列举的项目经验
自我介绍:开始的时候一般要进行自我介绍,面试官手中有应聘者的简历(有详细资料),不必详细介绍个人情况,而是用1分钟左右的时间介绍自己的主要学习、项目经历、工作经历等
项目经验描述:
- 项目经验的描述使用STAR模型进行描述,从以下几个方面描述:
- situation:简短的项目背景(项目规模、项目功能、目标用户)
- task:自己完成的任务(注意参与和负责的区别)
- action:为完成任务做了哪些工作、是怎么做的(基于什么工具在什么平台应用哪些技术进行开发)
- result:自己的贡献(完成多少功能、优化性能提高的百分比是多少、修改多少bug)
注意:在这个过程中没有技术难题,是一个暖场的过程,应聘者可以利用这几分钟调整情绪,进入状态
(2)技术面试(核心)
技术面试:面试官通过各种方法考查应聘者的能力与技术,比如手写代码、回答问题等
技术面试是面试中的核心部分,一般时间在30分钟以上,50分钟以下,对整个面试的结果起决定性作用
技术面试核心考查以下五点素质:
- 扎实的基础知识:熟悉编程语言(1到2门)、数据结构和算法
- 高质量的代码:正确、鲁棒性、完整
- 清晰的思路:解决复杂性问题时有清晰的思路
- 优化算法效率:时间复杂度、空间复杂度
- 综合能力:学习沟通能力、发散思维能力等
详细内容见后面的技术面试应具备的基本素质
(3)应聘者提问
在结束面试的5到10分钟之内,一般面试者都会给应聘者机会提几个问题,应聘者提的问题质量对面试结果也有一定影响,建议提前准备好几个问题
注意事项:
- 不要问和职位无关的事情:例如开发工程师不要问公司未来五年的发展战略是什么
- 不要问薪水:技术面试不是谈薪水的时候,谈薪水是等全部面试通过之后跟HR谈
- 不要马上打听面试结果:面试一般都有好几轮,最后能否成要把所有面试官的评价综合起来
- 推荐问与职位或项目相关的问题:面试前了解公司主要业务及职位要求、面试过程中注意面试官说的话(有些面试官会介绍公司的项目)
3、技术面试应具备的基本素质
技术面试中应聘者应当具备的基本素质如下:
- 扎实的基础知识:熟悉编程语言(1到2门)、数据结构和算法
- 高质量的代码:正确、鲁棒性、完整
- 清晰的思路:解决复杂性问题时有清晰的思路
- 优化算法效率:时间复杂度、空间复杂度
- 综合能力:学习沟通能力、发散思维能力等
(1)扎实的基础知识
扎实的基础知识包括以下三方面:
- 编程语言:熟悉C++、Java、python等
- 数据结构:熟悉链表、树、栈、队列等常用数据结构
- 算法:熟悉查找(二分)、排序(归并、快排)、动态规划、贪心等常用算法
(2)高质量的代码
高质量的代码包括以下几方面:
- 考虑边界条件
- 特殊输入处理(空指针、空字符串等)
- 错误处理
(3)清晰的思路
一些复杂的问题,应聘者可能无法很快得出正确答案,但是一定要展示自己清晰的思路,不要乱
清晰的思路可以从以下三方面去做:
- 举例(把问题形象化):举几个简单的具体例子让自己理解问题,通过具体的实例找到抽象的规律
- 图形化(把问题具体化):用图形表示抽象的数据结构,比如分析链表、二叉树这样的题目,可以画出它们的结构来进行分析
- 分解问题(把问题简化):可以试着把复杂的问题分解成若干个简单的子问题,再一一解决,很多基于递归的问题都可以这样去解决
(4)优化算法效率
优秀的程序员对时间和内存的消耗都锱铢必较,有激情的不断去优化代码。当面试官面试出的题目有多种解的时候一般都希望应聘者能最终找到最优解或者能不断优化算法效率
优化算法效率就是不断优化算法的时间效率和空间效率
优化算法效率从以下三方面去做:
- 学会分析效率
- 熟知各种数据结构的优缺点并选择合适的数据结构解决问题
- 熟练掌握常用的算法
(5)综合能力
在整个技术面试中,面试者除了展示自己的编程能力和技术功底外还需要展示自己的软技能:
- 沟通能力:介绍项目经验或算法思路时是否观点明确、逻辑清晰,说话的神态和语气(面试官不喜欢高傲或轻视合作的人)
- 学习能力:知识迁移能力,能否从简单问题中得到启示从而找到解决复杂问题的窍门
- 抽象建模能力:从日常生活中提出问题,考查面试者能否将问题抽象出来用合理的数据结构表示并找到规律解决
- 发散思维能力:面试官有时候会提示不限制解题方法,这就考查应聘者是否具有创新精神,打开思路从多角度分析、解决问题
4、技术面试的经验建议
此部分来自《Java程序员笔试面试宝典》及网上的面经
(1)认清自我、保持强烈的求知欲
一个人最重要的就是认清自我,明确知道自己想要什么,明确自己的目标。只有认清了自己之后才能知道自己想要做什么、适合做什么、能做什么。
在某种程度上这比你学什么知识、技术更加重要。只有方向和目标明确,才会有前进的动力,否则再努力都是白费。
其次,要有强烈的求知欲,求知欲即求生欲,连求知欲都没有的人很难在技术圈里混下去,哪怕没有也要装做有的样子!
世界上没有学不会的东西,就看你是否用心去学,是否愿意花费时间去做、去想,万事就怕认真,只要你认真做了不是太难的东西一般可以学会的。
(2)坦白诚实、脚踏实地
有时候面试官问到了你不会的问题或者不太熟悉的领域,那就实话实说,讲出自己的理解并坦言自己这方面知识的欠缺,这比你不懂装懂好得多。
另外大部分面试官在面试的时候一般都是在考查求职者擅长的方面,问的不擅长的问题应该不会很多,所以也没有必要担心面试官问的自己不会或者从来没听说过,只要做好自己就好
企业招聘人才的时候,想要的人是这样的:对人对事有信心、掌握多项技能、基础扎实、有冲劲、愿意拼搏,所以在平时的学习中,还是要脚踏实地的学好专业知识,适当拓展专业技能
(3)未雨绸缪、提前准备
什么事情都要提前准备,没有准备就去面试等于送死。
首先你要对你去面试的这个岗位有一个基本的认识,不能犯低级错误(比如投错简历),你要清楚的知道企业对这个岗位的要求是什么以及关于这个岗位的其他要求等信息。
其次要根据别人对你的职位要求进行相应准备,比如人家要求你了解socket编程你就要清楚socket编程中的几个函数(bind、connect、listen、accept、send、recv、close)
(4)多刷题、刷好题、多总结
如果要参加好的公司的技术面试,一定有一个前提就是通过别人公司的笔试(在线笔试 or 现场笔试),笔试无非就是刷题,题型是选择题+编程题(可能有的公司有简答题)
选择题可以去牛客上练:
编程题可以刷leetcode,另外剑指offer和编程之美这两本书里面的题目也要会(笔试的编程题的套路要么考这上面的原题要么换汤不换药,套路都是一样的)