坚持编程:如何找到一份工程师工作

说实话,你是一位优秀的工程师候选人吗?你如何评价自己?你面试过多少家公司?你拿到 Offer 的比率是多少?试一下用以下的公式来计算:

x = number of companies interviewed with onsite
y = number of offers received

value = 100 * log(x) * y / x

如果你的计算结果小于 90,请仔细阅读这篇文章;如果大于 120,那你并不需要这篇文章。

关于作者

我没有高中学历。19 岁时,我从芝加哥前往南加州开始编程生涯。我把所有家当装进了轿车里,身上只有 400 美元,但手里握着一个年薪 4 万美元的高级程序员 Offer。那是 12 年前的事了,当然,这又是另一个故事。

从那以后,我曾在 Double HelixNamco BandaiGoogleObvious 以及 Square 等公司工作过。我也收到过来自 Naughty DogActivisionRiot GamesBlizzardPinterestGoldman Sachs 等公司的 Offer。正由于此,用前面提到的公式计算,我的得分是 132。

我至少面试过 500 位工程师求职者,他们之中大概 10% 会收到 Offer,3% 我认为是"Rockstar"级别的求职者,他们留给我的印象尤为深刻。

我想告诉你,绝对没有万无一失的方法保证你被录用。因为这里面存在太多的不确定因素,特别是像 Google 这样的公司,你将会面对 5-7 位随机挑选出来的工程师,他们会选择一套他们认为合适的问题来进行面试,通常包括“白板编码”(Whiteboard Coding)。有些工程师可能是差劲的面试官,他们会问一些不公平的问题并作出武断的判断。但是没关系,这对我们来说正好,因为求职者通常被允许搞砸多轮面试中的其中一轮。

我能做的就是告诉你怎样做好充分的准备,下面是我提供的一些建议。

技术建议

1. 坚持编程

很简单,程序写得越多,你的收获越多。通过编程,你不断地练习。不过,最好的练习是有目标的练习。在脑海里设定一个目标,开拓新的领域,挑战自我。经过一段时间后,你需要给你完成的和未完成的项目建立一个主页。Github 是一个非常好的用来建立项目主页的地方。

2. 掌握至少一门编程语言

掌握一门编程语言会让你拥有敏锐的洞察力。为此,你必须编写大量的代码,阅读大量的代码,同时要学习代码里的最佳实践。理论上,一门语言应该有一个很活跃的社区,和大量的产品代码提供学习。可选的编程语言包括 C#、C++、Java、PHP、Python 和 Ruby。

在 C++ 面试里,有一个经常被问到的问题:“你给自己的 C++ 知识打多少分,从 1 分到 10 分?”。我非常厌恶这样的问题。愿上帝帮助那些给自己打了 9-10 分的人,因为他们很快会露出马脚。Bjarne Stroustrup 给自己打了 8 分或者更少。这门语言真的太复杂、太丰富,而且随着时间的过去,演进了太多次。离题了 :)。

3. 理解复杂度

阅读这篇文章:Read this cheat sheet。明确自己清楚复杂度的含义。然后实现一些常用的算法,比如 Dijkstra、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 和 Graph Problems 的能力。浏览一下这些归档的问题:archived problems

这或许是我被 Google 聘请的首要原因,我有 2 个星期的时间沉迷在 TopCoder 里。在那以后,我可以在闭上眼睛绑起一条手臂的情况下,编好 Dijkstra 算法。我可以解决几乎所有的和图相关的问题。这都是在重复解答问题的步骤而已。Eric Schmidt 说过:“重复并不会使得祈祷没有意义”。

6. 使编程简单

至少,使其看起来更加简单。随着时间的过去,我了解到,编程是工程师工作中最直接和最简单的部分。我常常用一个词组"a simple matter of programming",因为我相信更复杂的部分是在编程之前和之后。例如,设计好你所要编写的代码,并确保你编写的代码能够发布。让你的面试官了解你清楚地知道,编程只是到达目的的一种手段。

注意,在别人面前编码可能会让你感到害怕。自己找方法去练习白板编程和结对编程(Pair Programming)。Google 基本上都是白板编程,而 Square 都是结对编程。我的朋友兼同事 Dan 写了一篇关于这个的文章:Read this

其他建议

在这里,我不能自称专家。事实上,有些人会说我甚至不善于和别人相处。但是我还是应该说一些非技术的建议,其中有一些还是非常明显的。

1. 知道为什么你在那里

如果你在面试一家公司的时候,完全不明白为什么他们在这、他们是谁、他们在做什么,那么请不要去面试。

2. 激情

如果你不在意,那么其他人也不会。对某些事情充满激情。可能是编程,或者别的。你会热衷于利用业余时间编写一个编译器吗?你会自己动手制造一个遥控直升机吗?只要你有激情,都没关系,你会使其变得有趣。

3. 不要做任何假设

如果不确定,就询问。如果他们问了你一个问题,你不是 100% 地肯定问题是什么,那么请他们再问一次。我见过许许多多的求职者从不询问任何问题,结果浪费大量时间解答了错的问题。

4. 微笑

兴奋、开心和积极。但不要过度。正如我前面提到的,人们会作出快速的判断。确保你留给别人的第一印象是好的。微笑是能够传染的,我常常带着糟糕的心情走进面试的房间,但是求职者一个合适的微笑会让我快速地恢复过来。

正如我之前所说,没有银弹能够让你被雇佣。但是,作为一个工程师,你能尽你最大努力做的是 ABC: Always Be Coding —— 坚持编程。

[英文原文:ABC: Always Be Coding]

说明:本文原文发表时间较早,文中提到的部分面试资源(如 TopCoder)在当时较为流行,现今求职者也可参考 LeetCode 等平台进行算法练习。文中提到的"12 年前”及具体薪资数据仅供参考,请结合当前就业市场实际情况理解。