it-swarm.dev

Um programador competente deve ser capaz de criar seu próprio algoritmo de caminho mais curto?

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

58
Newbie Programmer

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, o que parece ser um padrão muito alto para determinar se alguém é um 'bom programador'

118
GSto

É esse o tipo de coisa que um bom programador deve ser capaz de "reinventar" em algumas horas ou estou sendo realista?

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 do 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 está completamente OK 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.)

54
Konrad Rudolph

É esse o tipo de coisa que um bom programador deve ser capaz de "reinventar" em algumas horas ou estou sendo realista?

Definitivamente irrealista. As pessoas não "inventam" algoritmos em poucas horas. É preciso muito esforço e trabalho. Para citar this blog:

Em Programming Pearls, Bentley, citando Donald Knuth, diz "Enquanto a primeira pesquisa binária foi publicada em 1946, a primeira pesquisa binária que funciona corretamente para todos os valores de n não apareceu até 1962".

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.

17
BlackJack

É 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 a melhor maneira de 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.

9
Jose Faeti

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 pudesse 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.

6
Keith Layne

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 muito programadores 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 poderia amarrar seus próprios cadarços até os dez anos de idade.

É bem provável que você tenha reinventado, sem saber, muitas coisas que muitas outras nunca teriam descoberto se não fosse por elas serem ensinadas explicitamente.

3
Rei Miyasaka

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 outras pessoas 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ê precise criar 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.)

3
Alpha

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 pode ter alguns problemas específicos do projeto, complicados, nos quais não pode confiar em muitas pesquisas científicas anteriores.

2
Hans-Peter Störr

Não se preocupe

Como programador Perl, eu estou prestes a nunca 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 inventamos a roda. Essa é uma das melhores coisas sobre Perl.

Então, o que estou dizendo é o seguinte:

  1. Eu não recomendo reinventar a roda, mas quando você faz ...
  2. Tente não reinventá-lo completamente e ...
  3. Não se preocupe se você não pode fazê-lo. É por isso que temos uma comunidade de programação :-).
1
Dynamic

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 via 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 com razão, é cegamente óbvio quando a solução está à sua frente. Esse sempre parece ser o caso!

0
Engineer

É esse o tipo de coisa que um bom programador deve ser capaz de "reinventar" em algumas horas ou estou sendo realista?

Eu diria que, se você é capaz de inventar um algoritmo para um problema conhecido como o Caminho Mais Curto sozinho, você está sendo um bad programador.

Isso significa que você está ignorando ma história 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 algoritmo de Dijkstra com árvores de Fibonacci). É quase garantido que você se sai pior do que os algoritmos já criados. Pior ainda, há uma boa chance de o 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 incentivo 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.

0
Alex ten Brink