一些关于最近跳槽的经验分享

avatar 158542
黄金霸者
8513
10
楼主是有接近一年经验的SDE,之前一直在面试,最近面试告一段落,因为准备的时候在一亩三分地上学到了很多,所以也想把一些面试的经历发出来希望可以给更多的人来做参考~
首先我想聊一聊跳槽时机的问题。我这次的经历就是,因为只有不到一年的经验,所以除了G一家以外其他基本上都是一些小公司给面试,个人觉得时机还是非常重要。楼主一些有两年经验的朋友投一些大公司基本都有回应,所以我觉得大家如果在原公司干的开心的话,可以不用那么着急,可以先在原公司多干干积累经验,等合适的时候再跳槽,收割一个大包。
然后是面试经验。因为签了NDA所以大公司就不发具体的题目出来了。面大公司最主要的其实还是刷题,这个在地里的讨论已经有很多了,所以我就也不过多再说了。楼主其实之前new grad的时候就已经面过G但是很遗憾挂了,这次楼主再面,感觉和上次做题能力上并没有非常显著的提升,主要是在一些其他技巧上进步很大,所以想来聊一聊。
首先,非常感谢这几篇文章,楼主在面试之前有幸读到,启发很大:
instant.1point3acres.cn
instant.1point3acres.cn
instant.1point3acres.cn
instant.1point3acres.cn
这些文章给我启发最大的一点是,面试的目的其实是“找出那个你愿意一起工作的人”,而不是“找出那个能把题目做出来的人”。楼主在面new grad的时候,当时听到身边一些同学说G只要把题目做出来基本都能过,楼主当时题目基本都做出来但是最后还是fail了,所以当时心态还是挺崩的。通过这次面试的经历以及上面几篇文章,其实可以发现大公司还是非常注重“交流”能力的。这里的交流可能不单单只和面试官流畅的对话,而包括了各种各样的一个合格的软件工程师应该具备的素质,比如遇到一个定义的不是那么清楚的问题,能不能清楚的clarify它,明确了基本的问题以后能不能有一些基本的思路,思路有了之后能不能清楚的描述这个思路的算法,有了算法以后能不能实现(这个地方其实应该是大家练习最多的地方),算法写完以后能不能设计出test case来测试各种corner case,以及能不能根据之前的idea变化一下解决一些followup(这个可能也是大家focus的地方)。相比于能把题目做出来,我相信这些也是很重要的考察指标,如果一个candidate前面做的非常好,只是题目思路一是卡住了或是需要一点提示,我相信大多数面试官最后还是会给positive feedback的。
以上经验其实地里已经有很多类似的了(包括上面几篇文章),但是因为楼主自己在公司也做(不那么专业)的面试官,还是会看到很多面试者并没有太注意这些问题,所以觉得还是有必要提醒大家一下。
真正的做题流程在我看来就像平时大家在公司和别人讨论问题一样,一开始或多或少会有一些听不懂的地方或者有些corner case我们的tech lead没有直接讲清楚,这个时候就应该去clarify,去和面试官讨论。我见过很多candidate,包括我有的时候,在听懂题意以后就直接开始思考。一些简单的clarification应该当场就想到,比如array有没有duplicate,某一个值会不会是0或者null等等,如果当时想不到,也可以说These are all the questions as far as I can see but I might have some more as I am solving the problem. Do you mind if we jump to the next step and try some solutions to the problem? 这个时候面试官一般都会说No,No,Go ahead,我们的目的就达到了,就是让面试官清楚,这个题目我已经完全搞清楚题意和边界范围啦,我们可以开始想思路啦!

下一步应该是直接说思路。我在和朋友的一些mock interview,包括自己面试别人的时候,发现很多人有一个常见的误区是这一步很急,很想飞快的描述一遍算法,然后就开始写。我觉得更好地做法可能是,先阐述自己算法的思路,这个时候一定要借助白板把涉及到的数据结构,几个主要的variable以及它们之间如何interact的流程完整地画出来,甚至可以1234标出步骤,这一步越清晰越好,目的就是让面试官觉得你的思路非常organized。最好能做到的就是面试官听完思路以后不需要再对里面的一些细节进行提问。思路说完后,主动分析一下复杂度(也可以记录在白板上),复杂度分析完了以后再询问一下面试官能不能开始implement了。这个时候如果某一个地方有什么问题,或者你的复杂度太高,面试官可能会帮你找出来了,你们就可以继续讨论,省掉implement的时间。
这个时候,如果某一个地方卡住了,一定要告诉面试官你卡在了什么地方,不要一个人闷头想。就像我们在和lead讨论问题的时候,如果我们发现什么地方有问题,肯定不会把lead晾在那里,肯定要把stuck的地方提出来两个人一起解决。很多时候很多人会有顾虑是因为担心这样做会被面试官认为是要hint。这个其实每个人就有不同的看法了。就我个人觉得,主动说出自己stuck的地方其实是一个交流的过程,并不算向面试官要hint。关键在于要清楚地描述自己卡在什么地方,可能的解决方案是什么,自己还需要什么条件就可以解决它,而不是直接一句Can I get some hints on this,这样我觉得会好很多。

然后就是implement算法,考验大家平时刷题的时候到了。地里有很多资源,我就不多说了。

最后设计test case。提醒一句就是千万千万不要自己去省略这一步,等着面试官来说,要主动向面试官提出来。因为test case其实也是自己debug的过程,如果在这个过程中de出了bug,个人觉得是一个加分项。楼主在面试的时候就有过几次自己设计test case找出了一些没有处理到的corner case,可以看出面试官还是非常满意的。

总的来说,我觉得还需要注意两点,第一点就是自己要主导面试的流程,上面的每一个步骤应该都是我们来主导面试官的,就是要有一个面试节奏在我们手里的感觉;然后就是如果是白板面试的话,尽量记录下来自己所有的思考过程,最好能标上序号,给面试官organized的感觉。而且很多面试官是会拍张照之后写review的,将所有的分析过程记录下来其实也是帮助面试官回忆你的面试表现,impress面试官的几率更大。

最后我想说一点关于这种面试方法的看法。其实我面完所有公司以后,也仔细回忆了一下面试的过程,感觉其实这种方法并不是所有面试官都喜欢。这种方法给人一种非常有条理的感觉,但是带来的问题就是可能花的时间比较长。一轮面试就45分钟到一个小时,有的时候,光清楚地阐述问题这个步骤,我都可能花15-20分钟,因为需要先描述暴力解,然后讨论时间复杂度,中间会和面试官讨论一点问题,再尝试优化,再讨论,这个时间估计都够某些实力强的大神把最优解写两遍了。这个问题,我目前没什么好的办法,只能说是根据面试官因人而异,但是有的时候不同的公司可能也会有不同的出题风格。个人感觉,其实现在面试可以分为两类,一种是以过程为导向,做不做得出题并不那么重要,比较注重交流,这种面试官多出自比如G,MS;还有一类是以结果为导向的,就比较强调做题了,面试官多出自比如FB,snapchat之类的公司(个人感觉,如果说错了求轻喷)。可能也没什么统一的标准区分哪一类面试官,但是如果碰到比较强调做题的面试官,其实可能就真的需要快点把题做出来了,因为可能会有一大堆follow up等着。楼主有一次面试就有一个面试官,在楼主阐述idea的时候以及后面写test case的时候非常不耐烦,楼主也因为花了比较多的时间没有做完所有的follow up,也算是一个教训吧。

谢谢大家能读到这里。楼主这次求职已经结束了,给所有还在奋斗的小伙伴们,good luck to everyone!最后,求加大米,以及求H1B transfer好运!
  • 238
10条回复