金九银十,又到一年秋招季。这场规模巨大的校园招聘,承载了近千万毕业生的梦想。不过,在这特殊的2020年,这场秋招也变得非比寻常。
本周,我们公司的校园招聘也正式启动了,我担任了3天的二面面试官。这是我毕业8年后,第一次以另外一种身份参与到秋招中。
虽然没有应聘者的那种压力感,却能深深感受到他们身上的紧张、诚挚和渴望,当年自己参与秋招的画面也历历在目,甚是感慨。
这篇文章,我将结合自己的亲身感受,从面试官的角度给出些建议,希望对正在参与秋招的莘莘学子们有所帮助。
— 1 —
很多学生真正体会了一把史无前例的 “云” 课堂、“云” 毕业。但是,疫情带来的影响绝不仅仅只是上课形式或者毕业仪式的改变,紧接着的就业影响才是这场特殊 “成人礼” 真正的考验。我问了几个候选人,都说因为疫情没法参加实习。放在往年,实习经历是企业招人时很看重的点。尤其对于程序员这个职业,非常强调实战。提前经历过实习以及生产项目历练的候选人,他们的编程能力以及对技术的理解更能接近企业的要求。另外,一段亮眼的实习经历通常也是拿 special offer 的必备条件,但是几天面试下来,没有一个候选人能达到这个水平。参加面试的候选人绝大部分都是一本,而且将近一半是211/985硕士,这一点挺出乎我意料的,毕竟我们公司只能算是二线的互联网公司。我问其中一个985硕士背景的候选人,为什么会选择我们公司?答案很现实:因为整体形势不太好,只要有点名气的一二线互联网公司他都会海投。另外,还有一个就读澳洲名校硕士的候选人,因为海外疫情严重,也打算回国发展了。从这两点来看,今年的就业形势确实比较严峻。据统计,参与今年秋招的大军预计在1千万左右,人数达到新高,但是绝大部分互联网公司并没有扩招的趋势,可见竞争之激烈。在这个最难的毕业季,要想拿到一个好offer着实不易,务必认清现状,同时做好充分准备。— 2 —
虽然就业形势很严峻,但是公司招人的标准只会更高,因为供远大于求。对于应届生来说,要考察的内容主要包括以下几个方面:面试时重点看的还是计算机理论、算法能力以及代码功底,框架和项目只是锦上添花的考察项。下面,我以一道实际的编程题为例,同时结合候选人的答题过程,详细地聊一聊面试官通常是如何判断应届生素质的?希望让参与秋招的你有所启发。“一个单链表,从高位指向低位存储一个大数,每个节点表示这个大数的其中一位(取值范围从0到9)。题目要求:对这个大数进行加1,输入和输出都是单链表,时间复杂度和空间复杂度尽可能低。
对于刷过leetcode的同学来说,这道编程题真心不难,而且解法非常多,我觉得还比较适合应届生。
但是,就是这样一道普通的程序题,居然刷掉了将近50%的候选人,并且这批人都是已经通过笔试和第1轮技术面的。题目给出来后,我会跟候选人确认下是否完全理解题目了,然后给1-2分钟时间让对方思考下解法。这个环节有几位候选人的表现让我印象深刻。候选人:这题简单,遍历到最后一位加1就行!
面试官:你再想想,还有什么情况没考虑到?
候选人:哦哦,最后一位如果是9,要处理进位问题,我再想想.....
面试官说完题目后,你不假思索就开始说解法,这种其实是做算法题时的大忌,很容易让面试官觉得你是一个没有思考力的人。候选人:我能用数组表示吗?这样进位就好处理了
面试官:那你数组大小怎么定呢?
候选人:嗯... 我可以先遍历链表,得到链表长度
面试官:然后呢?
候选人:那就简单了,链表转成数组后,先对数组加1,然后再将数组转成链表返回就行。
大约有1/3的候选人会先想到这种最常规的解法,也有人用ArrayList或者Stack的,其实底层都是数组。
很显然,这种解决并不是最优的,空间复杂度太高,然后我会引导他们思考更优的解法。面试官:空间复杂度太高了,有更好的解法没有?
候选人:我再想想....
候选人:能给点提示吗?
面试官:链表是从高位指向低位的,但是进位是从低位到高位的,如何解决这个方向不一致的问题呢?你朝这个角度想想
候选人:哦,我知道了,可以将链表反转
部分候选人在听到提示后,基本能想到 “链表反转” 的解法了,当然也有想不出来的,这种我会直接告诉他解法,然后看他在coding阶段是否有突出的表现。因为这个题目本身难度不大,链表反转基本是应届生们信手拈来、倒背如流的题目。我这个题只是在此基础上 “拐了一个弯” 而已,但是确实难倒了一些人。因此,建议应届生们:刷题有必要,但是一定要懂得灵活变通,不要寄希望于遇到原题。前面提到这个题的解法很多种,比如:可以不反转链表,而是用递归法;最聪明的解法是记录最后一个不是9的节点,然后处理该节点和最后一个节点之间的加1就行。
在我面试的候选人当中,大概有50%的人能在没有提示的情况下给出解法,还有少部分人提示后能想到解法。编码环节是我比较关注的,候选人在IDE中直接编码,并将屏幕共享给我,我会全程观察他们的coding过程。上面这份50行左右的代码,是一个1面表现还不错的候选人花了15分钟写完的,而且这是我从所有候选人中挑出来的质量偏中上的代码(是不是有点惊讶?)站在面试官的角度评价这份代码,除了程序的正确性以外,我几乎找不到其他亮点。下面几点我觉得是应届生们同样需要重视的:变量命名和方法命名体现了你的编码习惯,一定要注意规范性,做到见名知意。
将重复性的代码封装成子方法,比如上面的链表反转。
复杂逻辑拆解成多步,每个步骤封装成独立的方法,方便维护和阅读。
可以适当加些注释,对特殊逻辑进行解释。
写完代码,一定要写个UT或者Main方法,测试下各种case,而不是等面试官提示你写测试用例时才想起来。
Talk is cheap, show me the code. 编码能力是真正拉开应届生差距的考察点。因为Coding的过程能充分体现你的基本功和逻辑思维,而这两点恰恰是面试官判断候选人是否有潜力的重要依据。
调试环节也是个很好的面试考察点,能判断候选人定位问题和解决问题的能力。这3天我面试的候选人,居然没有一位能一次性写出正确的代码,这一点当然跟绝大部分人不写测试代码或者测试case覆盖不全有关。另外就是,有一部分候选人的调试过程真的很让人着急,我说几个具体case:
第1种,不会先拆分成大的步骤去定位问题,而是单步调试。比如你用反转链表的解法,基本是以下3步:比较好的思路是将这3步的结果打印出来,看下是否符合预期,这样1个复杂问题相当于拆解成3个子问题了,然后排除法定位即可。第2种,明显的错误看不出来。比如:遍历链表时,指针没指向下一个节点引起了死循环,导致程序结束不了,有候选人一度怀疑自己的IDE出问题了,还重启了一把IDE。第3种,改完一个BUG又引入了新的BUG。链表节点全是9的情况是很多候选人没覆盖到的,需要再新加一个节点,有不少人在解决这个问题时又引入了新BUG,但是没有意识去重跑之前通过的case。总之,调试过程也是一个很重要的环节,它是你对错误代码进行补救的机会,首先要调整好心态,其次是注重方法。关于调试,我的建议是:加关键日志进行打印,先定位到出问题的代码块或者子方法,然后再仔细审阅代码或者单步调试。另外,改完一部分代码后,一定要重新跑一下之前通过的测试case。— 3 —
希望上面这道编程题的还原过程能让你有所启发,下面我再总结下其他参考建议:1、良好的面试环境很重要:因为疫情原因,绝大部分秋招都是远程视频面试,因此一定要有一个安静且整洁的面试空间;其次需要确保网络畅通,不会出现卡顿情况;再次,电脑上有编程环境,除非你裸写代码的能力很强,可以不依赖IDE.2、注重沟通技巧和效率:开场的自我介绍一般是用来暖场的,如何快速说出自己的优势和成绩很重要,切忌对照简历说太多无用的细节。另外,问答环节听清楚题目很重要,如果有疑问一定要及时确认,避免答非所问。3、注重细节,而不是差不多:细节决定成败,要做到脱颖而出,一定要精益求精。计算机的基础知识,不建议死记硬背,而是真的吃透了,你的回答代表你的思考过程,而不是记忆过程,最好能说出你自己的理解。4、展示积极和真诚的一面:遇到不会的问题时,不要轻易说放弃,而是积极去思考或者让面试官给你适当的提示。其次,没必要伪装或者夸大自己的成绩,而是尽量展示出你真正理解的东西以及你对这个行业的热爱,自信和真诚很重要。5、让面试官给你建议:秋招是一场持久战,面试也看缘分,没面好不代表你就不行。如果能认识到这一点,在最后的提问环节,你可以让面试官针对你的表现给些建议,这是你越面越顺的最好方法。
— 4 —
回想8年前自己参与秋招的过程,做梦都是offer。一个钟意的offer背后,不仅仅是一份工作,也承载了一个你想去奋斗的城市,一个你感兴趣的行业,一个你想持续精进的岗位,一份你想回报家人的薪酬...这是从象牙塔走向社会的里程碑,希望这篇文章对你有所帮助。积极准备,同时多做复盘。本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!
3T技术资源大放送!包括但不限于:Java、C/C++,Linux,Python,大数据,人工智能等等。在公众号内回复「1024」,即可免费获取!!