说实话,你是一位优秀的工程师候选人吗?你怎么评价自己?你面试过多少家公司?你拿到offer的比率是多少?试一下用以下的公式来计算。
- x = number of companies interviewed with onsite
- y = number of offers received
- value = 100 * log(x) * y / x
如果你的计算结果小于90,请仔细阅读这篇文章;如果大于120,那你并不需要这篇文章。
我是谁?
我没有高中学历。我19岁从芝加哥前往南加州开始编程。我把所有东西装进了我的轿车里,身上只有400美金和一个offer,4万美金年薪的高级程序员。那是在12年前,当然又是另外一个故事了。
从那以后,我曾在 Double Helix, Namco Bandai, Google,Obvious and Square等公司工作过。也收到过来自Naughty Dog, Activision, Riot Games, Blizzard, Pinterest, Goldman Sachs等公司的offer。正由于此,用前面提到的公司算出我的得分是132。
我至少面试过500位工程师求职者,他们之中大概10%会收到offer,3%我认为是”rockstar”求职者,他们留给我的印象尤为深刻。
我想告诉你,绝对没有万无一失的方法保证你被录用。因为这里面存在太多的不确定因素,特别是像Google这样的公司,你将会面对5-7个随机挑选出来的工程师,他们会选择一套他们认为合适的问题来进行面试,通常会包括“白板编码”。但是有一些工程师是很差劲的面试官,他们会问一些不公平的问题并作出武断的判断。但是没关系,这对我们来说正好,因为求职者通常会允许搞砸多轮面试中的其中一轮。
我可以做的就是告诉你怎样做好充分的准备,下面是我提供的一些建议:
技术建议:
1 坚持编程:
很简单,程序写得越多,你的收获越多。通过编程,你不断的练习。不过,最好的练习是有目标的练习。在脑海里有一个目标,开拓新的领域,和挑战自我。经过一段时间后,你需要给你完成的和未完成的项目建立一个主页。Github是一个非常好的用来建立项目主页的地方。
2 掌握至少一门编程语言
掌握一门编程语言会让你拥有敏锐的洞察力。为此,你必须编写大量的代码,阅读大量的代码,同时要学习代码里的最佳实践。理论上,一门语言会有一个很活跃的社区,和大量的产品代码提供学习。可选的编程语言包括C#、C++、java、PHP、Python和Ruby。
在C++面试里,有一个经常被问到的问题:“你给自己的C++知识打多少分,从1分到10分?”。我非常厌恶这样的问题。愿上帝帮助那些给自己打了 9-10分的人,因为他们很快会露出马脚。Bjourne Stroustrap给自己打了8分或者更少。这门语言真的太复杂,太丰富,而且随着时间的过去,演进了太多次。离题了:)。
3 理解复杂度
阅读这篇文章( Read this cheat sheet)。明确自己清楚复杂度的含义。然后实现一些常用的算法,比如Dijkstra’s, Floyd-Warshall, Traveling Salesman, A*, bloom filter, breadth-first iterative search, binary search, k-way merge, bubble/selection/insertion sort, in-place quick sort, bucket/radix sort, closest pair 等。再次重复,坚持编程!
4 重复发明轮子
你应该使用你常用的语言来实现一些常用的数据结构。不要依赖于库。实现以下的数据结构并为其编写测试用例:vector (dynamic array), linked list, stack, queue, circular queue, hash map, set, priority queue, binary search tree等。你应该能够很快的编写完成。
5 解决问题
不要在google上这样搜索 like this。这都是一些基础的编程概念。你要做的是,至少花费40小时编写解决各种问题的代码。其中最好的资源是TopCoder(Read this),然后尝试去解决更多的问题。挑一些问题来测试你实现recursive, pattern-matching, greedy, dynamic programming, and graph problems的能力。浏览一下这些归档的问题(archived problems)。
这或许是我被Google聘请的首要原因,我有2个星期的时间沉迷在Topcode里。在那以后,我可以在闭上眼睛绑起一条手臂的情况下,编好 Dijkstra算法。我可以解决几乎所有的和图相关的问题。这都是在重复解答问题的步骤而已。Eric Schmidt说过“重复并不会使得祈祷没有意义”。
6 使编程简单
至少,使其看起来更加简单。随着时间的过去,我了解到,编程是工程师工作中最直接和最简单的部分。我常常用一个词组“a simple matter of programming”,因为我相信更复杂的部分是在编程之前和之后。例如,设计好你所要编写的代码和确保你编写的代码能够发布。让你的面试官了解你清楚的知道,编程只是到达目的的一种手段。
注意,在别人面前编码可能会让你感到害怕。自己找方法去练习白板编程和结对编程。Google基本上都是白板编程,而Square都是结对编程。我的朋友和同时Dan写了一篇关于这个的文章( Read this)。
其他建议:
在这里,我不能自称专家。事实上,有些人会说我甚至不善于和别人相处。但是我还是应该说一些非技术的建议,其中有一些还是非常明显的。
1 知道为什么你在那里
如果你在面试一家公司的时候,完全不明白为什么他们在这,他们是谁,他们在做什么,那么请不要去面试。
2 激情
如果你不在意,那么其他人也不会。对某些事情充满激情。可能是编程,或者别的。你会热衷于利用业余时间编写一个编译器吗?你会自己动手制造一个遥控直升机吗?只要你有激情,都没关系,你会使其变得有趣。
3 不要做任何假设
如果不确定,就询问。如果他们问了你一个问题,你不是100%的肯定问题是什么,那么请他们再问一次。我见过许许多多的求职者从不询问任何问题,结果浪费大量时间解答了错的问题。
4 微笑
兴奋,开心和积极。但不要过度。正如我前面提到的,人们会作出快速的判断。确保你留给别人的第一印象是好的。微笑是能够传染的,我常常带着糟糕的心情走进面试的房间,但是求职者一个合适的微笑会让我快速的恢复过来。
正如我之前所说,没有银弹能够让你被雇佣。但是,作为一个工程师,你能尽你最大努力做的是 ABC: Always Be Coding. – 坚持编程。
译文链接:http://www.cnblogs.com/wilsonwen/archive/2013/05/22/3093383.html