Preciso entender algoritmos e estruturas de dados para serem chamados de programadores? [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 eu trabalhasse 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 estão no malabarismo de alguns algoritmos de ordenação. Eu não sei se eu deveria realmente conhecê-los ou devo parar de me chamar de programador. Há algo em mim que também me diz que mesmo que as pessoas que estão fazendo todas essas perguntas me selecionem, elas nunca me farão trabalhar com essas coisas. Eu realmente preciso saber tudo isso?

    
por sushil bharwani 11.11.2010 / 17:05
fonte

12 respostas

78

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

    
por 11.11.2010 / 19:34
fonte
32

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

    
por 11.11.2010 / 17:34
fonte
27

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

Para o Java OTOH, há uma diferença. Suponho que a biblioteca padrão do Java forneça informações sobre qualquer estrutura de dados de que você precisa. No entanto:

  1. Você precisa conhecer e distinguir essas estruturas de dados e entender como eles atuam em diferentes situações para que você possa escolher o caminho certo.
  2. Em Java, não é absolutamente improvável que você deseje gravar 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 otimização) .

Quando se trata de algoritmos de classificação, não há muita necessidade de conhecê-los ou entendê-los, porque não há necessidade de implementar um por conta própria. No entanto, se tal algoritmo é dado a você, você deve ser capaz de compreendê-lo e implementá-lo.

Duas coisas são certas:

  1. Você pode fazer uma carreira como programador sem depender de conhecimentos como esse.
  2. Definitivamente não vai machucá-lo para conhecê-los.

Estruturas de dados e algoritmos são simplesmente uma coisa, isso é bom de entender. E é algo extremamente claro e formalizado e, portanto, bastante trivial em comparação com as complexidades da aplicação ou engenharia de sistemas. Eles são apenas uma pequena peça no 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.

    
por 11.11.2010 / 19:17
fonte
13

Esta pode ser uma ocasião em que pode haver uma distinção semanticamente significativa entre "programador" e "engenheiro de software". Neste contexto, especificamente, vemos que você tem conhecimento de várias linguagens de programação e tecnologias relacionadas e que você pode usá-las para produzir os resultados desejados. Esta é uma excelente 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, eu provavelmente faço as mesmas coisas que você faz. Eu uso a linguagem de computador e tecnologias relacionadas para produzir algum resultado desejado. No entanto, eu tenho uma compreensão de estruturas de dados e algoritmos, e considero que o conhecimento é uma base fundamental da minha capacidade de fazer muito mais.

Frequentemente - embora nem sempre dia - meu trabalho envolve encontrar soluções para problemas complexos para os quais não há soluções óbvias, nada que seja diretamente abordado pelos recursos do framework que estou usando ou pelos recursos da linguagem que Eu estou trabalhando com. Nisso, preciso analisar o problema e elaborar uma solução e, ocasionalmente, esse processo entra no reino da arquitetura de grande 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 espécie de heap geralmente tem 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 e viajar mais amplamente e ganhar a experiência que também é necessária para resolver os problemas maiores.

Suponho que, para responder à sua pergunta, você deve se perguntar: "O que eu quero ser? Para onde vou com minha carreira?" Se você está contente em continuar fazendo o que está fazendo, talvez queira apenas aprender estruturas de dados e algoritmos suficientes para superar as perguntas arbitrárias de entrevistas que enfrenta.

Se você quer crescer em sua carreira e tem a paixão por isso que é essencial, você deve abraçar esses assuntos o mais que puder. Se você tiver algum tempo para trabalhar nelas, uma mente aberta e um verdadeiro entusiasmo, encontrará algumas coisas maravilhosas e emocionantes. Eu nunca vou esquecer o dia em que eu entendi o quicksort. O sentimento de excitação e descoberta definiu o curso para a maior parte do resto da minha vida, e eu não poderia estar mais agradecido por isso. Agora, não consigo imaginar fazer nada além de trabalhar como engenheiro de software.

Boa sorte com o que você escolher.

    
por 11.11.2010 / 17:29
fonte
10

