面试经验之谈

通常面试官会把每一轮面试分为三个环节:① 行为面试 ② 技术面试 ③ 应聘者提问

行为面试环节


面试开始的5~10分钟通常是行为面试的时间,面试官会参照简历和你的自我介绍了解应聘者的过往经验项目经历。由于面试官手里拿着应聘者的简历,里面有应聘者的详细信息,因此此时的自我不用花费很多时间,用30秒到1分钟的时间介绍自己的主要学习知识工作经历即可。如果面试官对你的某一段经历或者参与的某一个项目感兴趣,那么他会有针对性地提几个问题详细了解。

应聘者项目经验

自我介绍完之后,面试官会一般会对照简历详细了解第一个项目(因为你最熟悉),建议按照如下模型描述自己经历的每一个项目:

【Situation 简短的项目背景】比如项目的规模,开发的软件的功能、目标用户等。
【Task 自己完成的任务】这个要写详细,要让面试官对自己的工作一目了然。在用词上要注意区分 “参与” 和 “负责”。如果只是加入某一个团队写了几行代码就用“负责”,那就很危险,架构师可能就会问项目总体框架设计、核心算法、团队合作等问题。这些问题对于知识简单 “参于” 的人来说,很难回答。会让面试官认为你不诚实,印象分减去很多。
【Action 为完成任务自己做了哪些工作,是怎么做的】这里可以详细介绍。做系统设计的,可以介绍系统架构的特点;做软件开发的,可以写基于什么工具在哪个平台下应用了哪些技术等。
【Result 自己的贡献】这方面的信息可以写得具体些,最好能用数字加以说明。如果是参与功能开发,则可以说按时完成了多少功能。如果做优化,则可以说性能提高的百分比是多少;如果是维护,则可以说修改了多少个 Bug。

面试官针对项目经验最常问的问题包括如下几个类型:
【1】你在项目中碰到的最大的问题是什么,你是怎么解决的?
【2】从这个项目中你学到了什么?
【3】什么时候会和其他团队成员有什么样的冲突,你们是怎么解决冲突的?

应聘者在准备简历的时候,针对每一个项目经历都应该提前做好相应的准备,只有准备充分,应聘者在行为面试环节才可以表现的游刃有余。

在介绍项目经验时,应聘者不必详述项目的背景,而要突出介绍自己完成的工作及取得的成就

应聘者掌握的技能

除了参与过的项目之外,面试官对应聘者掌握的技能也很感兴趣,他有可能针对简历上提到的技能提出问题。描述技能掌握程度时也要注意 “了解”、“熟悉”、和“精通”的区别。
“了解”指对某项技术只是上过课或者看过书,但没有做过实际的项目。通常不建议在简历中列出只是肤浅地了解一点的技能,除非这项技术应聘的职位的确需要。
“熟悉”指在项目中使用某项技术已经较长时间,通过查阅相关的文档可以独立解决大部分问题,那么我们就熟悉它了。
“掌握” 指对一项技术使用得得心应手,当同学或同事向我们请教这个领域的问题时,我们都有信息解决,这个时候我们就可以说自己精通了这项技术。不要试图在简历中把自己修饰成“高人”而轻易使用“精通”,除非自己能够很轻松地回答这个领域里的绝大多数问题,否则就会适得其反。通常如果应聘者在简历中说自己精通某项技术,面试官就会对他有很高的期望值,因此会挑一些比较难的问题来问。

为什么离职

每个人都有自己跳槽的动机和原因,因此面试官也不会期待一个标准答案。但在回答这个问题的时候不要抱怨,也不要流露出负面情绪。尽量避免以下四个原因:
【1】老板太苛刻;
【2】同事太难相处;
【3】加班太频繁;
【4】工资太低;
常用的答案是:现在的工作做了一段时间,已经没有太多的激情,因此希望寻找一份更有挑战的工作。然后具体为什么厌倦现在的职位,以及面试的职位为什么会有兴趣,都需要进行思考。

技术面试环节

