El futuro del «programador Java» en la era de la IA

Corría el año 2021 cuando tuve mi primer momento de miedo con la IA, específicamente cuando realicé este video evaluando GitHub Copilot con Java

En este punto de la historia, la propuesta de valor era que la IA nos ayudara como un copiloto en el proceso tradicional de software, y en menos de 5 años pasó de ser un copiloto a un actor central.

Más allá del video y del guiño obvio a la pandemia, algo que me marcó en ese video fue enfrentarme al hecho de que la profesión nunca iba a volver a ser la misma. A partír de ahi ha sido un juego del gato y el ratón para intentar estar al día en el futuro de la profesión de programador Java y de la profesión de ingeniero de software en si misma, al día de hoy veo tres corrientes de pensamiento que estan definiendo como creamos software.

Los vibecoders

Llamémosles también los creyentes. Si vamos a la definición formal y aceptada de vibecoders, un vibecoder es aquella persona capaz de producir de principio a fin una aplicación en lenguaje natural sin saber programar. Entre otras cosas, hace que el lenguaje de programación sea irrelevante, dado que el inglés (o español) sería el reemplazo natural. En mi opinión, este es el futuro, pero aún no llegamos ahí.

Y creo que aún no llegamos aqui porque escribir el software no es ni de cerca la mayoria del trabajo, la mayoria del trabajo es el manteimiento del software porque el software es un ente vivo, software que no necesita mantenimiento es sinonimo de software que no tiene usuarios.

Sin embargo, esto no significa que el vibecoding no exista. Al día de hoy, reemplazó la creación de prototipos y yo mismo lo he visto como una herramienta que ha reemplazado el mocking de UIs, a decir verdad, es muy útil para esto.

Los promotores de SDD

Para quien lleva años en la profesión, el término specification driven development resuena y se parece bastante a una de las prácticas ágiles que siempre prometieron pero nunca cumplieron a cabalidad, que es Behaviour Driven Development.

En BDD original, la propuesta de valor es que el comportamiento de un sistema se «especifica» de antemano y su implementación depende tanto de las historias de usuario como de las especificaciones resultantes. La diferencia con SDD es que, ahora en lugar de que sea el instrumento guía de un humano programador, la especificación es la guía de trabajo de un coding agent, lo que se traduce en la colisión de dos profesiones

  • Los actuales product owners, pueden tener una transición a «VibePMs», PMs que capturan el rumbo de un producto, lo especifican y luego lo entregan a un coding agent para crear la aplicación.
  • Los actuales programadores, deben subir un nivel y por fin preocuparse más por la entrega de valor de negocio donde entregan a un coding agent las especificaciones y (de ser necesario) se preocupan por revisar el resultado, actuando como humans in the loop por si a la IA «se le va la moto».

Al día de hoy he visto más el escenario B que el escenario A, pero no dudo que A sea atractivo. Sin embargo, tampoco estamos 100% ahí, aunque no dudo que lleguemos a mediano plazo.

Acá el lenguaje de programación también es irrelevante, y es más una formalización del vibecoding, un vibecoding ingenieril si me lo permiten.

El AI T-shaped software engineer

En los últimos tres años mi carrera tomó este giro, y hablando desde la experiencia personal creo que este es el presente inmediato y no el futuro.

De nuevo, quien lleva suficientes años en la profesión sabe que el código no es ni de cerca la mayoría del trabajo y también (por haberlo intentado una y otra vez) sé que SDD tiene sus límites y el límite suele ser la responsabilidad. Al trabajar en sistemas criticos, un «mal» que padecemos los ingenieros de software es querer comer …. y para poder comer y no perder los trabajos necesitamos estar seguros de que el sistema va a funcionar, porque no son pocos los escenarios donde la IA ha fallado cuando se ha utilizado sin control.

El término T-Shaped viene de este tipo de gráficas


En pocas palabras, un ingeniero T-Shaped es aquel ingeniero que conoce diversos tópicos propios de la profesión y que además es especialista en una rama. Creo que con IA se «potenció» el eje broad y los ingenieros de software AI se ven así:

Desde el punto de vista antropológico, ha derivado en:

  • Despidos masivos dado que esta tecnología es carísima, incluso más que muchos humanos
  • Migración del trabajo a países con menor costo por persona. Una IA por si sola aún no hace el trabajo de un Staff Engineer de USA, pero una IA y un Dev en Latam si, y hasta más barato.
  • Aumentos de carga de trabajo para ingenieros de software (se supone que la IA nos haría trabajar menos, pero en realidad trabajamos más)
  • Estancamiento de salarios y hasta ganancias en la industria
  • Oligopolios mundiales, dado que no son más de 10 proveedores de LLMs que realmente «sacan la tarea»

Y desde el punto de vista de desarrollo de software ahora nos preocupamos también por:

  • Guardrails, cómo crearlos y cómo colocar determinismo en algo que es eminentemente no-determinista (los LLMs)
  • Control de costos, especialmente porque no todos los programadores estamos en la misma realidad. Esto ha impactado mucho más a solo/indie/freelance developers y ha hecho que nos hagamos creativos con consumo de tokens, persistencia de memoria, routers a distintos LLMs
  • Control de contextos y alucinaciones. Hacer software siempre es una suma de contextos, entre necesidades del usuario, capacidades de una herramienta y novedades de una herramienta. En mi experiencia no han sido pocas las veces que un LLM me sugiere soluciones que ya no estan vigentes o simplemente las halucinó.

Siendo así, al día de hoy programar sin ayuda de IAs dejó de ser una profesión y se ve ya como algo artesanal, algo que se hace solo cuando queremos divertirnos, pero algo que ninguna empresa puede permitirse dado que su competencia está en la misma situación.

