码农乌托邦

楠哥小站

楠哥,理想主义码农,就职于Google,现居纽约。


工作基本敲定,我的找工作总结【楠哥原创】

原帖发于:http://www.1point3acres.com/bbs/thread-45678-1-1.html 

拿到微软的Offer后,找工作这事儿终于可以暂告一个段落。在地里得到了颇多帮助,所以写写整个的求职过程,希望对后来人有帮助。注意,这篇文章里没有任何的面经,只有面试流程的描述。因为这个ID基本是实名了,所以我会用别的方式(比如小号)把面经写出来。也请大家不要转载,此文只在地里和我的某个人迹罕至的博客中发表。

0 背景介绍

先来介绍一下背景吧(虽然在各种帖子里我已经写了无数次了),小弟国内四川大学CS本科(GPA:88+),Columbia CS小硕(GPA:3.9+),属于既没有做过ACM丰富工作经验的水人一枚。前后申请的大小公司应该有100左右了,大约面了30多家,最后拿到微软SDE、亚马逊、Syncsort、Epic的offer,后面还有零星几个小公司,打算从了微软,除了NYC的一个小公司以外,不打算面其它家了。

还是那句话,本文所有的观点都是基于我个人的经历,“错误百出”。我们的经历或许会相似,但绝不会相同。你如果有不同见解,就不要骂人了,即使骂人也就在线上骂吧,不要人肉我之后指名道姓的骂。一年前我只不过在帖子中说了一句“我觉得软件工程这门课挺有用的”,竟然在线下遭到了“言语攻击”……

1 时间表与公司选择

今年12月毕业,9月份开始找工作。暑假在路透做intern,本以为拿个return offer保底,之后再试试几家心仪的大公司就可以了,但是没想到return offer不但没有拿到,找工作初期之痛苦也远远超出了我的想象。我周围的同学有找工作开始的比较早的,也有比较晚的,但是大家拿offer的时间(除了大牛)都比较集中。到现在为止,平时混的比较熟的人很多都有了去处,没有的也基本进入了onsite的丰收期。

没有return offer, 我只好采取海投策略。因为对NYC特别留恋,所以基本上投的都是NYC的公司,这其中小公司不计其数。从10人规模的小公司,到FLAG这类巨头,通通投了一遍,学校Career Service 所有做IT的工作,全部都投了一遍。我基本上是每周日和周一投简历,这样的话大概周四、周五会收到一些预约电话面试的邮件,可以把电话面试约到下一周,这样就形成了一个良性的循环。这样的循环大概持续了4-5周,可是基本所有的这些机会都被我浪费了,一个onsite都没有。

最先招人的是NYC各大金融巨头、银行和高频交易等公司,之后是中型公司或者其它主业不是IT但是需要码农的公司,最后是各IT“巨头“和“准巨头”。从技术难度上讲,银行应该是难度比较低的,问的题基本是一些basic的c++和java细节,编程题也很水;小公司其实并不好做准备,小公司问的题目往往非主流(比如我碰到过让写各种java里面的继承方式的),个别过于小的公司由于面试官素质参差不齐,有些算法其实还不如你明白,所以小公司其实还是很看运气的,如果背景匹配,其实面试就是手到擒来,否则的话,准备一些算法题很难直接过关。至于高频交易的公司,其实我觉得也是有相当的难度的,虽然不是纯tech公司,但是里面的人其实每个人都非常的聪明,和面试官聊得时候就会感觉到面试官思维敏捷,涉猎广泛。IT的几个巨头(一说FLAG,一说五大,反正就是那几家)面试都是非常典型的算法题+设计题。我觉得准备IT巨头的面试很像是标准化的考试,考试大纲已经给你了,复习方法也都知道了,有些公司的题甚至都被网友们爆的差不多了,就看你愿意花功夫准备了。不能说你努力的程度和最后拿到的offer的好坏成正比,但是绝对是有很大的正相关性的。

2 CS面试准备

