El estado de Java en 2021 desde 10000 pies de altura

El 23 de mayo recién pasado Java cumplió 26 años, en este contexto vale la pena analizar el estado de la plataforma desde los 10000 pies de altura donde la altitud es la ideal y las turbulencias son minimas.

En este megapost estaré analizando Java en las siguientes áreas:

  1. La plataforma Java
  2. Los lenguajes de la JVM y su relevancia
  3. Las distribuciones Java
  4. Java imperativo, Java declarativo y Java reactivo
  5. Cloud Native Java
  6. Reflexiones finales

Este post puede ser utilizado como una lectura completa, una lectura rápida o un articulo con profundidad.

Abrochense sus cinturones mientras alcanzamos los 10000 pies de altura y no olviden compartir.

La plataforma Java

Uno de los mayores aciertos y errores a nivel de marketing de Sun Microsystems fue el uso indiscriminado del termino Java, y siendo así debemos considerar que existen 3 grandes cosas llamadas Java:

  • Java, el lenguaje de programación
  • La plataforma Java
  • La máquina virtual de Java

Cuando una empresa busca un programador Java generalmente busca:

«Un programador que conozca el lenguaje de programación Java, con las herramientas de la plataforma Java y que tenga experiencia administrando la máquina virtual de Java«

Ningun reclutador en la vida

Como su nombre lo indica, una plataforma de programación es la base sobre la cual se crea un ecosistema y suele incluir:

  • Compilador
  • Entorno de ejecución
  • APIs y bibliotecas
  • Editores o IDEs

Si analizamos Turbo Pascal, la plataforma solía estar compuesta por:

Turbo Pascal
  • Lenguaje de programación: Pascal
  • Compilador: Borland Pascal o Turbo Pascal
  • Bibliotecas y APIs: Borland stdlib -e.g. conio.h-
  • Editor: Borland Pascal

Y si analizamos C++ vemos que la línea continua y tenemos una plataforma heterogénea:

CLion
  • Lenguaje de programación: C++
  • Compilador(es): GCC (GNU), LLVM (Apple), MSVC++(Microsoft)
  • Bibliotecas y APIs: musl (Linux), Glibc (UNIX), QT(UNIX), GTK(UNIX), Cocoa (MacOS)
  • Editor(es): XCode (Apple), Visual Studio (Microsoft), CLion (JetBrains)

Java no es ajeno a esta tendencia y tanto Sun Microsystems como Oracle lo tenían bien claro, existe un grupo dentro de Oracle denominado «the Java Platform Group«, encargado de la evolución de la plataforma sobre la cual existe el ecosistema.

Hasta hace algunos años la plataforma Java estaba compuesta por las siguientes áreas:

  • Java SE
  • Java ME
  • Java Card

Y sobre estas áreas de la plataforma, se soportaban de forma oficial, las siguientes APIs y bibliotecas:

  • Java EE
  • JavaFX
  • Java TV
  • BD-J
  • MSA

Si consultamos los sitios de Oracle vemos que en algunas paginas la plataforma sigue siendo más o menos lo mismo:

Pero a nivel comercial se observa simplificación en otras paginas:

¿Que ha pasado con la plataforma entonces?. Como este no es un viaje transatlántico, resumiré los 4 cambios más importantes por plataforma y API que todo desarrollador Java debería saber.

Java SE

Estado: Saludable y adelgazando.

Java SE es la base del ecosistema, y acá resalto lo siguiente:

  • Java 9 hizo a Java modular y es posible entregar máquinas virtuales pequeñas que únicamente incluyen las características necesarias para su funcionamiento. Minecraft es el ejemplo más claro.
  • Los lanzamientos ahora se hacen con un calendario predecible, cada 6 meses tenemos nuevas versiones de Java estables y entre estas versiones algunas tienen un calendario de soporte extendido por parte de varios fabricantes.
  • La compilación de Java de Oracle (HotSpot) ahora requiere el pago de una licencia para su uso en producción. Al mismo tiempo Oracle liberó las características «premium» y es posible usar la compilación de otros fabricantes.
  • Entre Java 8 y Java 17 las siguientes APIs y componentes de la plataforma han sido separados o eliminados del Java core:

Java ME

Estado: Le pasó un tren encima

Java ME no ha desaparecido, pero:

Java EE

Estado: Murió pero revivió y ahora la pasa bomba

Java FX

Estado: Se independizó y vive una segunda juventud para bien o para mal

