尝试着翻译一篇文章,原文地址:https://medium.com/tech-talk/d5f8051afce2

在36kr也有同样的翻译,比我翻译的要通顺的多,http://www.36kr.com/p/203535.html

能把文章翻译好,确实不是一件容易的事情。


ABC:一直保持写代码

怎样做好工程师的工作


诚实点说,你是否是一个好的工程师求职者?你怎么衡量你自己的水平?你面试了多少家公司?你现场面试然后获得聘书的比率是多少?试试下面的公式吧(这其实是我自己瞎想的也没什么实际意义):


# x = 现场面试的公司数

# y = 获得聘书的数目

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


若你的value小于90,那么你应该阅读本文;若你的value大于120,那么你可能不需要读,但不管怎样你应该读一下。


我是谁?

我没有×××,在19岁那年我离开芝加哥到南加州时,我开始专职编程。我所有的东西都在我的车里,我口袋里有400$,同时有一个年薪40000$的初级程序员聘书。这已经是12年前的事了,是另一个故事了。

然后我在 Double Helix, Namco Bandai, Google, Obvious and Square工作过。同时我还有其他公司的聘书,比如Naughty Dog, Activision, Riot Games, Blizzard, Pinterest, Goldman Sachs 等。这是什么意思呢,刚才那个公式我的得分是132.

我面试过至少500个求职者,大概10%会获得聘书,大概有不到3%的应聘者,我认为是属于“精英”级别的求职者,我都记得他们。

我要确定的跟你们说,没有什么方法能够一定获得聘书,有太多的不确定因素了,尤其是像google这样的公司,它会随机挑选5-7名工程师来面试你,他们问一些恰当的问题,通常都需要你在白板上写代码。有一些工程师是很恶心的,他们会问一些规则之外的问题,且就此快速判断。但也没关系,我们大都有这样的经历,一般也都允许你在在白板上写的不好。

我所能做的就是告诉你怎么去做好适当的准备工作。废话不多说,下面这是我能给出的建议。

技术建议:

1.ABC(保持一直在写代码),你写的越多,你获得的就越多--这是很明显的道理。通过写代码,你会得到实践,但最好的实践是 重点实践。在头脑中定一个目标,探索新的区域,然后挑战自己。时间久了之后,你就会有一堆的完成和未完成的项目。GitHub是一个很好的平台,可以把这些项目放到这里来展示,但是只选择

2.至少精通一门多范式语言。精通一门语言会给你一种强大的洞察力。要达到精通,你必须写很多很多的代码,还要读更多的代码,从中你可以学到最好的模式。理论上每一门语言都会有一个活跃的群体,以及很多产品的合理先进的代码。一些好的求职者都是C#,Ruby,C++,php,java和python。

这有一个C++求职者经常被面试官问的问题:若以1到10分记,10分最多,你对C++的掌握了几分?,我很讨厌这个问题。因为居然会有人会回答说9-10分,Bjarne Stroustrap才最多给8分。它太复杂了,内容太多了,并且都发展了这么长时间了。我跑题了。

3.了解问题的复杂度。读一下这个表。弄清楚他们是怎么运转的,然后实现这些算法,比如Dijkstra算法,旅行商问题,A*算法,bloom filter算法,广度优先查找算法,二进制查找,K路匹配,选择排序,插入排序,冒泡排序,快速排序等等。同样的,您需要ABC。从这入门挺不错的。

4.重新写基本结构。你应该用你的语言去实现大部分的数据结构,不要依靠库函数。实现下面这些结构并且进行测试:容器(动态数组),链表,栈,队列,循环队列,哈希图,集合,优先级队列,二进制查询数等,你要有快速实现的能力。

5.解决词汇问题。别像这么查找,查出来的都是些基本的编程概念。至少花40个小时去编码实现各种问题的解决方案,有一个很好的资源是TopCoder,然后试着解决这些问题,从中你可以了解自己解决递归、模式匹配、贪婪算法、动态编程、路径问题的能力。完成这一堆的问题吧。

这可能也是我为什么能进google的原因吧,我差不多花了2周的时间沉浸在TopCoder里,从那之后,我闭上眼睛一只手都能写出Dijkstra算法的代码实现,天底下几乎所有的图的问题。这就是反复解决问题的结果,正如Eric Schmidt所说的熟能生巧。

6.把编码变的简单。至少让它看起来很简单。过了很久我才明白,写代码就是工程师最直接也是最重要的部分,我经常用这样的说法:“写代码是简单的事”,因为我相信做工程师前后最困难的事情就是写代码。比如,设计好你的代码并且确保和之前的代码能兼容。让你的面试官知道你的代码就是解决问题的途径。

提醒一下,什么都不做就开始编程可能会让你感到沮丧。可以先尝试着结对编程和白板编程,google基本上所有的编程都是在白板上,而Square则都是在电脑前结对编程。可以看一下,这是我的朋友Dan的白板编程。


通用建议。

这方面我不能说是一个专家,甚至有人说我并不擅长跟人相处。但我还是想说一些跟技术无关的话题,其实很多大家都是很清楚的。

1.知道你为什么在这儿。如果你正在公司面试,而你却不是很清楚他们为什么在这,他们是谁,他们是干嘛的,那么你就别面试了。那些关心雇佣你公司的工程师早就了解的一清二楚。在大公司你可能会因此离开,但是在小公司则不会。

2.要有激情。如果你自己都不在意,那没人会在意你。对某些事有激情,可能是编程,但是是这样吗?你喜欢在业余时间搞一个编译器吗?你有做好一个遥控飞机吗?具体是什么没关系,只要你对它有激情,你就能把它做好。

3.别做假设。不明白就问,如果你提出一个问题,并且对答案不能百分百确定,那就问出来。我见过好多失败的应聘者,他们将浪费在了解决错误的问题上,并且从来不问一个问题。

4.保持微笑。要高兴、活跃、乐观,但也别太过分了。就像我之前提到的,人们总是快速判断,确保你给人的印象是一个很好的工程师。微笑可以感染别人,我去面试时有时会心情不好或者对其他某些事情感到压力沉重,但求职者的合适的微笑会让我立刻心情大好。


就像我之前所说的,没有方法能让你永远被聘用。但是作为一个工程师,你能做的最好的事情就是Abc,永远保持编码。