Depende de quais são os trabalhos. Esse tipo de coisa é uma questão de entrevista bastante padronizada, mas também é relativamente sem imaginação e provavelmente não se relaciona com o trabalho - certamente não é um emprego usando as tecnologias que você lista.

Para mim, como perguntas para entrevistas, elas são boas para julgar se você fez um curso de Ciência da Computação (e pode se lembrar disso) em vez de qualquer medida de habilidade ou conhecimento geral de programação.

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

    
por 11.11.2010 / 17:10
fonte
6

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

Entrevistei muitos programadores de API , conhecidos como macacos de código, e na maioria das entrevistas eles rotineiramente falharam em projetar sistemas eficientes em termos de desempenho e escaláveis. Resumindo: conhecer cargas de API vai te dar o pão, mas para a manteiga você precisa começar do básico da computação.

    
por 28.11.2010 / 18:18
fonte
3

Eu adicionarei "sim, claro que você ainda pode se chamar de 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 eles escolheram uma estrutura / algoritmo de dados em particular, bem como os trade-offs que vêm com isso. Espero que qualquer desenvolvedor que eu entreviste tenha pelo menos uma compreensão básica, mesmo que eles não usem o mesmo jargão (embora não conhecer o jargão significa que você vai achar mais difícil se comunicar com outros desenvolvedores).

    
por 11.11.2010 / 17:41
fonte
2

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

    
por 28.11.2010 / 18:35
fonte
2

"If you want to be a good programmer you just program every day for two years. If you want to be a world class programmer you can program every day for ten years, or you could program every day for two years and take an algorithms class."

-Charles E. Leiserson

Bons conselhos da análise de algoritmos Por Charles E. Leiserson - MIT

    
por 08.04.2013 / 17:33
fonte
1

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

Eu passei muito tempo para trabalhar em design (teste, documentação, design de código). Mas, quando encontro um bug (ou mau desempenho) ou tenho que codificar uma nova estrutura de dados (porque o requisito é muito NOVO para a aplicação), devo entender onde está o problema no algoritmo e devo 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 excelentes links:

por 11.11.2010 / 17:42
fonte
1

Você pode muito bem ser um bom programador    agora, mas o conhecimento de dados    Estrutura, Algoritmos e Conhecimento    de outros tópicos em ciência da computação    certamente ajudaria muito em    melhorando de várias maneiras:

  • Você pode ser capaz para ser mais eficaz e mais rápido fazendo coisas. Mesmo pessoas que já tem um grau de Ciência da Computação e sabe que muitos desses tópicos tenderiam para manter-se a par com últimos avanços, a fim de melhorar eles mesmos.

  • Esse conhecimento também será bom para se até um menor grau, digamos se você passar de programador para gerenciamento seguir mais tarde, porque você ainda ser capaz de entender o técnico aspectos de projetos melhor com este conhecimento.

  • É claro que estrutura de dados e algoritmos são solicitados muito em entrevistas, de modo que é mais um razão pela qual pode ser útil saber eles.

por 11.11.2010 / 19:44
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ê deve definitivamente entender as árvores no mínimo, então você pode trabalhar com o DOM bem. Mas se scripting é tudo que você precisa fazer, então provavelmente você está bem. Você não precisará da maioria das ferramentas do comércio para um programador real. Mas isso é porque há uma grande diferença entre o malabarismo de cordas que compõe a maioria dos scripts da Web e o que a maioria de nós considera "escrever programas".

Eu trabalho com hashes e árvores praticamente diariamente, e pilhas e filas com menos freqüência, mas com frequência suficiente. A classificação é basicamente um problema resolvido; praticamente qualquer idioma tem um quicksort embutido na biblioteca padrão, um método Sort nos tipos básicos de coleção, etc, mas você deve saber sob quais circunstâncias o desempenho do quicksort pode ser degradado severamente e as estratégias corretas para atrasar a classificação.

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

    
por 11.11.2010 / 19:37
fonte