面试官通过简历及行为面试大致了解应聘者背景后,接下来就开始技术面试了。通常一轮一小时的面试,技术面试会占 40~50分钟,这是面试的重头戏,对面试结果起决定性因素。虽然不同公司不同面试官的背景、性格不同,但总体来说他们都会关注应聘者的5种素质:
【1】扎实的基础知识、包括编程语言、数据结构、算法等;
【2】能写正确的、完整的、高质量的代码
【3】分析问题时思路清晰,能解决复杂问题;
【4】能从时间、空间复杂度两方面优化算法效率
【5】具备优秀的沟通能力、学习能力、发散思维能力等;
应聘者在面试之前需要做足准备,对编程语言数据结构算法等基础知识有全面的了解。面试的时候如果遇到简单的问题,则应聘者一定要注重细节,写出完整、鲁邦的代码。如果遇到复杂的问题,应聘者可以通过画图、举具体的例子分析和分解复杂问题等方法先理清思路再动手编程。除此之外,应聘者还应该不断优化时间效率和空间效率,力求找到最优的解法。在面试的过程中,应聘者还应主动提出,以弄清楚题目的要求,表现自己的沟通能力。

扎实的基础知识

3个方面:编程语言、数据结构、算法。数据结构是面试过程中的重点,在面试之前,应聘者需要熟练掌握链表队列哈希表等数据结构,以及它们的操作。链表二叉树是面试官最喜欢问的问题。这方面看似简单,但是真正掌握也不容易,特备适合短时间的面试内校验应聘者的基本功。如果应聘者事先对链表的插入和删除节点了如指掌,对二叉树的各种遍历方法的循环和递归写法烂熟于胸,那么真正到了面试的时候也就游刃有余了。
最后,大部分公司都会注重考查查找、排序等算法。应聘者可以在了解各种查找和排序算法的基础上,重点掌握二分查找归并查找快速排序,因为很多面试题都只是这些算法的变体而已。

高质量的代码

只有注重质量的程序员,才能写出鲁邦、稳定的大型软件。在面试的过程中,面试官会格外关注边界条件特殊输入等看似细枝末节但实则至关重要的地方,以考查应聘者是否注重代码质量。
要想写好优秀的代码,考虑全边界条件和特殊输入。最好的办法是在动手写代码之前想好测试用例。只有把各种可能的输入事先都想好了,才能在写代码的时候把各种情况都进行相应的处理。写完代码之后不要立刻给面试官检查,而是先在心里默默地运行。当输入之前向好的所有测试用例都能得到合理的处理输出时,再把代码交给面试官。

清晰的思路

只有思路清晰,应聘者才有可能在面试过程中解决复杂的问题。有时候面试官会有意出一些比较复杂的问题,以考查应聘者是否能在短时间内形成清晰的思路并解决问题。对于确实很复杂的问题,面试官甚至不期待应聘者能在面试不到一小时的时间里给出完整的答案,他更看重的可能还是应聘者是否有清晰的思路。面试官通常不喜欢应聘者在没有形成清晰的思路之前就草率地开始写代码,这样写的代码容易逻辑混乱、错误百出。

可以通过几个简单的方法帮助自己形成清晰的思路。首先,举几个简单的具体例子让自己理解问题。说不定通过具体的例子找到抽象的规律。其实,可以试着用图形表示抽象的数据结构。像分析链表、二叉树相关的题目,我们都可以画出它们的结构来简化题目。最后,可以试着把复杂的问题分解成若干简单的子问题,再一一解决。很多基于递归的思路,包括分治法和动态规划,都是把复杂的问题分解成一个或者多个简单的子问题。

优化效率的能力

优秀的程序员对时间内存的消耗锱铢必较,他们很有激情地不断优化自己的代码。当面试官提出的问题有多种解法的时候,通常他会期待应聘者最终能够找到最优解。当面试官提示还有更好的解法的时候,应聘者不能放弃思考,而应该努力寻找时间消耗或者空间消耗上可以优化的地方。

要想优化代码的效率,我们还要熟知各种数据结构的优缺点,并选择合适的数据结构解决问题。我们在数组中根据下标可以用O(1)时间完成查找。数组的这个特征可以用简单的哈希表解决很多问题,如面试题 “第一个只出现一次的字符”

要想优化代码的效率,我们也要熟练掌握常用的算法。面试中最常用的算法是查找排序。如果从头到尾顺序扫描一个数组,那么我们需要 O(n) 时间才能完成查找。如果数组是排序的,应用二分查找算法就能把时间复杂度降到 O(logn)。

优秀的综合能力

