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?
interview
self-improvement
algorithms
data-structures
sushil bharwani
fonte
fonte
Respostas:
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.
fonte
aqueles que não conhecem a história são condenados a reinventá-la
fonte
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:
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:
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.
fonte
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.
fonte
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.
fonte
Ó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.
fonte
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).
fonte
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
Bons conselhos da Análise de algoritmos Por Charles E. Leiserson - MIT
fonte
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:
fonte
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.
fonte
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.
fonte