Mientras el lenguaje más utilizado del mundo cumplió ya sus 20 años, hay muchas voces en el mundo del desarrollo que reniegan de Java.
Es cierto que Java es un lenguaje antiguo, que para muchas tareas es extremadamente verboso y que tiene problemas de base que uno de sus creadores, Joshua Bloch, desgranó en su libro.
Entonces, ¿por qué tantas compañías vuelven atrás y abandonan lenguajes mucho más modernos para utilizar Java? Te voy a presentar unos cuantos ejemplos y veremos si tienen algo en común.
El sorprendente caso de Twitter
En 2011, Twitter, la empresa conocida por ser la mayor plataforma escrita en Ruby, anunciaba que su buscador había sido reescrito en Java, consiguiendo así triplicar su velocidad y reducir en un 50% el consumo de CPU.
Esto significaba que sus servidores ahora podían servir 10 veces más peticiones que anteriormente.
¿Cómo era esto posible? La primera razón fue el cambio de base de datos, de MySQL a Lucene, lo que permitía búsquedas en tiempo real. Pero la segunda, y más importante, el salto a Java dejando atrás Ruby.
El utilizar la JVM como entorno de ejecución abre la puerta a una gran cantidad de lenguajes, como Scala, Clojure o Kotlin
Moverse a un lenguaje como Java tiene una implicación aún mayor: comenzar a utilizar la Máquina Virtual de Java (JVM). El runtime de Ruby tiene algunos problemas de rendimiento comparado con la JVM, lo que generaba que un servicio con tanta demanda como es Twitter tuviera problemas cuando había picos en su uso.
Pero las ventajas no acaban aquí: el utilizar la JVM como entorno de ejecución abre la puerta a una gran cantidad de lenguajes que pueden ser utilizados conjuntamente y aplicados donde resulten más eficientes. Por ejemplo Twitter utiliza Scala y Clojure para algunos de sus servicios.
Pero por lo que podemos leer en este artículo del blog de Twitter, el verdadero problema estaba en la escalabilidad de Ruby on Rails para manejar peticiones en tiempo real. Al ser un lenguaje interpretado, el consumo de CPU y memoria se disparaba conforme iba creciendo el número de usuarios.
Uber, la famosa startup, también da un paso atrás
La arquitectura de Uber es un poco diferente, basada en microservicios. Esta filosofía les ha permitido crecer muy rápido y escribir cada uno de estos microservicios en lenguajes muy diferentes. Uber utiliza Node.js, Python, Go, Java y Scala, lo que además les permite contratar ingenieros de forma más rápida al no verse limitados por el el lenguaje.
Pero el usar tantos lenguajes diferentes se convierte en una limitación cuando se tiene que solucionar el mismo problema tantas veces como lenguajes existen. La reutilización se convierte en algo muy complejo.
Por lo que comenta Matt Ranney a InfoQ, nunca se habrían imaginado el coste que suponía el escribir los microservicios en lenguajes tan diferentes.
En Uber decidieron quedarse exclusivamente con dos lenguajes para los nuevos desarrollos: Java y Go. La razón parece ser porque sus sistemas más críticos y que requieren un mayor rendimiento, como son los que calculan rutas y tiempos estimados, están escritos en java.
Netflix
En palabras de Andrew Glover, en el Engineering Manager de Netflix:
"La gran mayoría de los servicios de nuestra arquitectura están desarrollados usando Java y la JVM. Netflix usa una arquitectura sin estado, por lo que según atraemos a más clientes podemos incluir más instancias de forma relativamente sencilla. Tenemos miles de procesos Java ejecutándose todo el tiempo, por lo que según crecemos no nos encontramos con excesivos retos de infraestructura."
"También utilizamos muchas herramientas de software libre que están basadas en Java, lo que nos hace mucho más sencillo monitorizar, actualizar y escalar nuestros servicios."
Square
La famosa compañía de lectores de tarjetas par móviles, más conocida entre los desarrolladores (sobre todo Android) por crear algunas de las librerías que todos utilizamos también utiliza Java en sus sistemas críticos. Muy interesante la charla de Bob Lee: On the cusp of a Java renaissance, donde nos cuenta algunas de las razones.
Es mucho más sencillo contratar talento especializado en Java que en Ruby
En ella también lo compara con Ruby, y una de las mayores ventajas es la concurrencia. Mientras que Ruby puede manejar unos 10-20 procesos concurrentes por segundo, Java (con algunas tecnologías como Netty) puede superar los 100.000 procesos concurrentes, lo que supone un ahorro considerable en hardware.
Además, debido a la expansion de ambos lenguajes, es mucho más sencillo contratar talento especializado en Java que en Ruby. Este es un aspecto muy importante a tener en cuenta, pues nos encontramos en una situación en el mercado del desarrollo de software donde los perfiles especializados son muy caros y difíciles de encontrar.
Java es una opción muy real
Y como estas, hay muchas otras compañías que utilizan Java en su día a día como lenguaje principal para los sistemas de más alta demanda de sus servicios. ¿Significa esto que el resto de lenguajes no deben utilizarse? No, igual que hemos encontrado estos ejemplos para Java, se podría hacer lo mismo con muchos otros lenguajes.
Lo que significa es que Java está muy lejos de ser un lenguaje extinto, y que hay razones muy claras para tenerlo en cuenta:
- En algunos entornos puede ser la solución más eficiente. En términos de concurrencia es más efectivo que otras tecnologías. También entran en juego otras características como la seguridad.
- Hay una gran cantidad de software libre listo para ser integrado en nuestros proyectos, los que nos puede ahorrar muchísimo tiempo de programación.
- El utilizar la JVM nos abre la puerta para un número mucho mayor de lenguajes que se ejecutan sobre la JVM, como Scala, Clojure o Kotlin, que pueden ofrecernos ventajas sobre Java, y que en general se integrarán muy bien con código ya escrito en este lenguaje.
- Un último punto, y para mí uno de los más importantes: la facilidad de encontrar expertos en Java. Realmente la contratación de talento es un problema que afecta a muchas compañías, y es mucho más sencillo encontrar perfiles Java que en cualquier otro lenguaje menos conocido.
¿Entonces deberías aprender Java?
Mi opinión es que debes formarte en lo que te haga sentirte feliz y apasionado con lo que haces.
Pero si hablamos desde un punto de vista más pragmático, precisamente la escasez es la que genera sueldos más altos. Destacar como desarrollador Java te va a ser mucho más difícil que hacerlo en algún lenguaje más minoritario. La especialización es básica para que las empresas te consideren un referente.
Dicho esto, hay muchas especializaciones dentro del mundo de Java, y está claro que es un lenguaje que seguirá con nosotros mucho más tiempo. Así que tampoco será nunca una mala inversión de tiempo.
Conclusión
Java y la JVM están aquí para quedarse por mucho más tiempo. No parece que vayamos a ver sus sustitución a corto plazo, ya que muchas compañías de éxito siguen confiando en este lenguaje para sus sistemas más críticos.
Además, el auge de los lenguajes basados en la JVM hacer que podamos tener lo mejor de ambos mundos. Confiar en Java hoy en día no nos limita a usar otros lenguajes más modernos más adelante.
¿Tú qué opinas? ¿Crees que Java tiene los días contados? ¿Piensas que puede abrir puertas a la hora de buscar empleo?