0%

【编程起跑线】14 技术面试感悟

本文属于不务正业及歪门邪道,没有太多判断力的同学请不要点开或立即关闭本页面。


更新历史

  • 2019.08.05:编入新系列
  • 2016.02.14:完成初稿

缘起

去年确定要回国之后,基本已经停止了投简历和刷题。这两天完成了(可能是)最后一次 onsite 面试,连续飞来飞去,身心俱疲,但是能免费出去玩,见见朋友聊聊天,还是值得去感受下的。

从去年九月开始,到现在也算是找了小半年工作了,除了一开始什么都不懂有些迷茫之外,整个过程基本处于可控的状态,从前期的找节奏热身,到后面针对性去考察不同公司,可以说还都是比较顺利的。因为我的动机和大部分人不一样,所以这里谈及的所有,很可能对另一个人没有任何可操作性,当然,如果你对一个『奇葩』的思路和做法感兴趣,请继续。

借用知乎体,问为什么之前先要问是什么,于是问题来了:什么是面试?什么是找工作?

狭义来说,找工作面试类似于从学生到社会人身份转换的认证考试,考试成绩可能和工资公司职位有关。但一切认证考试背后的目的是对应的能力,比方说考驾照,背后对应的是驾驶车辆,判断路况以及做出最佳选择的能力。那么在找工作面试这件事儿上,所需的能力是什么呢?

简单来说八个字:观察、思考、沟通、行动。

观察不只是看题,更是审时度势说什么不说什么;思考不只是算法,更是逻辑和知识框架的建立;沟通不只是套近乎,更是因势利导去了解对方的思维模式;行动不只是刷题,更是通过试错和改进让自己更快完成身份转换。

当然,刷题也没什么错,但是不要用战术上的勤奋掩饰战略上的懒惰,道理都懂,我不多说。不过如果连我前面在说什么都看不懂的话,还是老老实实刷题吧。

我还记得小时候刚开始学英语的时候,面对一个一个不知所云的单词时的无助(当然 GRE 考试我也有这个感觉)。但是这些跟找工作相比(其实具体指对应的能力),就太九牛一毛了。那些可以量化的指标往往都是清晰的,难易暂且不说,但是至少我们有终点,也有起点。

可是对于那些直觉类的能力,由于悟道时间的不确定,我们唯一能做的就是不断坚持修炼直到开化的那天。

从这个角度来说,面试就是一个学习的过程,一个公司专门找五六个人陪你聊天帮你成长,不但不收钱还报销一切费用,难道还有更好的事情嘛?就用这么好的机会来刷刷题,难道不觉得很浪费嘛?

对于半只脚踏入社会的毕业生来说,重要的是尽一切可能去汲取那些在学校里无法获取的知识和经验,当然,结果也重要,不过如果你能在这个过程中学到足够多的东西,结果反而是水到渠成的事情,不必过多担心。

武器

就我的感觉来看,简历在没被刷掉之后,作用就基本等于零了。除非参与过一些举世闻名的项目,或者刚好和面试官的领域吻合,不然说真的没人在意。假如硬要说面试官会在面试的时候看,这都面对面了,直接跟他介绍自己不就得了嘛。

当然这不是说简历不重要,简历重要性在于做简历。要知道每往上面加哪怕一条记录,都需要大量的努力,这些背后的一点一滴,才是简历的价值,然后价值决定价格,价格会浮动,不要因为一点浮动就恐慌性抛售,沉住气,闷声发大财。

整个找工作过程中,一定要慢慢形成适合自己的合理的思维模式。在学校里,只要足够努力,很多时候都能取得比较好的成绩,但是在步入社会的过程中,或多或少会有迷茫无助的时刻,感觉自己已经刷了很多题目,很认真准备了简历,为什么还是屡战屡败。

但反过来看,这其实是一个很好的强迫自己去审视自己的机会,看看自己那一步出了问题,然后对应去调整,再根据新的反馈来继续调整,这其实就是面对没有标准解答的问题的时候的最佳实践。就好像机器学习里,有正样本,也有负样本,只有综合考虑运用,才能得到最佳的学校效果。

一旦有了这种思维,那么飞花落叶皆可伤人,比方说刷题,其实意义很大吗?不大,但是如果接着找工作的压力,检查去做,并从中验证和改进自己的学习和理解能力,那意义就大了。所谓努力,不应该只是战术上的,更应该是战略上的,而时不时停下来,审视自己之前的工作和方向,并根据观察和反馈设定下一阶段的目标,则是很重要的战略努力。

