JavaRush /Blog Java /Random-ES /Pausa para el café #131. El papel de Java en el desarroll...

Pausa para el café #131. El papel de Java en el desarrollo de aplicaciones web y móviles. Programación funcional: pros y contras

Publicado en el grupo Random-ES

El papel de Java en el desarrollo de aplicaciones web y móviles

Fuente: DZone Java es uno de los lenguajes de programación más utilizados. Se utiliza activamente en el desarrollo de aplicaciones corporativas, web y móviles. Java tiene aplicaciones en industrias tecnológicas líderes, desde ciencia de datos hasta AR/VR. Aunque el desarrollo empresarial en Java es el caso de uso más popular de este lenguaje, las aplicaciones web y móviles también se consideran una de las áreas donde se utiliza Java. Pausa para el café #131.  El papel de Java en el desarrollo de aplicaciones web y móviles.  Programación funcional - pros y contras - 1Echemos un vistazo a por qué el desarrollo de Java se ha vuelto tan popular en la web y en los dispositivos móviles durante las últimas dos décadas. Una de las principales razones para utilizar Java para web y dispositivos móviles es que es un lenguaje de programación de alto rendimiento. Garantiza que sus aplicaciones puedan ejecutarse rápidamente y sin errores de procesamiento. También hay otras razones:

1. Código abierto

Al ser un lenguaje de programación de código abierto, Java tiene una serie de ventajas. Primero, reduce el costo del proceso de desarrollo de aplicaciones. En segundo lugar, los desarrolladores cambian fácilmente el idioma y lo actualizan con frecuencia ya que es de código abierto. Además, Java tiene una sintaxis fácil de leer que facilita el desarrollo de aplicaciones para la web y dispositivos móviles. Finalmente, los desarrolladores pueden utilizar el código base del lenguaje existente y mejorarlo.

2. Multiplataforma

Otro beneficio de programar en Java es que es un lenguaje multiplataforma. Los desarrolladores pueden escribir código en Windows y ejecutarlo en macOS y Linux. Aquí se aplica el principio “escribe una vez, ejecuta en todas partes”. Esto facilita a los desarrolladores que trabajan en diferentes sistemas y simplifica el proceso de prueba en diferentes máquinas. Por ejemplo, los desarrolladores pueden probar si un programa se ejecutará correctamente en diferentes tamaños de pantalla y sistemas operativos.

3. Compatible con dispositivos móviles

Java es una tecnología popular para aplicaciones móviles. Los desarrolladores de aplicaciones de Android utilizan principalmente el lenguaje Java porque es fácil de implementar, tiene funciones de seguridad y capacidades multiplataforma. Android requiere un lenguaje potente para escalar una aplicación, pero Java ofrece capacidades de escala sorprendentes. También simplifica el proceso de prueba de aplicaciones de Android. Todo esto sugiere que es un lenguaje de programación confiable y dinámico para la creación de aplicaciones móviles.

4. Herramientas y bibliotecas

Una de las ventajas más importantes de Java es su compatibilidad con diversas herramientas. Marcos como Spring, Hibernate, Struts, Spark y otros simplifican enormemente el proceso de desarrollo. Todas estas herramientas ofrecen varias funciones para crear aplicaciones interactivas y dinámicas. Bibliotecas como Apache Commons, Java Standard Libraries, Maven, Jackson, etc. permiten a los desarrolladores agregar funcionalidades sin escribir código desde cero.

5. Comunidad activa

Hay más de 7,6 millones de desarrolladores Java en el mundo. Actualizan constantemente el lenguaje de programación y le agregan nuevas funciones. Dado que Java se actualiza cada 6 meses, los desarrolladores tienen la oportunidad de aprender rápidamente y crear mejores productos. También puede utilizar la comunidad Java para encontrar respuestas a varias preguntas.

El auge de Java en el desarrollo de aplicaciones web

Desde su creación en 1995 por parte de Sun Microsystems, el lenguaje Java se ha convertido en una de las prioridades en la industria de la programación. Hoy en día, empresas de todo el mundo utilizan este lenguaje de programación para crear aplicaciones web. Google, Netflix, Spotify y Pinterest son sólo algunas de las empresas que utilizan Java en su tecnología. Los expertos estiman que más del 60% de las empresas que trabajan en TI utilizan Java de una forma u otra. Además, sigue siendo un lenguaje de programación popular debido a su adopción en otras áreas del desarrollo web, a saber, computación en la nube, redes sociales, desarrollo empresarial, AR, VR y más. Es un lenguaje de programación excelente y potente para usar en empresas que ahora necesitan una arquitectura basada en la nube. Cuando se combina con JavaScript, Java le permite crear aplicaciones web de alto rendimiento que pueden ejecutarse en cualquier plataforma.

El auge de Java en los casos de uso modernos

Además del desarrollo web y el desarrollo móvil, Java ha dejado su huella en el mundo tecnológico moderno. Hoy en día, Java es un lenguaje de programación extremadamente útil para aplicaciones científicas. Ofrece un entorno seguro, rápido y portátil para la informática científica. MATLAB es una de las bibliotecas más populares para aplicaciones científicas basadas en Java.
  • Java también es útil en el desarrollo front-end y back-end de aplicaciones científicas. Puede utilizar Struts y Java Server Pages para el desarrollo front-end y Java Core para el desarrollo back-end de aplicaciones científicas.

  • Java también es útil para el análisis de datos. Permite a los desarrolladores crear soluciones de análisis de datos utilizando varias bibliotecas y herramientas. Hoy en día, Java ha encontrado aplicación en el segmento de Internet de las cosas. Es una tecnología clave en sistemas integrados como tarjetas inteligentes y sensores. Por ello, las empresas utilizan este lenguaje de programación en la industria domótica. Además, se utiliza activamente en el desarrollo de tecnologías de dispositivos de streaming y Smart TV.

  • La plataforma de big data Hadoop está escrita en Java. Al ser un lenguaje de código abierto y orientado a objetos, es la piedra angular de las aplicaciones de Big Data. Los lenguajes de programación como Scala pueden ejecutarse fácilmente en la máquina virtual Java y facilitar el análisis de big data.

  • Los juegos son una industria emergente y de rápido crecimiento en la que Java se utiliza ampliamente para diversas aplicaciones de juegos. Por ejemplo, ofrece soporte para jMonkeyEngine, el mayor motor de desarrollo de juegos 3D de código abierto. Además, Dalvik Virtual Machine (DVM) es compatible principalmente con Java y se utiliza para crear juegos interactivos para Android.

Programación funcional: pros y contras

Fuente: Dev.to A pesar de mi tradicional escepticismo hacia las tecnologías desconocidas, reconozco los beneficios de la programación funcional. A continuación se muestra una lista aproximada de las ventajas que describen este paradigma de programación. Pausa para el café #131.  El papel de Java en el desarrollo de aplicaciones web y móviles.  Programación funcional - pros y contras - 2

Simultaneidad segura

El enfoque funcional fomenta la concurrencia segura, es decir, la capacidad de ejecutar trabajos en subprocesos separados sin causar conflictos de subprocesos o colisiones de modificación. La razón es que, a diferencia del enfoque de objetos, no se comparte un objeto cuyo estado pueda cambiarse durante el procesamiento. Hay entradas y salidas, y la entrada no cambia gracias a ti. En Java, incluso si utiliza objetos "seguros para subprocesos", no puede garantizar que tendrán los mismos valores cuando se llame a su método. En el siguiente ejemplo, podemos ver que un bucle que procesa elementos uno a la vez se puede procesar fácilmente en paralelo utilizando una función lambda dentro de un hilo.
for( String item : items ) {
   process(item);
}
Y ahora se convierte en:
items.parallelStream().forEach( item -> process(item) );

E/S rápida

La programación funcional admite un enfoque diferente al de subprocesos múltiples. Esto significa que ya no tenemos subprocesos separados esperando respuestas de E/S, como llamadas a bases de datos. Es decir, maximizamos el uso de CPU y ancho de banda. Para aplicaciones de alto rendimiento esto es una clara ventaja. Esto se implementa con la idea de que una llamada a función puede devolver un Futuro, que no es el resultado real de la llamada, sino más bien una promesa de devolver el resultado en algún momento en el futuro. En algún momento en el futuro, se obtiene un valor de retorno que ejecuta la función. Esto significa que los subprocesos del procesador no esperan a que se completen las llamadas a la base de datos o REST y pueden hacer otra cosa.

Brevedad de expresión

Los desarrolladores de software quieren poder expresar ideas complejas con elegancia. La programación funcional le permite hacer esto de forma concisa. Por ejemplo, las construcciones comunes, como los bucles for, se pueden reemplazar por subprocesos, que abstraen las operaciones for comunes para las que se utilizan los bucles. No hay duda de que la incorporación de funciones y subprocesos de Lambda a Java ha ampliado la capacidad de expresar ideas que antes eran imposibles.

¿Por qué no volverse funcional?

Solo para reiterar lo anterior: la codificación funcional tiene muchos beneficios, por lo que este artículo no intenta generalizar todo en un solo caso y decir que definitivamente debes hacer programación funcional o viceversa. Esta decisión debe tomarse con una comprensión clara de los motivos de la transición y los posibles problemas.

Siempre es difícil entender intuitivamente.

Al escribir código, ¿intenta comunicarse con la computadora? Si la comunicación con una computadora es tan importante para usted, ¿por qué no escribir en código de máquina? Por supuesto, esto es muy difícil, por lo que se inventaron lenguajes informáticos para hacerlo más fácil. También permiten a los programadores crear expresiones que otros programadores puedan entender. A medida que el software se vuelve más grande y complejo, necesitamos estrategias para gestionar la complejidad. Esto lo logramos mediante abstracciones y ocultación de información. La clase que usas en Java para enviar correo electrónico es bastante compleja, pero la interfaz de esta clase es simple. Oculta la implementación detallada, revelándonos sólo el lado externo del control. Las características del lenguaje, como llaves y corchetes, nos indican estructuras como declaraciones condicionales y bucles. Solo que ahora movemos bucles, o más bien recursividad, y condiciones a funciones:
for( String item : items ) {
    System.out.println(item);
}
Resulta:
items.foreach( item -> System.out.println(item) );
Los enfoques de streaming y lambda son definitivamente más cortos. Puede expresar la misma funcionalidad con menos código. El problema es que ahora estamos ocultando el comportamiento real dentro de los métodos que necesitamos saber. Los bucles en Java utilizan palabras clave. Por otro lado, las funciones lambda pueden implementar varias formas de recursividad, y aquí sólo el nombre indica lo que hace. Por ejemplo:
boo.fooble( item -> System.out.println(item) );
Ya no es posible simplemente leer el código para comprender la estructura. Esto dificulta el seguimiento del flujo de ejecución. Otra característica es el encadenamiento de funciones, donde el resultado de una función es la entrada de la siguiente sin asignar una variable intermedia.
boolean result = boo
    .fooble( /*some code*/ )
    .bobble( /*some code*/)
    .goober( /*some code*/);
Esto podría tener sentido para el autor de este código porque parece haber escrito cada función y sabe lo que hace. Sin embargo, para aquellos nuevos en el código, esto no les dice mucho sobre los parámetros, procesos o valores de retorno de cada función. Pero si escribes lo mismo en algo que asigne tipos, obtendrás:
Car car = boo.fooble( /*some parameters*/);
Tyre tyre = car.bobble( /*some parameters*/);
int pressure = tyre.goober( /*some parameters*/);
Puede que esta no sea una analogía perfecta, ya que los parámetros y las funciones anónimas no son lo mismo, pero el punto aquí es que una oración larga con resultados y parámetros desconocidos es difícil de leer sin una comprensión más profunda de lo que hacen las funciones que se describen a continuación. Y entonces es posible que la programación funcional sea muy expresiva en segmentos de código sorprendentemente cortos, pero incomprensible para las personas nuevas en el software. El objetivo de las clases e interfaces es ocultar datos, crear piezas de código reutilizables que no requieran que el desarrollador comprenda o tal vez incluso mire la implementación. Existen para que los desarrolladores puedan trabajar en sistemas grandes y complejos sin dolores de cabeza. Esta es una forma conveniente de organizar el código asociado con entidades específicas. Sin embargo, entiendo poco cómo la programación funcional ayuda a estructurar proyectos grandes y complejos. Probablemente existan razones subjetivas para ello.

