面试的流程
面试的三种形式
- 电话面试:形象化语言讲解细节;如果没有听清楚和听懂问题,不要不懂装懂,答非所问
- 共享桌面,远程面试:编程习惯和调试能力。1,思考清楚再开始编码,先想思路,考虑时间和空间复杂度、特殊情况的处理;2,编码命名和缩进对齐的习惯。3,单元测试,定义函数之后对函数进行全面的单元测试。先写单元测试用例,在写解决问题的函数。测试在前,开发在后 很难。遇到问题,考察:设置断点、单步跟踪、查看内存、分析调用栈
- 现场面试:1,规划路线 早到;2,衣着得体;3,注意面试函里面的面试流程;4,准备自己想问的问题
面试的三个环节
行为面试:项目经验
- 自我介绍:主要学习和工作经历 30秒-1分钟 简历有,不需要太长时间
- 描述自己的项目:简单的项目背景 -> 自己完成的任务 -> 为完成任务,自己做了哪些工作,怎么做的? -> 自己的贡献
- Situation:简短的项目背景。比如项目的规模,开发的软件的功能、目标用户等。
- Task:自己完成的任务。这个要写详细,要让面试官对自己的工作一目了然。在用词上要注意区分“参与”和“负责”:如果只是加入某一个开发团队写了几行代码就用“负责”,那就很危险。面试官看到简历上应聘者"负责”了某个项目,他可能就会问项目的总体框架设计、核心算法、团队合作等问题。这些问题对于只是简单“参与”的人来说,是很难回答的,会让面试官认为你不诚实,印象分会减去很多
- Action:为完成任务自己做了哪些工作,是怎么做的。这里可以详细介绍。做系统设计的,可以介绍系统架构的特点;做软件开发的,可以写基于什么工具在哪个平台下应用了哪些技术;做软件测试的,可以写是手工测试还是自动化测试、是白盒测试还是黑盒测试等。
- Result:自己的贡献。这方面的信息可以写得具体些,最好能用数字加以说明。如果是参与功能开发,则可以说按时完成了多少功能:如果做优化,则可以说性能提高的百分比是多少;如果是维护,则可以说修改了多少个Bug
例子
- Winforms是微软.NET中的一个成熟的UI平台(Situation)?本人的工作是在添加少量新功能之外主要负责维护已有的功能(Task)。新的功能主要是让Winforms的控件风格和Vista、Windows7的风格保持一致。在维护方面,对于较难的问题,我用WinDbg等工具进行调试(Action)。在过去两年中,我共修改了超过200个Bug(Result)
- 你在该项目中碰到的最大问题是什么,你是怎么解决的?
- 从这个项目中你学到了什么?
- 什么时候会和其他团队成员(包括开发人员、测试人员、设计人员、项目经理等)有什么样的冲突,你们是怎么解决冲突的?
- 应聘者在准备简历的时候,针对每一个项目经历都应提前做好相应的准备。只有准备充分,应聘者在行为面试环节才可以表现得游刃有余。
- 突出介绍自己完成的工作及取得的成绩
应聘者掌握的技能
- 描述技能掌握程度时也要注意“了解”、“熟悉”和 “精通”的区别
- 了解:和应聘的岗位无关,没有写的必要
- 熟悉:实际项目中使用某项技术己经有较长的时间,通过查阅相关的文档可以独立解决大部分问题,那么就使用熟悉
- 回 答 “为什么跳槽
- 不要抱怨,也不要流露出负面的情绪
- 尽量.避免以下4 个原因
- 1,老板太苛刻
- 2,同事太难相处
- 3,加班太频繁
- 4,工资太低
- 例子:现在的工作做了一段时间,己经没有太多的激情了,因此希望寻找一份更有挑战的工作。然后具体论述为什么有些厌倦现在的职位,以及面试的职位我为什么会有兴趣。笔者自己跳过几次槽,第一次从Autodesk跳槽到微软,第二次从微软跳槽到思科, 后来又从思科回到了微软。从面试的结果来看,这样的回答都让面试官很满意,最终也都拿到了 Offer。
当时在微软面试被问到为什么要跳槽时,笔者的回答是:我在Autodesk 开发的软件Civil 3D 是一款面向土木行业的设计软件。如果我想在现在的 职位上得到提升,就必须加强土木行业的学习,可我对诸如计算土方量、道路设计等没有太多兴趣,因此出来寻找机会。
在微软工作两年半之后去思科面试的时候,笔者的回答是:我在微软的主要工作是开发和维护.NET的 UI平台Winformso由于Winforms已经非常成熟,不需要添加多少新功能,因此我的大部分工作是维护和修改Bug。 两年下来,调试的能力得到了很大的提高,但长期如此,自己的软件开发和设计能力将不能得到提高,因此想出来寻找可以设计和开发系统的职位。同时,我在过去几年里的工作都是开发桌面软件,对网络了解甚少,因此希望下一个工作能与网络相关。众所周知,思科是一家网络公司,这里的软件和系统或多或少都离不开网络,因此我对思科的职位很感兴趣。
技术面试:现场写代码
应聘者在面试之前需要做足准备,对编程语言、数据结构和算法等基础知识有全面的了解。面试的时候如果遇到简单的问题,则应聘者一定要注重细节,写出完整、鲁棒的代码。如果遇到复杂的问题,则应聘者通过画图、举具体例子分析和分解复杂问题等方法先厘清思路再动手编程。除此之外,应聘者还应该不断优化时间效率和空间效率,力求找到最优的解法。在面试过程中,应聘者还应该主动提问,以弄清楚题目的要求,表现自己的沟通能力。当面试官前后问的两个问题有相关性的时候,尽量把解决前面问题的思路迁移到后面的问题中去,展示自己良好的学习能力。如果能做到这几点,那么通过面试获得心仪的职位将是水到渠成的事情。
扎实的基础知识
写的代码及跟进的提问中能看出其编程语言掌握的熟练程度。以很多公司面试要求的C++举例。如果写的函数需要传入一个指针,则面试官可能会问是否需要为该指针加上const、把 const加在指针不同的位置是否有区别;如果写的函数需要传入的参数是一个复杂类型的实例,则面试官可能会问传入值参数和传入引用参数有什么区别、什么时候需要为传入的引用参数加上const。
- 注重考查:链表 二叉树 ; 二分查找、归并排序和快速排序、动态规划和贪婪算法
- 格外关注边界条件、特殊输入等看似细枝末节但实则至关重要的地方,以考查应聘者是否注重代码质量
- 面试官通常不喜欢应聘者在没有形成清晰思路之前就草率地开始写代码,这样写出来的代码容易逻辑混乱、错误百出。
- 首先,举几个简单的具体例子让自己理解问题
- 用图形表示抽象的数据结构。像分析与链表、二叉树相关的题目,我们都可以画出它们的结构来简化题目。
- 把复杂的问题分解成若干简单的子问题,再一一解决。很多基于递归的思路,包括分治法和动态规划,都是把复杂的问题分解成一个或者多个简单的子问题
应聘者面试:面试者提问
- 不要问和自己的职位没有关系的问题,比如问“公司未来五年的发展战略是什么
- 不要问薪水。技术面试不是谈薪水的时候,要谈工资要等通过面试之后和HR谈。而且这会让面试官觉得你最关心的问题就是薪水,给面试官留下的印象也不好。
- 不要立即打听面试结果,比如问“您觉得我能拿到Offer吗”之 类的问题
- 推荐问的问题是与应聘的职位或者项目相关的问题
- 一是面试前做足功课,到网上去搜集一些相关的信息,做到对公司成立时间、主要业务、职位要求等都了然于胸;
- 二是面试过程中留心面试官说过的话。有不少面试官在面试之前会简单介绍与招聘职位相关的项目,其中会包含从其他渠道无法得到的信息,比如项目进展情况等。应聘者可以从中找出一两个点,然后向面试官提问。