¿Los programadores diseñan algoritmos o simplemente los toman de Internet?

Sí, es lo que nos pagan por hacer.

Aquí está la cosa: no hay nada mágico en un algoritmo. Estrictamente definido [1], un algoritmo es:

Un proceso o conjunto de reglas a seguir en los cálculos u otras operaciones de resolución de problemas, especialmente por una computadora.

Un programa es simplemente la implementación de un algoritmo, a menudo haciendo referencia a otros algoritmos.

Ahora, hay un conjunto de algoritmos bien conocidos y profundamente probados para tareas comunes. Un programador sería tonto si perdiera el tiempo reinventando una rueda probablemente inferior. Un ingeniero de software sería tonto si se comprometiera a mantener un algoritmo personalizado si hay una biblioteca que alguien más mantendrá para usted.

Las tareas más específicas, como el procesamiento de una llamada a la API, requieren un comportamiento específico, por lo que esos algoritmos deberán crearse desde cero.

Notas al pie

[1] definir algoritmo – Búsqueda de Google

Ellos si. Ambos, dependiendo de la situación.

Vale la pena no reinventar la rueda cuando se trata de algoritmos bien conocidos y descritos. Pero a veces no encuentras algoritmos implementados de una manera que realmente puedas reutilizar o necesites algo muy específico. O te gusta inventar nuevas formas de hacer las cosas. Entonces necesita diseñar e implementar su propia (variación) de un algoritmo.

Si compara un algoritmo con una receta (también una serie de pasos para alcanzar un objetivo determinado), lo cual a menudo hago, su pregunta sería equivalente a “¿Los cocineros diseñan recetas o simplemente las toman de los libros de cocina?” Seguro que la respuesta también es totalmente comparable. Los cocineros aficionados a menudo solo siguen recetas conocidas, mientras que los mejores chefs a menudo son conocidos específicamente por sus nuevos platos o métodos creativos, a la vez que tienen un conocimiento muy extenso de recetas básicas y la historia de la cocina en general.

A menudo es instructivo resolver las cosas por uno mismo. Esto le da a uno una mejor comprensión de lo que está sucediendo. Sin embargo, se ha invertido un considerable esfuerzo e ingenio en el desarrollo de numerosos algoritmos útiles y, por lo general, es mejor utilizarlos cuando se puede.

Sin embargo, tenga en cuenta que los algoritmos más utilizados son necesariamente de uso general. Dependiendo de los detalles del caso, a veces uno puede mejorarlos. Por ejemplo, si bien es poco probable que encuentre una mejora general en un algoritmo de clasificación conocido, cuando sabe que sus datos tienen características especiales, a menudo es posible ajustar los algoritmos existentes o determinar la mejor manera de sintetizar su uso para logre un resultado superior para su necesidad especial.

Según tengo entendido, no, generalmente los programadores no son los que diseñan deliberadamente nuevos algoritmos. Por otra parte, es un poco un área gris dependiendo de cómo se defina un “programador”.

Para mí, los informáticos y programadores son a menudo (nota: NO SIEMPRE) profesiones diferentes; personas que miran cosas similares desde diferentes perspectivas. Los informáticos han recibido educación formal sobre todo lo relacionado con las computadoras, incluido el funcionamiento de los algoritmos existentes y entienden cómo funciona la programación en teoría. Estas son las personas que se centran en abordar los problemas con los algoritmos existentes para crear nuevos y mejores.

Los programadores, por otro lado, pueden no tener una educación formal de ningún tipo. Han aprendido programación a través de prueba y error, tutoriales y haciendo sus propias observaciones y ocasionalmente observando la teoría detrás de las cosas. Se centran principalmente en usar algoritmos existentes para resolver los problemas que enfrentan en su trabajo.

PERO. En el mundo de hoy, no es tan simple como las personas pueden encajar perfectamente en ambas categorías. También recomendaría tomar esto con un grano de sal, ya que aún no he recibido educación formal en informática (aunque lentamente me dirijo hacia esa dirección).

Los algoritmos flotaban en el éter, y cuando se creó Internet, de alguna manera se solidificaron allí, donde se pueden encontrar.

Eso responde tu pregunta?

En serio, hubo algunos buenos programadores que diseñaron y codificaron, y refinaron algoritmos comunes que usamos a diario.

Claro, raramente inventamos un nuevo algoritmo de clasificación, ni siquiera los “tomamos de Internet”, solo usamos los implementados en el lenguaje que usamos, quizás con alguna opción adaptada al tipo de datos que tenemos que clasificar. Lo mismo para tablas hash, listas, árboles, montones, etc. Un buen lenguaje tiene una biblioteca estándar que implementa todos los algoritmos que usamos diariamente.

Ahora, si tengo que implementar un buen algoritmo para encontrar una cadena en un texto, probablemente buscaría el algoritmo Boyer – Moore o Knuth – Morris – Pratt. Estos son hechos por programadores, y no tiene mucho sentido reinventar la rueda, probablemente de una manera menos eficiente.

Pero a veces encontramos nuevos desafíos y tenemos que encontrar nuevos algoritmos. P.ej. La estructura / algoritmo de datos de cuerda para manejar los cambios en cadenas largas de manera eficiente. Alguien descubrió que mover caracteres en cada inserción era ineficiente, y encontró una manera de hacerlo rápido, con algunas compensaciones, por supuesto.

Cuando hice un analizador Markdown simplificado para generar HTML a partir de él, de alguna manera creé un algoritmo por mi cuenta. No es tan conciso / elegante como los que mencioné, pero funcionó.

En resumen, se trata de programadores que crearon algoritmos, y aunque tendemos a reutilizar los buenos, a veces tenemos que hacer los nuestros.

A2A: Ambos y ninguno.

Constantemente encuentro problemas para los cuales tengo que crear un algoritmo para resolverlos. (A veces descubro más tarde que alguien más ha creado el mismo algoritmo para el mismo problema. Realmente no me importa quién lo implementó primero, pero a veces fui yo mismo. Uno de esos problemas para el que recientemente creé un algoritmo (del cual yo estoy bastante orgulloso) es cómo barajar de manera válida y eficiente solo un subconjunto arbitrario de las piezas móviles de un cubo de Rubik simulado por computadora. Por ejemplo, la capa superior y otra esquina. Estoy bastante seguro de que nadie más ha resuelto esa. )

OTOH, hay muchos problemas no triviales bien conocidos para los cuales se sabe que ya se ha desarrollado un algoritmo. Sin embargo, en tales casos, lo que normalmente se usaría no es el algoritmo en sí, sino una implementación del mismo en el lenguaje de programación de elección. Los más comunes pueden incluso estar en la biblioteca de subrutinas disponibles en el entorno de desarrollo del programa, en cuyo caso no se necesita descargar.

En un sentido más amplio, cualquier programa de computadora que resuelva un problema no trivial podría considerarse como la implementación de un algoritmo para hacerlo. Entonces, en ese sentido, los programadores están creando nuevos algoritmos todo el tiempo.

Muy pocos programadores diseñarán un “nuevo algoritmo” y solo un pequeño porcentaje modificará significativamente un algoritmo existente y conocido de una manera más que superficial.

Incluso los diseñadores de idiomas están APROVECHANDO MÁS sus métodos de los libros, los cursos que han tomado y los documentos que han leído.

Ocasionalmente reinventamos la rueda diseñando algún ‘algoritmo’ que es nuevo de usar (porque no lo hemos estudiado) pero casi siempre es solo una repetición, generalmente inferior, a una solución bien conocida.

En los “buenos tiempos”, eso era con frecuencia más fácil que buscarlo, pero hoy una búsqueda en Google de 10 minutos encontrará casi cualquier cosa, y muy a menudo con el código fuente completo en el mismo idioma que estamos usando.

Claramente depende.

NO hay razón para reinventar la rueda.

  • ¿Hay una biblioteca ligera que hace el trabajo? Úsalo.
  • ¿O puede adaptar una solución comprobada que ha encontrado Y entendido? Ve a por ello
  • ¿Necesita un algoritmo específico que no puede encontrar una solución o no comprende los que encuentra? Yay, ahora comienza la gran parte de tu trabajo: hacerlo todo tú mismo

Si bien me encanta hacer lo último, simplemente no tiene sentido perder mi tiempo y el dinero de mis empleadores rehaciendo los problemas resueltos. Excepto para el aprendizaje, refactorización o propósitos similares, por supuesto.

Algunos algoritmos son clásicos, y aquí estoy hablando de Quick-sort o completar un cierre transitivo de una matriz. Aquellos para los que usaría una referencia. Pero no vale la pena mirar las cosas básicas del día a día. La respuesta es bastante obvia y, en general, no es necesario extraer el último bit de eficiencia del código. También hay un término medio. Por ejemplo, podría estar codificando un “controlador de bucle PID” y sé que “reset-windup” es algo que quiero evitar, por lo que podría investigar un poco y encontrar todas las diversas formas en que puedo mitigarlo. Una referencia podría decir “limitar el término integral para que la salida no sea superior a su máximo”. No lo consideraría como un algoritmo: todo el bucle PID es un algoritmo; esto es solo una pequeña parte de ella.

Tal vez una forma de obtener el sabor es mirar “Back To The Future” y escuchar las instrucciones de Marty para la banda. No entrega la música escrita de Johnnie B. Goode para que todos la toquen. Todo lo que dice es “es un riff de blues en D. Mírame por los cambios”. Son músicos lo suficientemente buenos que eso es todo lo que necesitan para mantenerse al día.

Del mismo modo para programadores. Además de algunos clásicos intrincados, todo lo que necesitas es una pista aquí o allá.

Los programadores suelen diseñar soluciones a problemas específicos. Una buena solución es la que da la respuesta correcta, se puede razonar sobre (tiempos de ejecución mejores y promedio, etc.) y se aplica a numerosos problemas similares (por ejemplo, ordena números y cadenas, funciona para cualquier gráfico de nodos y bordes).

En la década de 1950, cada buena solución era un nuevo algoritmo (clasificación, hash, recorrido de gráficos, búsqueda binaria, etc.) En 1990, la mayoría de las buenas soluciones solo reinventaban la rueda.

Un programador bueno y experimentado hoy habrá diseñado miles de soluciones a varios problemas. Tal vez cien habrán calificado como algoritmos. Tal vez dos serán realmente originales.

Raramente escribo algoritmos y estructuras de datos clásicos, hay bibliotecas bien escritas para eso. La mayor parte de mi tiempo lo paso escribiendo programas que resuelven un problema comercial. Los algoritmos clásicos son una parte tan pequeña del problema y en el mundo de la programación empresarial, la diferencia entre un árbol rojo / negro y un árbol B + no es tan importante.

El 90% de la programación se trata de copiar y pegar, sin embargo, es más fácil copiar y pegar su propio código (o código que utilizó antes) que ya entiende y sabe que funciona, en lugar de copiar cosas de Internet que necesita probar y probar.

Pero normalmente al ingresar a un nuevo campo o plataforma (como hice recientemente con Android) hay muchas copias de Internet. Para cuando pueda navegar por la plataforma con facilidad, habrá desarrollado sus propios algoritmos conocidos y probados.

ps No distingo aquí entre código y algoritmos, ya que no creo que el interlocutor sepa la diferencia.

Hay programadores y programadores. No puede comparar a los desarrolladores front-end con bioinformáticos o diseñadores de compiladores. Entonces, una vez que elija un grupo más refinado, la respuesta será probablemente obvia.

Bueno, en casos generales, programar cualquier cosa requiere un cierto nivel de copiado o ‘pegarlo de la red’, ya que reinventar la rueda cada vez es una pérdida de tiempo.

Pero cada uno de los algoritmos debe ponerse en contexto y rediseñarse para adaptarse a la necesidad particular.

Diseñar su propio algoritmo desde cero es generalmente más divertido, pero más difícil de justificar ante su jefe porque lleva más tiempo. Cuando trabajaba, mi jefe siempre quiso que agotara mi oferta de términos de búsqueda de Google antes de escribir algo original.

LOL, sí, y los algoritmos originales provienen de extraterrestres. De esto se trata realmente el Área 51, donde los ET nos dan algoritmos.

He tenido compañeros de trabajo que me han preguntado “¿de dónde copiaste esto?”

Los buenos programadores plagian, no permiten que el trabajo de nadie más evada sus ojos, tanto como sea legalmente posible. Pero también consideran sus propias ideas en pie de igualdad con las de los demás.