就像大侠最重要的不是武器,而是『勇气、侠义、爱与宽容』一样(古龙先生语),学习最重要的不是知识点,而是『学会学习与学会解决问题』。仔细想想,如果感觉自己因为所谓的『目标』而跑偏的话,那么现在回头,还是来得及的。

招式

不同公司的文化不同,风格不同,技术倾向不同,人员组成不同,千奇百怪组合起来,就像武林中的各个门派一样。江湖中有通用的功夫吗?并没有!所以见招拆招就很重要了。当然,有些门派就是天生不适合,那也不必强求,要知道,那些想一统武林的人,通常都没有什么好下场。

不过门派虽多,还是有规律可寻。招式的变化终究是有穷尽的,兵器的变化其实也不多,本来想多实地考察几个公司学百晓生写个兵器谱,但是东岸西岸飞一次要老命,前两天的红眼航班让我彻底放弃了这个念头,于是这个部分就随心写一下。

总体来说,无论大公司小公司,算法题基本就是主要沟通方式了,毕竟其他也没有什么好说的,毕竟面得多,可能一开始比较有激情,后面对着面试者,面试官更多就是打个卡了。

大公司制度严明,一开始就会告诉你所有的安排,接下来就是按部就班完成;小公司比较随意,谁有空谁来面,每次面多久也基本没有稳定值,最近去湾区一家小公司一口气面了 7 轮,真是『想要逃』,想大喊一声『老子就这么屌我们不要废话了爱要要不要拉倒』,恩我也就是想想而已。

打戏,要拍得好看,一定要有来有往,面试也一样,不能因为是求职的一方,就先自降一等,不卑不亢,该说什么说什么,为了一份工作,真不值得放弃更重要的东西。

偷懒地说,面试官有两种,大部分都是第一种,只有很少是第二种。第一种就是心中有题目也有答案,你没说出他想要的答案,那就是不行。第二种是心中有题目,但没有答案,会和你一起『努力』去解决一个问题。

第一种算是比较没有诚意的(当然还可以更没有诚意,这里就不提了),在网上找个题目看看答案然后心里只有标准答案,这样真的有很大意义吗?我觉得稍微学过一点计算机的,都可以做到,当然,毕竟有一定的工作经验,但是就这样似乎『事不关己』等待面试者给出正确答案,可能给出的评价也没有多少参考价值吧。遇到第二种面试官,整个面试过程变成了一个完美的大型互动教学活动,只能说好好珍惜,能学到很多有用的东西。

什么才是好的面试题目呢?当然是根据自己平时工作的场景,抽象成比较简单的设计+编码题,不需要太难,但是可以综合考察到面试者思考问题的角度以及对计算机学科的理解,最后的编码可以了解算法能力。最好可以带一点新概念,这样还能考察面试者的快速学习和理解能力。当然还有很多值得考察的角度,不过都比较花心思,估计大部分打卡型面试官,是不会这样的,所以大家还是可以放心刷题。

秘笈

写到这我有点累了。但是还是要厕所里挂钟——有始有终。

如何看人还是要向老祖宗取经,这里推荐一本书《冰鉴》,不要看译注版本(里面举得例子很多比较牵强)。

试探的话有以下方法,这里就不展开了:

  • 故意写错比较关键但是不大容易发现的小失误,看面试官能否及时指出
  • 故意写错比较关键的地方,但是精心设计几个看似合理但其实是『陷阱测试用例』,看看面试官能不能自己绕出逻辑陷阱(递归中这个方法很好用)
  • 摸清楚面试官擅长的领域,然后开始扯他不熟悉的领域,看他的表现(比如说扯一点汇编,扯一点硬件)
  • 写完一个解法之后问问面试官有没有什么优化的方法,如果他说有,问他怎么有,如果他说没有,你就给出一个优化的方法
  • 其他很多…自行发挥创意

当然这些慎用,装逼有风险,起手需谨慎。

金盆

总结一下就是,还是要把时间用在更有意义的地方。

很多内容文章里只能点到为止,想要详细了解的同学可以趁我还在匹兹堡(目测五月中下旬走)的时候约饭聊。