除了编程技能和技术功底之外,还需要展示自己的软技能(Soft Skills),注入自己的沟通能力学习能力。随着软件系统的规模越来越大,软件开发已经告别了单打独斗的年代,程序员与他人的沟通变得越来越重要。面试官会观察应聘者在介绍项目经验或者算法思路时是否观点明确、逻辑清晰,并以此判断其沟通能力的强弱。另外,面试官也会从应聘者说话的神态和语气来判断他是否有团队合作的意识。通常面试官不会喜欢高傲或者轻视合作者的人。

IT 行业知识更新很快,因此程序员只有具备很好的学习能力才能跟上知识更替的步伐。通常面试官有两种办法考察应聘者的学习能力。第一种方法是询问应聘者最近在看什么书、从中学到了那些新技术。面试官可以从这个问题了解应聘者的学习愿望和学习能力。第二种方法是抛出一个新的概念,接下来他会观察应聘者能不能在较短时间内理解这个新概念并解决相关的问题。

知识迁移能力是一种特殊的学习能力。如果能够把已经掌握的知识迁移到其他领域,那么学习新技术或者解决新问题就会变得容易。面试官经常会先问一个简单的问题,再问一个复杂但和前面的简单问题相关的问题。这时候面试官期待应聘者能够从简单问题中得到启示,从而找到解决复杂问题的窍门。

还有不少面试官喜欢考查应聘者的抽象建模能力发散思维能力。面试官从日常生活中提炼出问题,考查应聘者能不能把问题抽象出来用合理的数据结构表示,并找到其中的规律解决问题。面试官也可以限制应聘者不得使用常规方法,这要求应聘者具备创新精神,能够打开思路从多角度分析,解决问题。

应聘者提问环节

在结束面试前 5~10分钟,面试官会给应聘者机会问几个问题,应聘者的问题质量对面试的结果也有一定的影响。有些人的沟通能力很强,马上会想到有意思的问题。建议应聘者为每一轮面试准备2~3个问题,这样到提问环节就游刃有余了。面试官让应聘者问几个问题,主要是想了解他最关心的问题有哪些,因为应聘者至少要问一两个问题,否则面试官就会觉得你对我们公司、职位等都不感兴趣,那你来面试干什么?但也不是什么问题都可以在这个时候问。如果问题问的比较合适,则对应聘者来说是个加分的好机会;但如果问的问题不太合适,则面试官对他的影响就会大大折扣。

有些问题不适合在技术面试这个环节里问的。首先,不要问和自己职位没有关系的问题,比如问 “公司未来五年的发展战略是什么”。如果面试的是 CTO,面试官是 CEO这个问题倒是比较合适。其实,不要谈薪水,技术面试不是谈薪水的时候,要谈工资要等通过面试之后和 HR谈。再次,不要立即打听面试结果,比如问 “你觉得我能拿到 Offer吗” 之类的问题。最后,推荐问的问题与应聘的职位或者项目相关的问题。如果这种类型的问题问的很到位,那么面试官就会觉得你对应聘的职位很有兴趣。不过要问好此类问题也不容易,要对应聘的职位或者项目的背景有一定的了解。可以从两方面了解相关信息:一是面试前在网上收集一些信息,做到对公司成立时间、主要业务、职位要求等都了然于胸;而是面试过程中留心面试官说过的话。有不少面试官在面试之前会介绍与招聘相关的项目,其中包含从其他渠道无法得到的信息,比如项目进展情况等。应聘者可以从中找出一两个点,然后向面试官提问。

总结

通常面试时从电话面试开始的。接下来可能有一两轮共享桌面远程面试,面试官通过桌面共享软件远程考查应聘者的编程和调试能力。如果应聘者足够优秀,那么公司将邀请他到公司去接受现场面试。一般一轮面试都有3个环节。首先是行为面试环节,面试官在这一环节对照简历询问应聘者的项目经验和掌握的技能。接下来就是技术面试,这个是面试的重头戏。在这一环节里,面试官除了关注应聘者的编程能力和技术功底,还会注意考查他的沟通能力和学习能力。在面试的最后,通常面试官会留几分钟时间让应聘者问几个他感兴趣的问题。

posted @ 2020-11-14 17:51  Java程序员进阶  阅读(85)  评论(0编辑  收藏  举报