Y esto qué tiene que ver con Java

Si resumimos mi párrafo anterior, para mí en 2026 la profesión está así

El marketing promueve el movimiento del vibecoding/prompt engineer, las unidades de negocio quisieran que BDD fuera perfecto para ya no tener devs y a los devs les pasó por encima un tren que exige que ahora sean super T-Shaped con ayuda de la IA

Y de nuevo por experiencia el abordaje que yo sugeriría si alguien me preguntara es

Vuelvete t-shaped para saber cuando a una IA se le va la moto

Que en el «entorno Java» se traduce en:

  • Entender no solamente Java como lenguaje de programación sino como plataforma
  • Aprender programación como una ciencia y no como un arte. Es decir entender como mínimo los conceptos computacionales que hay detrás de
    • Programación orientada a objetos y programación funcional
    • Lenguajes scripting, lenguajes tipados, lenguajes declarativos
  • Por fin entender a fondo las convenciones de los frameworks que utilizan, ya que si ni yo mismo los entiendo, mucho menos voy a saber si una IA está o no alucinando
  • Aceptar que mucho del trabajo de aquí en adelante ya no va a ser crear SaaS, también necesitamos aprender a crear los agentes/servidores MCP que atienden a otros agentes
  • Abordar los problemas de software como problemas de ingeniería, con retos técnicos pero también con retos arquitecturales, de diseño y presupuestarios
  • Aceptar que habilidades que solían ser complementarias (DevSecOps, Linux, Coding Agents) ahora son el mínimo de la profesión, lo mínimo que se espera

Y sobre todo

No perdernos de la realidad del mercado, aceptar que la profesión ya no va a volver a ser la misma

¿Es Java un buen lenguaje en la era de los coding agents?

Dejando de lado mi sombrero de Java Champion, es una pregunta que me he hecho varias veces en este último año y (de momento) tengo las siguientes conclusiones:

Java como lenguaje es bueno pero no es el único bueno y aceptarlo está bien

Los lenguajes de programación de alto nivel jamás han sido herramientas para comunicarnos con las computadoras. Las computadoras entienden lenguaje máquina.

Los lenguajes de programación son abstracciones para que los humanos podamos expresar nuestras ideas y heredar las ideas de otros cuando trabajamos en el mismo proyecto. Y ahora también son lenguajes que los coding agents usan para implementar requerimientos de negocios y que nosotros, los humanos, podemos entender. Nosotros brindamos lenguaje natural (no determinista) y los LLMs nos brindan equivalentes en código (determinista).

En este sentido lenguajes como Java, TypeScript, C#, Rust o Go, tienen ventaja, está demostrado que los lenguajes típados en si mismos funcionan como «guardrails» y reducen las alucinaciones de tipo type check. Tal y como pasaba con los humanos, los compiladores y sistemas de tipos funcionan como «trancas».

¿Vale entonces la pena aprender a programar Java en 2026?

La respuesta corta es si, pero ya no como profesión sino como una habilidad más y ya no para todos los trabajos.

Claro que existen entornos donde soluciones «vibecoded» ya sacan la tarea, y van a seguir aumentando. Pero es mentira decir que TODA la computación se puede resolver con vibecoding al día de hoy (puede que en 5-10 años sea diferente).

Ahora con mi sombrero de educador, los generadores de código no son nuevos, lo que son nuevos son los generadores de código basados en IA. Incluso dentro del mundo Java no son pocos los generadores de código que hemos tenido durante décadas (JHipster, Hilla, Spring Roo, Telosys, Cuba Platform, por mencionar algunos).

Pero hasta que el vibecoding llegue a un punto de desarrollo donde ya no sean necesarios los lenguajes de programación de alto nivel, lo segundo mejor que tenemos es saber programar para ser el human in the loop.

¿Y por qué Java?. Durante años observé como profesor que alguien que aprende POO con Java se pasa fácil a cualquier otro lenguaje tipado porque ofrece un buen balance entre verbosidad, presencia en el mercado y caminos de transición hacia otros lenguajes. Asimismo, creo que C# también tiene esta «virtud».

Lo que nadie menciona, la búsqueda de trabajo

Hasta que el vibecoding «nivele el campo» para todos, debemos recordar que conseguir trabajo es un proceso eminentemente competitivo. De nuevo, analizando la realidad como ella es y no como nos gustaría que fuera, una simple búsqueda en linkedin les va a revelar que la IA pasó a ser obligatoria y los requisitos de habilidades técnicas no bajaron; en realidad, subieron.

Aunque podamos debatir todo el día que ya no es necesario saber programar porque la IA lo hace, la verdad es que los mejores trabajos están reservados para las personas que mejor supervisan a las IAs y esas personas generalmente saben programar. No todas las empresas pueden pagar Opus o Astra, y el juicio humano especialista tiene valor, diferente, probablemente más barato, pero aún lo tiene.

Qué se espera entonces del programador Java moderno

  1. Que ya no sea programador Java, en realidad se espera que sea un ingeniero de software más completo donde Java se usa porque es muy buena plataforma (ejemplos hay un montón)
  2. Que tenga mentalidad T-Shaped, que ya no solo sepa Java, que sepa de sistemas operativos, infraestructura, operaciones, arquitectura, patrones de diseño. En fin que su conocimiento técnico aumente y además tenga conocimiento de dominio
  3. Que domine los coding agents. Aunque la IA en sí misma es un pay-to-win, difícilmente un programador hoy va a sobrevivir sin un mínimo de experiencia usando Claude Code/Github Copilot/OpenCode

¿Y si el vibecoding finalmente se perfecciona?

Para mí la pregunta ya no es si lo va a hacer, es cuándo. La respuesta no la tengo y es muy dificil discernir entre la paja y el trigo, incluso más que con los cryptoposts. Pero cuando eso pase, la preocupación ya no va a ser si se acaban los programadores o no, es qué va a pasar con la humanidad y ahí, finalmente, a todo computín nos va a llegar la factura de nunca habernos preocupado por la política. Material para otro post.

Me quedé en Java 8 ¿Que hago?. Capitulo 1: La licencia de Java

Una sugerencia que recibí via Instagram fue discutir acerca de como «montarse nuevamente en el caballo», específicamente el caballo de Java. La razón es relativamente simple, Java 8 fue un divisor de aguas en el ecosistema de Java dada la introducción de programación funcional, mejoras al lenguaje y la relativa velocidad luego de que Oracle tomara el liderazgo en el desarrollo de Java.

Siendo así, me gustaría compartirles mi visión de los 10 puntos más importantes que han pasado desde entonces en Java y sobre todo ¿Como puedo actualizarme siendo un desarrollador Java si ya me quedé atras?. Lo dividiere en 10 capitulos para que cada capítulo sea lo suficientemente informativo pero al mismo tiempo no sea tedioso.


Se que esto también se lo pueden preguntar a Deepseek pero a veces hace falta el calor humano en esta información.

Continue reading →

El uso de Java(JVM) en Guatemala (2023)

Considerando la salida de Java 21, el grupo de usuarios Java de Guatemala aprovechó la ocasión para diagnosticar cual es el estado del ecosistema para el año 2023 en nuestro país.

Abajo se detallan todas las respuestas brindadas por la comunidad guatemalteca pero en resumen:

  • Java 8 dejó finalmente de ser el Java más usado. Fuiste grande Java 8
  • Windows sigue siendo el sistema operativo #1 para programar en Guatemala y Linux el sistema operativo #1 para despliegues.
  • La JVM de Oracle sigue siendo la más usada

Gracias a todos los participantes. Los datos se encuentran a disposición en csv y fueron analizados con un notebook de Kotlin, por si desean realizar sus propios análisis todo esto lo pueden encontrar en GitHub.

Adicionalmente, este informe se puede visualizar de mejor forma en el reporte de Datalore Notebook asi como en PDF.

Continue reading →

¿Es posible estudiar una ingeniería en sistema de forma barata (casi gratuita) a base de moocs?

De forma regular he estado actualizando mi conocimiento a través de libros, podcast y moocs.

En estos últimos he visto la proliferación de cursos con nivel universitario por lo que me surge una pregunta.

¿Es posible estudiar de forma gratuita el contenido de una ingeniería en sistemas?.

Debo aclarar que no estoy intentando responder si uno puede o no volverse un desarrollador de forma autodidacta, esto ya lo doy por hecho. Más bien mi pregunta abarcará todo lo que implica un programa de ingeniería y no solamente el desarrollo de software como tal como tal.

Continue reading →

Al final del día ¿Qué es Jakarta EE?

Del sitio web de Jakarta EE se puede extraer la siguiente definición:

Jakarta EE brinda a los desarrolladores un conjunto integral de especificaciones abiertas y neutrales para el proveedor que se utilizan para desarrollar aplicaciones Java modernas y nativas de la nube desde cero.Con Jakarta EE, los desarrolladores y consumidores de tecnología pueden estar seguros de que cuentan con las mejores tecnologías para desarrollar aplicaciones de misión crítica nativas en la nube.Y pueden basarse en décadas de experiencia de los desarrolladores de Java para trasladar las cargas de trabajo existentes a la nube.

¿Qué significa esto realmente para los desarrolladores?

Uno de los puntos más fuertes de ser un desarrollador de Java es el ecosistema . En principio, el desarrollador Java puede elegir entre diferentes proveedores de JVM, frameworks, bibliotecas y entornos de ejecución. Esta ha sido la situación desde la era de Sun Microsystems y hay diferentes frameworks para diferentes necesidades, por ejemplo, si queremos crear una API REST con Java, la primera selección debe ser entre:

  • Microframeworks que proporcionan un modelo de programación imperativo y comunicaciones HTTP como SparkJava o Javalin
  • Frameworks «opinionated» integrales con su propia mentalidad y forma de hacer las cosas como Armeria o Akka
  • Frameworks generalistas de extremo a extremo basados ​​en programación declarativa (anotaciones) y convenciones sobre configuración, como Spring Boot o Dropwizard

Con esto en mente, un desarrollador de Java normal no puede conocer todos los aspectos particulares de cada framework, por lo tanto y en muchas situaciones, su conocimiento sobre una solución no es transferible en absoluto a otras soluciones a pesar de que ambas soluciones son Java .

Esto último no es necesariamente bueno o malo, pero sin la existencia de especificaciones la programación en Java seria el viejo oeste, donde cada creador de frameworks y entornos de ejecución tendría una forma única y diferente de hacer su producto.

Siendo así, en 1998, Sun Microsystems creó el Java Community Process, una organización de estándares cuyo objetivo es proporcionar un conjunto común de especificaciones técnicas para Java Core (J2SE), Java Micro (J2ME) y Java Enterprise (J2EE). Trasladandonos al día de hoy J2EE se convirtió en Java EE, y algunos años más tarde el proceso de Java EE fue donado a la Fundación Eclipse , donde nació Jakarta EE.

Dentro de Eclipse, los proveedores de software (comunidades o empresas) podrían tomar (o proponer) una especificación, con el objetivo de tener bases técnicas comunes para definir una «forma empresarial Java» de hacer las cosas.

Un «producto» de especificación es principalmente (pero no exclusivamente) cuatro cosas: 1. Un subproyecto a cargo de la especificación, básicamente una comunidad compuesta por partes interesadas, 2. La definición de la especificación (documentación al respecto), 3. Un conjunto de Java APIs y 4. Un conjunto de pruebas de compatibilidad para validar eventuales implementaciones (TCK).

Cómo se ve Jakarta EE en la vida real

Tomemos una de las especificaciones Jakarta EE más populares, la especificación para la persistencia de objetos Java -es decir, Jakarta Persistence o JPA- .

La definición textual es:

Jakarta Persistence define un estándar para la gestión de la persistencia y el mapeo de objetos/relaciones en entornos Java®.

Como probablemente estén adivinando, esta especificación tiene (al menos) los cuatro elementos descritos anteriormente, siendo:

  1. Una comunidad que dirige la especificación
  2. La definición de especificación
  3. Un conjunto de API de Java
  4. Un TCK

Posteriormente o durante la creación de la especificación, las comunidades y empresas crean bibliotecas y/o productos Java compatibles con esta especificación, en este momento Jakarta Persistence 3.1 tiene dos implementaciones:

  1. EclipseLink (Eclipse)
  2. Hibernate (Red Hat)

En términos prácticos, esto significa que tanto EclipseLink como Hibernate son bibliotecas que proporcionan el código fuente para satisfacer el objetivo de Jakarta Persistence, se prueban contra TCK y tienen un comportamiento predecible donde su conocimiento sobre Jakarta Persistence funciona en ambas bibliotecas. Si el desarrollador Java decide permanecer en la especificación, su código será portátil entre implementaciones porque se utilizan igual, con las mismas anotaciones, las mismas interfaces Java y el mismo estilo de programación.

Al mismo tiempo, cada proyecto proporciona capacidades adicionales, como ser compatible con algún caché en particular, por ejemplo, Infinispan e Hibernate , o tener funciones adicionales para algunas bases de datos en particular, por ejemplo, EclipseLink y Oracle . Si se decide utilizar las capacidades adicionales, es probable que el código Java no sea portátil entre las implementaciones, pero aún así tendrá la forma y el estilo empresarial de hacer las cosas.

Colecciones de especificaciones y entornos de ejecución certificados

Algunas especificaciones de Jakarta son más populares que otras y, lo que es más importante , no todas las comunidades o empresas de Java adoptarán todas las especificaciones.

Por ejemplo, tanto Spring Boot como Micronaut ofrecen capas de datos de abstracción sobre Jakarta Persistence, pero cada uno tiene su propia forma de definir APIs REST ( Spring , Micronaut ).

Por otro lado, si una empresa o comunidad determinada decide adoptar completamente Jakarta EE, puede crear productos certificados con los perfiles de Jakarta EE, siendo estos :

  • Jakarta EE Core: ofrece un conjunto minimalista de especificaciones para la creación de servicios REST
  • Jakarta EE Web: Ofreciendo un conjunto de especificaciones para crear aplicaciones Web
  • Jakarta EE Full: Ofreciendo un conjunto completo de especificaciones para productos que necesitan ofrecer un conjunto sólido de características para cualquier tipo de aplicaciones Java Enterprise

Una vez más, un producto dado podría apuntar al mínimo para cumplir con Jakarta EE Core, pero aún así ofrecer muchos extras con su propia mentalidad y no necesariamente compatible con Jakarta EE Full, como Quarkus que probablemente va a certificarse contra Jakarta EE 10 core.

Así mismo, no todos los entornos de ejecución son iguales, si damos un vistazo rápido a implementaciones compatibles vamos a encontrar diferentes categorías, como:

Entornos para la creación de microservicios modulares sobre FastJars, Docker o Kubernetes:

Entornos para la creación de UberJars independientes sobre Docker o Kubernetes:

Servidores de aplicaciones completos

¿Cuál es mejor?

Como todo en TI, esto depende de la necesidad.

Personalmente tiendo a preferir Payara si necesito un servidor independiente, principalmente porque tengo considerable experiencia en Glassfish. Además, si necesito distribuir una aplicación simple en un fatjar, tiendo a usar Payara Micro o Apache TomEE .

Si necesito una arquitectura de microservicios, probablemente usaré Quarkus o Helidon .

Si necesito una función lambda, Quarkus seguramente.

¿Que esperar y aprender de Java en 2023?

Inicié esta tradición en 2020, que luego tuvo buena recepción en 2021 y 2022, los dejare como jueces del resultado final pero a mi parecer las predicciones han sido bastante certeras. Siendo así, arranco el año con mis predicciones acerca del ecosistema de la Java Virtual Machine en 2023.

En otro orden de noticias dejé el blog abandonado porque dejó de funcionar en la migración MySQL 5 hacia MySQL 8 pero ya está solucionado :D.

Continue reading →

[Videoserie] Testing con Jakarta EE 9 y JUnit 5

Las pruebas unitarias y de integración son la base de una buena cultura TDD para la implementación de automation testing, las cuales no son siempre utilizadas por su relativa dificultad en configuración de las herramientas.

En esta serie exploramos la creación de pruebas utilizando Java (11) como lenguaje de programación y Jakarta EE (9) sobre Payara para explorar su correcta implementación.

Como primer capitulo discutimos que es la gestión de calidad del software:

Y posteriormente discutimos que tipos de pruebas de software existen:

Adentrados en Java, discutimos como implementar correctamente pruebas unitarias con JUnit 5 y Java 11:

Y discutimos la importancia o utilidad de los mocks via Mockito:

Iniciamos la cuesta final creando tests de integración con Arquillian, Jakarta EE 9 y JUnit 5:

Incrementamos la dificultad creando una API REST (CRUD) sobre MySQL:

La cual probamos posteriormente en tres tipos de bases de datos: 1- Real, 2- En memoria (H2), 3- Real sobre Docker via Testcontainers (MySQL):

Como convertirse en Java Champion

Recientemente alguien me hizo esta pregunta via Twitter. Y la verdad es que me la han hecho varias veces y me di cuenta que no está documentado el proceso, al menos no en español.

¿Que es un Java Champion?

Primero debemos establecer que es un Java Champion. De acuerdo a una traducción liberal desde el sitio oficial de Java, un Java Champion es:

El programa Java Champions consta de un grupo único de expertos en tecnología Java y líderes comunitarios patrocinados por Oracle. Los Campeones de Java provienen de una amplia muestra representativa de la comunidad de Java. Son líderes, personas influyentes y habilitadores que ayudan a aumentar el tamaño de la comunidad Java. Los campeones de Java están activos de muchas maneras, como participar activamente en proyectos de Java, interactuar con las comunidades de grupos de usuarios de Java, hablar en conferencias, crear contenido, enseñar a otros desarrolladores, fomentar la participación inclusiva y mucho más.

Son luminarias técnicas y comunitarias; algunos son ingenieros o arquitectos de Java que son relativamente hábiles y tienen mucha experiencia, o son constructores de comunidades que se toman el tiempo para construir relaciones personales duraderas que van más allá de la programación. Los campeones de Java tienen una mentalidad independiente y son creíbles, y encarnan las mejores virtudes de la comunidad de Java, incluida la honestidad, la dedicación y la sinceridad.

Los Java Champions también pueden defender o influir en otros desarrolladores a través de sus propias actividades profesionales (a través de consultoría, enseñanza, redacción, oratoria, etc.). Tienen la oportunidad de proporcionar comentarios e ideas independientes y constructivos sin una agenda competitiva que ayudarán a Oracle a seguir impulsando Java. Este intercambio puede ser en forma de discusiones técnicas y / o actividades de construcción de comunidad con el Equipo Java de Oracle.

Oracle

De este párrafo podemos extraer al menos cinco criterios que son evaluados:

  1. Los Java Champions tienen experiencia en Java y liderazgo en comunidades Java
  2. Los Java Champions crean proyectos importantes y/o contribuyen a proyectos Open Source
  3. Los Java Champions son independientes y NO pueden trabajar para Oracle
  4. Los Java Champions enseñan a otros Java
  5. Los Java Champions deben ser buenas personas

Segun me han comentado «los fundadores» el programa originalmente pertenencia a Sun Microsystems, fue creado con el objetivo de establecer una mejor comunicación entre Sun y la comunidad Java, con esto Sun pretendia conocer mejor las necesidades de los desarrolladores y sobre todo hacerlo de forma más transparente.

El programa funciona como un premio al cual accedes luego de demostrar esos criterios, es decir, una vez dado solo lo puedes perder por tres razones:

  1. Decides retirarte voluntariamente
  2. Vas a trabajar para Oracle
  3. Hiciste algo muy malo

Al ser un premio y luego de ver varios procesos de selección, puedo decir que el programa es bastante estricto en los criterios.

¿Que NO es un Java Champion?

Un Java Champion no es lo siguiente:

  • Una certificación: Para esto Oracle tiene sus propios programas de certificación Java
  • Una prueba de que eres el mejor en Java: Probablemente la mayoría de los Java Champions sean buenos en Java pero no necesariamente «el mejor»
  • Un trabajo: El programa es 100% comunitario y a excepción de algunos regalos que recibes, no tienes una asignación monetaria de Oracle

¿Como alguien se convierte en Java Champion?

Por lo general y con el pasar de los años, la actividad que un desarrollador Java tenga en pro de la comunidad se nota y este es el primer paso para convertirse en JC, contribuir genuinamente con la comunidad Java.

El programa Java Champion funciona a través de sponsors, un JC existente puede proponerte como Java Champion si te considera apto para participar y tu trabajo ha impactado lo suficiente a la comunidad global Java. A lo interno cualquier JC puede crear una nominación incluyendo evidencia en los cinco criterios anteriormente descritos y puede ser apoyada por más de un sponsor. Luego la nominación es sometida a una votación donde la nominación se acepta o rechaza.

¿Que beneficios trae ser Java Champion y porqué alguien quiere participar del programa?

Como mencioné anteriormente, ser Java Champion es un premio y no un trabajo, por lo que básicamente ganas prestigio y también una nueva responsabilidad.

Personalmente el ser Java Champion me ha dado cinco beneficios directos:

  1. Tener un mejor contacto con las personas que hacen Java y contribuir con opiniones independientes a las plataformas que me han dado de comer por tantos años
  2. Oportunidades laborales diversas
  3. De tanto en tanto Oracle envía algunos «perks» como ropa personalizada con el logo de Java
  4. Hay empresas como JetBrains, Pluralsight, Packt que tienen programas de apoyo a la comunidad de desarrolladores. Por lo que entre otras cosas he recibido licencias de IntelliJ, libros para revisión, cursos gratis, créditos en Oracle Cloud
  5. Conocer el mundo mediante mi trabajo o participando en conferencias como expositor (muchas veces con gastos pagados) y hacer nuevos amigos

En el lado «negativo», me di cuenta que necesitaba ser más prudente con mis opiniones y actuar en Internet porque de pronto mucha más gente te sigue por el contenido técnico y sabe quien eres. Es parte de crecer supongo.

¿Como me convertí en Java Champion?

En su momento varios amigos que conocí en la comunidad de Java en Español se acercaron a mi para preguntarme si tenia interes en participar, sinceramente nunca fue mi intención convertirme en Java Champion porque yo ya creaba contenido comunitario por diversión desde el inicio de este blog.

Sin embargo algunos criterios que creo que pesaron en el programa fueron las siguientes:

  • Contribuir a mantener activo GuateJUG y JConf
  • Escribir periódicamente tutoriales aca y en otros sitios como DZone
  • Contribuir código en diversos proyectos Open Source
  • Participar como ponente en diversas conferencias grandes como Java One, TDC, Devnexus
  • Tener más de 10 años de experiencia en Java y estar certificado
  • Participar como tutor en varios MOOC de Java
  • Haber participado en un proyecto ganador del Duke’s Choice Award (el Oscar de Java)

En resumen, me gusta Java y siempre difundia lo que voy conociendo de la plataforma para que otros aprendan.

Va a sonar tonto pero en el principio de los tiempos, yo aprendí Java gracias a un bootcamp que se dio en la Universidad de San Carlos de Guatemala, y empecé a promover Java porque en ese entonces estaba en la onda Linuxera y no queria trabajar en .net/Windows (el más popular en mi país en ese entonces).

¿Vale la pena dedicar tanto trabajo para ser Java Champion?

La verdad es que depende de cada quien, yo conozco bastantes profesionales que son excelentes en Java y probablemente nunca expongan su trabajo al exterior o simplemente no les interese la comunidad Java, es algo común y sobre todo respetable.

En mi caso el ser Java Champion no fue algo que busqué sino una consecuencia de algo que yo ya hacia, crear contenido técnico en la plataforma que más me gusta trabajar y lo hago con gusto porque es uno de mis pasatiempos. Probablemente haria lo mismo aunque nunca me hubieran nombrado Java Champion.

Quiero ser Java Champion pero estoy en <<X>> país y siento que es para gringos

Yo estoy en Guatemala, al fondo de la tabla en todo, si yo pude cualquiera puede.

¿Que esperar y aprender de Java en 2022?

Continuando con una tradición que he ejecutado en 2020 y 2021, iniciare el año con mis predicciones acerca del ecosistema de la Java Virtual Machine. He visto que los post de años anteriores fueron bastante certeros entonces espero que este año no sea la excepción.

Spring impulsara a GraalVM Native

Como lo mencioné el año pasado, Spring presentó en 2021 su versión enfocada en compilación AOT (de la cual he hablado a detalle en un vídeo). Aunque Quarkus, Micronaut y Helidon ya destacaban en el frente AOT, debemos recordar que Spring sigue al día de hoy como el #1 en lo que respecta a frameworks Java.

El hecho que Spring impulse a GraalVM Native también debiera acelerar la aparición de bibliotecas reflectionless para que sean compatibles de forma «fácil» con la compilación nativa proveida por GraalVM Native, esto es genial para el ecosistema ya que no todos usamos Spring pero nos beneficiamos :).

Si aún no han experimentado con GraalVM Native, seguramente lo haran con Spring.

El fiasco de log4j se convertirá en FUD a Java

A menos que vivan bajo una piedra, si viven dentro del ecosistema de Java ya saben que hubo un gran agujero de seguridad en la biblioteca log4j, la cual permitió entre otras cosas ejecución remota de código, obteniendo así la mayor calificación de riesgo.

No fueron pocos los medios que reportaron su descubrimiento, incluso medios no enfocados en programación. De este episodio saco dos cosas:

  • Me parece impresionante como la gente declara a Java muerto, cuando al mismo tiempo un error en una biblioteca afectó a medio mundo. Incluyendo lugares donde uno no lo imagina como en el hardware de Cisco, básicamente la carretera de Internet.
  • Este error pudo pasar (y ya pasó) en otros ecosistemas, pero por lo extendido que está el uso de Java ha servido para propagar FUD al respecto de la plataforma y el lenguaje, sorprendente si se considera que el error fue parchado en tiempo record.

Debo resaltar que aunque el parche fue lanzado de forma inmediata, el origen de la mala reputación van a ser aquellos despliegues desatendidos y sin actualizaciones, aplicaciones con malas prácticas y poco control de dependencias. Una pena pero es lo que hay. Esto también lo resaltó el director de la NSA, pero es más fácil decir «me hackearon por usar Java vamonos a Elixir».

El ecosistema DevOps Java girara alrededor de Testcontainers, Docker y extensiones basadas en JUnit

Hemos recorrido un largo camino y sin miedo a equivocarme Java (junto a Maven) tienen uno de los mejores ecosistemas para flujos de trabajo DevOps.

Muchos de los conceptos inventados por JUnit (y TestNG) ahora son ubicuos en varios ecosistemas de software. Si han estado lo suficiente en Java probablemente han visto la siguiente evolución

Arquillian a mi punto de vista fue el último gran intento de estandarizar las practicas de integration test en Java Empresarial. Aunque sigue bastante vivo, he empezado a notar que cada framework también incluye su propio entorno de ejecución de tests basado en extensiones JUnit, lo vemos ya en:

¿Porqué JUnit?. JUnit es un estandar de facto para la creación de tests en Java y lo más importante, casi todos los entornos DevOps o CI/CD -e.g. Gihub, Gitlab, CircleCI, Jenkins- utilizan el formato de reportes de JUnit para flujos de trabajo basados en Java.

Uno de los temas pendientes en todos estos frameworks y bibliotecas siempre han sido las bases de datos, a principios de la decada pasada se popularizó el uso de bases de datos en memoria como H2 o Apache Derby, al punto de que en JakartaEE aún es requerido que se incluya una base de datos en memoria en los servidores de aplicaciones.

Aunque en principio los tests sobre H2/Derby son los suficientemente buenos para software creado con JPA, los problemas empiezan cuando queremos validar particularidades de cada base de datos, por ejemplo:

  • SQL Nativo
  • Índices (o la falta de)
  • Diferencias entre mayúsculas y minusculas
  • Comportamiento de pool de conexiones
  • Reactividad y drivers reactivos (o pseudo-reactivos)

Esto ha impulsado la adopción de Testcontainers (mi biblioteca favorita de 2021), que a grandes rasgos nos permite (de nuevo mediante JUnit) ejecutar contenedores Docker para desplegar o complementar nuestra aplicación, aprovisionar bases de datos de pruebas, o lanzar cualquier otro servicio que esté disponible como contenedor Docker.

Esta revolución a mi parecer inició con Arquillian Cube, pero Testcontainers ejecutó de forma más simple y funciona en cualquier entorno, no solo entornos basados en CDI.

Se detendrá la proliferación de Java Virtual Machines

Con el lanzamiento de Java 17, Oracle cambió nuevamente la licencia de SU JVM (aka HotSpot) la que de acuerdo a estadísticas propias, es la que la mayoría de la gente sigue usando.

Aunque siempre vale la pena leer la letra pequeña, lo cierto es que Oracle brinda más opciones para utilizar HotSpot de forma gratuita y para mucha gente esto es suficientemente bueno como para ya no plantearse una alternativa, siendo así deberíamos ver la muerte de algunas «distros Java».

¿No sabias que existen otras distros Java?, siempre es buena idea consultar la tabla de foojay, a mi parecer la más completa

MicroProfile se alineara más a CNCF

La «otra» gran alternativa a Spring es MicroProfile, aunque su adopción seguramente es menor, ha sido fuertemente impulsado por la popularidad de Quarkus.

Dicho esto, recordemos que el paso del espacio Cloud Native lo marca la Cloud Native Computing Foundation, y aunque existen esfuerzos para tener un punto central Cloud Native en el ecosistemas de Java, el ecosistema CNCF ya es lo suficientemente grande y maduro como para aceptar que las herramientas Java se tienen que alinear si quieren sobrevivir en un mundo cada vez más serverless y Kubernetico.

Esto la verdad no es necesariamente malo y en esta línea vemos como la apuesta de Jakarta EE es cada vez más Cloud Native y cada vez menos a lo que estábamos acostumbrados (app servers tradicionales, instalaciones on premise).

Por cierto no se pierdan mi curso gratuito de MicroProfile, directamente en el sitio del proyecto :).

Las «emociones» de la JVM se centraran en Loom, Panama y un poco menos en Valhalla

El cambio a Java modular fue por decirlo de una forma amable «doloroso», pero los que seguimos el carrito de lanzamientos hemos visto como las innovaciones llegan de forma más rápida a Java.

Luego de superar la velocidad de lanzamiento, migraciones de Java 8 a 11 y de 11 a 17 en algunos casos, lo que nos queda a los desarrolladores Java es aprovechar este flujo constante de actualizaciones, en esta línea veo que lo más emocionante viene de tres frentes:

Project Amber (mejoras en el lenguaje) ha presentado bastantes innovaciones y nos na tenido «tranquilos», pero lo realmente impresionante serán las posibles mejoras en escalabilidad proveidas por estos tres proyectos, desde mi trinchera les deseo muchos éxitos a los arquitectos de Java

Bienvenido 2022

Si llegaron hasta acá les deseo un 2022 lleno de Java, no tan lleno de pausas en el Heap y no olviden que estoy en muchas redes sociales:

Como pasé la certificación Certified Kubernetes Administrator

Esta es una experiencia de la certificación CKA por si alguien tiene dudas del proceso.

¿Que certificaciones para Kubernetes existen?

Partamos del hecho que Kubernetes en este momento es un proyecto Open Source donado por Google hacia la Cloud Native Computing Foundation. Al ser un producto Open Source pueden existir no una sino varias ofertas comerciales (que las hay) y en esa línea también diversas certificaciones, por lo que encontramos dos tipos:

Certificaciones de la implementación neutral (evaluadas por The Linux Foundation):

Certificaciones de una implementación en especifico, por ejemplo:

En el caso de las certificaciones neutrales se recomienda tomar CKS y CKA si su principal rol es SRE/sysadmin y CKAD si lo que pretenden hacer es desplegar aplicaciones Cloud Native.

¿Porqué obtener la certificación?

Las certificaciones son una eterna polémica en TI, siendo así establezcamos que para desempeñar un trabajo bien se necesitan dos cosas:

  • Experiencia (que viene con el tiempo y la práctica)
  • Conocimiento (que viene con el estudio)

Y el conocimiento en TI generalmente se demuestra en tres formas:

  • Diploma universitario
  • Certificaciones
  • Ejecución de pruebas técnicas

Tanto las certificaciones como los diplomas universitarios son a larga la validación de un tercero sobre el conocimiento, o sea una prueba técnica anticipada. Estas evaluaciones se realizan sobre una serie de tópicos generales (Universidad) o de una tecnología especifica (Certificaciones), la certificación o diploma universitario tendrá mas prestigio de acuerdo a quien la emite. Para poner un ejemplo no es lo mismo obtener la certificación Java de Oracle que de un proveedor de Mooc.

En otras palabras al obtener la certificación obtienes el sello de aprobación de The Linux Foundation de que sabes Kubernetes.

¿Porqué obtuve yo la certificación?

TL;DR Ver si me perdía de algo, también pereza de estar demostrando a cada rato que si se y pasé con 10 matemáticas, y es una forma monetaria de contribuir con The Linux Foundation obteniendo un beneficio, casi una teleton computina.

Siempre me he descrito como un desarrollador de software que se sabe uno que otro tango en Linux porque lo aprendió en la Universida’ de la Vida. Actualmente me dedico a consultorías con instituciones de banca, industria y gobierno, y en su mayoría mi equipo y/o yo participamos en desarrollo, implementaciones y acompañamiento en definición y arquitecturas de software tradicionales, Cloud Native y cualquier otro termino de marketing que surja en el futuro.

En el corto plazo y como ya he comprobado con otras certificaciones, son un atajo para conseguir contratos y brindar respaldo a los clientes, pero lo más importante evaluar si mi conocimiento está al nivel adecuado de mi experiencia, en Kubernetes en este caso (+/- 4 años).

Dificultad

Para mi la certificación más difícil que he tomado ha sido la certificación Oracle Certified Professional, Java SE 8 Programmer y sigue ahí. Si esa certificación es un 10, ubicaria CKA en un 7.

El examen de certificación tiene una duración total de 2 horas donde se realizan 17 tareas prácticas en al menos 6 clusters diferentes de Kubernetes, con una nota mínima de aprobación de 66%. La ejecución de estas tareas se utiliza una terminal dentro de un navegador Web (Chrome) la cual es bastante incomoda. Como estamos en COVIS toda prueba es remota con la camara encendida todo el tiempo y haciendo screensharing.

Durante el examen te permiten ver la documentación oficial de Kubernetes y Helm porque es imposible memorizar cada uno de los aspectos, pero al ser contra-reloj si no sabes que buscar estas frito (en esta línea recomiendo tener bookmarks).

Las tareas incluidas en mi examen fueron actualizaciones de clusters, troubleshooting, apertura de servicios al exterior mediante NodePorts e Ingress, backup de etcd, definición de políticas de seguridad y red, creación de volumenes de almacenamiento e instalación de un operador, pero puede variar.

Diria que el examen es bastante justo y refleja tareas básicas del día a día de un administrador Kubernetes, pero por mi experiencia creo que las personas lo fallan por los siguientes motivos:

  • No tienen buenas nociones de Linux
  • Hay que leer bien las instrucciones
  • Hay que darse cuenta en que cluster se está trabajado en cada pregunta, si no Ixcamic
  • Es contra reloj y a cada rato te dan advertencias que ya se te va ir la moto
  • Solo está permitida la consulta de recursos en dominios de internet aprobados (documentación de Kubernetes, Helm) y si no haces caso te anulan el test
  • Hay que saber usar bien vi o nano

¿Como me preparé para el test?

Esta sección es un poco difícil porque muchos recursos los fui usando durante el transcurso de los años pero me parecen útiles.

Antes de tomar la prueba el candidato debe de tener buena experiencia en Linux, no a nivel de compilar tu propio Kernel pero si un buen manejo de la terminal, sed, grep, awk, more, less, find, en otras palabras ser un buen Linuxero terminalero, en su momento hace muchos años en una galaxia muy muy lejana yo aprendí Linux por mi cuenta leyendo Linux Bible y también en la Universida’ de la Vida.

Para aprender Kubernetes en su momento compré el libro The Kubernetes Book de Nigel Poulton, es un buen libro introductorio y a excepción de la sección de seguridad (bastante incompleta) es un buen recurso que siempre recomiendo.

Aprovechando que tengo acceso a Oracle Cloud via Oracle Grounbreakers Ambassadors, me armé «a mano» via kubeadm un Cluster con dos nodos en OCI, esto lo pueden hacer también con Oracle Cloud Free Tier, con el objetivo de tener un entorno de pruebas. Muchas personas también recomiendan el tutorial Kubernetes the Hard Way de Kelsey HIghtower pero sinceramente eso solo lo hice una vez cuando empezaba a aprender Kubernetes, ante ese tutorial instalar Gentoo es fácil.

Si sumo los ratos libres donde iba haciendo mis pruebas probablemente ejecuté unas 20 horas de pruebas desperdigadas en 37 dias, la edad de mi clustercito de pruebas:

Al inicio de mi jornada compré el examen para tener una fecha límite y la oferta tenia acceso a Killer Shell con dos intentos. El primero sinceramente lo ejecuté sin humildad y lo perdí, pero me sirvió para identificar cosas no hago tan a menudo para reforzar esos conceptos, siendo en mi caso:

  • Definición de políticas de red
  • Backups de etcd
  • RBAC
  • Sidecars manuales
  • Edits de despliegues en línea de comandos

Al buscar recursos recordé que como Java Champion tengo acceso a Pluralsight VIP Subscription y durante esas 20 horas además de hacer mis pruebas, tomé el MOOC Configuring and Managing Kubernetes Security de Anthony Nocentino para ponerme a punto, y al intentar de nuevo pasé en killer.sh y posteriormente pasé el examen al primer intento (el examen trae dos intentos). La verdad por conocimiento hubiera querido tomar más MOOCs porqué pluralsight tiene un path completo de Kubernetes, pero soy una persona muy ocupada actualmente y:

Al final te dan este diploma: