【伯乐在线导读】:这个源自 Quora,题主还补充说:
我和我认识的人从未用过任何高级算法和数据结构,我们中的有些人已经在业界工作 20 年了。你是如何激励自己去学习高级算法和数据结构的呢?或许,参加编程比赛会有点用…
下面是来自 Jerason Banes 的回答,1.4 K+ 顶
恭喜你!我刚把你的简历扔到“不要”的那堆中去了,嘴里还碎碎念叨着,「为什么怎么会有你这样的小孩,业界出什么问题了,我为什么要重新训练每一个我招来的工程师」。你也很可能认为数据库很神奇,只要再丢一个索引到里面,就可以解决你的所有问题,对么?
我为什么要这样做?我是一个脾气暴躁的老头,喜欢随心所欲得给应聘者设置难题吗?
事实上,答案正好相反。如果你学习过,而且是一名接受过训练的工程师(注意我一直使用这个词),你会发现面试过程相当的简单。我经常问一些很简单的问题,例如「写一个FizzBuzz程序」,「JavaScript是函数化语言?」。电话面试中有几个超级难的问题,我并没有问。因为这些问题会吸引你学习,并为我工作。
如果我不是在设置难题,我到底是做什么的?
我正在设计一个系统,可以基于千兆兆(10的15次方)字节规模的数据提供分析结果。由于 Google 让每个人相信,他可以在全网查找他输入的东西,所以我也必须要在自己的网络应用程序中提供类似表现。
要做到这个,异常困难。我找了一下 EMC SAN 磁盘规格说明,上面都告诉我没有足够的吞吐量。虽然我可以寻求一些无限带宽的昂贵硬件,但是我不为 Google 工作的,我预算有限啊。我需要找到一个方法,利用一堆廉价货,让它们在一起来提供交互速度。一个超级强大的设备不能做到的,但一堆平行 IO 却可能实现。
我现在所要做的,就是要求我的工程师们对这些结构写查询代码……卧槽,刚才有个童鞋尝试把整个代码加载到内存中,结果把整个结构的栈搞挂掉了。我们回退了他的代码。他说这代码在他的测试环境上是可以工作的,他不理解为什么会这样。我摇摇头,把他拉到白板前,给他解释内存背后的原理,内存就像数据的蓄水池,容量是有限的。一个直管的通过量(数据流),只受限于时间(数据移动的速度),而不是容量。
他说他明白了,以后会避免犯类似的错误。嗯,他可能会避免,也可能还会犯错。有智力解决复杂计算机问题的人凤毛麟角。大部分人看上去有机会,但做到的只是极少数人。特别是这个世界还有很多愚蠢的想法,比如“为什么我要学习数据结构和算法”之类的?
我最终可能会炒掉那个工程师。这相当糟糕(译注:艰难的决定),因为在其它方面我还是很喜欢他的。他只是不适合这个工作。
你要知道,你对编程的理解,会体现在你自己选择的工作态度上。毕竟这些不是有趣的工作,赚的也不是很多。你做的事情也不是真正重要的。
如果你觉得作一个低工资的程序员也还好,你最终会改行去做其它的事情,那你不用去学算法和数据结构。如果计算机科学真的吸引你,你知道该做什么。
后记
首先,感谢大家对这个帖子如此关注。也有批评者花时间给了有理有据的反驳,得以让这个对话继续下去。对于成为这样重要主题的中心,我诚惶诚恐。
接下来,我想和那些觉得这帖子有些刺耳的人解释下。当我决定回这个问题时,我想让答案比以往的更有影响力。以往的答案有些是很好的,但缺少和年轻人的内在联系,让他们不容易理解。电影会以呈现原始场景的方式引起观众的共鸣,我发帖目的也是一样的。
我收到的另外一类质疑,觉得这是一个虚构的故事。请理解,这只是对我所处理问题的一种提炼。这些情况都出现过,只是顺序不是你在帖子里看到的。例如,上次我谈到有个工程师在流代码中间使用 ArrayList 缓冲区,他并没有被解雇的风险。事实上他是一个相当优秀的工程师,只是当时没有考虑到。
他的代码在代码审查事被发现,并没有进入产品。我给他和他的同事们作了关于数据仓库的培训,让他们理解内在的原理,希望避免类似问题再次发生。
解雇人是一件困难的事情。你必须这样开始,“我做错了什么?”,“我要怎样解决这个问题?”。找到满足他们个人和适合他们的学习方式,通常需要一个漫长的过程。很多人都回答好的领导力和培训。有一些已经超过我的能力范围。
因为一开始就把重点放在不要招不合适的人,那些我不得不解雇的人,都是不适合团队的(例如,社会问题没有得到改善),或者很长时间都没有掌握他们学习的东西。后面这种情况,对我这样善解人意的领导而言很难,因为他们的表现看上去有改善,但之后又回落到之前的表现。幸好这样的情况很少,但却让人印象深刻。
我现在停下来说一些我见过很棒的工程师,他们在构建大规模代码上没啥经验,但他们对出现的机遇会很兴奋。在某些情况下,这些人会比那些对自己技能有信心的人,更加主动学习和提高。这远不是一个硬性规则,只是一个有趣的观察。
第三点,我注意到有人质疑我的经历只是例外。我建议你们去看下“自我选择的态度”部分。我不得不招技能不好的工程师,是因为大公司们(Google,Orbitz,NavTec,SalesForce等)展开了对工程师的抢夺大战,尽可能快地去得到他们。大数据带来对熟练工程师的需求激增,结果导致整个市场的短缺。这也就是为什么我不得不冒险招人,并且希望我提供的训练是足够的。我们找到剩下的这些工程师,希望把他们训练出来。这对软件工程师有利,前提是你愿意认可计算机科学,理解事物工作的本质是相当重要的。否则你会在电话面试中败下阵来,可能永远不知道原因。
最后,有些人对我描述的工作环境很感兴趣。我目前正在招人,如果你在芝加哥而且觉得你很适合,可以直接和我联系。
让你了解一下你所要进入的领域,我为健康分析中心服务。这行业中的事务处理代码很可能占 95 %,大多数函数库和软件都关注在这些上。分析只占 5 % ,只能使用少数 BI 工具。这些工具在我的行业中不好用,因为我们关心这些数据的细节(比如每个病人),并通过摘要方式找到那些事例,而不是结束它们。这带来很大的挑战,让我不停工作下去。一言以蔽之,你需要了解数据库优化的思想,你会从事定制大规模的谓词引擎,你将开发定制化的 OLAP 逻辑,你将始终面对复杂问题的恐惧和解决它们的成就感。