Estou sofrendo uma crise de confiança na minha capacidade como programador de computador.
Ontem tentei criar meu próprio algoritmo de caminho mais curto para um gráfico e depois de algumas horas simplesmente joguei a toalha e aprendi o algoritmo de Dijkstra.
É esse o tipo de coisa que um bom programador deve ser capaz de "reinventar" em algumas horas ou estou sendo realista?
Bem, pelo menos eu fui capaz de reinventar o tipo de bolha: D
algorithms
Programador iniciante
fonte
fonte
Respostas:
Um bom programador deve perceber que um ótimo algoritmo já foi escrito para resolver um problema e não perde tempo reinventando as rodas.
Duvido que Dijkstra tenha inventado o algoritmo de caminho mais curto em poucas horas, de modo que parece um padrão realmente alto para determinar se alguém é um 'bom programador'
fonte
Primeiro, você talvez esteja confundindo programação com ciência da computação teórica. Um programador fantástico precisa de um bom fundamento em ciência da computação, mas não precisa ser fantástico. Dijkstra era fantástico em ciência da computação.
Em segundo lugar, eu esperaria que qualquer pessoa com uma boa compreensão dos gráficos desenvolvesse seu próprio percurso de gráficos após um pouco de reflexão. Mas não é um algoritmo de caminho mais curto. O algoritmo de Dijkstra, em particular, é altamente sofisticado. Depois de entender, é óbvio. Mas a maioria das coisas é assim.
Você provavelmente poderia derivar algum tipo de algoritmo de caminho mais curto depois de experimentar algumas coisas e dar à idéia algum tempo. Mas não fique desapontado se isso levar horas ou até alguns dias. Isso é completamente bom e normal.
(Advertência: bem, você deve conseguir forçar o problema com força bruta em algumas horas no máximo, mas isso não produziria um algoritmo funcional, mesmo em gráficos relativamente pequenos.)
fonte
Definitivamente irrealista. As pessoas não "inventam" algoritmos em poucas horas. É preciso muito esforço e trabalho. Para citar este blog:
e a versão de Bentley também era problemática quando implementada para grandes conjuntos.
Além disso, um bom programador sabe quais ferramentas estão à sua disposição e quando usá-las. Você não ganha pontos extras por originalidade ou por fazer coisas diferentes - você quer que funcione e funcione bem.
fonte
É muito improvável que você consiga encontrar uma solução melhor do que a que você pode escolher.
Criar um algoritmo melhor do que o considerado "o melhor" (no seu caso, o mais curto) não é algo que todos possam fazer. Provavelmente nem é possível.
Um bom programador deve ser capaz de entender a lógica por trás do algoritmo e por que é melhor ou pior (ou simplesmente inadequado para esse problema em particular) do que outros algoritmos que tentam resolver o mesmo problema.
(s) Ele também deve saber se é realmente o melhor caminho a seguir para resolver esse problema específico.
De qualquer forma, se você deseja praticar, ainda pode tentar escrever sua implementação pessoal de um algoritmo, tentando resolver um problema usando sua mente. Pode não ser o melhor, mas é uma boa prática para a solução de problemas.
fonte
Isso me lembra algo que li sobre a diferença entre "engenharia de software" (o que eu chamaria de programação) e as outras disciplinas de engenharia. Pensando bem, acho que foi o livro original de Design Patterns. Tenho certeza de que alguém aqui pode citar isso em cima de sua cabeça.
De qualquer forma, o ponto (embora não exatamente voltado para o design de algoritmos) era que as disciplinas de engenharia são codificadas; é provável que nenhum engenheiro civil gaste tempo tentando reinventar o feixe em I, mas os programadores fazem isso o tempo todo. O problema (e percebo que estou apenas ecoando os sentimentos de muitos) é que esse comportamento é um desperdício e propenso a erros, e serve ao ego mais do que à solução.
A ciência da computação me levou à programação e eu amo os dois. No entanto, sou um programador muito melhor do que um cientista da computação. Eu nunca acusaria você de ser incompetente porque não conseguiu reinventar o algoritmo de Dijkstra em uma tarde. Eu questionaria sua competência como programador se você não pudesse reconhecer um problema que poderia ser resolvido por meio de um algoritmo gráfico de caminho mais curto.
Dito isso, acredito que pensar em algoritmos e tentar projetar e implementar novos é (potencialmente) divertido e (quase) sempre instrutivo. Eu apenas tento separar claramente meu tempo de CS do meu tempo de programação. Para os programadores, nosso tempo (especialmente pago) é mais bem gasto resolvendo problemas práticos, em vez de outros problemas. Além disso, o tempo de CS quase sempre esmaga minha confiança.
fonte
Você não vai notar as mesmas coisas que todo mundo faz. Eu acho que é apenas um fato da vida que temos que viver. Muito disso se resume ao seu aprendizado passivo e aos modelos mentais que você desenvolveu como resultado deles.
Conheço alguns programadores muito inteligentes e competentes que tiveram que aprender a lei de DeMorgan na escola antes que pudessem fazê-lo de forma consistente. Por acaso, eu descobri o algoritmo de Dijkstra por conta própria (e tenho que admitir que tenho um pouco de orgulho disso), mas demorei muito tempo até que eu pudesse entender o tipo de bolha.
Mais famoso, Einstein, que você pensaria que seria um especialista em teoria dos nós, não conseguiu amarrar seus próprios cadarços até os dez anos de idade.
As chances são boas de que você, sem saber, tenha reinventado muitas coisas que muitos outros nunca teriam descoberto se não fossem ensinamentos explícitos.
fonte
Eu imploro para diferir pelo que a maioria das respostas diz. Embora eu não esperasse que um programador de qualquer nível fosse capaz de aparecer sozinho no algoritmo de Dijkstra, eu definitivamente esperaria que ele tivesse alguma maneira (eficiente ou não) de resolver o problema.
Por exemplo, você disse como um comentário secundário que conseguiu criar o tipo de bolha por conta própria. Eu sei que é o algoritmo de classificação mais fedido, mas você encontrou uma maneira de resolver um problema, e é isso que eu espero que os programadores sejam capazes de: encontrar uma maneira de resolver problemas.
É claro que investigar e encontrar soluções feitas por outros também funciona, mas o extremo desse ponto é um cara que não pensa em si mesmo e cujos programas são um compêndio de pesquisas no Google.
Acho que estou parecendo mais severo do que realmente quero, mas o que quero dizer é: espero que um programador seja criativo o suficiente para encontrar uma solução para um problema, mesmo que a solução seja com erros ou com erros.
Então, voltando ao seu caso, não acho que você deva inventar o algoritmo de Dijkstra, mas se você tiver a capacidade de escrever um algoritmo para experimentar várias possibilidades e encontrar o caminho mais curto sem terminar em um loop infinito, então você tem minha aprovação.
(BTW, minha aprovação conta na mesma ordem de importância que um cupom de lavagem de carro gratuito.)
fonte
Sim, ele / ela deveria.
Pode ser o equivalente moral do tipo de bolha, mas acho que um bom programador deve conseguir criar pelo menos algo que funcione, por mais ineficiente que seja.
Desnecessário dizer que, se esse problema em particular surgisse, um bom programador procuraria primeiro se existe uma biblioteca para fazer isso por ele ou quais algoritmos publicados fazem isso e são fáceis de implementar.
Obviamente, muitas tarefas de programação são muito menos difíceis e nem todos precisam ser capazes de lidar com problemas tão difíceis. Mas você quer ter alguém com uma mente assim em sua equipe, porque você pode ter alguns problemas específicos do projeto, complicados, nos quais não pode confiar em muitas pesquisas científicas anteriores.
fonte
Não se preocupe
Como programador Perl, eu nunca pretendo reinventar a roda. Esse é o trabalho da CPAN. Se houver um algoritmo ou módulo simples e bem suportado, nós o usamos. Se não houver um bom módulo, então nós inventar a roda. Essa é uma das melhores coisas sobre Perl.
Então, o que estou dizendo é o seguinte:
fonte
A teoria dos grafos e os algoritmos que se aplicam a ela parecem simples na superfície, mas geralmente estão longe dela. Você pensaria que a formação de gráficos não cruzados (planares) é simples, por exemplo, à primeira vista. No ano passado, examinei extensivamente esse problema (planaridade através da eliminação dos subgráficos de Kuratowski). Posso dizer, a partir dessa experiência, que as pessoas que escrevem esses algoritmos normalmente passam a duração de seus estudos de doutorado fazendo isso, e às vezes essa pesquisa é feita em equipes. E, como pesquisadores , esse é seu único foco de trabalho durante esse período de tempo. Não é sensato pensar que nós, engenheiros de campo, podemos esperar o mesmo. Como alguém aqui disse corretamente, é cegamente óbvio quando a solução está à sua frente. Esse sempre parece ser o caso!
fonte
Eu diria que, se você é capaz de inventar um algoritmo para um problema conhecido como o Shortest Path sozinho, está sendo um péssimo programador.
Isso significa que você está ignorando uma história bastante antiga sobre o problema do Caminho Mais Curto , passando de um algoritmo O (| V | ^ 4) publicado em 1955 para o algoritmo O (E + V log V) publicado em 1984 (que é o de Dijkstra). algoritmo com árvores de Fibonacci). É quase garantido que você se sai pior do que os algoritmos já criados. Pior ainda, há uma boa chance de seu algoritmo ter lacunas ou erros, tornando-o incorreto. Além disso, você certamente passará muito mais tempo pensando em seu algoritmo, implementando-o e testando-o do que o tempo necessário para reutilizar um algoritmo existente.
Deixe o design dos algoritmos para os designers de algoritmos. Programadores são consumidores de seus resultados. Os programadores combinam algoritmos e os colocam para trabalhar em tarefas do mundo real. Um policial não precisa reinventar a lei para poder trabalhar ou ser um bom policial.
Até o encorajo a usar implementações feitas por especialistas, em vez de implementar você mesmo os algoritmos para qualquer algoritmo moderadamente complicado. É mais provável que esteja correto, as chances são de que sejam mais rápidas do que você nunca e isso poupa muito tempo. Isso é particularmente verdadeiro para algoritmos criptográficos, porque você recebe uma demanda adicional de segurança, que geralmente apenas especialistas podem fornecer.
fonte