Preciso entender algoritmos e estruturas de dados para ser chamado de programador? [fechadas]

37

Faz seis anos desde que eu tenho codificado. Codificação em todos os tipos de coisas, como ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP, etc. Eu usei matrizes, mapas, listas vinculadas, conjuntos, etc. e onde quer que trabalhasse com pessoas como eu. Mas sempre que sou entrevistado, é muito provável que as pessoas me façam perguntas sobre hashes, árvores, pilhas e filas. Algumas perguntas são sobre como manipular alguns algoritmos de classificação. Não sei se devo conhecê-los ou devo parar de me chamar de programador. Há algo em mim que também me diz, mesmo que as pessoas que estão fazendo todas essas perguntas me selecionem, elas nunca me farão trabalhar com essas coisas. Eu realmente sou obrigado a saber tudo isso?

sushil bharwani
fonte
10
Isso depende de onde você trabalha e de quem você gostaria de chamá-lo de programador.
Tim
11
Sim, se sem adjetivos negativos.
duros

Respostas:

79

Se tudo o que você sabe fazer é escrever código de cola, você pode se chamar um macaco de código. É necessário escrever muito código de cola e você pode ganhar uma vida decente como um macaco de código. Para se chamar Real Programmer TM e ser confiável quando o código precisar ser escrito do zero, você precisa conhecer algoritmos, estruturas de dados, gerenciamento de memória, ponteiros, linguagem assembly etc. e entender como usar esse conhecimento para avaliar compensações.

