camiler

coding,永不止步

camiler · 2017-01-06翻译 · 533阅读 原文链接

实话说,你是一个优秀的工程师候选人么?你如何自我评价?你面试了几家公司?你现场面试获得offer的比例怎样?试试下面的公式(完全是我凭空想象的,没有任何意义):

# x = 面试的公司数量
# y = 获得offer的数量
value = 100 * ln(x) * y / x

如果你的结果有120,那么可能你不需要看这篇文章了,但不管怎样可以浏览一下。

我是谁?

我没有大学学位。我19岁离开芝加哥到加州南部后开始专门搞编程。我所有家当都挤在车厢里;口袋里有400美元,有一份年收入40000美元的初级码农的工作。那是12年前, 老故事了!

此后,我在Double Helix, Namco Bandai, Google, Obvious还有 Square相继工作过。我也收到过 Naughty Dog, Activision, Riot Games, Blizzard, Pinterest, Goldman Sachs这些公司的offer,还有很多。这代表着,按照上面的公式我的分数是132.

我面试过至少500位工程师求职人员。大概有10%可以给offer。不到3%的求职者让我印象深刻,我认为是有如“摇滚歌星”一样的存在。

必须说明并没有绝对万无一失的方法可以被录用。有太多可变因素了,尤其是像Google那样的企业,由5-7位(随机)软件工程师面试,关键在于他们是否提出了一系列合适的问题,通常还包括白板编程。有些工程师并不擅长面试,他们提问也不公平,并且还会快速做出评判。这还可以接受,毕竟这种事情大家在所难免。在一组面试中,你通常可以允许出错一次。

我能做的就是告诉你如何做好充分准备。言归正传,宝典在此。

技术秘诀

  1. ABC (always be coding)。 写的越多,得到的越多-就这么简单。编码,即练习。但最好是集中重点练习。制定目标,探索发现,挑战自己。有朝一日,你开发的项目应该可以堆成一份文件夹了。GitHub是个不错的平台来托管展示这些项目,但只是有个折衷的工作(将代码项目托管)是巨大的。

  2. 掌握至少一种多范例语言。掌握一门语言可以让你开心明目。要达到这种程度,你需要写的更多,读的更多,坑踩的更多。最好是这门语言有活跃的社区,有大量的生产代码运行,这样它才是一门合理的流行语言。C#, C++, Java, PHP, Python, 以及 Ruby都是不错的选择。 有一个经典问题是C++面试官喜欢问的:“在1-10的分数间,10是最高分,你给自己的C++打几分?”我其实讨厌这个问题。祈祷老天保佑那些回答9-10分的狂妄之徒吧,毕竟话说的太满很难自圆其说。就连Bjarne Stroustrap自己可能也只能估个8分或者更少。这门语言实在太复杂,太深奥,并且日积月累发展了更多的知识。抱歉,跑题了!

  3. 了解其复杂度。 参考这些图表. 然后确定你是否真正理解其原理。像Dijkstra,Floyd-Warshall,Traveling Salesman这些算法,bloom过滤器,广度优先迭代搜索,二分查找,排序,冒泡/选择/插入排序,快速排序,桶排序,基数排序,分治算法等等。再次强调,ABC(always be coding)。这篇文章也不错,讲的很透彻,入门够了。

  4. 重复造轮子。 你应该实现最常见的数据结构。不要依赖任何公用库。实现下面这些结构,并进行测试:向量(动态数组),链表,堆栈,队列,循环队列,哈希map,集合,优先队列,二叉树,诸如此类。你应该能快速实现它们。

  5. 解决问题。 请不要像这样搜索。结果全是一些基础的编程概念。你至少得花40个小时编码解决不同类型的问题。TopCoder是个不错的平台。 看看吧,尝试攻克它们!挑一些可以考验你实现递归、模式匹配、贪婪、动态规划和图形问题能力的题目。赶紧去题海中徜徉吧! 这可能是我能被Google录用的首要原因。我实际花了两周的时间泡在TopCoder上。从那之后,就算闭着眼睛,我也能一只手写出Dijkstra算法。我可以解决天底下几乎任何一种图形问题。其实就是反复解决问题。正如Eric Schmidt说的,“不要怕重复,重复又不会毁掉成功的机会”。

  6. 简化代码。 至少,让代码看起来简单。逐渐,我明白了编程其实是工程师最直接简单的部分。我经常说“这是一个简单的编程问题”,因为我相信做一个工程师最困难的部分大多是写代码之前和之后。比如,写之前要做好设计,写完后要确保它可运行,可以上到生产。要让你的面试官明白你知道编程只是实现目标的一种手段。

注意:在人前写代码是挺困难的一件事。找个法子来练习白板编程和结对编程吧。Google基本上是白板编程,Square差不多都是在真机上用你选择的语言和IDE进行结对编程。这篇文章 或许对你有帮助,出自我的小伙伴Dan。

通用诀窍

我不能自称是这方面的高手。事实上,有些人说我甚至都不擅长与人打交道。但是我应该谈一些非技术性的小窍门,尽管这些可能是显而易见的。

  1. 明确你为什么在那里。 如果你在公司面试,但你不完全清楚为什么他们会存在,他们是谁,或者他们在做什么,那就不要撒谎。真正在乎他们雇用人员的工程师会敏锐察觉到这一点。或许在大公司你可以蒙混过关,但在小公司就拆翅难逃了。

  2. 充满热情。 如果你都不关注,还指望其他人会?请对任何事物都保持热情。可以是对编程充满热情,但这又如何?你喜欢在业余时间写编译器么?你会建造一个遥控直升机么?这其实无关紧要,只有你对它充满热情,才能其乐无穷。

  3. 不可臆断。如果不确定就提出来。如果你被问到一个问题,但你没有100%的把握确定这个问题究竟是什么意思,那就问面试官。有好多次我碰到面试者走入了死胡同,但一直不提出来,最终浪费时间去解决一个错误的问题。

  4. 微笑。保持兴奋,友好,积极。但要恰到好处。正如我之前提到的,面试官会快速进行判断。确保你的第一印象是良好的。微笑是会传染的,我以前经常带着坏心情去面试或者因为其他一些重要的事情感到压力山大,但来自面试者的微笑很快就能让我的从坏心情走出来。

我之前说过,面试没什么奇招。但是,作为一名工程师,你能做的最好的事就是ABC: Always Be Coding

相关文章