Para impresionar a los demás con tus habilidades.

Algunos desarrolladores de software se sienten tan inseguros de sus habilidades que intentan impresionar escribiendo código innecesariamente complejo. Como desarrollador senior, no admiro particularmente a otros desarrolladores de software que intentan escribir código inteligente. Por supuesto, esto no sólo se aplica a la programación funcional; Lo mismo puede suceder en cualquier estilo de codificación. Pero he notado cierta vanidad intelectual entre los defensores de la programación funcional. La cuestión es que los desarrolladores de software no trabajan en el vacío. Este código "inteligente" deberá mantenerse y, si es difícil de entender, será difícil de leer, cambiar y depurar. Cuando gestionamos equipos, tenemos personas en todos los niveles, por lo que lo más inteligente es escribir código de manera que todos los involucrados puedan entenderlo. Es por eso que tenemos nombres de variables largos y claros, por lo que limitamos la longitud de los métodos. El código "inteligente" consumirá más tiempo, por lo que no es muy inteligente escribirlo. Creo que la programación funcional utiliza los mismos argumentos sobre expresiones concisas y potentes que Perl utilizó hace muchos años. Los partidarios de Perl se enorgullecían de su expresividad, de la forma en que podían escribir programas muy potentes con sólo unas pocas líneas de código. Eso era cierto. El problema era que eran difíciles de entender. Quizás la programación funcional haya caído en la misma trampa.

porque es una nueva moda

Siempre hay una nueva tecnología o paradigma "de moda". Constantemente surgen nuevas tecnologías, lenguajes y enfoques. Debemos desafiarnos constantemente y aprender cosas nuevas. Ser desarrollador de software significa avanzar en la tecnología. Pero como desarrolladores de software, debemos evaluar por nosotros mismos qué tecnologías necesitamos para crear un producto. Aprender una nueva tecnología popular sólo porque es popular no es un uso inteligente del tiempo. Esto no significa que no debas aprender programación funcional, sino que debes evaluar los pros y los contras de este paradigma para la aplicación que estás escribiendo.

Porque esta es la única manera verdadera

Muchas veces antes, he visto a desarrolladores promover este o aquel enfoque como el único correcto. Pero como me dijo un amigo, diferentes trabajos requieren diferentes herramientas. Por ejemplo, yo personalmente uso Python y PyTorch para inteligencia artificial, aunque existen muchas otras herramientas y tecnologías, cada una con sus propias ventajas y desventajas. Existen buenas razones para considerar la programación funcional como una opción para servicios que necesitan una escalabilidad significativa. Esto se debe a la seguridad de concurrencia que ofrece este enfoque. Pero también hay que ser consciente de los costes y riesgos potenciales. Hace unos años tuve una experiencia similar con la inyección de dependencia y se consideró que Spring era el mejor para el trabajo. Cuando pregunté a los partidarios de Spring qué beneficios aporta, no me dieron respuestas claras. Estoy viendo algo similar ahora con algunos puristas de la programación funcional que parecen estar involucrados en algún tipo de campaña religiosa en lugar de una evaluación imparcial de la tecnología. Por cierto, la inyección de dependencia fue una gran idea y ahora puedo identificar claramente sus beneficios. Asimismo, creo que mis preocupaciones sobre la programación funcional tienen que ver con cómo se usa, más que con si es un enfoque útil y válido.

Conclusión

El objetivo de este artículo no es proporcionar una respuesta clara a la pregunta de si se debe realizar programación funcional. La cuestión es cómo se evalúa cualquier nueva tecnología o enfoque. Lo principal: no dejes que tu ego te bloquee una evaluación objetiva. El desarrollo de software no es una prueba de su capacidad intelectual ni de sus cualidades personales. Se trata de crear valor en el mundo real. Si la programación funcional le ayuda, úsela.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION