说实话,你是一位优秀的工程师候选人吗?你怎么评价自己?你面试过多少家公司?你拿到offer的比率是多少?试一下用以下的公式来计算。
x = 现场面试的次数
y = 拿到的 offer 数量
value = 100 * log(x) * y / x
如果你的计算结果小于90,请仔细阅读这篇文章;如果大于120,那你并不需要这篇文章。
我是谁?
我没有高中学历。我19岁从芝加哥前往南加州开始编程。我把所有东西装进了我的轿车里,身上只有400美金和一个offer,4万美金年薪的初级程序员。那是在12年前,当然又是另外一个故事了。
从那以后,我曾在 Double Helix、 Namco Bandai、 Google、Obvious 和 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. – 坚持编程。
-
工程师
+关注
关注
59文章
1559浏览量
68268
发布评论请先 登录
相关推荐
![](https://file1.elecfans.com/web2/M00/FF/40/wKgaomahti2AV26dAAMiNIjdnKg435.jpg)
请求一份CS1237 的应用应用原理图和软件代码
![](https://file1.elecfans.com/web2/M00/EB/14/wKgaomZXAd-AWEwjAAuV2RdwuSM130.png)
嵌入式软件工程师和硬件工程师的区别?
![](https://file1.elecfans.com/web2/M00/E5/09/wKgZomZB1aqAfoLMAALwKMk88bw153.jpg)
![](https://file1.elecfans.com/web2/M00/DF/FB/wKgZomY1H9uAdzzJAAMwQMmJ0js548.jpg)
![](https://file1.elecfans.com/web2/M00/DE/DE/wKgZomYwuQ-AegjsAAISSibiD4I286.jpg)
![](https://file1.elecfans.com/web2/M00/C5/1E/wKgaomXxdsmAENR6AAKEdyutPEU736.jpg)
![](https://file1.elecfans.com/web2/M00/C1/46/wKgaomXUeXuAXDwNAAJ_XqvplMU996.jpg)
![](https://file1.elecfans.com/web2/M00/B7/F6/wKgZomWARnaAGMBZAAiNu8Sn5g8323.jpg)
![](https://file.elecfans.com/web2/M00/A8/C4/poYBAGR3RA2APkgLAAArjhh75Y8484.png)
![](https://file1.elecfans.com/web2/M00/B2/A2/wKgZomVgfB2ABIsXAAJb9GZ_9SY604.jpg)
![](https://file1.elecfans.com/web2/M00/B0/C1/wKgZomVXnJuAcozaABJWWN5ArbY888.jpg)
评论