¿Todos los problemas de programación son problemas de algoritmos? [cerrado]

13

Me gusta cómo "Introducción a los algoritmos" por Cormen et al. transmite conocimiento. Una razón es que todo tiene que ver con problemas de programación y el libro no está implementado en ningún lenguaje de programación en particular. Esta independencia del lenguaje proporciona un enfoque en las ideas en general.

Entonces mi pregunta es, como dice en el título. ¿Se puede resolver cualquier problema de programación solucionable pensando de esta manera algorítmica? No importa qué idioma, campo, etc. En caso afirmativo, dar argumentos, de lo contrario, dar argumentos!

No he implementado muchos programas complejos con GUI, AI, Gráficos, etc. ¿Pero estos tipos de problemas también son una cuestión de pensar en buenos algoritmos?

Wittgenstein
fuente
66
El problema más común para un programador, en mi humilde opinión, es: "oh, ¿A eso se refería? Ahora entiendo. No es lo que implementé, lo siento". ¿Es eso un problema de programación?
keppla
1
Esta pregunta es muy similar.
back2dos
Debe hacer un informe con el cliente, describir sus requisitos y, en función de eso, debe diseñar, probar, implementar, refactorizar, optimizar y mantener el software. Necesita entornos para probar, desarrollar, implementar, ejecutar y medir el software. En este sistema, un algoritmo individual es solo un detalle de implementación.
inf3rno
@Keppla (más uno) ope, es un problema de requisitos, la causa raíz de todos los problemas de software
Mawg dice que reinstale a Monica el

Respuestas:

29

Depende de cómo defina "Problema de programación".

En proyectos del mundo real, la respuesta es definitivamente un NO claro. La mayoría de los problemas ni siquiera son problemas técnicos, sino problemas de comunicación, requisitos que no están claros, etc.

Entonces tienes sujetos completos de clases de problemas que requieren casi ningún algoritmo. Por ejemplo, las GUI a menudo son fáciles de "programar", pero el problema real es tener un buen diseño (desde un punto de vista de uso, no solo la apariencia gráfica).

Sin embargo, hay algunos campos en los que los problemas tienden a ser mucho más algorítmicos por la naturaleza de ese campo. Por ejemplo, la IA es un tema principal, donde los algoritmos están en el núcleo. Los gráficos pueden ser intensivos en algoritmos, pero depende de lo que se quiere decir exactamente con "Programación de gráficos".

En general, si el problema que está resolviendo programáticamente es adecuado para una representación matemática, está entrando en el área algorítmica. Por supuesto, esto es solo un indicador aproximado, ya que puede crear modelos matemáticos para casi todo. Pero para la mayoría de las cosas, normalmente no considerarías hacerlo.

Ejemplo final: si el problema es crear una GUI que permita ingresar datos para objetos comerciales, no pensaría mucho en las formulaciones matemáticas. Sin embargo, si el problema es crear una GUI que cambie dinámicamente y reubique elementos en función de algún valor de importancia, es mucho más probable que termine con un modelo matemático y una implementación algorítmica.

Franco
fuente
2
Aparentemente, también depende de cómo se defina el "Algoritmo". Diría que muy pocos problemas requieren algoritmos novedosos, pero dado que un programa de computadora tiene solo dos partes: algoritmos y estructuras de datos, todos los problemas requieren algunos algoritmos, incluso si esos algoritmos son triviales. Un algoritmo no es un modelo matemático, es una secuencia de instrucciones.
philosodad
Eso es cierto en su sentido más estricto, pero yo, por mi parte, no lo acepto i++como nuestro nuevo señor supremo ... erm ... algoritmo.
Frank
Pero, ¿y si no supiéramos acerca de la suma? ¡Entonces la introducción de la adición sería una gran innovación en nuestros estudios de algoritmos! Y así sucesivamente hasta que encontremos algoritmos cada vez más complejos.
CMCDragonkai
8

¿Qué quieres decir con problema de programación?

De acuerdo con Wikipedia:

La programación informática (a menudo abreviada a programación o codificación) es el proceso de diseño, escritura, prueba, depuración y mantenimiento del código fuente de los programas informáticos.

lo que significa que la programación en general es inherentemente mayor que la traducción de algoritmos a través del código.

Para darle un ejemplo, un problema de programación que tengo ahora es que tengo que lidiar con un código fuente de espagueti heredado agregando pruebas unitarias y luego refactorizándolo . También implica agregar comentarios en los lugares correctos, normalizar el uso de mayúsculas en los nombres, etc. No tiene nada o poco que ver con algoritmos.

Del mismo modo, muchas tareas del desarrollador no están relacionadas con los algoritmos. Ejemplo: internacionalización. De la misma manera, muchas aplicaciones (CRUD, por ejemplo) no usan demasiado los algoritmos en su código fuente (sin hablar del código subyacente del marco).

Ahora, si asume que en "problema de programación", "programación" es sinónimo de traducción de algoritmos a través de código, entonces sí, lógicamente cualquier problema sería un problema de algoritmo: A × n = B × nsi A = B.

Arseni Mourzenko
fuente
Hay una diferencia entre una tarea y un problema . Su problema no es agregar pruebas unitarias o mantener el código heredado, es la solución al problema que reside dentro de la base del código, no el comportamiento del programa en sí mismo que el código representa mediante algoritmos.
zxcdw
Su tarea, como se describe, no altera el comportamiento del programa. Presumiblemente es un trabajo preparatorio para algunos otros cambios, que pueden o no involucrar algoritmos. No creo que a nadie se le pague solo por refactorizar el código de trabajo durante todo el día.
MarkJ
6