CS面试准备自然算法和数据结构是第一位的。CtCI那本书我觉得应该像当年刷红宝一样多看几遍,这本书真的覆盖了大多数的面试题。我觉得这本书不一定每道题都用编译器写,但是应该做到看到题就能提出至少一个不错的解法来的水平。其实做到后期,你会发现部分题目书上的解法也不是最优的,你甚至可以想到很多更好的办法来。CtCI这本书可能对于以前数据结构基础不好的同学略有难度,可以看看一本红色封皮的书,《Programming Interview Exposed》,是出版较早的一本关于CS面试的习题集。里面的题目难度较低,和CtCI也有部分重合。很多小公司面试的时候其实会从这本书里面选题(我估计是因为面试官还是学生的时候主要看的是红皮书)。CtCI现在还没有最新版的电子版,花钱买一本吧,为了年薪数万左右的工作花20刀买本书,绝对是值得。

还有两个网站必须推荐,但是我觉得应该看完上面两本书再来找这两个网上资源。一个是leetcode,应该也是同胞办的网站,题目难度要比CtCI略高,题目也有重合。这个网站在不断的更新,而且有online judge,有非常好的test cases让你测试。所以我觉得到后期应该多在上面练一练。我准备的时候大约有120道题目,我写了60多道,感觉提高非常大。另外一个网站是geekforgeek,但是网站比较乱,我没有仔细看,不过上面有很多不错的解法和整理好的面经,可以用于参考。

刷题的资源就是以上这些,但是刷题的方法我觉得还是要啰嗦两句。我觉得刷题一定要认真,拿到一道好题应该尝试各种方法,不要直接去看最优解,而是应该理解最优解是怎么得到的。比如,看三五道DP的题,应该就能把基本的DP思想理解了,至少应该对于一维的DP能有比较敏锐的感觉。我在刷题的前期刷了很多,但是提高不明显,就是以一种类似于背答案的方法刷题,效果自然不好。

另外,对于难题和偏题可以暂且放过,到现在为止,我只在面MS时候遇到过一道图搜索的题,其它最复杂的就是二叉树的dfs和 bfs,大多都是线性的数据结构。所以不要刷到误区里面。

我近期会把我写的所有题目的代码整理一下放出来,供大家参考。

3 CS面试真的做题就是一切么?

我想不少人一定经历过两种情况:“我题都做对了怎么没有offer啊?”“我特别幸运,题非常简单,可是没有offer……”。这两种情况我觉得我已经经历了不止一次了,静下来仔细想想,我认为是面试官考察的不是你会不会写这个算法,而是你解决问题的方法和能力。

CS面试,技术实力毋庸置疑是极其重要的,但是能不能把你的技术实力很好的展现出来也是面试的重点考察项目之一。记着有一道经典的题目是“怎么向你的外婆介绍什么是数据库”,其实就是专门在考察这方面的能力。中国人英语差,这是普遍的;但是在大家英语都不好的情况下,谁“条理清晰”、“沟通有效”应该就占了上峰,毕竟将来大家是作为一个团队工作,再牛的人也不可能将来管理所有的代码。

另外,我还是要坚持我的观点,软件工程的方法真的很重要。可能有很多人觉得软件工程只是关于文档的东西,而我觉得他更像是一种“管理科学”。一个人开发软件,想怎么写就怎么写;三五个人开发软件,见面商量一下各写各的就可以;而几百人同时写一个产品,真的需要有一个好的方法和规范。只有真正的在这样的环境中呆一段时间,才能明白为什么要有stand up meeting,为什么那么多人痴迷于agile,为什么代码规范和可读性是那么重要。很有可能你写了三天的函数,其实别人已经定义好了;也可能你查了很久bug,发现其实后台返回的数据就有问题。CS面试中其实很多无形的陷阱都是在考察你对于软件工程的理解,特别是当面试官是manager的时候,你谈论一些软件工程的东西,他反而会更感兴趣。

最后,我觉得CS面试考察的内容还包括你个人的品质。很多人肯定都会在面试时碰到你见过的题目,这时候你会怎么办?CtCI的作者建议是坦白说出来;我的建议是,用一种谦虚的态度坦白的说出来:你可以告诉面试官,你见过这个题,我可以很快的简单介绍一下这个题的解法思路,如果你有兴趣我可以写出详细的代码。当然,有些人可能会装作不知道,如果演技高超,这也不失为一个策略,但是我觉得我的使用我的策略,一方面展现了你诚实的一面,另一方面说不定面试官也会让你继续写这道题,可谓一举两得。另外,你可能还会碰到非常难或者毫无思路的题目,这个时候是你展现你“坚毅”品质的时候。永远不要放弃,尝试所有你学习过得方法,而且要大声的说出来,反正已然这样了,不如和面试官好好讨论一下这个题,即便面试跪了,也能学到一个新的解法。而且这种情况下学到的东西往往印象深刻。

4 “差不多”其实“差很多”

这是我面试的过程中的另一个体会。很多时候我们会觉得我们离正确答案“差不多”、“很相似”,但是真的这样么?记得有一个生动的例子是,写Binary Search的时候,求mid的index你会怎么求?很多人会这么写:int mid = (low+high)/2,但是很多书上却写成了int mid = low + (high-low)/2。这是《编程之美》上的一个题,如作者所说,第二种形式有效的面了溢出,所以要优于第一种解法。我曾经没有把这个当回事,后来在实际的面试中,才明白原来这些“差不多”的地方,很多都是面试官着重考察的地方。比如边界条件,比如异常抛出,比如static等等的细节,说不定什么地方就会出问题。

条理性是另外一个容易忽视的地方。当我们自己写出一个代码的时候,和答案对照一下,认为差不多就可以了,其实保持代码的条理性是非常重要的,因为后面的人要维护你的代码,就要按照你的思路来思考。CtCI那本书已经对代码的条理性、整洁性强调了很多,我就不啰嗦了,我用另外一个例子来解释条例性的重要性。比如,让你测试一个代码,你会怎么测试?大部分人可能会随便举几个例子,或者测几个特殊值就可以了,而一个好的测试方案应该是有条理的吧test case列出来。比如你的黑盒、白盒分别是什么,压力测试是什么;黑盒测试中boundary cases是什么,partition是什么;白盒测试中如何coverage,使用什么样的代码和工具。如果别的面试者只是写出了几个test cases,而你却把你的test cases有条理的组织起来,一定会让面试官眼前一亮。

5 几个重要面试的流程

最后把我经历过的几家公司的面试流程列一下,还是本文开始的那几句话,这里没有任何具体的题目,只是流程而已。

微软:一开始是MS Office Hour,可以和HR好好交流一下,我觉得正是因为这个交流,HR把我的简历选了出来。接着是On Campus面试是特别水的两个题,我估计绝大多数人都做出来了,只是看你能不能和面试官很好的沟通。约1个半月后,在Seattle Onsite面试,一共五轮,前两轮题目非常水,从第三轮开始题目各种变化,不过面经已经被同胞们套的差不多了,面经里面都有相同或者相似的。

Amazon:很幸运,没有电话面试,直接到Seattle进行了四场的Onsite。Amazon的面试只有一半时间是写代码,另外一半会问一些各种奇怪的题目。比较奇怪的题目有,Complier课里面学过的LALR文法、parser、NFA、DFA,DB里的B+ Tree结构,Linux的各种命令如grep和wc,还有Hash table的一些细节。

Epic:这个已经是公认的大水公司了,先是电话聊天+考试中心做题(大部分是CtCI原题),之后到公司Onsite毫无技术面试,聊聊天基本就发了offer。

Syncsort:1场phone interview+8场onsite面试 。他家虽然名声不是很响亮,但是待遇很高,base要比amazon高。8场onsite面试有一些零星的技术题,有一些很蹩脚,但是得到答案后其实很简单。8场Onsite面完的感觉就是,这哪是来面试的,明明是来练口语的……

6 感谢

最应该感谢的当然是地里的这些朋友,各方面的资料绝对是很有用的。还应该还写一亩三分地的缔造者们,这个平台是一个少有的“含金量”高的平台。重要的是,这个平台的信誉度和靠谱度已经越来越高,这要比一些其它的论坛让人觉得更加的可靠。

另外,还是留个邮箱吧,有什么问题的话可以来邮件问,我不能保证来信必复,但是一定会尽全力的。

邮件主题注明CSJOB, 否则信件会直接进入垃圾箱……

liubonan@liubonan.com

最近的文章

Two Sum

Two Sum是各种面试题当中的经典题目。题目是给定一个目标和和一个数组,找出和等于目标和的所有数对。题目的解法有很多,比如使用hash map把数组进行hash存储,之后查找每个元素是否可以找到对应…

Technical, Career继续阅读
更早的文章

Chrome启动后打开第一个网页很慢的解决方案

Chrome/Chromium以速度快著称,我在路透实习的时候做的一个Project就是使用Chromium的V8引擎加速整个页面JavaScript的加载速度。但是最近电脑出现了一些奇怪的现象,每当…

Technical继续阅读
comments powered by Disqus