一般面经很少会告诉你如何临场发挥,我觉得这边文章对你很重要。
上一篇文章讲了如何进行前期的准备,但是在面试的过程中,一定会问到没有准备过的问题。那么这个时候怎么办的?那么我来简单讲一下我总结下来的经验。依然分为几种情况:
- 编程测试
- 面试
1. 编程测试
编程测试是很多大公司都会有的环节。有些考察算法,有些是考察编程能力,有些是考察设计。内容要看面试官想考察面试者什么能力有关。对于这种测试,很多人就要问了,“这不就和高考一样,拿到题目做,不就完了,和临场发挥有什么关系?”。其实这和高考大有不同。
编程测试的时候你是面对着命题者的。而且命题者往往有他想要考察的点。但是命题者都是语文水平和我们差不多的程序员,题目就是他们随便写写的。意思的表达多少会有点不清晰。那么这个时候就是临场发挥的时候了。
审完题不要急着做,先简单思考一下命题者究竟想要考察什么,题意究竟是什么。然后把自己理解的题意讲给命题者听,问下他题目是不是这个意思。
无论你理解的对不对,都没有关系,理解的不对命题者会给你指出,总比你把代码都写完了才发现题目理解错了好。无论对错,无形中都为自己加了一些分。因为这反应了你平时是一个动手做之前,先把需求理解清楚的人。那么题目理解完之后就可以直接写了吗?错。
对于一道题目,一定会有很多解题思路和方法。高考的时候是你最后的结果对,那这题就能拿到满分。但是编程测试可不是。使用了不好的思路和方法一样会挂掉。那么这就又到了临场发挥的时候了!
明确了题目意思之后,先讲“那我思考一下”为自己争取一些时间。然后就让自己的CPU跑起来思考吧,尽量多想几种方案。然后把自己的方案讲给命题者听,如果能讲出每种方案的优缺点更好。
有的人可能觉得做到这一点很难。其实在我自己的面试过程中,以及与其他人交流面试的时候发现,编程测试的题目一般都能做出来。挂掉的都是挂在方法上。如果水平不是太差,至少能想出一种简单粗暴的方法。但是,如果你把这个写下来,往往拿不到Offer。所以讲你的思路就很重要了。把你的思路和解题方法讲出来,和面试官一起探讨。面试官往往会试探的引导你去寻找正确方法,这就又给自己增加了机会。当探讨到面试官满意的方法,或者实在想不出来,面试官说“那你就按当前讨论的方法写吧”的时候再动手写。
按照上面的方法编程测试下来,就算你没有用完美的方法解题,也一定会给面试官留下一个好的印象。
2. 面试
面试环节可变因素实在太多,问到自己没有准备过的问题非常正常。遇到自己准备过的内容,精确正确的回答是最理想的。然而遇到自己没有准备过的问题,也没有必要直接说自己不会。往往一场面试下来,你发现有几次“这个我不会”,那Offer也就没了。那么怎么样在自己不会的时候也能给面试官留下好印象呢?
- 让面试官重复问题(确认问题内容,争取思考时间)
- 复述问题(让面试官确认一下你是否理解了问题,同时争取思考时间)
- 表明自己没有研究过(让面试官可以谅解,毕竟再厉害的人也有没有研究过的问题)
- 请求时间思考一下(争取时间,拼命想)
- 30秒到1分钟后,讲思路与面试官探讨,不一定要有答案(表明自己的思路,以探讨的方式和面试官交流,面试官会引导你向正确的答案靠近。)
举一个我支付宝面试栗子,聊到了数据库分表,面试官突然问了如下问题:
假如有一个交易表,用户和商家每进行一次交易就会在交易表中产生一条记录,那么分库分表,要按照怎样的规则分。
这个问题我之前并没有准备过。于是我说:“不好意思,我没有太明白您的问题,您能否再重复一下。”,他重复一遍之后,我又复述了一下问题,得到了他的肯定之后,我说:“我之前没有研究过这个问题,我现在思考一下可以吗?”,面试官不会说不行的。
然后过了大概三四十秒的样子。我回答:“对这张表进行分表的话,我们希望的效果是同一个用户的所有数据都在一个表中,同一个商家的所有数据都在同一个表中。但是任何用户是可以和任何商家交易的。假设一个A表中的用户和B表中的商家交易,那么产生的数据就无法确定放在哪个表中,所以不存在这样的一个分表规则。”其实我在那段时间里就想到这里,在说这段话的时候想到的接下来的。然后我接着说:“那么不知道是不是可以将这个表通过用户分表,另外再维护一个商家到原始数据的索引表。来为商家提供查询。”然后面试官说:“这样确实可以,但是有些麻烦,没关系,我随便问问的。”
如果遇到没有准备过的问题,按照这个思路,最后只要说出一些自己的思路。即使思路不太正确。也比直接说不会好。毕竟谁都有没有研究过的问题。这样回答至少说明了你乐于去思考。
总结
在面试过程中,遇到没有准备过的问题很正常。遇到的时候不要慌张,要保持冷静,想办法争取时间,并在争取到的时间内全速开启自己的CPU去思考。最后把握好时间不要冷场尴尬。没有想出结果就说思路。无论对错都比直接说不会好。祝大家面试成功。下一篇介绍平时工作工程中如何积累。