División de tecnologías para la integración ciber-humana Departamento de ciencias computacionales Tarea 1 Paradigmas de programación, proceso de abstracción Meza Diaz Víctor Uriel POO 2023A - D04 - L & MI - 11 A 1 PM Mariscal Lugo Luis Felipe EVOLUCION EN LOS PARADIGMAS PARA CREAR SOWFWARE La programación es un campo en constante evolución, y a lo largo del tiempo, se han desarrollado varios paradigmas de programación con el objetivo de mejorar la eficiencia y la facilidad de uso de los programas. En este ensayo se explorará la evolución de algunos de los principales paradigmas de programación a lo largo de la historia. El primer paradigma de programación que surgió fue el de programación estructurada. Este enfoque se enfocó en la organización lógica del código y la eliminación del uso de salto incondicional. Esto permitió a los desarrolladores escribir programas más fáciles de leer y entender, y también ayudó a reducir los errores de programación. El siguiente paso en la evolución de los paradigmas de programación fue el de programación orientada a objetos (POO). Este enfoque se enfocó en la encapsulación de datos y funciones dentro de una entidad llamada "objeto". Esto permitió a los desarrolladores crear programas más fáciles de mantener y reutilizar, ya que los objetos podían ser reutilizados en otros programas. En los últimos años, el paradigma funcional ha ganado popularidad. Este enfoque se enfoca en la abstracción de los procesos de un programa en funciones matemáticas. Esto permite a los desarrolladores crear programas más fáciles de probar y mantener, ya que las funciones son puras y no tienen efectos secundarios. Además, el uso de programación funcional permite el manejo de operaciones concurrentes de forma más eficiente. Además de los paradigmas mencionados anteriormente, existen otros enfoques de programación que también han ganado popularidad a lo largo del tiempo. Uno de ellos es el paradigma de programación lógica, en el cual se utilizan técnicas de lógica matemática para representar y resolver problemas. Este paradigma se utiliza principalmente en aplicaciones de inteligencia artificial y sistemas expertos. Otro paradigma es la programación basada en eventos, en la cual el programa reacciona a eventos externos en lugar de seguir un flujo de ejecución predefinido. Este enfoque se utiliza principalmente en aplicaciones de tiempo real y sistemas distribuidos. Además, en los últimos años ha habido un aumento en el uso de la programación reactiva, que se enfoca en la construcción de sistemas escalables y altamente confiables mediante la programación de sistemas que son capaces de reaccionar automáticamente a los cambios en el estado del sistema. Este enfoque se utiliza principalmente en aplicaciones web y móviles, donde es importante mantener una interfaz de usuario fluida y reaccionar rápidamente a los cambios en el estado de la aplicación. En resumen, la evolución de los paradigmas de programación ha sido un proceso continuo que ha llevado a la creación de enfoques más eficientes y fáciles de usar para la construcción de programas. Cada paradigma tiene sus propias ventajas y desventajas, y muchos desarrolladores utilizan una combinación de varios paradigmas para crear programas robustos y eficientes. A medida que la tecnología continúa evolucionando, es probable que surjan nuevos paradigmas de programación que ofrezcan soluciones a problemas aún no resueltos. Además de los paradigmas mencionados anteriormente, hay otro enfoque de programación que ha ganado popularidad en los últimos años, el paradigma de programación reactiva. Este enfoque se enfoca en la construcción de sistemas escalables y altamente confiables mediante la programación de sistemas que son capaces de reaccionar automáticamente a los cambios en el estado del sistema. Este enfoque se basa en la idea de que los sistemas deben ser capaces de manejar cambios en el estado de forma eficiente y escalable, y se utiliza principalmente en aplicaciones web y móviles, donde es importante mantener una interfaz de usuario fluida y reaccionar rápidamente a los cambios en el estado de la aplicación. Otro enfoque que ha ganado popularidad en los últimos años es el paradigma de programación orientada a microservicios. Este enfoque se basa en la idea de que los sistemas deben ser construidos como un conjunto de servicios independientes que se comunican entre sí mediante una interfaz estandarizada. Esto permite a los desarrolladores crear sistemas altamente escalables y fáciles de mantener, ya que cada servicio puede ser desarrollado, probado y desplegado de forma independiente. existe también el paradigma de programación funcional. Este enfoque se basa en la idea de que los programas deben ser construidos como un conjunto de funciones matemáticas puras, es decir, funciones que no tienen efectos secundarios y siempre devuelven el mismo resultado dado el mismo input. Este enfoque promueve la inmutabilidad de los datos y la composición de funciones, lo que permite construir programas más predecibles y fáciles de probar. Otro enfoque que ha ganado popularidad en los últimos años es el paradigma de programación declarativo. Este enfoque se enfoca en describir qué se quiere lograr en lugar de cómo se quiere hacerlo. Los lenguajes de programación declarativos, como SQL o XSLT, son utilizados para definir reglas y relaciones entre diferentes elementos, en lugar de dar instrucciones explícitas sobre cómo se deben manipular estos elementos. En conclusión, la evolución de los paradigmas de programación ha sido esencial para el desarrollo de software. A lo largo de la historia, se han desarrollado diferentes enfoques para abordar los problemas de programación, cada uno con sus propias ventajas y desventajas. Los paradigmas imperativos y estructurados, como el lenguaje de programación C, se enfocan en dar instrucciones detalladas sobre cómo se deben manipular los datos. Los paradigmas orientados a objetos, como Java o C++, se enfocan en la creación de objetos y la encapsulación de datos. El paradigma de programación funcional se basa en la idea de que los programas deben ser construidos como un conjunto de funciones matemáticas puras. El paradigma declarativo se enfoca en describir qué se quiere lograr en lugar de cómo se quiere hacerlo. Cada uno de estos paradigmas tiene sus propias ventajas y desventajas, y muchos desarrolladores utilizan una combinación de varios paradigmas para crear programas robustos y eficientes. Es importante que los desarrolladores estén familiarizados con los diferentes paradigmas de programación y sus características para poder elegir el que mejor se adapte a las necesidades del proyecto. A medida que la tecnología continúa evolucionando, es probable que surjan nuevos paradigmas de programación que ofrezcan soluciones a problemas aún no resueltos. Es importante tener en cuenta que la evolución de los paradigmas de programación no es un proceso estático, sino continuo y en constante cambio, y es necesario estar al tanto de las nuevas tendencias y herramientas para poder aprovecharlas al máximo. En resumen, la evolución de los paradigmas de programación ha sido fundamental para el desarrollo de software y es esencial para crear sistemas eficientes y escalables. LA ABSTRACCION EN LA PROGRAMACION La abstracción más que una palabra elegante de programación es un concepto que aplicamos en nuestra vida diaria. Especialmente útil y necesaria en la programación, aunque un poco complejo de entender al principio y aplicarlo adecuadamente. Si no sabes qué es y cómo se relaciona con la programación, puede que te interese esta publicación. Los humanos dependemos tanto de la abstracción que, virtualmente, nuestra vida cotidiana se basa en ella. Damos por hechas muchas cosas a nuestro alrededor, abstrayéndonos de su funcionamiento interno; simplemente conociendo qué hace, qué necesita para hacerlo pero no cómo lo hace. Piensa un poco y analiza con cuantos objetos interactúas diariamente de los cuales no tienes idea de cómo funcionan y la verdad, no tienes que saberlo. La mayoría de nuestras investigaciones científicas se basan en conclusiones de trabajos de otras personas, donde se da por hecho que algo funciona como dice que funciona, y trabajan sobre esas conclusiones sin tener que empezar todo desde cero. Esta es una buena manera de avanzar reusando el trabajo existente, abstrayéndonos de los detalles internos lo que nos permite funcionar en un nivel más alto. ¿Te has preguntado cómo funciona un televisor? Pues si lo pensamos un poco, le damos energía eléctrica, alguna señal y esperamos que nos muestre imágenes. Ahí estamos abstrayendo muchos detalles. ¿Sabes cómo funciona la pantalla del televisor? ¿Sabes cómo se representan los colores en la pantalla del televisor? No necesitas saber cómo funciona algo para usarlo El concepto de Caja Negra Este término se usa como analogía para hacer referencia a componentes o sistemas de los cuales no se conocen los detalles internos de su funcionamiento. Básicamente, llamamos caja negra a aquellas cosas que le hemos aplicado la abstracción, es decir, no queremos saber sus detalles internos, solamente como interactuar con ese algo. Para eso, debemos saber qué necesita para funcionar y cuál es el resultado que genera (entrada y salida). Así como en los ejemplos anteriores, vemos muchas cosas como “cajas negras”: un televisor, un auto, una máquina de helados, una calculadora, un restaurante, el cuerpo humano, y muchísimas cosas más. Este concepto es esencial para los programadores porque, basados en él, podemos reutilizar programas y códigos de otras personas simplemente conociendo su entrada y los resultados que produce. La abstracción como técnica para analizar problemas Imaginemos a un pintor de paredes que debe cotizar cuanto cobrar por pintar una casa. Este seguramente abstrae los detalles de una casa cuando está analizando lo que debe hacer. Al pintor no le interesa el estado del suelo, ni el estado del techo, o de las puertas. Al pintor solo le interesa el estado de las paredes. En su mente, el objeto que está analizando deja de ser una casa completa y se convierte en puras paredes y se enfoca en analizar eso solamente. Lo mismo ocurre con el plomero. A él no le interesa nada más que las tuberías, el material del cual están hechas, su ubicación, etc. Entonces deja de pensar en las cosas irrelevantes para su problema inmediato y se enfoca únicamente en ese problema específico. En estos casos, ellos saben bien en qué deben enfocarse. Ellos llevan años en su negocio y saben bien qué ignorar y qué no. Su experiencia juega un papel importante. En la programación, muchas veces no es sencillo saber que es relevante y que no lo es. La programación es multi-disciplinaria Como ya mencioné en otra publicación. La programación es, básicamente, resolver problemas. Los programadores aprenden a (o aspiran) resolver problemas de la manera más eficiente. Sin embargo, no pueden pretender saber todo acerca de todas las carreras que existen y todas las áreas de conocimiento. Para llevar con éxito un proyecto complejo, que cumpla con la necesidad del cliente y su negocio, es necesario aprender un poco de ese negocio; de esa disciplina. Si trabajas en un sistema de contabilidad, pues el programador debe entender un poco de contabilidad. Si trabajas en un sistema de ventas, entonces el programar debe entender un poco de logística e inventario. Nuestra suposición es que, en principio, no vamos a saber más que nuestro cliente de su negocio. Después de todo, es posible que ellos hayan estudiado una carrera para eso, o tenga muchos años de experiencia en el área. Incluso si tú, como programador, también has tenido experiencia en esa área, puede que ese cliente maneje procesos particular de los cuales tú no conoces nada. Así que vamos a trabajar sobre esa suposición: Nuestro cliente sabe más de su negocio que nosotros. Para poder resolver un problema, primero debemos entenderlo. Si no lo entendemos, no vamos a hallar la solución. Si al área de conocimiento resulta totalmente ajena a nosotros (i.e. podemos no saber absolutamente nada del tema), aplicar la abstracción nos ayudara a entender mejor el problema, al enfocarnos únicamente en los detalles que son relevantes para ese problema o partes de ese problema. Un problema complejo puede ser dividido en varios problemas más simples. Estos, a su vez, pueden ser divididos en otros más pequeños, hasta que tengamos un conjunto de problemas relativamente triviales o cuya solución sea fácil de hallar. ¿Quieres una tienda online? Bien, ¿Cómo está compuesta la tienda? ¿Qué productos tienes? ¿Qué categorías de productos? ¿Qué descuentos ofreces?. Todas estas preguntas rompen un problema más grande como el de una tienda online, en problemas más pequeños y manejables. Estos problemas más pequeños los podría romper aún más, abstrayéndome de los otros problemas, momentáneamente, para enfocarme en una sola cosa a la vez. La abstracción como herramienta para el modelado El modelado en la programación es esencial para ayudar a resolver problemas, representando partes o componentes de ese problema. Lo que se trata de modelar o representar en el programa es el funcionamiento de estas partes. Siguiendo el ejemplo de la tienda online, un carrito de compras en un sitio web es una representación de un carrito de compras real, es decir, cumple una funciona similar al llevar los artículos que deseamos comprar. Sin embargo, no es un carro de compras real; no es físico; y realmente no estás llevando un carro de compras en tus manos. Es simplemente una representación o modelo. En este orden de ideas, podríamos decir que un modelo es la representación de un objeto real o un concepto abstracto (como una cuenta contable) del mundo real, perteneciente al dominio o área de conocimiento del cual queremos automatizar los procesos y que le hemos aplicado el proceso de abstracción, es decir, al modelar algo realmente estamos eliminando detalles que no son relevantes. Una auto de juguete es básicamente un modelo. Se ignoraron detalles del auto real para hacer ese juguete. Detalles como, por ejemplo, un motor funcional, o tanque de combustible, entre muchos otros. Entonces no podemos decir que ese juguete es auto real, y simplemente es una representación “abstracta” del auto. ¿Abstracta? “Gabo, no es abstracta porque el juguete tiene forma de el auto real”. Pues hay diferentes niveles de abstracción. Podemos decir que en el momento en que ignoramos detalles de un objeto, ya estamos creando una representación abstracta (sin algunos detalles) de ese objeto. El nivel de abstracción dependerá que tantos detalles removamos en nuestro modelo. Consideremos un traje y tratemos de aplicar distintos niveles de abstracción. Empezando, tenemos dos extremos: un extremo con el nivel mínimo de abstracción (ninguna abstracción) donde encontramos al objeto real con absolutamente todos los detalles. Mientras, en el otro extremo tenemos el nivel máximo de abstracción donde removemos todos los detalles y nos queda absolutamente nada, solo un vacío. (Si yo ofrezco un traje transparente y lo vendo, pues efectivamente, es un traje para quien lo quiera ver de esa forma). Dentro de estos dos extremos hay muchísimos niveles. Yo podría ignorar el color, ignorar el material, ignorar la forma, entre muchas otros detalles. Mi nivel de abstracción puede ser totalmente diferente al de alguien más. De hecho, es extremadamente común que dos personas hallen soluciones diferentes al mismo problemas porque, entre otras cosas, aplicaron un nivel diferente de abstracción y es aquí donde la buena comunicación juega un papel importante para que todos se puedan entender. ¿Qué sucede si omito demasiados detalles al resolver un problema? Si esto sucede, tu solución puede tener huecos y no funcionar para situaciones específicas. ¿Qué sucede si omito pocos detalles? Entonces tu solución puede resultar mucho más compleja de lo que debería ser, aumentando costos en tiempo, dinero, mantenimiento, etc. Encontrar el nivel de abstracción adecuado no es trivial. En mi opinión, es algo que viene teniendo una buena preparación y conocimientos sólidos como bases, y la experiencia de trabajar en diferentes proyectos con diferentes personas, evaluando sus puntos de vista y objetivamente evaluando cada uno de los enfoques. Bibliografía La Abstracción en la programación. (s/f). Esgabo.dev. Recuperado el 29 de enero de 2023, de https://esgabo.dev/blog/la-abstraccion-en-la-programacion/ Evolución de los paradigmas de la programación. (2013, agosto 13). Alexander. https://alexanderyasno.wordpress.com/evolucion-de-los-paradigmas-de-la-programacion/