dsimcha
fonte
6
Uau, eu meio que esperava que isso fosse rebaixado ao esquecimento por pessoas excessivamente politicamente corretas por usar o termo "macaco de código".
dsimcha 11/11
15
"símia software" é sempre a terminologia preferida
STW
3
Eu não concordo totalmente. O tipo de software que está sendo escrito "do zero" afeta muito quem é capaz de escrevê-lo. Alguns softwares exigem inerentemente menos (ou maior) sofisticação do que outros.
Nick Spreitzer
8
+1, 20% porque eu concordo, 5% por causa do "Real Programmer TM" e 75% porque eu aprendi linguagem assembly e quero fingir que valeu a pena
Carson Myers
3
A maioria dos trabalhos existentes requer apenas 'macacos de código'. É normal que as pessoas que trabalham com 'macaco de código' tendem a esquecer todo o seu conhecimento anterior, tornando-se um pouco mais 'macaco de código' todos os dias, apesar de seu potencial. :(
cag
32

aqueles que não conhecem a história são condenados a reinventá-la

Steven A. Lowe
fonte
75
Na verdade, aqueles que não conhecem a história são condenados a reinventá-la usando os métodos O (N 2) ou O (N 3) em vez de usar métodos conhecidos O (N log N) com idade suficiente para comprar bebida em todos os 50 estados.
John R. Strohm
@ John ROFLMAO - verdade demais!
Steven A. Lowe
3
... está condenado a
30

Bem, trabalhar em uma linguagem como JavaScript torna isso bastante obsoleto, pois um Array é uma mistura entre um vetor, um hash e uma árvore e pode ser usado como uma pilha ou fila. É muito improvável que você precise ou possa implementar uma estrutura de dados em JavaScript que supere a classe Array. Este também é o caso em PHP.

Para Java OTOH, há uma diferença. Suponho que a biblioteca padrão do Java forneça todas as estruturas de dados que você precisar. Contudo:

  1. Você precisa conhecer e distinguir essas estruturas de dados e entender como elas funcionam em diferentes situações, para que você possa escolher a correta.
  2. Em Java, não é absolutamente improvável que você queira escrever sua própria implementação para um hashmap para obter melhor velocidade em alguns casos muito específicos (por exemplo, se as chaves que você deseja manipular preencherem algumas restrições especiais que permitem a otimização).

Quando se trata de algoritmos de classificação, não há muita necessidade de conhecê-los ou compreendê-los, porque não há necessidade de implementar um sozinho. No entanto, se esse algoritmo for fornecido a você, você poderá entendê-lo e implementá-lo.

Duas coisas são certas:

  1. Você pode fazer carreira como programador sem depender de conhecimentos como esse.
  2. Ele definitivamente não vai feri-lo para conhecê-los.

Estruturas de dados e algoritmos são simplesmente algo que é bom de entender. E é algo extremamente claro e formalizado e, portanto, bastante trivial em comparação com os meandros da engenharia de aplicativos ou sistemas. Eles são apenas uma pequena peça do quebra-cabeça, mas são fáceis de entender - se você estiver disposto a investir algum tempo.

Então, não, você não precisa deles, mas seria apenas para seu benefício conhecê-los.

back2dos
fonte
13

Pode ser uma ocasião em que possa haver uma distinção semanticamente significativa entre 'programador' e 'engenheiro de software'. Nesse contexto, especificamente, vemos que você tem conhecimento de várias linguagens de programação e tecnologias relacionadas e que pode usá-las para produzir os resultados desejados. Essa é uma boa definição operacional de 'programador de computador'.

Eu me considero um engenheiro de software. Na maioria dos aspectos do dia-a-dia do meu trabalho, provavelmente faço as mesmas coisas que você. Uso linguagem de computador e tecnologias relacionadas para produzir o resultado desejado. No entanto, eu tenho um entendimento das estruturas e algoritmos de dados e considero esse conhecimento um fundamento fundamental da minha capacidade de fazer muito mais.

Freqüentemente - embora nem todos os dias - meu trabalho envolva encontrar soluções para problemas complexos para os quais não existem soluções óbvias, nada que seja diretamente abordado pelos recursos da estrutura que estou usando ou pelos recursos da linguagem em que estou trabalhando. com. Nisso, preciso analisar o problema e elaborar uma solução e, ocasionalmente, esse processo entra no domínio da arquitetura em larga escala.

Embora seja necessário um excelente entendimento dessas questões mais profundas para realizar esse tipo de trabalho, isso não é suficiente . Em outras palavras, apenas saber como uma tabela de hash funciona ou por que uma classificação de heap geralmente possui boas características de desempenho não é suficiente para ser um arquiteto de sistemas ou um engenheiro sênior. É o ponto de partida lógico e, a partir daí, você pode começar a se aprofundar, a viajar mais amplamente e a adquirir a experiência necessária também para resolver os problemas maiores.

Suponho que, para responder à sua pergunta, você deve se perguntar: "O que eu quero ser? Onde irei com a minha carreira?" Se você está contente em continuar fazendo o que está fazendo, talvez queira aprender estruturas e algoritmos de dados suficientes para passar pelas perguntas da entrevista amplamente arbitrárias com as quais se depara.

Se você quer crescer em sua carreira e tem uma paixão essencial, deve abraçar esses assuntos da maneira mais rigorosa possível. Se você tiver algum tempo para trabalhar neles, mente aberta e verdadeiro entusiasmo, encontrará coisas maravilhosas e emocionantes. Nunca esquecerei o dia em que entendi quicksort. O sentimento de excitação e descoberta definiu o caminho para grande parte da minha vida, e eu não poderia estar mais agradecida por isso. Agora, não consigo imaginar fazer nada além de trabalhar como engenheiro de software.

Boa sorte com o que você escolher.

Adam Crossland
fonte
2
Sempre existem soluções óbvias. Eles simplesmente param de funcionar quando os requisitos mudam;) Eu não acho que o conhecimento profundo de algoritmos e estruturas de dados seja um requisito real para um bom engenheiro de software. Você raramente vê um sem ele, porque o que um bom engenheiro de software tem é uma sede insatisfatória de conhecimento.
Novidade
+1 Bem redigido: "Suponho que, para responder à sua pergunta, você deva se perguntar:" O que eu quero ser? Onde irei com a minha carreira? "
Bill
12

Depende para que servem os trabalhos. Esse tipo de coisa são perguntas de entrevista bastante comuns, mas também não imaginam e provavelmente não se relacionam com o trabalho - certamente não com as tecnologias listadas.

Para mim, como perguntas da entrevista, eles julgam se você fez um curso de Ciência da Computação (e pode se lembrar) em vez de qualquer medida da capacidade ou conhecimento geral de programação.

Eu sugiro que você aprenda essas coisas para poder passar pela entrevista ou simplesmente aceite que em qualquer lugar perguntando essas coisas não é para você, mas não, você não precisa conhecê-las para se chamar um programador.

Jon Hopkins
fonte
11
obrigado pela sua resposta. Compartilharei com uma entrevista engraçada as pessoas que me interessavam, exigindo alguém que fosse bom no lado da interface do usuário usando json css ajax javascript jquery etc. Eles me perguntaram como você escreveria um servidor da web. E o que acontece quando save é pressionado em um arquivo de palavra
sushil bharwani
2
@sushil - Eu acho que é o tipo de lugar que você não quer trabalhar ...
Jon Hopkins
@sushil: Eu concordo totalmente com @ Jon Hopkins. Melhor trabalhar como garçom à espera de um bom emprego do que aceitar um emprego como esse. Ter idiotas incompetentes como superiores o deixará extremamente frustrado e o impedirá em seu desenvolvimento pessoal.
Novidade
6