Java Card

Estado: Parece saludable y se mantiene en su habitación

En este debo ser bastante sincero, jamas lo he utilizado. Según veo en los medios de Oracle, Java Card complementa su oferta de IoT y parece estar bastante saludable.

Los lenguajes de la JVM y su relevancia

La máquina virtual de Java es una de las grandes obras de ingeniería y ciencias de la computación, su impacto ha sido tal que diversas comunidades de software la utilizan con lenguajes de programación alternativos. Entre estos, considero que 5 son los más importantes:

  1. Java
  2. Kotlin
  3. Scala
  4. Clojure
  5. Groovy

Para analizarlos vale la pena resaltar tres datos útiles: su popularidad relativa (al día 30 de mayo de 2021), usuarios importantes, quien está detrás de su desarrollo y algunos comentarios.

Java

Popularidad relativa: #3 TIOBE, #3 Redmonk, #2 PYPL, #2 IEEE

Usuarios importantes: La NASA, Wikipedia, Hadoop, Minecraft, Goldman Sachs, NSA, Minecraft, Runscape, Jitsi, y el seguro social de Brasil

Quien está detrás de su desarrollo: Oracle, IBM, Red Hat, SAP, Amazon entre otros

Comentarios: Considero que Java y .net fueron las ultimas dos grandes plataformas de propósito general, actualmente vivimos en una era donde los lenguajes de programación son especializados. Llevo 10 años esperando la muerte de Java y aunque su popularidad relativa sube o baja, si ha de morir sera una muerte más que digna luego de 26 años. De momento está ahí siempre al tope y compitiendo por la pole position con Python y JavaScript.

Kotlin

Popularidad relativa: #35 TIOBE, #18 Redmonk, #12 PYPL, #18 IEEE

Usuarios importantes: Toda aplicacion movíl para Android (drops the mic) . . . Google

Quien está detrás de su desarrollo: Jetbrains y Google

Comentarios: Como lenguaje fue creado para eliminar la «verbosidad» de Java para la programación de InteliJ IDEA. Eventualmente se liberó su uso como un lenguaje Open Source y por azares del destino en 2017 Google lo hizo EL lenguaje oficial para el desarrollo en Android. A mi personalmente me gusta mucho, creo que lo que limita su adopción es que para su uso es necesario usar IntelliJ IDEA ($500) o Android Studio (gratis pero solo para Android). Muchos lo plantean como el «Java killer» pero esto ya lo vi una vez así que yo si me ando con cautela con esa afirmación.

Scala

Popularidad relativa: #32 TIOBE, #14 Redmonk, #19 PYPL, #16 IEEE

Usuarios importantes: Twitter

Quien está detrás de su desarrollo: École Polytechnique Fédérale Lausanne (EPFL)

Comentarios: Scala fue el primer «Java killer» antes de Kotlin. Su creador Martin Odersky ha contribuido también a Java y es conocido principalmente por Generics. Así mismo Scala demostró de forma practica que es posible combinar bases de código orientadas a objetos y funcionales de forma clara, muchas de estas características inspiraron la introducción de programación funcional a otros lenguajes, incluido Java con Java 8.

Clojure

Popularidad relativa: #51-100 TIOBE, #NA Redmonk, #NA PYPL, #44 IEEE

Usuarios importantes: Nubank

Quien está detrás de su desarrollo: Cognitech (Nubank)

Comentarios: Clojure es un lenguaje de programación funcional puro y al día de hoy probablemente el dialecto más famoso de LISP. Aunque técnicamente es un lenguaje de nicho, su popularidad aumentó cuando la primer startup unicornio de Latinoamerica lo adoptó, su importancia fue tal que hasta compraron la empresa que lo creaba.

Groovy

Popularidad relativa: #14 TIOBE, #NA Redmonk, #24 PYPL, #40 IEEE

Usuarios importantes: Netflix, y casi cualquier proyecto usando Gradle (otra vez Google)

Quien está detrás de su desarrollo: The Apache Software Foundation

Comentarios: La historia de Groovy es «turbulenta». Fue uno de los primeros lenguajes de programación dinámicos para la JVM al punto que fue estandarizado mediante el Java Community Process. Su primera gran gloria fue cuando se utilizó como base para el framework Grails y luego fue adquirido por Springsource que a su vez fue cambiando de manos y se perdió en el camino. Actualmente es famoso por ser parte de Gradle para la elaboración de su DSL y es el lenguaje de scripting/dinámico por excelencia en la JVM.

Existen algunos otros lenguajes destacables como JRuby, Xtend, Jython, Lucee, Ballerina y Ecstasy pero de momento los considero comunidades de nicho.

Las distribuciones Java

Con el cambio de licencia para su uso en producción y la liberación de características premium por parte de Oracle diversos fabricantes han optado por producir sus propias compilaciones de Java, lo que llamaríamos en el mundo Linux como distribuciones.

En este punto vale la pena entender tres cosas:

  1. Java (el lenguaje, la plataforma y la máquina virtual) se desarrollan bajo licencia GPLv3 en el proyecto OpenJDK. A partir de acá diversos fabricantes pueden crear su versión y cobrar por el soporte sobre esta versión

2. Para que una distribución de Java pueda usar el nombre Java, necesita pasar un test riguroso al cual se accede después de pagar una cuota o aprovechando acuerdos comunitarios con Oracle. Solo después de realizar esto una distribución Java puede usar el nombre e incluso el logotipo ya que son marcas registradas.

3. Java como proyecto comunitario recibe contribuciones de diversas empresas, no solamente Oracle. En Java 16 vimos contribuciones de las siguientes empresas:

Dicho esto podemos encontrar distribuciones por parte de:

  1. La comunidad Java (AdoptOpenJDK, Eclipse Adoptium)
  2. Las distribuciones Linux como Debian, Ubuntu, Gentoo y otros suelen crear su propia compilación
  3. Oracle (OpenJDK, OracleJDK y GraalVM)
  4. Red Hat
  5. Azul
  6. Bellsoft (famosa porque es la que usa IntelliJ)
  7. Microsoft
  8. Amazon
  9. SAP
  10. Alibaba
  11. Huawei

¿Cual escoger? Esto por si solo es un problema pero lo que se debería de tomar en cuenta:

  • ¿Cuales sistemas operativos soportan?
  • ¿Cuales arquitecturas de procesador soportan?
  • ¿Soportan versiones current, LTS?
  • ¿Tienen planes de soporte comercial?
  • ¿Cuanto contribuyen a OpenJDK?

Yo personalmente uso GraalVM CE en desarrollo y generalmente la que el cliente me indique en producción, al día de hoy jamas he tenido problemas por cambiar de JVM.

Java imperativo, Java declarativo y Java reactivo

Al día de hoy dentro del ecosistema de Java existen a mi opinión tres grandes estilos de programación, imperativo, declarativo y reactivo.

Frameworks y bibliotecas imperativas

public class HelloWorld extends HttpServlet {
 
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

      out.println("<h1> Hola mundo </h1>");
   }
}

Estas bibliotecas se caracterizan por ser simples, ideales para crear código a bajo nivel o ser bibliotecas base de los niveles declarativos y reactivos. Aca vale la pena señalar algunas herramientas tipicas de la programación imperativa:

  1. Tomcat
  2. Jetty
  3. Jooby
  4. Spark

En ese espacio siempre hay innovación y suelen ser las preferidas por los recien llegados a Java que se sienten abrumados por la convenciones sobre la configuración tipicas de frameworks declarativos.

Frameworks y bibliotecas declarativas

@Inject
HolaService say;

@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
    return say.hello();
}

Con la introducción de las antotaciones en Java 5 nacieron una serie de frameworks basados en el principio «convention over configuration» en el cual el código complejo del nivel imperativo se abstraia mediante metadatos. Con esto la programación «de la calle» en Java suele ser bastante declarativa mediante bibliotecas y frameworks.

Este es el nivel donde Java es más conocido y vale la pena destacar:

  1. Spring (el más popular)
  2. Jakarta EE y sus implementaciones
  3. MicroProfile y sus implementaciones
  4. Micronaut
  5. Play Framework

Frameworks y bibliotecas reactivas

public class Server extends AbstractVerticle {
  public void start() {
    vertx.createHttpServer().requestHandler(req -> {
      req.response()
        .putHeader("content-type", "text/plain")
        .end("Hello from Vert.x!");
    }).listen(8080);
  }
}

Una de las tendencias que sin duda alguna marcó NodeJS fue la creación de sistemas basados en el principo reactivo. Estos sistemas se caracterizan por el uso frecuente de callbacks y colas de eventos para el procesamiento de información asincrono. En Java esta seria la otra gran familia de frameworks cuyo caballito de venta es la escalabilidad sobre la facilidad de uso. Vale la pena mencionar:

  1. Vert.x
  2. Akka
  3. Netty
  4. Spring Webflux

Asi mismo existen dos herramientas importantes para lenguajes de la JVM

  1. ZIO para Scala
  2. Ktor para Kotlin

En conclusión, el ecosistema de Java (y la JVM) ofrece soporte a los principales estilos de programación, escalas y sobre todo, gustos. Esta fue la sección más dificil de escribir porque facilmente superaria los 100 frameworks y bibliotecas, las que seleccioné son las que conmunmente encuentro en los entornos latinoamericanos y en conferencias del mundo JVM.

Cloud Native Java

De acuerdo a Red Hat:

Las aplicaciones «nativas de la nube» (Cloud Native Apps) están diseñadas específicamente para proporcionar un desarrollo consistente y una experiencia de gestión automatizada a través de nubes privadas, públicas e híbridas.

Durante mucho tiempo el ecosistema empresarial de Java estuvo basado en el concepto de servidores de aplicaciones, el cual sigue siendo valido pero con el tiempo ha sido reemplazado y/o compite con otro tipo de arquitecturas.

En esta linea siempre es bueno ver los 12 factores Cloud Native de Heroku y usándolos como base podemos mencionar algunas herramientas Java a tomar en cuenta en el ecosistema:

  1. Código base: jGit
  2. Dependencias: Maven y Gradle
  3. Externalización de la configuracion: MicroProfile Config, DeltaSpike Config, Spring Cloud Config
  4. Backing services: Basicamente cualquier framework Java que permita despliegues en formato UberJar, FatJar (es decir un Jar que incluya todas sus dependencias) o Jlink
  5. Construir, desplegar, ejecutar: Jenkins, Eclipse JKube
  6. Procesos (cualquier framework)
  7. Asignación de puertos (cualquier framework)
  8. Concurrencia (cualquier framework)
  9. Desechabilidad: Eclipse JKube, Java Containers (Jib)
  10. Paridad en desarrollo y producción (cualquier framework)
  11. Historiales y trazabilidad: Elasticsearch, Logstash y Kibana
  12. Administración de procesos (mismas herramientas que desechabilidad)

Al día de hoy podemos observar que entornos Serverless, PaaS, Kubernetes e incluso propietarios siguen soportando Java desde el día 1 por lo que el estado de salud es bastante bueno.

De forma similar, en Eclipse podemos ver a la alianza Cloud Native 4 Java que quiere contribuir a la creación de especificaciones y herramientas para mejorar la experiencia Cloud Native. Pero de momento diría que todavía estamos viviendo el viejo oeste.

Reflexiones finales

Quisiera cerrar este megapost con algunas reflexiones:

  • Algo que he observado durante los últimos años es que un lenguaje o plataforma son tan importantes como lo sean sus usos, he visto morir interesantes lenguajes de programación mientras que otros no tan bonitos ganaron popularidad gracias a que había alguien que los usaba. Para que un lenguaje sea exitoso primero debe resolver los problemas de alguien.
  • Java como todo lenguaje de programación ha tenido sus aciertos y fracasos, al día de hoy considero que su éxito depende del futuro de algunos proyectos:
    • GraalVM, la máquina virtual políglota
    • Amber, las mejoras incrementales al lenguaje de programación Java
    • Panama, y la mejora de interacción de Java con código nativo
    • Loom, y los virtual threads como nueva forma de escalabilidad
  • Aunque no dudo de la calidad técnica de la plataforma, creo que una parte importante del éxito de Java es su comunidad de usuarios. Si les gusta el lenguaje participen de su Java User Group más cercano, muestren al mundo lo que Java puede hacer y contribuyan con su proyecto open source de preferencia
  • También es importante aprender otros lenguajes, yo opino que un buen desarrollador debe dominar al menos 4:
    • Un lenguaje de tipádo estático para crear sistemas de alto desempeño. Java es un buen inicio que abre puertas para entender Kotlin, C#, TypeScript y hasta Rust y Go.
    • Un lenguaje de tipádo dinámico o scripting. Acá mis preferidos suelen ser JavaScript y un poco más atrás Python.
    • Un lenguaje de tareas de sistema operativo. Bash o hasta PowerShell
    • SQL

One Reply to “El estado de Java en 2021 desde 10000 pies de altura”

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *