最近我的一位技术不错的同学想换工作,然后跟我吐槽在面试中碰到了一些奇怪的面试官问了一些不着边际的题目,让我这位同学很是苦恼。其实我之前一直想说说面试,但是也一直比较懒。这次听完他的谈话,结合我的一些面试别人的经验和自己被面试的经验,今天分别来谈谈从面试官角度和被面试者出发,我对一次”良好“面试的看法吧。因为我是做后台开发的,所以讲的东西可能有点偏重于后台开发,但是我觉得面试方法来说是具有普适性的。
1. 从面试官角度出发
- 面试题目应该覆盖足够广的程度。比如我是做后台开发的,我认为一次合格的后台开发面试应该覆盖到:数据结构&算法、操作系统、网络知识、某一门求职者擅长的编程语言。以上4个我认为是必须需要考察的,另外还有一些比如数据库、分布式、Linux基本操作等相应知识也可以进行适当的考察。不能一次面试只面操作系统,这个就没办法进行系统而全面的考察。
- 面试考察应该由浅及深。一开始可以问一些浅的知识,如果面试者知道,再可以进行深入探讨,查看他对该知识点了解的深度。而不应该一开始就考察特别深,可能面试者对这一知识看的不够深,或者平时他自己做的项目没有涉及这么深,那么这么问可能也不合适。举个例子,比如面C++,很多面试官愿意问你知道map实现机制是什么,当你说出红黑树就换个问题了。这个不好,我认为如果面试者知道红黑树,再提问红黑树特性是什么?为什么选择用红黑树实现而不是平衡二叉树,如果我用平衡二叉树实现可不可以,有什么优缺点;再比如考察操作系统,先问fork是干什么的,再问fork具体做了些什么,fork完父子进程哪个先执行,为什么。这种由浅及深的过程可以考察到面试者对问题的掌握程度,如果知道,肯定是加分项,但是如果只是某一个或者某几个比较偏的问题不知道,也不应该对其进行否定,毕竟可能求职者之前做的项目没涉及这么深或者没看到这么深。
- 面试的问题应该和求职者之后入职的岗位匹配。千万不要面不相关的题目,比如明明来是做Java的,面了一堆C/C++的问题;或者明明做的项目没涉及到分布式,面了一堆分布式问题。这样难免会对面试者产生误判,认为岗位是做这些东西的啊。如果对这些不感兴趣,可能offer就拒了,如果感兴趣来了发现不是这些东西,再失望离职,对双方都是比较大的损失。
- 数据结构算法的考察不应该考察过于偏的算法。比如我认为对于普通没有竞赛基础的人,应该考察到的数据结构是集合(点)、线性结构(链表、数组)、树(二叉树、xx二叉树等)。不要考察图,因为这对没有做过算法竞赛的人不公平。算法来说可以考察一些基础的贪心、简单的动态规划、深广搜、基于树的各种算法等。其实面这类问题真的一直是面试官比较纠结的问题,一来面吧,其实工作中用到的真不多,而且面一些概念性的东西无法考察面试者的思维逻辑能力,也就是通俗来说得聪明程度;不面吧,更不合适,要是基本的数据结构这些知识不知道,可能工作后事倍功半。
我认为一次失败的数据结构算法面试是什么样的,比如上来问“你知道最短路Dijsktra算法是怎么个过程”,或者“背包问题怎么做”,再或者“写一个快速排序吧”,还有仅仅提问“说出时间复杂度为O(nlog(n))的排序算法”。这类问题纯粹属于准备了就知道,不准备就不知道,没有什么营养,当然如果连O(nlog(n))的排序算法都不知道,那的确应该是大大的减分项。
一个合格的数据结构算法面试也应该由浅及深。拿个常见的问题举例子,比如最长连续子段和,这类问题我比较喜欢,如果面试者之前没做过,的确挺能考察对方的思维能力。如果做过(当然,现在这么多刷题网站,很多都做过),也不应该就pass了,而应该进行扩展,比如二维数组的连续最大矩阵和怎么求,再比如一个连续的一维数组里面,最长的两端最长子段和怎么求……种种之类的扩展有很多,面试者不可能都做过,而且就算最后做不出来也不要紧,关键是从不会到会求职者思考的过程。
千万不要问太难太偏的算法,比如:组合博弈的问题,凸包问题,网络流问题。这类问题恐怕真是为了出题而出题。 - 面试过与不过的门槛不应该局限于某一具体知识点的知道与不知道。比如,求职者知道这个,然后面试官就认为,这个人不错;求职者不知道这个知识点,面试官就认为,这个人不行。这就没什么营养了,谁都不可能啥都知道。举个例子,比如你问求职者协程的实现机制是什么;或者Redis通信机制;或者,tcp四次分手。当然我说的没有营养是只问四次分手概念,但如果进行扩展,比如为什么四次,三次行不行,什么是TIME_WAIT状态,为什么有这个状态,类似此类的扩展,这个问题就有营养了。
- 面试官千万不要站在把面试者难倒就有成就感的角度去问问题。这个容易出现在刚当面试官的时候的心态,实话实说,第一次当面试官的时候,我也有过,惭愧……面试是为了招合适人,而不是为了凸显自己的牛逼。毕竟这种浪费双方时间的做法,谁都讨厌。
- 面试官在提问之前,自己一定要对问题足够了解。曾经我了解一些面试官,可能自己都对问题不是很了解,就去问别人。这样如果他说的对不对,你都不知道,面试又有什么意义?还有一次曾经有一位面试官让我用O(nlog(n))的时间复杂度,O(1)的空间复杂度对单链表进行排序,而且函数传参数也计入空间复杂度。这个我觉得扯淡了,O(nlog(n))时间复杂度做到没问题,但同时要做到O(1)的空间复杂度就扯淡了。最后我问面试官怎么做,他也没说。所以我得出的结论就是面试官的能力有限,他可能对某一个知识存在误区。
- 尝试去提问灵活性题目。灵活性题目比如系统设计,例如:如何设计微信?这类问题没有固定答案,面试者怎么答都可以,但是通过回答过程可以了解到面试者对各个知识的掌握程度,是否了解从0到1设计一个系统,以及如何从1到2扩展一个系统。目前,flag等公司的社招也都是数据结构算法+系统设计的组合。
- 面试是一次“接近”平等沟通的过程。为什么我说“接近”,因为其实肯定是不平等的,毕竟求职者是被面试;但是没有那么不平等,而应该是面试官招人,被面试者找同事或者mentor的过程。通过面试,求职者也能知道面试官的水平在什么层次。如果面试官问的问题特别水,求职者难免会产生一种“这个公司不会就这个水平吧”的疑问。有些面试官上来趾高气扬,有些面着面着求职者觉得体验很差,半路走的我也听说过。所以一次合格的面试,首先面试官要亲和,双方保持足够的耐心进行沟通,对对方提问或者回答理解不到位的,一定要及时提问。
2. 从求职者角度出发
- 一定要诚信。面试者对待面试一定要诚信,这个最主要体现在简历上,现在有些面试者为了通过简历筛选,或者突出自己的亮点,会出现对简历进行编造的情况。大到学历,中到获奖经历,小到项目经历。这些东西考察不出来还好,但一个合格的面试官肯定能考察出来,特别是获奖和项目,学历之类的更做不了假,很大很大的概率被查出来。
- 面试者需要具备应聘岗位基本的求职技能。这个是从节约时间角度来考虑的,比如面试jd上写的一条都不满足还去投简历,这个意义的确不大了。但反过来说,现在有些面试jd要求的确也偏多,可能会一两个也具备要求了,所以应聘时自己需要考量一下。
- 简历上最好不要写精通,除非你真的真的很精通。这个可能是行业的“潜规则”,现在面试官一看到“精通”的字眼,就会琢磨:哎哟,这么不谦虚,我来杀杀他的锐气。然后完了一面,如果你的确精通,那是个加分项,但是不是的话,期望和现实有落差,你认识的“精通”跟他的“精通”原来是两码事,那就完犊子了。所以,如果将“精通”的东西写成“熟悉”,“熟悉”的写成“了解”,面试官一看简历只是“了解”,就会降低期望,然后一面,发现,咦,不止“了解”,不错呀。这个就是心理学的问题了。当然,你写“了解”可能简历都过不了,这个就需要权衡了。
- 面试要保持平和心态。无论如何,不要跟面试官发生争执,除非他真的说出涉及到人生攻击之类的话语了,这样的话你也可以跟HR投诉这位面试官。面试官说错了,表达你自己的观点,但万一他认为自己就是对的,也不要争吵。
- 对于自己面试的岗位要充分了解。假设你不了解应聘岗位具体做什么,及时问面试官。一般在面试的最后面试官会提问,你对我们有什么问题吗,就是你提问的时候了。保持良好的沟通是一次有效面试的必备条件。
- 回答问题时要体现自己的思维逻辑过程。比如一道题从不会到会,总有个思考的过程。不要拿到一道题就开始想,想了10分钟,告诉面试官我不知道。你及时表达出你的思考想法,比如算法题,最简单的暴力应该怎么做,优化我是怎么想的,哪里不对。好的面试官会去引导你,给你提示,考察你的思维逻辑。一般不会干等你的最后结果。
- 不会就是不会。千万不要不懂装懂,面试官不是傻子,你懂不懂一听就知道。不要绕了半圈,最后还是在瞎说一通。
- 自身硬实力。这个就不多说了,其实是废话……
小结一下吧,从上本科到研究生到毕业工作,我经历了不少面试,我也面试过一些求职者。对于求职者来说,一次好的面试体验,可能之后在offer选择时,在薪资差别不大的情况下,有较大的倾向性,因为他感觉面试官的水平足够高也足够亲和,吸引他之后过来。我特别能理解作为面试者,特别是刚毕业面试者面试的忐忑心理,这时候面试官也需要引导面试者进入状态。总而言之,保持良好沟通是一次良好面试的必要条件。