{
  "basics": {
    "name": "Carlos Gude Sánchez",
    "title": "Senior Backend Engineer & Software Architect",
    "focus": ["PHP", "Symfony", "Modernización de legacy", "Integraciones con APIs", "DDD / Hexagonal"],
    "summary": "Senior Backend Engineer y Software Architect con más de 10 años construyendo y modernizando sistemas PHP/Symfony, incluidas plataformas distribuidas de alto volumen. Especializado en migrar sistemas legacy críticos sin interrupción del servicio, en hacer que los cambios sean seguros mediante tests y análisis estático integrados en CI, y en diseñar capas de integración con APIs externas. Experiencia en producción en logística, viajes, transporte público y SaaS para retail; autor del bundle open source IntegrationEngine.",
    "location": {
      "city": "Cambados",
      "region": "Pontevedra",
      "country": "España",
      "timezone": "CET"
    },
    "availability": "Abierto a puestos 100 % remotos",
    "contact": {
      "email": "carlos.sgude@gmail.com"
    },
    "profiles": [
      { "network": "GitHub", "username": "CarlosGude", "url": "https://github.com/CarlosGude" },
      { "network": "LinkedIn", "username": "carlos-gude", "url": "https://www.linkedin.com/in/carlos-gude/" }
    ],
    "cv": { "file": "Carlos_Gude_Sanchez_CV_ES.pdf", "language": "es", "sizeKb": 82 }
  },
  "highlights": [
    { "value": "100+", "label": "endpoints migrados sin interrupción del servicio", "context": "PrimeIT · PHP 7.4 / Symfony 4 → PHP 8.3 / Symfony 6" },
    { "value": "300K+", "label": "mensajes por minuto", "context": "Auro · posicionamiento de repartidores con alta concurrencia" },
    { "value": "15+", "label": "integraciones con APIs externas en producción", "context": "Más de 10 en Auro y más de 5 en Quadrant TravelTech" },
    { "value": "−93 %", "label": "baseline de PHPStan a nivel 9", "context": "Datcisions · de 3.339 a 239 errores" }
  ],
  "topics": {
    "integrations": "Integraciones",
    "modernisation": "Modernización",
    "quality": "Calidad",
    "security": "Seguridad",
    "realtime": "Mensajería y tiempo real"
  },
  "experience": [
    {
      "company": "Datcisions",
      "role": "Senior Backend Engineer",
      "start": "2026-07",
      "end": "2026-09",
      "sector": "SaaS para retail",
      "context": "SaaS de planificación de stock y compras para marcas de moda y retail. Encargo de duración definida centrado en la calidad y la modularización de la plataforma.",
      "topics": ["quality", "modernisation", "integrations", "security"],
      "achievements": [
        "Subí PHPStan en la plataforma principal del nivel 5 al 9 y reduje la baseline de nivel 9 de 3.339 a 239 errores (−93 %).",
        "Recuperé una suite de tests que ya no se ejecutaba y la amplié a más de 2.100 tests en verde.",
        "Modularicé el monorepo en bundles de Symfony: separé IAM y el control de acceso de Security, repartí 127 migraciones entre módulos y eliminé 53.000 líneas de código muerto en el proceso.",
        "Construí desde cero el conector con el ERP en la nube Holded y lo llevé a producción en 11 días, con PHPStan y PHP-CS-Fixer como puertas de calidad en CI.",
        "Detecté y corregí dos vulnerabilidades IDOR en una revisión de seguridad por iniciativa propia."
      ]
    },
    {
      "company": "PrimeIT",
      "role": "Senior Backend Engineer",
      "start": "2025-04",
      "end": "2026-06",
      "sector": "Consultoría tecnológica",
      "context": "Consultora tecnológica internacional.",
      "topics": ["modernisation", "security"],
      "achievements": [
        "Lideré la migración sin interrupción del servicio de un sistema legacy con más de 100 endpoints, de PHP 7.4 / Symfony 4 a PHP 8.3 / Symfony 6, usando agentes de programación con IA para los refactors mecánicos, con cada cambio validado por tests y análisis estático.",
        "Reescribí la autenticación con el componente Security nativo de Symfony, eliminando las vulnerabilidades del modelo anterior."
      ]
    },
    {
      "company": "Quadrant TravelTech",
      "role": "Backend Engineer, Integrations",
      "start": "2023-05",
      "end": "2025-03",
      "sector": "Viajes",
      "context": "A través de Interacso de mayo de 2023 a enero de 2024; después, contratado directamente por Quadrant.",
      "topics": ["integrations"],
      "achievements": [
        "Diseñé e implementé más de 5 integraciones de viajes, entre ellas Booking.com, Iberia, Lleego y Hostalia.",
        "Construí una capa de integración multiproveedor en la que se podían añadir proveedores nuevos sin cambiar el core."
      ]
    },
    {
      "company": "Auro",
      "role": "Backend Engineer",
      "start": "2021-03",
      "end": "2023-03",
      "sector": "Logística",
      "context": "Plataforma de logística de última milla.",
      "topics": ["integrations", "realtime"],
      "achievements": [
        "Desarrollé e integré más de 10 APIs de partners externos para una plataforma de logística de última milla con seguimiento de envíos en tiempo real.",
        "Diseñé la capa de eventos y mensajería que coordinaba varios transportistas y procesaba más de 300.000 mensajes por minuto para el posicionamiento de repartidores con alta concurrencia (RabbitMQ, SQS y Symfony Messenger, con consumidores idempotentes)."
      ]
    },
    {
      "company": "Jamenet",
      "role": "Backend Engineer, project-based",
      "start": "2020-06",
      "end": "2021-03",
      "sector": "Transporte público",
      "context": "Metro Bilbao.",
      "topics": ["integrations", "realtime"],
      "achievements": [
        "Construí la integración Drupal–Symfony–Vue para Metro Bilbao, un sistema 24/7 que da servicio a tráfico real de pasajeros.",
        "Implementé el procesamiento masivo en tiempo real de datos de líneas y horarios."
      ]
    }
  ],
  "earlierExperience": [
    {
      "company": "Freelance",
      "role": "Plataforma de streaming en tiempo real",
      "start": "2020-01",
      "end": "2020-06",
      "sector": "Streaming en directo",
      "topics": ["realtime"],
      "summary": "Desarrollo integral en solitario de una plataforma tipo Twitch: chat en directo con WebSockets, streaming de vídeo con WebRTC, pagos con Stripe, PayPal y Redsys, economía virtual y moderación."
    },
    {
      "company": "Syntelix",
      "role": "Backend Engineer",
      "start": "2019-05",
      "end": "2020-01",
      "sector": "Telemetría marítima",
      "topics": ["realtime"],
      "summary": "Pipelines de ingesta en tiempo real y mensajería ordenada y sin pérdidas para telemetría marítima."
    },
    {
      "company": "Card2Card",
      "role": "Full-stack Symfony Developer",
      "start": "2017-11",
      "end": "2019-05",
      "sector": "SaaS de e-commerce",
      "topics": [],
      "summary": "Único responsable técnico de una plataforma SaaS de e-commerce personalizable."
    },
    {
      "company": "Freelance",
      "role": "Desarrollo web y backend PHP",
      "start": "2012",
      "end": "2017",
      "sector": "Clientes diversos",
      "topics": [],
      "summary": "Más de 10 proyectos para pymes locales, agencias, e-commerce y clientes de turismo y hostelería."
    }
  ],
  "projects": [
    {
      "name": "IntegrationEngine",
      "type": "Bundle open source para Symfony",
      "role": "Autor y mantenedor",
      "license": "MIT",
      "requires": { "php": "8.2+", "symfony": "6.4 / 7 / 8" },
      "topics": ["integrations", "quality"],
      "summary": "Una estructura común para construir y mantener integraciones con APIs externas en Symfony.",
      "motivation": "Cada vez que integraba una API externa en Symfony, volvía a resolver piezas parecidas: autenticación, peticiones HTTP, mapeo de respuestas y gestión de errores. Además, cada integración tendía a organizarse con sus propias convenciones. IntegrationEngine nació de esa experiencia.",
      "model": [
        "Cada operación contra la API externa es una Action.",
        "Un Mapper transforma la respuesta externa en un objeto Response tipado.",
        "El bundle se encarga del flujo común: configuración, autenticación y transporte HTTP.",
        "Cada integración conserva los detalles específicos de su proveedor."
      ],
      "flow": ["Action + Context", "IntegrationEngine", "API externa", "Mapper", "Response tipada"],
      "goal": "Una forma de trabajar repetible —contratos claros y una estructura coherente— basada en problemas que me he encontrado en producción. Los proveedores siguen siendo distintos; el bundle da a esas diferencias un lugar predecible.",
      "links": [
        { "label": "Código en GitHub", "url": "https://github.com/CarlosGude/integrationEngine" },
        { "label": "Packagist", "url": "https://packagist.org/packages/carlosgude/integration-engine" },
        { "label": "integrationengine.dev", "url": "https://integrationengine.dev/" }
      ],
      "example": {
        "title": "Obtener una película de TMDB",
        "origin": "Tomado de la aplicación de demo",
        "source": "https://github.com/CarlosGude/integrationEngine-demo/tree/main/src/Integrations/Tmdb",
        "steps": [
          { "title": "Declarar la operación", "description": "Método, ruta y mapper de la action get_movie.", "file": "src/Integrations/Tmdb/Tmdb.yaml", "snippet": "data/examples/tmdb/get-movie.yaml", "language": "yaml" },
          { "title": "Llamarla desde la aplicación", "description": "Una fachada pequeña mantiene el engine fuera de controladores y servicios.", "file": "src/Integrations/Tmdb/TmdbIntegration.php", "snippet": "data/examples/tmdb/TmdbIntegration.getMovie.php", "language": "php" },
          { "title": "TMDB responde con su propio modelo", "description": "El fixture de test que usa la demo para esta llamada: 25 campos, la mayoría innecesarios para la aplicación.", "file": "tests/Catalog/Infrastructure/Integrations/Tmdb/Fixtures/get-movie.json", "snippet": "data/examples/tmdb/get-movie.fixture.json", "language": "json" },
          { "title": "El Mapper se queda con lo que usa la aplicación", "description": "Los nombres de campo del proveedor se quedan aquí; el resto del código solo ve la respuesta tipada.", "file": "src/Integrations/Tmdb/Mappers/GetMovieMapper.php", "snippet": "data/examples/tmdb/GetMovieMapper.transform.php", "language": "php" },
          { "title": "Respuesta tipada", "description": "GetMovieResponse::toArray() para el fixture anterior.", "file": "GetMovieResponse", "snippet": "data/examples/tmdb/GetMovieResponse.toArray.json", "language": "json" }
        ]
      }
    },
    {
      "name": "IntegrationEngine Demo",
      "type": "Aplicación Symfony",
      "role": "Autor",
      "license": "MIT",
      "requires": { "php": "8.4+", "symfony": "7.4" },
      "topics": ["integrations", "quality"],
      "summary": "Aplicación de referencia ejecutable que usa el bundle contra APIs reales, incluidas peticiones concurrentes con una aceleración medida de 5–13× frente a las llamadas secuenciales.",
      "covers": [
        "REST · TMDB",
        "GraphQL · Countries",
        "CSV · Supplier",
        "Peticiones form-encoded y webhooks firmados de Stripe"
      ],
      "notes": [
        "Cargas concurrentes con sendMany() y aislamiento de fallos parciales; aceleración medida de 5–13× para 20 cargas de películas concurrentes frente a la ejecución secuencial.",
        "Bounded contexts y gateways aíslan las integraciones del código de negocio.",
        "La CI exige tests, PHPStan max, PHP-CS-Fixer, Deptrac, validación de instalación en producción / Docker y mutation testing."
      ],
      "links": [
        { "label": "Código en GitHub", "url": "https://github.com/CarlosGude/integrationEngine-demo" }
      ]
    }
  ],
  "skills": [
    { "group": "Arquitectura", "items": ["Hexagonal", "DDD", "Clean Architecture", "Event-Driven", "CQRS"] },
    { "group": "Backend", "items": ["PHP 8.x", "Symfony 6 / 7 / 8", "API Platform", "Doctrine", "REST", "Webhooks"] },
    { "group": "Calidad", "items": ["TDD", "PHPUnit", "PHPStan", "Infection", "Deptrac", "PHP-CS-Fixer", "SonarQube"] },
    { "group": "Infraestructura", "items": ["RabbitMQ", "SQS", "Docker", "CI/CD con GitHub Actions", "Linux"] },
    { "group": "Bases de datos", "items": ["MySQL", "PostgreSQL", "Redis"] },
    { "group": "Desarrollo asistido por IA", "items": ["Agentes de programación con IA para refactors, generación de tests, migraciones, revisión de código y documentación, con cada cambio validado por PHPStan max, Deptrac, mutation testing y revisión de código humana"] }
  ],
  "languages": [
    { "language": "Español", "level": "Nativo" },
    { "language": "Inglés", "level": "Competencia profesional" }
  ],
  "education": [
    { "title": "Técnico Superior en Administración de Sistemas Informáticos en Red", "start": "2010", "end": "2012", "note": "Nivel 5 del Marco Europeo de Cualificaciones (EQF)" },
    { "title": "Autodidacta", "summary": "PHP, Symfony y arquitectura de software, aprendidos de forma autodidacta.", "note": "Formación continua en arquitectura, DDD y el ecosistema PHP/Symfony, aplicada en proyectos profesionales y open source." }
  ]
}
