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
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