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