Gonzalo Palavesino

Desarrollador de software. Java, Spring Boot, Oracle SQL.

Encuentro lo que está mal en el código y lo explico por escrito.

En NTT DATA lidero el desarrollo técnico de una plataforma de gobierno digital: más de 10 microservicios Spring Boot, cambios de datos en producción sobre Oracle, la migración a Java 17 y Spring Boot 3, análisis de incidentes y revisiones de código. Busco trabajo de entrenamiento y evaluación de IA que pida esos mismos hábitos: leer una respuesta con atención, encontrar qué está mal y explicarlo para que se pueda corregir.

En resumen

  • Software Engineer en NTT DATA desde noviembre de 2021.
  • Mendoza, Argentina (UTC−3).
  • Español: nativo. Inglés: intermedio-alto (B2), con lectura y escritura avanzadas.

Una respuesta de IA plausible, revisada

Un ejemplo construido: lo escribí para mostrar cómo reviso código. No proviene de un cliente ni de un proyecto de entrenamiento de IA.

Consigna App en Spring Boot 3. Dejar abierto /api/public/**, exigir autenticación en todo lo demás y responder 401 en lugar de redirigir a una página de login.

Mostrar
import javax.servlet.http.HttpServletResponse;@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {  @Override  protected void configure(HttpSecurity http) throws Exception {    http.authorizeRequests()        .antMatchers("/api/public/**").permitAll()        .anyRequest().authenticated()        .and()        .exceptionHandling()        .authenticationEntryPoint((req, res, e) ->            res.sendError(HttpServletResponse.SC_UNAUTHORIZED));  }}
import jakarta.servlet.http.HttpServletResponse;@Configuration@EnableWebSecuritypublic class SecurityConfig {  @Bean  SecurityFilterChain filterChain(HttpSecurity http) throws Exception {    http        .authorizeHttpRequests(auth -> auth            .requestMatchers("/api/public/**").permitAll()            .anyRequest().authenticated())        .exceptionHandling(ex -> ex            .authenticationEntryPoint((req, res, e) ->                res.sendError(HttpServletResponse.SC_UNAUTHORIZED)));    return http.build();  }}

Fragmento: se omiten el package y los imports de Spring.

Rúbrica

Hace lo que pide la consigna
Sí
Sí
Compila en Spring Boot 3
No, 6 errores, 3 causas raíz
Sí, sin advertencias
Usa las APIs actuales de Spring Security
No, 4 problemas
Sí

Veredicto Intención correcta, API desactualizada. Está escrita al estilo de Spring Security 5 y no compila en Spring Boot 3.El mismo comportamiento con la API actual: /api/public/** sigue abierto, el resto exige autenticación y las requests sin autenticar reciben un 401.

Para confirmar el veredicto, las dos versiones se compilaron con javac -Xlint:all contra las bibliotecas de Spring Boot 3.5.16 (Spring Security 6.5.11). Correr la verificación.

Notas de revisión

  1. javax.servlet no existe en Spring Boot 3

    Spring Boot 3 pasó a Jakarta EE, así que las clases de servlet están en jakarta.servlet. Falla el import y, con él, cada uso de HttpServletResponse.

    Fuente: Guía de migración a Spring Boot 3.0

  2. Se eliminó WebSecurityConfigurerAdapter

    Spring Security 6 quitó el adapter, y con él el override de configure. La seguridad ahora se declara como un bean SecurityFilterChain.

    Fuente: Blog de Spring, configurar la seguridad sin el adapter

  3. authorizeRequests() y exceptionHandling() están marcados para eliminación

    Las dos formas sin argumentos están deprecadas para su eliminación. Las reemplazan las versiones con lambdas, authorizeHttpRequests(…) y exceptionHandling(…), que además vuelven innecesario el encadenamiento con .and().

    Fuente: Referencia de Spring Security, autorización de requests HTTP

  4. antMatchers ya no existe

    Se eliminó en Spring Security 6. Lo reemplaza requestMatchers, que acepta los mismos patrones de ruta.

    Fuente: Referencia de Spring Security, autorización de requests HTTP

Dónde se cruza mi trabajo con el entrenamiento de IA

Las plataformas de entrenamiento de IA describen el trabajo como calificar y rankear respuestas, escribir rúbricas de evaluación y escribir prompts que hagan fallar a los modelos. Todavía no trabajé en un proyecto de entrenamiento de IA. Esta es la parte de mi trabajo en software que se transfiere, y de dónde viene.

  • Calificar y rankear respuestas de código

    Qué requiere: Ver cuándo un código convincente está mal, y decir qué respuesta es mejor y por qué.

    Experiencia más cercana: Revisiones de código como referente técnico del equipo. Liderar la migración a Java 17 y Spring Boot 3 me enseñó qué APIs cambiaron, un punto donde el código generado suele fallar.

  • Escribir rúbricas de evaluación

    Qué requiere: Convertir “bueno” en criterios explícitos que dos revisores apliquen de la misma manera.

    Experiencia más cercana: Checkpoints y evaluaciones de seguridad para los despliegues a producción. Seguimiento de la ejecución de pruebas de 31 procesos de negocio.

  • Escribir prompts que hagan fallar al modelo

    Qué requiere: Conocer un dominio lo suficiente como para preguntar en qué se va a equivocar una respuesta que suena segura.

    Experiencia más cercana: Seis años de Java y SQL en producción. Uso activamente herramientas de IA para programar y ayudé a incorporar Claude Code al flujo de trabajo del equipo.

  • Explicar errores y escribir correcciones

    Qué requiere: Precisar la causa y documentarla para que otra persona pueda actuar.

    Experiencia más cercana: Incidentes de producción rastreados hasta el código, los datos o la configuración con Kibana y Dynatrace. Documentación técnica, de arquitectura y de seguridad para los despliegues a producción.

  • Revisar respuestas en español

    Qué requiere: Criterio nativo sobre gramática, tono y usos regionales.

    Experiencia más cercana: Hablante nativo de español (Argentina). En NTT DATA, y antes en la Municipalidad de Mendoza, trabajé en software en español para el sector público.

Lo que no afirmo. Experiencia en proyectos de entrenamiento de IA o en ingeniería de machine learning. Lo que aporto son seis años construyendo software en producción y, desde 2021, revisándolo, verificándolo y documentándolo en NTT DATA.

Dominios de código. Java (de 8 a 21), Spring Boot, SQL y PL/SQL sobre Oracle, TypeScript con Angular.

Experiencia

Un hilo común. Todos mis puestos consistieron en desarrollar software para trámites administrativos: procesos municipales, flujos de negocio y los expedientes del gobierno de una ciudad.

Software EngineerNTT DATA Europe & LATAM

– actualidad, Argentina

Plataforma de expedientes digitales para el gobierno de una ciudad de Argentina, integrada con los sistemas de gestión documental y de expediente electrónico del gobierno.

  • Lidero el desarrollo técnico y el mantenimiento de más de 10 microservicios en Java 17 y Spring Boot 3 con frontend en Angular, desplegados en OpenShift en DEV, HML, QA y PRD.
  • Lideré la migración de Java 11 a 17 y de Spring Boot 2 a 3 (de javax a jakarta, Hibernate 6, Spring Security con SecurityFilterChain) y actualicé dependencias para cumplir los requisitos de seguridad del cliente.
  • Planifiqué la migración incremental del frontend de Angular 14 a 19, incluyendo RxJS 7 y Angular Material.
  • Desarrollo e integro servicios REST y SOAP con sistemas externos del gobierno, incluyendo el análisis de fallas de conectividad y propuestas de mecanismos de reintento.
  • Diseño y ejecuto scripts idempotentes en Oracle 19c (SQL y PL/SQL) para cargas y actualizaciones masivas en producción (MERGE, tablas temporales globales, verificación previa al DML). En un solo despliegue se procesaron más de 13.000 registros.
  • Coordiné el saneamiento de datos del entorno de QA en 73 tablas del esquema y el seguimiento de la ejecución de pruebas de 31 procesos de negocio.
  • Analizo incidentes de producción con logs y métricas en Kibana y Dynatrace, y rastreo la causa raíz hasta el código, los datos o la configuración.
  • Escribo documentación técnica, de arquitectura y de seguridad para los despliegues a producción, incluidos checkpoints y evaluaciones de seguridad, y colecciones de Postman de más de 200 requests para QA.
  • Administro repositorios y pipelines de CI/CD en GitLab, y hago el seguimiento del trabajo en Jira con metodologías ágiles.
  • Soy el referente técnico del equipo: comparto conocimiento, reviso código e impulso la incorporación de herramientas de IA (Claude Code) al flujo de trabajo.

No es público. El código, los datos y los documentos del cliente son confidenciales. En una entrevista puedo explicar los enfoques, no mostrar los artefactos.

OpenShift. La plataforma de Kubernetes de Red Hat. DEV, HML (homologación, el entorno de aceptación del cliente), QA y PRD son los cuatro entornos de la plataforma.

Idempotente. Un script que deja el mismo resultado si corre una o dos veces, así un reintento no duplica ni corrompe datos.

Desarrollador JavaCumbreSoft

– , Mendoza, Argentina

  • Desarrollé aplicaciones web en Java con ZK Framework y consultas SQL sobre bases de datos relacionales.
  • Automaticé trámites administrativos y flujos de procesos de negocio con Sayges y BonitaSoft (BPM).
  • Brindé soporte técnico a usuarios y clientes.

Pasante de desarrollo JavaMunicipalidad de la Ciudad de Mendoza

– , Mendoza, Argentina

  • Participé en la digitalización de procesos municipales con Sayges.
  • Desarrollé funcionalidades en Java con ZK Framework.

Trabajos seleccionados

Dos trabajos profesionales, descritos sin detalles del cliente, y un proyecto personal.

Llevar una plataforma a Java 17 y Spring Boot 3

Trabajo profesional en NTT DATA

Contexto. Una plataforma de expedientes digitales para el gobierno de una ciudad: más de 10 microservicios Spring Boot y un frontend en Angular sobre OpenShift, integrados por REST y SOAP con los sistemas documentales y de expedientes del gobierno.

Problema. Los servicios corrían en Java 11 y Spring Boot 2, y los requisitos de seguridad del cliente exigían dependencias actualizadas.

Mi parte. Lideré la migración: de Java 11 a 17, de Spring Boot 2 a 3, el cambio de espacio de nombres de javax a jakarta, Hibernate 6 y la configuración de Spring Security reescrita con SecurityFilterChain. También planifiqué el camino incremental del frontend de Angular 14 a 19.

Decisiones. El plan para el frontend es incremental y no de un salto: Angular se actualiza una versión mayor por vez, que es como funciona su propia herramienta de actualización.

Resultado. Los servicios corren en Java 17 y Spring Boot 3 con las dependencias actualizadas. El ejemplo del inicio de esta página muestra el tipo de incompatibilidades que resuelve esta migración.

En resumen. Jakarta EE renombró los paquetes javax.* de Java EE a jakarta.*, así que cada import de clases de servlets, persistencia o validación tuvo que cambiar.

No es público. No puedo mostrar código ni documentos del cliente.

Cambios de datos en producción que se pueden correr dos veces sin riesgo

Trabajo profesional en NTT DATA

Contexto. Algunos despliegues a producción necesitaban cargas y actualizaciones masivas de datos en Oracle 19c.

Mi parte. Diseño y ejecuto esos scripts, en SQL y PL/SQL.

Decisiones. Idempotentes por construcción: MERGE en lugar de inserts y updates a ciegas, tablas temporales globales para preparar los datos y consultas de verificación antes de cualquier DML. El objetivo es un script que se pueda volver a correr después de una interrupción sin duplicar ni corromper filas.

Resultado. Más de 13.000 registros procesados en un solo despliegue.

Tabla temporal global. Una tabla de Oracle cuyas filas solo ve la sesión que las insertó, y que desaparecen al hacer commit o al cerrar la sesión, según cómo se defina. Documentación de Oracle.

No es público. Los scripts y los datos pertenecen al cliente.

Project Duck: publicar un juego para Android

Proyecto personal, 2026

Contexto. Un proyecto personal: un juego idle clicker hecho con Godot Engine y publicado en Google Play bajo el sello BlackCorp.

Qué se publicó. Inicio de sesión con Google o email, progreso que acompaña al jugador a un teléfono nuevo, un ranking online, incursiones en los patios de otros jugadores, anuncios y compras dentro de la app.

Más allá del código. Publicar en una tienda es cumplir una larga lista de reglas ajenas: política de privacidad, términos del servicio, una página para borrar la cuenta, una clasificación de contenido, un archivo app-ads.txt para AdMob y créditos de licencias para Godot y sus componentes de terceros. Todo eso está publicado.

Por qué está acá. El trabajo de anotación y evaluación se basa en guías detalladas. Publicar una app respetando las políticas de una tienda obliga a seguirlas al pie de la letra.

Es público. La ficha de la tienda, y el sitio del juego con sus páginas de políticas y los créditos del motor, los plugins, las tipografías y los sonidos hechos por terceros.

No es público. El código fuente del juego.

Herramientas y tecnologías

Agrupadas según dónde las usé, para que quede claro cuáles tienen peso en producción.

En mi puesto actual en NTT DATA
  • Java 17
  • Spring Boot 3
  • Spring Security
  • Hibernate 6 y JPA
  • REST
  • SOAP
  • Oracle Database 19c
  • SQL
  • PL/SQL
  • Angular
  • TypeScript
  • RxJS
  • Angular Material
  • OpenShift
  • Kubernetes
  • GitLab CI/CD
  • Kibana
  • Dynatrace
  • Postman
  • Jira
  • Claude Code
Otras herramientas que manejo
  • Java 8, 11 y 21
  • Spring Cloud Config
  • Maven
  • JUnit
  • Lombok
  • DBeaver
  • Docker
  • Tomcat
  • Git
  • Linux
  • JavaScript
  • Python
  • HTML
  • CSS
  • Bootstrap
  • TDD
  • Scrum
Puestos anteriores
  • ZK Framework
  • BonitaSoft (BPM)
  • Sayges
Proyectos personales
  • Godot Engine

Formación e idiomas

  • Licenciatura en Informática y Desarrollo de SoftwareUniversidad del Aconcagua. Incompleta.
  • Ingeniería en InformáticaUniversidad de Mendoza. Tres años cursados.
  • Técnico en Reparación y Mantenimiento de PC y RedesInstituto Escuelas Newton
  • Bachiller en Humanidades y Ciencias SocialesEscuela Secundaria Maestro Alfredo Bravo

Idiomas

Español
Nativo
Inglés
Intermedio-alto (B2): lectura y escritura avanzadas, conversación intermedia

Contacto

El email es la mejor forma de contactarme, en español o en inglés.

Mendoza, Argentina. UTC−3.

Disponible para proyectos remotos de entrenamiento y evaluación de IA, y para puestos de desarrollo de software.