我需要了解被称为程序员的算法和数据结构吗?[关闭]


37

自从我从事编码工作已经六年了。编码各种东西,例如ActionScript,JavaScript,Java,PHP,Ajax,XML HTML,ASP等。我使用过数组,映射,链接列表,集合等,无论我在哪里工作,都喜欢我。但是每当我接受采访时,人们很可能会问我有关哈希,树,堆栈和队列的问题。一些关于如何处理排序算法的问题。我不知道我是否应该真正认识他们,还是应该停止自称程序员。即使我在问所有这些问题的人选择了我,我的内心也会告诉我,他们永远不会让我做这些事情。我真的需要知道所有这些吗?


10
这取决于您在哪里工作,以及您想称呼谁为程序员。
Tim

1
是的,如果没有任何否定形容词。
duros

Answers:


79

如果您只知道编写粘合代码,您就可以称自己为代码猴子。需要编写很多胶水代码,您可以像代码猴子一样过上体面的生活。要称自己为Real Programmer TM并在需要从头开始编写代码时获得信任,您必须了解算法,数据结构,内存管理,指针,汇编语言等,并了解如何使用此知识来评估折衷。


6
哇,我中途预计会因使用“代码猴子”一词在政治上过分正确而被人们遗忘。
dsimcha 2010年

15
“ simian软件”始终是首选术语
STW 2010年

3
我完全不同意。“从头开始”编写的软件类型会极大地影响谁可以编写软件。某些软件固有地需要比其他软件更少(或更高)的复杂性。
Nick Spreitzer,2010年

8
+1,20%,因为我同意,5%,因为“ Real Programmer TM”,以及75%,因为我学习了汇编语言,并假装认为这值得痛苦
Carson Myers,2010年

3
现有的大多数工作仅需要“代码猴子”。通常,从事“代码猴子”工作的人往往会忘记他以前的所有知识,尽管他有潜力,但每天都会使自己多一点“代码猴子”。:(
cag

32

那些不知道历史的人会被谴责重塑历史


75
实际上,那些不知道历史的人会被谴责使用O(N 2)或O(N 3)方法来重塑历史,而不是使用足够古老的O(N log N)方法来购买全部50种酒状态。
约翰·R·斯特罗姆

@John ROFLMAO-太正确了!
史蒂文·劳

3
....注定要重新

30

好吧,使用像JavaScript这样的语言进行工作使这变得过时了,因为Array是向量,哈希和树之间的混合,可以用作堆栈或队列。您几乎不可能或不可能在JavaScript中实现优于Array类的数据结构。在PHP中也是如此。

对于Java OTOH,有所不同。我想Java的标准库可以为您提供所需的任何数据结构。然而:

  1. 您需要了解并区分这些数据结构,并了解它们在不同情况下的性能,以便能够选择正确的数据结构。
  2. 在Java中,并非绝对不可能最终要为某个哈希图编写自己的实现,以在某些非常特殊的情况下提高速度(例如,如果要处理的键填充一些允许优化的特殊约束)。

当涉及到排序算法时,并不需要太多的知识或了解它们,因为不需要自己实现一种算法。但是,如果为您提供了这样的算法,则您应该能够理解并实现它。

有两件事是确定的:

  1. 可以依靠这样的知识来从事程序员职业。
  2. 最肯定不会伤害你认识他们。

数据结构和算法只是一件事,很容易理解。与应用程序或系统工程的复杂性相比,这是非常清晰和形式化的,因此非常琐碎。它们只是难题中的一小部分,但是如果您愿意花一些时间,它们很容易掌握。

因此,不,您不需要它们,但是了解它们只会对有所帮助。


13

在这种情况下,“程序员”和“软件工程师”之间可能会有语义上的区别。在这种情况下,特别是,我们看到您具有几种编程语言和相关技术的知识,并且可以使用它们来产生期望的结果。这是“计算机程序员”的优良操作定义。

我认为自己是一名软件工程师。在我工作的大部分日常工作中,我可能会做与您相同的事情。我使用计算机语言和相关技术来产生一些期望的结果。但是,我确实了解数据结构和算法,并且我认为这些知识是我做更多事情的能力的基础。

通常-尽管不是每天-我的工作是寻找没有明显解决方案的复杂问题的解决方案,我所使用的框架的功能或所使用语言的功能无法直接解决任何问题用。在这种情况下,我需要分析问题并设计解决方案,有时此过程会进入大型体系结构领域。

尽管对这类更深层次的问题有很好的理解是进行此类工作所必需的,但这还不够。换句话说,仅仅知道哈希表如何工作或为什么堆排序通常具有良好的性能特征还不足以成为系统架构师或高级工程师。这是合乎逻辑的起点,从那里您可以开始更深入地挖掘和更广泛地旅行,并获得解决更大问题所必需的经验。

我想为了回答您的问题,您应该问自己:“我想成为什么?我的职业将去哪里?” 如果您对继续做自己的事情感到满意,那么您可能只想学习足够的数据结构和算法,以解决您面临的大部分任意采访问题。

如果您想在自己的职业中成长,并且对必不可少的激情充满热情,则应尽可能严格地接受这些主题。如果您有一些时间来处理它们,拥有开放的胸怀和真正的热情,您会发现一些奇妙而令人兴奋的事情。我永远不会忘记我最先了解quicksort的那一天。兴奋和发现的感觉为我一生的大部分时间设定了方向,我对此深表感谢。现在,我无法想象除了担任软件工程师以外还要做任何事情。

随您选择,祝您好运。


2
总有明显的解决方案。当需求变化时,它们只是停止工作;)我认为对于优秀的软件工程师而言,对算法和数据结构的深入了解并不是真正的前提。只是您很少看到没有它的人,因为优秀的软件工程师所拥有的知识是无法满足的。
back2dos

