自从我从事编码工作已经六年了。编码各种东西,例如ActionScript,JavaScript,Java,PHP,Ajax,XML HTML,ASP等。我使用过数组,映射,链接列表,集合等,无论我在哪里工作,都喜欢我。但是每当我接受采访时,人们很可能会问我有关哈希,树,堆栈和队列的问题。一些关于如何处理排序算法的问题。我不知道我是否应该真正认识他们,还是应该停止自称程序员。即使我在问所有这些问题的人选择了我,我的内心也会告诉我,他们永远不会让我做这些事情。我真的需要知道所有这些吗?
自从我从事编码工作已经六年了。编码各种东西,例如ActionScript,JavaScript,Java,PHP,Ajax,XML HTML,ASP等。我使用过数组,映射,链接列表,集合等,无论我在哪里工作,都喜欢我。但是每当我接受采访时,人们很可能会问我有关哈希,树,堆栈和队列的问题。一些关于如何处理排序算法的问题。我不知道我是否应该真正认识他们,还是应该停止自称程序员。即使我在问所有这些问题的人选择了我,我的内心也会告诉我,他们永远不会让我做这些事情。我真的需要知道所有这些吗?
Answers:
如果您只知道编写粘合代码,您就可以称自己为代码猴子。需要编写很多胶水代码,您可以像代码猴子一样过上体面的生活。要称自己为Real Programmer TM并在需要从头开始编写代码时获得信任,您必须了解算法,数据结构,内存管理,指针,汇编语言等,并了解如何使用此知识来评估折衷。
好吧,使用像JavaScript这样的语言进行工作使这变得过时了,因为Array是向量,哈希和树之间的混合,可以用作堆栈或队列。您几乎不可能或不可能在JavaScript中实现优于Array类的数据结构。在PHP中也是如此。
对于Java OTOH,有所不同。我想Java的标准库可以为您提供所需的任何数据结构。然而:
当涉及到排序算法时,并不需要太多的知识或了解它们,因为不需要自己实现一种算法。但是,如果为您提供了这样的算法,则您应该能够理解并实现它。
有两件事是确定的:
数据结构和算法只是一件事,很容易理解。与应用程序或系统工程的复杂性相比,这是非常清晰和形式化的,因此非常琐碎。它们只是难题中的一小部分,但是如果您愿意花一些时间,它们很容易掌握。
因此,不,您不需要它们,但是了解它们只会对您有所帮助。
在这种情况下,“程序员”和“软件工程师”之间可能会有语义上的区别。在这种情况下,特别是,我们看到您具有几种编程语言和相关技术的知识,并且可以使用它们来产生期望的结果。这是“计算机程序员”的优良操作定义。
我认为自己是一名软件工程师。在我工作的大部分日常工作中,我可能会做与您相同的事情。我使用计算机语言和相关技术来产生一些期望的结果。但是,我确实了解数据结构和算法,并且我认为这些知识是我做更多事情的能力的基础。
通常-尽管不是每天-我的工作是寻找没有明显解决方案的复杂问题的解决方案,我所使用的框架的功能或所使用语言的功能无法直接解决任何问题用。在这种情况下,我需要分析问题并设计解决方案,有时此过程会进入大型体系结构领域。
尽管对这类更深层次的问题有很好的理解是进行此类工作所必需的,但这还不够。换句话说,仅仅知道哈希表如何工作或为什么堆排序通常具有良好的性能特征还不足以成为系统架构师或高级工程师。这是合乎逻辑的起点,从那里您可以开始更深入地挖掘和更广泛地旅行,并获得解决更大问题所必需的经验。
我想为了回答您的问题,您应该问自己:“我想成为什么?我的职业将去哪里?” 如果您对继续做自己的事情感到满意,那么您可能只想学习足够的数据结构和算法,以解决您面临的大部分任意采访问题。
如果您想在自己的职业中成长,并且对必不可少的激情充满热情,则应尽可能严格地接受这些主题。如果您有一些时间来处理它们,拥有开放的胸怀和真正的热情,您会发现一些奇妙而令人兴奋的事情。我永远不会忘记我最先了解quicksort的那一天。兴奋和发现的感觉为我一生的大部分时间设定了方向,我对此深表感谢。现在,我无法想象除了担任软件工程师以外还要做任何事情。
随您选择,祝您好运。
这取决于工作的目的。这类问题是相当标准的面试问题,但它们也很缺乏想象力,可能根本与工作无关-当然不是使用您列出的技术进行的工作。
对我而言,面试问题对于他们是否获得计算机科学学位(并能记住)是一个很好的判断,而不是一般编程能力或知识的任何衡量标准。
我建议您要么学习这些东西,这样您就可以通过面试,或者您只是接受在任何地方问这些问题都不适合您,但是不,您不需要了解它们就可以称自己为程序员。
好问题。Javascript或Java或VC ++是超级智能的编程语言,您无需从头开始创建链表或哈希表。但是,您仍然需要能够决定何时使用彼此的性能,各自产生的性能损失和奖金等。
我采访了许多API程序员(又称代码猴子),在大多数采访中,他们通常都无法设计出性能高效且可扩展的系统。底线:了解API的负载将使您受益匪浅,但是对于黄油,您需要从计算基础开始。
我将添加“是的,当然您仍然可以称自己为程序员”。但是您想成为什么样的程序员?我认为最好的程序员至少在理论基础上有一定基础。他们知道为什么选择特定的数据结构/算法以及随之而来的取舍。我希望我采访的所有开发人员至少具有基本的了解,即使他们不使用相同的术语(尽管不了解术语意味着您会发现与其他开发人员进行交流更加困难)。
算法知识使您可以自信地说出您的选择将如何扩展!我个人认为这对于成为高级程序员是必要的
“如果您想成为一名优秀的程序员,您每天只需编程两年。如果您想成为世界一流的程序员,您可以每天编程十年,或者您可以每天编程两年并参加算法课。 。”
查尔斯·莱森
这取决于项目:我是计算机工程师,我是分析师程序员。
我花了很多时间进行设计(测试,文档,代码设计)。但是,当我发现一个错误(或性能不佳)或不得不编码一个新的数据结构(因为对应用程序的要求非常新)时,我必须了解算法中的问题所在,并且必须对其进行纠正(我做的不是很好,所以:))
经典算法和数据结构是开发人员世界中的一种“词典模式”。
一些优秀的链接:
您提到了哈希,树,堆栈,队列和排序算法。好吧,您提到的技术主要与网页和Web脚本相关。您绝对应该至少了解树,这样您才能很好地使用DOM。但是,如果您只需要编写脚本,那您就可以了。对于真正的程序员,您不需要交易中的大多数工具。但这是因为构成大多数Web脚本的字符串变戏法和我们大多数人认为的“编写程序”之间存在很大的差异。
我几乎每天都在处理哈希和树,并且不经常但频繁地堆积和排队。排序基本上是一个可以解决的问题;几乎任何一种语言都在标准库中内置了快速排序功能,对基本集合类型的排序方法等,但是您应该知道在什么情况下快速排序的性能会严重下降以及延迟排序的正确策略。
如果我不了解这些原理及其工作原理,那么我可能会破解一些行之有效的编码解决方案,但它们并不是质量很好的解决方案。它们运行缓慢,难以阅读,难以修改,重用或扩展。因此,如果您想学习成为一名优秀的程序员,则一定要阅读一下算法和数据结构。它们确实可以提高您的代码质量。