Algoritmo Vs Diseño [duplicado]

12

Esta pregunta está, quizás, relacionada principalmente con desarrolladores web que, como yo, codifican aplicaciones empresariales y usan lenguajes de alto nivel como Java, C # principalmente.

Debido a la naturaleza de las aplicaciones web de la empresa, que esencialmente realizan las operaciones de CRUD , y como dependemos en gran medida de las bibliotecas que proporciona el lenguaje, ¿cuál es la importancia de los algoritmos de aprendizaje?

Sé que la web está llena de artículos que indican profundamente que "el código es un algoritmo", pero ¿cuándo fue la última vez que alguien escribió el algoritmo quicksort en una aplicación de este tipo?

Veo muchos más beneficios en el aprendizaje de patrones de diseño y anti-patrones, que se utilizan mucho.

    
pregunta sij 23.09.2011 - 15:13

8 respuestas

18
  

Veo muchos más beneficios en el aprendizaje de patrones de diseño y anti-patrones,   que se utilizan mucho.

Desde su punto de vista, esto es ciertamente cierto y muchas aplicaciones no son realmente pesadas en algoritmos. Pero una gran cantidad de aplicaciones requieren un buen conocimiento sobre algoritmos y estructuras de datos, por ejemplo, juegos o aplicaciones logísticas. Esas aplicaciones a menudo requieren su propio algoritmo para encontrar una ruta más corta o llenar una mochila, no puedes usar una genérica.

  

Sé que la web está llena de artículos que indican profundamente que "el código   es un algoritmo ", pero ¿cuándo fue la última vez que alguien escribió quicksort   algoritmo en tal aplicación?

Ese no es el punto. La mayoría de la gente no va a volver a implementar quicksort de nuevo. Pero quicksort demuestra algunos de los conceptos más fundamentales del diseño de algoritmos. Si entiende Quicksort, puede aplicar este tipo de conocimiento a otros problemas. Como se indicó anteriormente, no todos los algoritmos se pueden usar de forma genérica. En el mundo real, a menudo tiene que crear algoritmos personalizados para sus problemas, que se crean con las mismas técnicas que, por ejemplo, las de uso rápido.

Y esto solo puede hacerse con un conocimiento fundamental sobre esas técnicas de algoritmo y estructuras de datos.

El día en que te topes con un problema de este tipo o con un cuello de botella en el rendimiento en alguna rutina, podrás resolverlo. Y tarde o temprano habrá uno. He visto desarrolladores de CRUD que luego simplemente dijeron "No es posible", cuando, de hecho, fue bastante fácil de resolver.

    
respondido por el Falcon 23.09.2011 - 15:26
6

Cuando usas el algoritmo de otra persona, aún necesitas entender las ventajas y desventajas. Por ejemplo, en Java, El método sort() provisto por la clase de Colecciones usa un mergesort modificado que garantiza el rendimiento de n log (n). Sin embargo, también indica que vuelca la colección en una matriz, la ordena y se repite en la lista. Este uso de una matriz requiere más consumo de memoria.

La pregunta es: ¿Es esto lo suficientemente bueno para tus necesidades? Si no entiendes los algoritmos, la complejidad del tiempo y la complejidad del espacio, realmente no puedes responder eso. No necesita saber tanto sobre las matemáticas y la teoría subyacentes como alguien que desarrolla nuevos algoritmos, pero sí necesita poder comparar múltiples algoritmos y determinar cuál le permite cumplir mejor con los requisitos del sistema. p>

Tenga en cuenta que exactamente lo mismo se aplica a las estructuras de datos. Comprender las características de sus datos y la inserción y recuperación de la estructura de datos le permitirá elegir la estructura más adecuada para sus necesidades.

Ahora, todo esto sucede en un nivel inferior a los patrones de diseño. Los patrones de diseño no dicen nada sobre qué estructura de datos o algoritmo necesita, sino que necesita tener algún tipo de relación entre los módulos de su aplicación. Cuando se habla de diseño, podría decir "necesitamos clasificar los datos", o tal vez incluso "necesitamos proporcionar múltiples algoritmos de clasificación" (¿Patrón de estrategia, tal vez?), Pero no estaría hablando de una clasificación por fusión o una clasificación rápida. o cualquier algoritmo de clasificación en particular.

    
respondido por el Thomas Owens 23.09.2011 - 15:28
4

Ser capaz de escribir una implementación de ordenación rápida correcta es un nivel de conocimiento. Estoy de acuerdo en que rara vez se necesita en la vida de un desarrollador web promedio (sin embargo, cuando lo necesitas, lo necesitas mucho ).

Comprender cómo funciona la ordenación rápida (y poder elegir entre este y otros algoritmos de clasificación para una tarea específica en cuestión) es otra. Creo que esto es más necesario, y un desarrollador decente debería tener este nivel de conocimiento general sobre algoritmos fundamentales. Sin esto, ni siquiera se da cuenta cuando se encuentra en una situación que necesita un algoritmo específico, y esto puede tener malas consecuencias.

Su pregunta es un poco análoga a la pregunta de si es útil que un conductor de taxi se inscriba en un curso que practique cómo conducir en una carretera nevada / helada, ya que el 99.9% de los casos este conocimiento no proporciona ningún beneficio en las carreteras bien mantenidas de una gran ciudad. De hecho, no; sin embargo, cuando se necesita ese 0,1%, puede marcar la diferencia entre un shock leve y una lesión grave. ¡Y nunca puede predecir de antemano cuándo lo va a necesitar!

Al igual que con un conductor de taxi (o con cualquier tipo de artesano), también somos profesionales que deben conocer nuestras herramientas del oficio. El desarrollo de software tiene que ver con la resolución de problemas, y el no aprender algoritmos reduce seriamente nuestra capacidad de resolución de problemas, por lo tanto nuestro valor de mercado.

    
respondido por el Péter Török 23.09.2011 - 15:25
3

Si solo aspiras a escribir la misma aplicación web para el resto de tu carrera, y nunca deseas mejorar y expandir tu conjunto de habilidades, entonces su importancia es limitada. Si quieres seguir aprendiendo, mejorando y expandiendo tu mente, conocimiento y habilidades ... esa es otra historia. Pero no se detiene ahí, porque estás equivocado en una cosa.

Cuando preguntas,

  

... ¿cuándo fue la última vez que alguien escribió un algoritmo de ordenamiento rápido en una aplicación de este tipo?

Una vez que domines, como sucede cuando aprendes los patrones de diseño ... comienzas a verlos en todas partes, incluso en lugares que antes eran 'solo código'.

Pero incluso entonces ... te las arreglas muy bien sin ellos. ¿Por qué son importantes saber? Son importantes porque llegará un momento en que un cliente realiza una solicitud de cambio en particular, o la compañía produce una nueva línea de software, o usted obtiene un nuevo trabajo porque tiene aumentos constantes y un niño recién salido de la escuela será multa con el salario base, o querrá expandir sus horizontes y trabajar en un campo diferente ...

En ese día, necesitarás este conocimiento. En ese día, ese joven cachorro recién llegado de la introducción a los algoritmos no va a dar un paso adelante y decir "muévase sobre Gramps, deje que los desarrolladores reales funcionen", y tenga razón.

    
respondido por el Steven Evers 23.09.2011 - 15:42
1

En la escuela primaria solía quejarme de aprender matemáticas, ya que las calculadoras electrónicas pueden hacer todo el trabajo, pensé.

Lo que quiero decir: como desarrollador, siempre debes tratar de entender cómo funcionan las cosas, en lugar de solo la excepción de que funcionan, aunque puedes confiar en que otros desarrolladores trabajen en el 99.9% de todos los casos.

    
respondido por el vikingosegundo 23.09.2011 - 15:19
1
  

pero ¿cuándo fue la última vez que alguien escribió un algoritmo de ordenamiento rápido en una aplicación así?

Es como cuando fue la última vez que alguien redefinió 2 * 2 = 4. Los algoritmos para tales problemas ya se han definido y redefinido a la solución óptima. Por lo tanto, no necesitamos escribir uno para nosotros mismos. Este tipo de algoritmo se aplica más a un desarrollador de sistemas que a un desarrollador web.

code is algorithm

Definitivamente, todo lo que escribes para lograr una tarea es un algoritmo en sí mismo. Si está logrando buenos resultados con su código, entonces está obteniendo buenos resultados. En caso de que su aplicación realice una función como CRUD con lentitud, deberá volver a pensar y decidir cómo aumentar el rendimiento. Aquí es donde el algoritmo es útil. No significa que necesite R & D en Algoritmos, sino que piense de manera racional sobre cómo puede lograr el rendimiento óptimo para su función. Como decidir qué clasificación se debe hacer antes y después. Las cosas así están más relacionadas con un desarrollador web y de aplicaciones que con quicksort y binarytree.

    
respondido por el Pankaj Upadhyay 23.09.2011 - 15:30
1

Tienes que aprender a comprender e implementar un algoritmo, quicksort es solo un ejemplo; normalmente, nunca lo escribirás tú mismo.

La clasificación es un buen ejemplo para saber que existen muchas soluciones diferentes para un problema, cada una con ventajas y desventajas según los datos en los que se trabaja.

Es digno de tener algunos conocimientos fundamentales de algoritmos y complejidad para evitar soluciones como el conteo de ocurrencias solo para verificar la existencia (solo un ejemplo simplificado).

    
respondido por el Arne Burmeister 23.09.2011 - 15:36
1

¡Sospecho que has estado hablando con diseñadores de front-end! Como diseñador de front-end, y siguiendo el comentario de Falcon, permítame agregar "no es posible" no es algo que deseamos escuchar. En general, la solución sin patrón puede ser demasiado costosa, pero exige a los programadores, para ser competitivos, una respuesta a la pregunta: "¿Es esto posible y, en caso afirmativo, cuánto?"

    
respondido por el xtian 23.09.2011 - 17:51

Lea otras preguntas en las etiquetas