+1措辞不错:“我想为了回答您的问题,您应该问自己:“我想成为什么?我的职业生涯将何去何从?”
比尔2010年

11

这取决于工作的目的。这类问题是相当标准的面试问题,但它们也很缺乏想象力,可能根本与工作无关-当然不是使用您列出的技术进行的工作。

对我而言,面试问题对于他们是否获得计算机科学学位(并能记住)是一个很好的判断,而不是一般编程能力或知识的任何衡量标准。

我建议您要么学习这些东西,这样您就可以通过面试,或者您只是接受在任何地方问这些问题都不适合您,但是不,您不需要了解它们就可以称自己为程序员。


1
感谢您的回答。我将与一个有趣的采访分享,需要我介入的人们需要使用json css ajax javascript jquery等在用户界面方面出色的人。他们问我如何编写Web服务器。当在单词文件中按保存时会发生什么情况
sushil bharwani 2010年

2
@sushil-我想那是您不想工作的地方...
Jon Hopkins 2010年

@sushil:我完全同意@Jon Hopkins。胜任这样的工作,比起做一份更好的工作来等待服务生更好。白痴无能为力会使您极度沮丧,并使您的个人发展停滞不前。
back2dos

6

好问题。Javascript或Java或VC ++是超级智能的编程语言,您无需从头开始创建链表或哈希表。但是,您仍然需要能够决定何时使用彼此的性能,各自产生的性能损失和奖金等。

我采访了许多API程序员(又称代码猴子),在大多数采访中,他们通常都无法设计出性能高效且可扩展的系统。底线:了解API的负载将使您受益匪浅,但是对于黄油,您需要从计算基础开始。


非常感谢,我将接受您的建议,并开始学习这些主题
Mahmoud Hossam

3

我将添加“是的,当然您仍然可以称自己为程序员”。但是您想成为什么样的程序员?我认为最好的程序员至少在理论基础上有一定基础。他们知道为什么选择特定的数据结构/算法以及随之而来的取舍。我希望我采访的所有开发人员至少具有基本的了解,即使他们不使用相同的术语(尽管不了解术语意味着您会发现与其他开发人员进行交流更加困难)。


2

算法知识使您可以自信地说出您的选择将如何扩展!我个人认为这对于成为高级程序员是必要的



1

这取决于项目:我是计算机工程师,我是分析师程序员。

我花了很多时间进行设计(测试,文档,代码设计)。但是,当我发现一个错误(或性能不佳)或不得不编码一个新的数据结构(因为对应用程序的要求非常新)时,我必须了解算法中的问题所在,并且必须对其进行纠正(我做的不是很好,所以:))

经典算法和数据结构是开发人员世界中的一种“词典模式”。

一些优秀的链接:


1

您可能现在已经是一名优秀的程序员,但是对数据结构,算法的了解以及计算机科学中其他主题的知识无疑会在许多方面帮助您提高自己:

  • 您可能可以更有效,更快速地处理事务。即使是已经拥有计算机科学学位并且知道很多这样的主题的人,也往往会跟上他们的最新进展,以提高自己。

  • 如果在较小程度上,该知识也将很有用,例如,如果您稍后从程序员转到管理职位,因为您仍然可以使用此知识更好地理解项目的技术方面。

  • 当然,在访谈中会问很多数据结构和算法,这也是了解它们可能有用的又一个原因。


0

您提到了哈希,树,堆栈,队列和排序算法。好吧,您提到的技术主要与网页和Web脚本相关。您绝对应该至少了解树,这样您才能很好地使用DOM。但是,如果您只需要编写脚本,那您就可以了。对于真正的程序员,您不需要交易中的大多数工具。但这是因为构成大多数Web脚本的字符串变戏法和我们大多数人认为的“编写程序”之间存在很大的差异。

我几乎每天都在处理哈希和树,并且不经常但频繁地堆积和排队。排序基本上是一个可以解决的问题;几乎任何一种语言都在标准库中内置了快速排序功能,对基本集合类型的排序方法等,但是您应该知道在什么情况下快速排序的性能会严重下降以及延迟排序的正确策略。

如果我不了解这些原理及其工作原理,那么我可能会破解一些行之有效的编码解决方案,但它们并不是质量很好的解决方案。它们运行缓慢,难以阅读,难以修改,重用或扩展。因此,如果您想学习成为一名优秀的程序员,则一定要阅读一下算法和数据结构。它们确实可以提高您的代码质量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.