Ótima pergunta. Javascript, Java ou VC ++ são linguagens de programação super inteligentes, nas quais você nunca precisará criar uma lista vinculada ou tabela de hash do zero. Mas você ainda precisa ter a capacidade de decidir quando usar um sobre o outro, as penalidades e bônus de desempenho acumulados, etc.

Eu entrevistei muitos programadores de API, também chamados de macacos de código, e na maioria das entrevistas eles falharam rotineiramente ao projetar sistemas que são eficientes e escaláveis ​​em termos de desempenho. Resumindo: conhecer as cargas da API fornece o pão, mas para a manteiga você precisa começar do básico da computação.

Fanatic23
fonte
Muito obrigado, vou seguir seu conselho e começar a aprender sobre esses tópicos #
Mahmoud Hossam
3

Vou acrescentar "sim, é claro que você ainda pode se chamar um programador". Mas que tipo de programador você quer ser? Eu acho que os melhores programadores têm pelo menos alguma base no básico teórico. Eles sabem por que escolheram uma estrutura / algoritmo de dados em particular, bem como as vantagens e desvantagens que o acompanham. Espero que qualquer desenvolvedor que entreviste tenha pelo menos um entendimento básico, mesmo que não use o mesmo jargão (embora não conheça o jargão significa que você terá mais dificuldade em se comunicar com outros desenvolvedores).

Martijn Verburg
fonte
2

O conhecimento dos algoritmos permite que você diga com confiança como suas escolhas serão dimensionadas ! Pessoalmente, considero necessário ser um programador sênior


fonte
1

Depende do projeto: sou engenheiro de computação e trabalho como programador analista.

Passei muito tempo trabalhando no design (teste, doc, design de código). Mas, quando encontro um bug (ou desempenho ruim) ou preciso codificar uma nova estrutura de dados (porque o requisito é muito NOVO para o aplicativo), preciso entender onde está o problema no algoritmo e preciso corrigi-lo ( Eu fiz isso não muito bom, então :))

Os algoritmos e estruturas de dados clássicos são uma espécie de "padrão de dicionário" no mundo do desenvolvedor.

Alguns links excelentes:

alepuzio
fonte
1

Você pode muito bem ser um bom programador agora, mas o conhecimento de estrutura de dados, algoritmos e o conhecimento de outros tópicos em ciência da computação certamente ajudariam muito a melhorar a si mesmo de várias maneiras:

  • Você pode ser mais eficaz e rápido ao fazer as coisas. Mesmo as pessoas que já possuem um diploma em Ciência da Computação e conhecem muitos desses tópicos tendem a se manter a par dos últimos avanços para melhorar a si mesmos.

  • Esse conhecimento também será bom para, se em menor grau, dizer se você passar da faixa de programador para gerenciamento posteriormente, porque ainda seria capaz de entender melhor os aspectos técnicos dos projetos com esse conhecimento.

  • É claro que a estrutura de dados e os algoritmos são muito solicitados em entrevistas, e esse é mais um motivo pelo qual pode ser útil conhecê-los.

aditya
fonte
0

Você menciona hashes, árvores, pilhas, filas e algoritmos de classificação. Bem, as tecnologias que você mencionou são principalmente relacionadas a páginas da web e scripts da web. Você definitivamente deve entender as árvores, no mínimo, para poder trabalhar bem com o DOM. Mas se você precisa apenas de scripts, provavelmente está bem. Você não precisará da maioria das ferramentas do comércio para um programador real. Mas isso ocorre porque há uma grande diferença entre o malabarismo de strings que compõe a maior parte dos scripts da Web e o que muitos de nós consideramos "programas de gravação".

Trabalho com árvores e arbustos praticamente diariamente, e empilha e filas com menos frequência, mas com frequência suficiente. A classificação é basicamente um problema resolvido; praticamente qualquer idioma possui um quicksort embutido na biblioteca padrão, um método Sort em tipos básicos de coleções, etc.

Se eu não conhecesse esses princípios e como eles funcionam, provavelmente poderia criar soluções de codificação que funcionassem, mas elas não seriam soluções de qualidade muito boa. Eles corriam devagar, eram difíceis de ler e difíceis de modificar, reutilizar ou estender. Portanto, se você quer aprender a ser um bom programador, definitivamente deve ler seus algoritmos e estruturas de dados. Eles realmente melhorarão a qualidade do seu código.

Mason Wheeler
fonte