Creo que la respuesta es enfáticamente no . Los algoritmos son solo bloques de construcción en un conjunto de habilidades mucho más grande.

Obtuve mi título en CS, especializándome en IA

Allí, el problema fundamental, al menos como lo vi, era encontrar buenas representaciones para la información. Estas representaciones deberían tratar de ser buenas coincidencias para las estructuras de conocimiento que están en la cabeza de las personas, y deberían facilitar los tipos de manipulaciones y alteraciones que se realizan en ellas.

En términos de programación diaria, esto significa que el problema básico es identificar el lenguaje específico de dominio (DSL) adecuado para la situación en cuestión. Hay muchas formas de crear DSL. La programación ordinaria, en la que se definen clases, variables y métodos, de hecho es crear un DSL porque le permite decir cosas (mapear sus estructuras mentales al código) que no podría decir sin ellas.

Los algoritmos también son importantes, pero son solo una parte de la historia.

Mike Dunlavey
fuente
5

Supongo que podría decir que todos los programas de computadora son algoritmos, porque está prescribiendo una secuencia de instrucciones para lograr el resultado deseado. Sin embargo, algunos de los más difíciles problemas no están en comunicar un programa a una computadora, sino en comunicar un programa a humanos que probarán y modificarán el software.

En otras palabras, a las computadoras no les importa si su código es completamente incomprensible para los humanos. Lo ejecutarán bien de cualquier manera. El desafío es hacer que el código sea lo suficientemente claro como para que cualquier error se destaque como un pulgar dolorido.

Curiosamente, las cosas técnicas que aprendí en la universidad sobre algoritmos han sido eclipsadas por lo que aprendí por mi cuenta desde entonces. En este punto, si quisiera obtener un tercer título universitario para ayudarme en mi trabajo, sería en composición en inglés.

Karl Bielefeldt
fuente
2

La mayoría de los problemas de programación son en realidad problemas de administración del sistema.

Esa es una especie de respuesta frívola, pero he descubierto que esto es cierto con más frecuencia de lo que cabría esperar. No sé cuántas veces he encontrado fallas porque el DNS estaba mal configurado en la máquina de prueba, todavía se está ejecutando un proceso obsoleto que está acaparando la CPU / memoria / puertos, el programa se está ejecutando con la identificación de usuario incorrecta y, por lo tanto, tiene el error permisos, el disco se particionó incorrectamente y, por lo tanto, se agotó el espacio, se instaló una versión incorrecta del archivo de configuración, etc.

Conseguir los algoritmos correctos suele ser solo una pequeña parte del problema. El resto del problema es poner el programa a trabajar para resolver problemas reales en el mundo real.

Stuart Marks
fuente
"Conseguir los algoritmos correctos suele ser solo una pequeña parte del problema" Los problemas en kaggle.com NO encajan [TM] en esa descripción.
Gandalf
Estoy de acuerdo, solo los puse en la categoría de "plomería". Trabajar con los servicios de otros programadores, API y, a veces, marcos es simplemente conectar las cosas como alguien más pensó que deberían funcionar.
JeffO
2

Creo que sí, todos los problemas de programación se pueden resolver pensando de manera algorítmica. Después de todo, un algoritmo es solo un conjunto de instrucciones que le dice a la computadora qué hacer.

Tomando algunos de los ejemplos de arriba

Por ejemplo, las GUI a menudo son fáciles de "programar", pero el problema real es tener un buen diseño (desde un punto de vista de uso, no solo la apariencia gráfica).

En términos de programación e incluso diseño que conocerá patrones / reglas que conduzcan a diseños de GUI efectivos que sean fáciles de usar y eficientes. Estas reglas se reducen a un algoritmo que, si se sigue, debería ayudar a producir una GUI fácil de usar. De hecho, los pasos reales de colocar los controles en la GUI también se pueden reducir a un algoritmo

Para darle un ejemplo, un problema de programación que tengo ahora es que tengo que lidiar con un código fuente de espagueti heredado agregando pruebas unitarias y luego refactorizándolo. También implica agregar comentarios en los lugares correctos, normalizar el uso de mayúsculas en los nombres, etc. No tiene nada o poco que ver con algoritmos.

Pero la manera en que se acerca a agregar pruebas unitarias puede describirse mediante un algoritmo como

  1. Identificar nueva prueba de unidad
  2. Prueba de unidad de escritura
  3. Aplicar el algoritmo de normalización de capitalización
  4. Aplicar algoritmo de comentarios

Ejemplo: internacionalización Este es un ejemplo perfecto de una solución de algoritmo. Como es más simple, busca una palabra conocida en un diccionario y la reemplaza por una forma de idioma diferente. (Por supuesto, la vida real involucra oraciones y contexto, y el algoritmo puede involucrar pasos para verificar con hablantes nativos, pero lo básico es cierto)

El problema con la mayoría de las respuestas de Sí es que las personas están pensando en algoritmos en términos de QuickSort, Bubble sort en lugar de un conjunto de instrucciones que reduce una descripción vaga y detallada de un problema a un conjunto de lógica / reglas claramente definidas.

armitage
fuente