Pasado, Presente, Futuro

Java

Antecedentes 

  • El lenguaje de programación C , creado en 1972, popularizó la programación.
  • El lenguaje de programación C++, creado en 1985, se creo sobre la base de C y se volvió un estándar de facto para manejar de mejor manera la complejidad de software cada vez más sofisticado.
  • Java surgió con la idea de ser un mejor C++

Java

  • Corre sobre un máquina virtual (VM) llamada la Java Virtual Machine o JVM
  • El manejo manual de la memoria es un "dolor de cabeza" por lo que usa un Garbage Collector
  • Hay una fuerte tradición de que el código esté documentado
  • Simplifica conceptos como los Apuntadores y los vuelve Referencias

Java (cont)

  • Un Thread (hilo) es un mecanismo por el cuál un programa crea un stack de ejecución adicional
  • Un Thread está asociado con un SO Thread
  • El SO ejecuta los stacks concurrentemente
  • Ahora con múltiples núcleos el SO puede ejecutar diferentes stacks en paralelo

Java (cont)

  • Java intentó ser importante en varios nichos pero logró finalmente una posición relevante en el mercado gracias a las aplicaciones web
  • Inicialmente pensado para ser usado en dispositivos inteligentes que podían descargar código y ejecutarlo

JavaScript (JS)

  • JavaScript nace en Netscape como un lenguaje no fuertemente tipado eventualmente usado para agregar dinamismo en el navegador
  • Como parte de un acuerdo para que Netscape incluyera Java en el navegador (Applets), Netscape renombró su lenguaje LiveScript como JavaScript
  • Para distanciarse de Java eventualmente se busca posicionar el nombre de JS

Python

  • Python nace como un lenguaje no fuertemente tipado de caracter general
  • Se convierte muy rapidamente en el lenguaje de aficionados
  • Gana adopción en industrias que no son las de desarrollo de software, especialmente en términos de Machine Learning y Data Science
  • Por debajo se ejecuta como un programa en C

Java 5 (2004)

  • Generics
  • Anotaciones
  • java.util.concurrent

Instalación Software

  • El usuario corre un programa de instalación en su máquina local
  • Si hay un bug, el usuario debe correr un parche
  • Si hay una nueva versión, el usuario debe correr un actualizador
  • En Java se puede comprimir todos los archivos en un "ejecutable", llamado JAR (Java ARchive)
  • El programa ejecuta el código en el JAR desde la JVM presente en la máquina (write once, run everywhere)

Applicación Web

  • Existe una sola versión del código independientemente de la cantidad de usuarios.
  • Los arreglos de bugs  y las actualizaciones se hacen en un solo lugar
  • Utiliza como UI un navegador que es una interfaz cuyo lenguaje es oblícuo (todos saben qué es un hipervínculo, todos saben que hacen el botón atrás y adelante de la historia, etc)

¿Cómo funciona el www?

  • Internet está construído en un modelo cliente / servidor con un protocolo llamado HTTP
  • Cliente (navegador) -> Petición HTTP -> Servidor -> Respuesta HTTP (html, json, etc)
  • HTTP no tiene estado: cada petición es independiente
  • Cada petición tiene un "Verbo" que indica el tipo de petición. Hay 7 pero inicialmente todos se acuerdan solo de 2: GET y POST
  • Un petición puede tener parámetos llamados query parameters con esta sintaxis: ?q=foo&page=1

Apache Web Server

  • Posicionó al Apache Software Foundation como un actor principal en la industria web
  • El rey de los servidores web estáticos

Servlets

  • Modelo usado por los Java Web Server para generar contenido dinámico
  • Se despliega un archivo similar al JAR pero recibe el nombre WAR (Web Application Archive)
  • El programa en el Web Server nunca se detiene, está pendiente de peticiones para generar su apropiada respuesta

Servlets (cont)

  • Cuando una petición llega, se crea un hilo donde se gestiona el proceso (Thread-per-request)
  • El concepto fundamental es el Servlet que es un tipo de dato que obtiene una petición y genera una respuesta
  • El Web Server gestiona el ciclo de vida de los Servlet, los programadores escriben Servlets y archivos de Configuración
  • Los Java Web Server obtienen un HttpServletRequest y generan un HttpServletResponse

Modelo por Capas

  • La arquitectura predominante es un modelo por capas: Los Servelts reciben la petición y la convierten en tipos de datos del dominio y se los pasa a una capa de servicio, la capa de servicio ejecuta reglas de negocio y de ser necesario usa la capa de persistencia. El servicio devuelve un tipo de dato del dominio y el Servlet lo convierte en una respuesta http

MVC

  • Muy pronto el modelo MVC (Model-View-Controller) se consolidó en el mundo web: La Vista representa el usuario, el Modelo es el Dominio y el Controlador es el intermediario
  • Aplicado al mundo Java, un Servlet es un Controller que manipula un objeto Vista pero no escribe HTML

Frameworks

  • Hay un estándar empresarial: Java Enterprise Edition (JEE) y algunos FWs lo implementan: GlassFish, WebSphere, JBoss, etc.
  • Surgen algunos FW que buscan simplificar el mundo empresarial apartándose de JEE: Spring
  • La comunicación con la Base de Datos es tan relevante que surgen FWs que buscan tratarla como Tipos de Datos (Object-Relational Mapping - ORM): Hibernate

Inyección de Dependencias

Spring logra poner de moda dos ideas:

  • Los clases de servicios usan colaboradores y la mejor práctica es "inyectarlos", táctica llamada Inyección de Dependencias reduciendo el acoplamiento de las clases
  • Una fuerte razón de esto es potencializar el uso de pruebas unitarias y JUnit gana mucha visibilidad

Empaquetadores

  • El manejo de dependencias se vuelve cada más crítico
  • Maven surge como estándar de facto
  • Todos odian a Maven pero surge solo una competencia seria: Gradle que no logra consolidarse
  • Hoy en día se reconoce como un área que necesita una "revolución"

Sun Microsystems

  • Sun, los creadores del lenguaje, hicieron muchas cosas novedosas: Crearon su propio comité de estandarización, el Java Community Process (JCP), hicieron el lenguaje Open Source (OpenJDK), crearon una fuerte comunidad Java One, Java User Groups (JUGs), Java Champions, etc.
  • Existen una pluralidad de implementaciones de JVM, cada una con un proveedor distinto y condiciones comerciales diferentes

Oracle (2010)

  • Cuando Sun tuvo problemas financieros, se pusieron a la venta.
  • Por 2 versiones, Java 6 y 7, hubo muy poca innovación debido a la incertidumbre antes de encontrar un comprador e inicialmente hicieron la integración
  • Oracle compra Sun y eventualmente todo vuelve a la normalidad
  • Durante los "años oscuros", muchos lenguajes buscan ser el "Siguiente Java" al correr sobre la JVM: Scala, Groovy, Clojure, JPython, Koitlin, etc.

Android

  • Inicialmente usaba un subconjunto de Java 7
  • Por una pelea entre Google y Oracle decidieron moverse a Kotlin (otro lenguaje JVM)

Java 8 (2014)

  • El "Salvador" de Java
  • Lambdas
  • Optional
  • Streams
  • Obtuvo una acelerada adopción

NodeJS

  • NodeJS nace con la filosofía de "es mejor tener un solo lenguaje para todas las necesidades", contradiciendo la historia
  • Ha generado una suerte de cisma en el lenguaje JS

REST

  • A pesar de que HTTP es un protocolo definido hace mucho tiempo, la industria lo utiliza de una manera desorganizada
  • Un paper establece un estrategia de cómo usarlo correctamente y recibe el nombre de REST (Representational State Transfer)
  • Rescata el uso de los 7 verbos y consolida qué significa una URL y el path

REST APIs

  • Y si Java fuera solo responsable de generar un objeto de negocio dada una URL?
  • Un FW especializado en la UI y los estándares web puede consumir esos URL ("endpoints") y a partir de la respuesta crear una página web
  • El formato de intercambio de información predominante es JSON

GraphQL

  • Otra alterativa para implementar endpoints que busca tener más control sobre lo que queremos que se retorne en nuestras peticiones

Cloud

  • Los web server son parte de la infraestructura de la compañía
  • Escalar se vuelve difícil: la idea de Cloud es exteriorizar esta infraestructura e instrumentalizarla para que escale y también para poder distribuirla en el mundo.
  • Cómo la infraestructura está en "todas" partes, es como si no estuviera en ninguna, en la "nube"

Cloud

  • AWS (Amazon Web Services) es el vendor dominante
  • Google Cloud
  • Azure Cloud
  • etc

Ambientes

  • Ambiente local: donde el desarrollador hace su trabajo
  • Ambiente dev: un solo ambiente de integración donde los desarrolladores pueden hacer experimentos
  • Ambiente Stage / UAT (User Acceptence Testing): un solo ambiente para hacer pruebas y que los clientes validen antes de promover el código. Debe ser muy cercano a Producción
  • Ambiente Producción: El ambiente público

"Funciona en mi local"

  • Con tantos ambientes se vuelve un desafío poder tener algo de estandarización que garantice dependa de algo que solo está en un ambiente
  • Si en Cloud puedo crear un nuevo servidor cuando la demanda de un servidor es alta, necesito poder replicar el servidor de una manera rápida
  • Surge la idea de los contenedores: Docker es el estándar de facto
  • Y se necesita software para orquestar esos contenedores: Kubernetes es el estándar de facto

Microservicios

  • Una aplicación se concebía como un todo: un monolíto. Si una funcionalidad cae, todo el monolíto se derrumba.
  • Y si toda la aplicación se piensa como un conjunto de servicios, cada uno independiente de los demás y en el mundo Cloud además que sucede si cada servicio es lo más pequeño posible?
  • Cada servicio puede interactuar con otros mediante llamados a la red o subscribirse a eventos
  • No es viable para todos los proyectos

Nuevas Arquitecturas

  • Arquitectura Hexagonal
  • Puertos y Adaptadores
  • No del todo consolidadas

Versiones de Java

  • Después de una larga espera por Java 9, el modelo de nuevas versiones de Java cambia
  • A partir de 2018, cada 6 mes hay una nueva versión
  • Habilitan previews que permiten que los desarrolladores prueben funcionalidades antes de que estén finalizadas
  • Permite tomar una gran idea y entregarla en pequeños incrementos

LTS

  • Hay un concepto, netamente comercial, a las versiones comercializadas por Oracle: Lifetime Support (LTS)
  • Cada nueva versión de la JDK de Oracle obtiene arreglos gratis
  • Para ofrecer soporte a otras versiones crearon el programa LTS: ciertas versiones reciben soporte comercial  extendido hasta la siguiente LTS
  • No tiene nada que ver con la "calidad" o "disponibilidad" de las funcionalidades en el lenguaje

Jakarta EE

  • Los estándares empresariales salen de Oracle y llegan al Apache Softwate Foundation con el nombre de Jakarta EE

Spring Boot

  • Spring lanza una versión en que el web server es parte de las dependencias del proyecto: Spring Boot
  • Aplicaciones vuelven a empaquetarse en JARs

Virtual Threads

  • El modelo de Thread-per-request necesitaba crecer para las nuevas demandas.
  • El modelo React se volvió un problema para los desarrolladores.
  • Los Virtual Threads se desligan de los OS Threads (el cuello de botella)
  • Los Virtual Threads están pensados para permitir la creación de millones de hilos ligeros que se puedan "botar" sin ninguna preocupación
  • Usados por las últimas versiones de los Web Server

Data Oriented Programming

  • En una arquitectura en que diferentes sistemas intercambio información se hacía importante crear un modelo de programación apropiado
  • 4 principios
    • Separar la lógica de los datos
    • La información es inmutable
    • Los estados ilegales de la información deben ser imposibles de representar
    • La información debe ser transparente

Pattern Matching

  • Mecanismo en que podemos operar sobre información heterogénea pero relacionada, de una manera en que sea sencillo extraer partes de ella

DOP en Java

  • Records
  • Sealed Classes
  • Pattern Matching de Records aún anidados
  • Pattern Matching de Primitivas (preview)
  • Pattern Matching de Arreglos (en el futuro)
  • Pattern Matching para otros tipos de Clases (en el futuro)

Valhalla

  • Value Classes: clases sin identidad
  • Homogenización de clases y tipos primitivos
  • Non Null Value Classes

 

Al implementar características para hacer mi código más expresivo en su intención, se abren las puertas para optimizaciones de memoria y desempeño

Leyden

Proyecto para:

  • Mejorar los tiempos en que nuestro programa ejecuta la primera línea de código significativa
  • Mejorar los tiempos en que nuestro código alcanza su desempeño óptimo
  • Permite crear un cache que se puede usar en subsecuentes ejecuciones

IA

Hay 2 partes importantes para la IA:

  • La creación de modelos
  • La incorporación de modelos en nuestro software

IA - Python

  • Para cuando Machine Learning se empezó a volver relevante, Python tenía una ventaja significativa en términos de librerías para crear Modelos
  • Por un tiempo se dio por sentado que Python era la "mejor" opción para introducir IA en el software

IA - Java

  • Java hizo cambios significativos para poder ejecutar código escrito en C / Python, cómo si fuera código en Java (Proyecto Panama)
  • También va a permitir ejecutar código escrito en Python y en JS (Proyecto Detroit)
  • También va a permitir que el código en Java se pueda trasformar en código específico de una GPU (Proyecto Babylon)

Librerías Java IA

  • Spring AI
  • LangChain4j
  • Embabel
  • Llama4J
  • DeepLearning4j
  • DeepNetts
  • etc

Redmonk

Futuro de Java

  • Los lenguajes tipados han mostrado ventajas:
    • Ayuda con el desarrollo de software complejo
    • Son más eficientes en el uso de energía
    • Tienen mucho mejor desempeño
  • Integrar IA en software es más sencillo si el software y la integración están en el mismo lenguaje
  • Debilitado la idea de "Un Lenguaje Para Gobernarlos a Todos"

Futuro de Java (cont)

  • Una vez que un lenguaje alcanza una masa crítica, la calidad de software se deteriora
    • Es mejor malo conocido que bueno por conocer
  • No solo es importante pensar en que es un lenguaje hoy en día sino en donde va a estar en 30 años
  • Redmonk (y otros) no son una estadística para declarar a un "mejor" lenguaje.

IMHO: Java

  • Java seguirá siendo el lenguaje más relevante por los siguientes 30 años
  • En el mundo empresarial muchos lenguajes van a desaparecer
  • Python va a ceder la corona del lenguaje uso para implementar IA
  • JS va a limitarse a la Web
  • C++ y Java seguirán siendo los lenguajes usados para sistemas críticos

Gracias!

Open Floor

Java: Pasado, Presente y Futuro

By Carlos Obregón

Java: Pasado, Presente y Futuro

  • 78