Backend Developer
Desarrollador enfocado en Spring Boot. Apasionado por la optimización de rendimiento y la construcción de sistemas modulares y mantenibles.
Desarrollador backend enfocado en Spring Boot y código limpio y escalable. Actualmente colaboro como Coordinador Digital de Proyecto Dubini, una organización juvenil centrada en el cambio climático y la sostenibilidad, donde gestiono la plataforma digital y los problemas relacionados con TI.
Me apasiona el desarrollo backend, la optimización del rendimiento y la construcción de sistemas modulares y mantenibles. Siempre curioso, siempre aprendiendo.
Empecé a programar a los 13 años utilizando plugins-frameworks de Minecraft Java. Mediante el despliegue de servidores basados en la nube con un número significativo de usuarios simultáneos, aprendí conceptos importantes como la depuración de errores, la gestión de recursos y cómo administrar y mantener un servicio de forma profesional.
Para maximizar la entrega de valor, aplico metodologías de AI-Augmented Software Engineering (CDD). Entendiendo que la IA te amplifica a ti, tanto tu velocidad como tus errores y huecos de conocimiento, el pilar innegociable de mi flujo de trabajo es establecer la arquitectura y la base del código al 100%. Al garantizar un contexto inicial perfecto y sin fisuras, evito que la IA alucine o arrastre errores. A partir de ahí, orquesto agentes para escalar el desarrollo, respaldados por Quality Gates automatizados.
📍 La Laguna, Santa Cruz de Tenerife
Desarrollo end-to-end de una plataforma de publicaciones con arquitectura distribuida. El sistema cuenta con un proveedor frontend que sirve archivos estáticos y cachea los contenidos, y un Backoffice para edición y administración de contenido.
La comunicación entre servicios es asincrónica mediante WebFlux y está protegida con JWT.
Implementación de un sistema de caché inteligente con Caffeine (memoria + persistente en disco), circuit breaker e invalidación por evento. El servicio proveedor de frontend sirve contenido directamente desde caché y continúa operativo incluso si el servicio backoffice cae temporalmente.
Gracias a este caché de doble capa se redujo el consumo de ancho de banda una cantidad considerable, permitiendo operar dentro del plan gratuito del host sin comprometer la disponibilidad.
Despliegue automatizado mediante pipeline CI/CD, con compilación nativa de servicios, construcción de imágenes Docker optimizadas y despliegue en segundos, garantizando rapidez y eficiencia.
Incluye despliegue real en dominio propio, siguiendo buenas prácticas de arquitectura y DevOps.
Plataforma de gestión de inventario predictiva para economatos educativos, con arquitectura de microservicios: backend transaccional en Spring Boot 4.0 / Java 25 (virtual threads, ZGC Generational, ScopedValue) y microservicio de forecasting en Python / FastAPI con Meta Prophet. Arquitectura hexagonal con CQRS: segregación lectura/escritura mediante PostgreSQL Primary + Replica con enrutamiento automático por AOP.
Lideré el desarrollo del equipo de 4 personas encargado del frontend en Angular, coordinando la implementación de funcionalidades clave y la integración con el backend.
Blockchain real para registro de stock inmutable, Merkle Trees con verificación O(log n) y encadenamiento HMAC-SHA256. Cada bloque agrupa transacciones del mempool, calcula su Merkle root y se sella en bloques encadenados (blockchain). Inmutabilidad reforzada con triggers PostgreSQL que impiden UPDATE/DELETE a nivel de base de datos. Analítica predictiva de consumo con Meta Prophet (forecasting a 14 días configurable) ejecutada en microservicio Python asíncrono, con Holt-Winters Triple Exponential Smoothing como fallback en Java.
Arquitectura event-driven con patrón Transactional Outbox y Kafka (modo KRaft) para entrega garantizada de eventos de auditoría. Caché multicapa (Redis + Caffeine) con degradación elegante y circuit breakers (Resilience4j) para PostgreSQL, Replica, Redis y Kafka, con alertas en tiempo real al frontend vía WebSocket.
Seguridad con JWT (HMAC SHA-256), blacklist con fallback Redis→DB, escalado temporal de roles y autorización a nivel de método. Generación de PDFs con iText 8, exportación Excel con Apache POI, internacionalización (i18n) y documentación interactiva con Swagger/OpenAPI y Scalar.
Observabilidad completa con Prometheus, Grafana y Micrometer. Dockerización de 10 servicios (PostgreSQL Primary/Replica, Redis, Kafka KRaft, Spring Boot, FastAPI Prophet, Prometheus, Grafana). Suite de 1000 tests: unitarios, integración con Testcontainers, concurrencia, resiliencia end-to-end y circuit breaker.
Proyecto de aprendizaje: plataforma de mensajería en tiempo real desarrollada con Node.js, con autenticación JWT, roles Admin/Usuario, hash de contraseñas con bcryptjs y rutas protegidas mediante middleware. Endpoints RESTful en Express.js y conexión a MySQL mediante connection pooling.
Comunicación en tiempo real con WebSockets usando Socket.io, con persistencia básica de mensajes y seguimiento del estado en línea. Se aplicaron buenas prácticas de seguridad como validación de entradas con express-validator y manejo de errores asincrónico.
Diseño de un flujo de trabajo (workflow) híbrido impulsado por Inteligencia Artificial. Dado que los LLMs son sistemas probabilísticos, no determinísticos; generan la salida estadísticamente más probable, no necesariamente la más robusta o correcta, mi metodología exige una estricta intervención humana (Human-in-the-Loop). Yo diseño la base y prevengo vulnerabilidades, la IA escala el código, y un proceso automatizado valida la calidad final.
Sistema de tolerancia a fallos para un backend con 4 servicios de infraestructura (PostgreSQL Primary, PostgreSQL Replica, Redis, Kafka). Diseñado para que la aplicación siga operativa aunque uno o varios servicios caigan, con detección proactiva, degradación elegante y notificación en tiempo real al frontend.
Un backend con CQRS (escritura en Primary, lecturas en Replica), caché distribuida en Redis y eventos de auditoría via Kafka tiene múltiples puntos de fallo. Un timeout de Redis o una caída de la réplica no deberían provocar errores 500 al usuario.
4 Circuit Breakers independientes (Resilience4j) monitorizan cada servicio. Un HealthChecker proactivo testea las conexiones cada 3-5 segundos y abre el circuit breaker antes de que una petición real falle. Al detectar caída o recuperación, se publica un Spring Event que un WebSocketNotificationService traduce a alertas STOMP al frontend.
ScopedValue (Java 25), sin cambiar una línea de
código de negocio.
CircuitBreakerAwareCacheManager envuelve cada
operación Redis. Con el CB abierto, toda operación de caché se
convierte en cache-miss: la app sigue funcionando sin caché.
Cada 3-5s se testean DB, Replica, Redis y Kafka. Si falla, se abre el Circuit Breaker inmediatamente.
Resilience4j emite un evento de transición (CLOSED→OPEN). Un
listener lo traduce a CircuitBreakerOpenEvent.
El servicio de notificaciones envía un código de alerta
(DB_FAILURE, REDIS_FAILURE...) vía
STOMP a /topic/alerts. Al reconectar, el
frontend recibe el estado actual de todos los CBs.
Cada 10-15s se testea la recuperación del servicio caído. Si
responde, se cierra el CB y se envía
*_RECOVERED al frontend.
DB_FAILURE,
REDIS_RECOVERED, etc.).
@Cacheable no lanza excepción con Redis CB abierto.
Arquitectura diseñada para zero-downtime parcial: cualquier servicio auxiliar puede caer sin producir errores al usuario. La detección proactiva (health checks cada 3s) reduce el tiempo medio de detección frente al enfoque reactivo tradicional, y el WebSocket permite al frontend mostrar banners informativos en vez de errores genéricos.
Sistema de caché multicapa diseñado para minimizar peticiones al backend, reducir ancho de banda y mantener la experiencia del usuario durante caídas o mantenimiento del backoffice. Pensado para Proyecto Dubini (Asociación medioambiental juvenil): menor tráfico → menor consumo energético.
Doble capa de caché: Caffeine en memoria para acceso inmediato y una caché persistente en disco como respaldo. El frontend provider precarga contenido crítico al arranque para operar de forma autónoma si el backoffice no está disponible.
Primera consulta a Caffeine para acceso inmediato.
Solicitud al backoffice y almacenamiento en caché cuando no existe el dato en memoria.
Fallback desde disco si la memoria y el backoffice no responden.
El endpoint api/news/last compara ETags
precalculadas para indicar si hay cambios. Respuestas mínimas:
304 Not Modified (sin transferencia) o
200 OK
si hay contenido nuevo. Las ETags se almacenan localmente para
evitar latencia de cálculo.
Service Worker que cachea recursos estáticos (HTML, CSS, JS) y datos esenciales, habilitando funcionamiento offline y reduciendo peticiones repetidas.
El sistema reduce drásticamente el consumo de ancho de banda gracias a que el contenido se sirve casi siempre desde caché. El cálculo es el siguiente:
Peso primera carga: 60 KB.
Peso cargas posteriores: 200 B.
Para 30 000 usuarios, cada uno realizando 10 visitas:
Consumo total ≈ 1.85 GB.
En un sistema sin caché inteligente, cada visita costaría 60 KB:
Reducción: 18 GB → 1.85 GB (≈ −89.7%).
Esto justifica matemáticamente la mejora reportada en las métricas.
Arquitectura diseñada para desacoplamiento y eficiencia: el frontend puede funcionar con contenido cargado previamente y el frontend provider opera independientemente del backoffice. Prioriza resiliencia, simplicidad y reducción de huella energética.
Mejoré significativamente los tiempos de despliegue y arranque en frío de un servicio Spring Boot mediante técnicas avanzadas de compilación nativa y automatización de pipelines.
Inicialmente, el proyecto tenía tiempos de deploy de 5 minutos y cold-start de 1,5 minutos, causando errores por timeout y una experiencia de despliegue poco eficiente.
Workflow de CI/CD: GitHub Actions .
Imagen Docker optimizada: Docker Hub .
Dockerfile utilizado: Dockerfile.native-simple .
(Este es uno de los servicios optimizados; ambos tienen configuraciones idénticas.)
La combinación de compilación nativa, ajustes de compatibilidad y pipeline automatizado permitió despliegues en segundos y cold-starts prácticamente instantáneos. Esta optimización demuestra capacidad para diseñar soluciones que integran rendimiento, DevOps y arquitectura de servicios de manera eficiente.