Estoy sufriendo una crisis de confianza en mi habilidad como programador de computadoras.
Ayer intenté crear mi propio algoritmo de ruta más corta para un gráfico y después de algunas horas simplemente tiré la toalla y aprendí el algoritmo de Dijkstra.
¿Es este el tipo de cosas que un buen programador debería ser capaz de "reinventar" en un par de horas o no soy realista?
Bueno, al menos pude reinventar el tipo de burbuja: D
algorithms
Programador novato
fuente
fuente
Respuestas:
Un buen programador debe darse cuenta de que ya se ha escrito un gran algoritmo para resolver un problema y no pierde el tiempo reinventando ruedas.
Dudo que a Dijkstra se le ocurra el algoritmo de ruta más corto en unas pocas horas, por lo que parece un estándar realmente alto para determinar si alguien es un "buen programador".
fuente
Primero, quizás estás confundiendo la programación con la informática teórica. Un programador fantástico necesita un buen fundamento en informática pero no necesita ser fantástico. Dijkstra fue fantástico en informática.
En segundo lugar, esperaría que cualquiera con una buena comprensión de los gráficos desarrolle su propio recorrido de gráficos después de un poco de reflexión. Pero no es un algoritmo de ruta más corto. El algoritmo de Dijkstra en particular es altamente sofisticado. Una vez que lo entiendes, es cegadoramente obvio. Pero la mayoría de las cosas son así.
Probablemente podría derivar algún tipo de algoritmo de ruta más corta después de probar algunas cosas y darle tiempo a la idea. Pero no se decepcione si eso lleva horas, o incluso unos días. Esto está completamente bien y es normal.
(Advertencia: bueno, deberías ser capaz de aplicar la fuerza bruta al problema en unas pocas horas como máximo, pero esto no daría un algoritmo de trabajo incluso en gráficos bastante pequeños).
fuente
Definitivamente poco realista. Las personas no solo "inventan" algoritmos en unas pocas horas. Se necesita mucho esfuerzo y trabajo. Para citar este blog:
y la versión de Bentley también fue problemática cuando se implementó para conjuntos grandes.
Además, un buen programador sabe qué herramientas están a su disposición y cuándo usarlas. No obtienes puntos extra por originalidad o por hacer las cosas de manera diferente: quieres que funcione y funcione bien.
fuente
Es muy poco probable que pueda encontrar una solución mejor que las que puede elegir.
Salir con un algoritmo mejor que uno considerado "el mejor" (en su caso, el más corto) no es algo que todos puedan hacer. Probablemente ni siquiera sea posible.
Un buen programador debería ser capaz de comprender la lógica detrás del algoritmo y por qué es mejor o peor (o simplemente inadecuado para ese problema en particular) que otros algoritmos que intentan resolver el mismo problema.
(s) También debería poder saber si realmente es la mejor manera de resolver ese problema en particular.
De todos modos, si quieres practicar, aún puedes intentar escribir tu implementación personal de un algoritmo, tratando de resolver un problema usando tu mente. Puede que no sea el mejor, pero es una buena práctica para resolver problemas.
fuente
Esto me recuerda algo que leí sobre la diferencia entre "ingeniería de software" (lo que yo llamaría programación) y las otras disciplinas de ingeniería. Ahora que lo pienso, creo que fue el libro original de Design Patterns. Estoy seguro de que alguien aquí puede citarlo en la parte superior de su cabeza.
De todos modos, el punto (aunque no exactamente orientado al diseño de algoritmos) fue que las disciplinas de ingeniería están codificadas; No es probable que los ingenieros civiles pasen tiempo intentando reinventar la viga en I, pero los programadores lo hacen todo el tiempo. El problema (y me doy cuenta de que simplemente estoy haciendo eco de los sentimientos de muchos) es que este comportamiento es derrochador y propenso a errores, y sirve al ego más que la solución.
La informática me llevó a la programación, y me encantan los dos. Sin embargo, soy mucho mejor programador que informático. Nunca te acusaría de ser incompetente porque no podrías reinventar el algoritmo de Dijkstra en una tarde. Cuestionaría tu competencia como programador si no pudieras reconocer un problema que podría resolverse mediante un algoritmo de gráfico de ruta más corta.
Dicho esto, creo que pensar en algoritmos e intentar diseñar e implementar nuevos es (potencialmente) divertido y (casi) siempre instructivo. Solo trato de separar limpiamente mi tiempo CS de mi tiempo de programación. Para los programadores, nuestro tiempo (especialmente pagado) se gasta mejor en resolver problemas prácticos en lugar de los abstractos. Además, el tiempo CS casi siempre me aplasta la confianza.
fuente
No notarás las mismas cosas que todos los demás. Creo que es solo un hecho de la vida con el que tenemos que vivir. Gran parte se reduce a su aprendizaje pasivo y los modelos mentales que ha desarrollado como resultado de ellos.
Conozco a algunos programadores muy inteligentes y competentes a quienes se les tuvo que enseñar la ley de DeMorgan en la escuela antes de que pudieran hacerlo de manera consistente. Por casualidad descubrí el algoritmo de Dijkstra por mi cuenta (y tengo que admitir que estoy un poco orgulloso de ello), pero me llevó mucho tiempo hasta que pude entender el tipo de burbuja.
Más famoso, Einstein, quien crees que sería un experto en teoría de nudos, no pudo atar sus propios cordones de los zapatos hasta que tenía alrededor de diez años.
Es probable que haya reinventado, sin saberlo, muchas cosas que muchos otros nunca habrían descubierto si no hubiera sido por la enseñanza explícita.
fuente
Ruego diferir por lo que dicen la mayoría de las respuestas. Si bien no esperaría que un programador de cualquier nivel pudiera aparecer solo en el algoritmo de Dijkstra, definitivamente esperaría que él encontrara alguna forma (eficiente o no) para resolver el problema.
Por ejemplo, dijiste como comentario adicional que eras capaz de crear burbujas por tu cuenta. Sé que es el algoritmo de clasificación más desagradable, pero encontraste una manera de resolver un problema, y eso es lo que espero que los programadores puedan: encontrar una forma de resolver problemas.
Por supuesto, investigar y encontrar soluciones hechas por otros también funciona, pero el extremo de ese punto es un tipo que no piensa en sí mismo y cuyos programas son un compendio de búsquedas de Google.
Creo que estoy sonando más duro de lo que realmente quiero, pero mi punto es: esperaría que un programador sea lo suficientemente creativo como para encontrar una solución a un problema, incluso si la solución es defectuosa o desordenada.
Entonces, volviendo a su caso, no creo que deba tener que idear el algoritmo de Dijkstra, pero si tiene la capacidad de escribir un algoritmo para probar varias posibilidades y encontrar el camino más corto sin terminar en un bucle infinito, entonces tienes mi aprobación.
(Por cierto, mi aprobación cuenta en el mismo orden de importancia que un cupón de lavado de autos gratis).
fuente
Sí, él / ella debería.
Puede ser el equivalente moral del tipo burbuja, pero creo que un buen programador debería ser capaz de encontrar al menos algo que funcione, por ineficiente que sea.
Huelga decir que si ese problema en particular surgiera, un buen programador primero buscaría si hay una biblioteca que lo haga por él, o qué algoritmos publicados lo hacen y son fáciles de implementar.
Por supuesto, muchas tareas de programación son mucho menos difíciles y no todos necesitan ser capaces de abordar problemas tan difíciles. Pero querrá tener a alguien con una mente así en su equipo, porque podría tener algunos problemas específicos de proyectos complicados en los que no puede confiar en un montón de investigaciones científicas previas.
fuente
No te preocupes
Como programador de Perl, mi objetivo es nunca reinventar la rueda. Ese es el trabajo de CPAN. Si hay un algoritmo o módulo simple y bien soportado, lo usamos. Si no hay un buen módulo, a continuación, nos inventamos la rueda. Esa es una de las mejores cosas de Perl.
Entonces, lo que digo es esto:
fuente
La teoría de grafos, y los algoritmos que se aplican a ella, parecen simples en la superficie, pero generalmente están lejos de serlo. Se podría pensar que la formación de gráficos no cruzados (planos) es simple, por ejemplo, a primera vista. El año pasado examiné ampliamente este problema (planaridad mediante la eliminación de los subgrafos de Kuratowski). Puedo decirle, por esa experiencia, que las personas que escriben estos algoritmos generalmente pasan la duración de sus estudios de doctorado haciéndolo, y a veces esa investigación se realiza en equipos. Y como investigadores , ese es su único enfoque de trabajo durante ese período de tiempo. No es sensato pensar que nosotros, los ingenieros en el terreno, podemos esperar lo mismo. Como alguien más aquí dijo correctamente, es cegadoramente obvio una vez que la solución está frente a usted. ¡Ese siempre parece ser el caso!
fuente
Diría que si eres capaz de inventar un algoritmo para un problema conocido como Shortest Path por tu cuenta, estás siendo un mal programador.
Significaría que está ignorando toda una historia sobre el problema de la ruta más corta , pasando de un algoritmo O (| V | ^ 4) publicado en 1955 al algoritmo O (E + V log V) publicado en 1984 (que es el de Dijkstra algoritmo con árboles de Fibonacci). Es casi seguro que lo harás peor que los algoritmos ya ideados. Peor aún, hay una buena posibilidad de que su algoritmo tenga huecos o errores que lo hacen incorrecto. Además, seguramente pasará mucho más tiempo pensando en su algoritmo, implementándolo y probándolo que el tiempo que llevaría reutilizar un algoritmo existente.
Deje el diseño de algoritmos a los diseñadores de algoritmos. Los programadores son consumidores de sus resultados. Los programadores combinan algoritmos y los ponen a trabajar en tareas del mundo real. Un oficial de policía no necesita poder reinventar la ley para poder trabajar o ser un buen oficial.
Incluso le recomiendo que use implementaciones hechas por expertos en lugar de implementar los algoritmos usted mismo para cualquier algoritmo moderadamente complicado. Es más probable que sea correcto, lo más probable es que lo hayan hecho más rápido de lo que nunca lo hará y le ahorrará mucho tiempo. Esto es particularmente cierto para los algoritmos criptográficos, porque obtiene la demanda adicional de seguridad, que generalmente solo los expertos pueden proporcionarle.
fuente