De código legacy a estándares modernos: transformando la infraestructura de Holafly

Eliminar la dependencia de conocimiento concentrado

El éxito comercial puede convertirse en una trampa. Holafly, empresa española líder en soluciones de conectividad para viajeros con operaciones en más de 180 países y atención al cliente 24/7, experimentó un crecimiento exponencial que expuso las debilidades de su infraestructura. Lo que funcionaba para unos pocos clientes se convirtió en un lastre cuando la escala se multiplicó.

En este contexto surgió la necesidad de un partner tecnológico que modernizara su infraestructura sin detener el negocio. Necesitaban profesionalizar el desarrollo, eliminar el conocimiento aislado en unos pocos desarrolladores y establecer estándares de calidad que permitieran escalar sin acumular más deuda técnica.

Nuestra solución fue implementar mejoras incrementales de alto impacto: desde 0% a 90% de test coverage, adopción de Open Telemetry para observabilidad moderna, y sacar a producción en menos de 1 semana un proyecto bloqueado durante meses. El resultado: una operación profesional preparada para crecer.

Escalar con una infraestructura que no estaba preparada

Holafly enfrentaba el dilema clásico de las empresas de rápido crecimiento: su éxito comercial superó la capacidad de su tecnología. La deuda técnica acumulada amenazaba su capacidad de seguir innovando. Para transformar esta situación, necesitaban un partner que les ayudara a enfrentar cuatro desafíos principales.

Eliminar la dependencia de conocimiento concentrado

Solo unos pocos desarrolladores conocían el funcionamiento crítico del sistema. No había documentación formal ni procesos de onboarding efectivos. El conocimiento estaba en las cabezas de unas pocas personas, creando cuellos de botella ante cualquier ausencia o salida.

Implementar estándares profesionales de calidad

La situación técnica era preocupante:

  • 0% de test coverage: ninguna línea de código tenía pruebas automatizadas
  • Ausencia total de tipado: errores en tiempo de ejecución por variables mal usadas y métodos con parámetros incorrectos
  • Cada despliegue era un salto al vacío, confiando únicamente en pruebas manuales

Modernizar la observabilidad del sistema

Los protocolos de trazas estaban deprecados y el monitoreo era prácticamente inexistente. El equipo operaba a ciegas: identificar el origen de una incidencia podía tomar horas o días. La arquitectura incluía el uso innecesario de PM2 en Kubernetes, causando pérdida de trazas.

Desbloquear proyectos críticos paralizados

La nueva plataforma de soporte llevaba meses estancada sin lograr salir a producción. La aplicación mostraba datos mockeados, las APIs no funcionaban y el equipo no sabía cómo avanzar. La frustración crecía y la confianza disminuía.

Modernización incremental sin bloquear el negocio

Nuestra estrategia fue clara: implementar testing, tipado y observabilidad sin reescribir código existente ni detener el desarrollo en curso. Cada decisión respondió al mismo principio: resultados medibles en semanas, no en trimestres.

El corazón de nuestra solución se construyó sobre tres pilares: calidad, observabilidad y ejecución rápida.

Tests de integración y tipado incremental

El primer obstáculo fue cultural. El equipo de arquitectura se mostraba reacio a adoptar TypeScript. Nuestra respuesta: implementar tipado mediante jsconfig.json, detectando typos y errores de parámetros sin cambiar el stack tecnológico.

El verdadero reto era el testing. Con 0% de coverage y una librería propietaria que no soportaba bien las pruebas, diseñamos una estrategia de tests de integración black-box:

  • Validación del comportamiento completo de cada endpoint
  • Documentación viva del comportamiento esperado del sistema
  • Detección de casos de uso no probados y flujos incorrectos
  • Red de seguridad para futuros cambios

El resultado: cobertura de entre 50% y 90% en servicios críticos. El equipo aprendió a escribir y mantener tests, eliminando la dependencia de validación manual en cada despliegue.

Ingeniería inversa de la librería propietaria

Para mejorar la trazabilidad, necesitábamos acceder al código fuente de la librería propietaria que gestionaba todos los BFF. Usando ingeniería inversa y análisis exhaustivo del node_modules, logramos entender su funcionamiento interno y solicitamos formalmente acceso al repositorio. Una vez conseguido:

  • Migración al estándar Open Telemetry, soportado y mantenido por la comunidad
  • Eliminación del uso innecesario de PM2 en clusters de Kubernetes
  • Monitorización efectiva en tiempo real

El equipo pasó de operar a ciegas a tener visibilidad completa de cada servicio.

Reestructuración completa del proyecto bloqueado

El mayor éxito fue desbloquear la plataforma de soporte. El equipo llevaba meses sin conseguir llevarla a producción. Al hacernos cargo, conseguimos:

  • Reestructuración completa de APIs y endpoints
  • Creación de 6 pantallas nuevas y 8 endpoints funcionales con tests
  • Uso estratégico de IA (Cursor) para acelerar el maquetado
  • Definición clara del alcance con backlog estructurado

En menos de 1 semana, la plataforma estaba en producción. En 2 semanas, teníamos un MVP completo y funcional.

Ingeniería inversa y adopción de estándares

El proyecto requirió superar obstáculos técnicos complejos: una librería propietaria sin documentación, un entorno hostil para testing y la necesidad de modernizar sin pausar el desarrollo. Las soluciones aplicadas no solo resolvieron estos problemas, sino que establecieron nuevas capacidades en el equipo.

Retos técnicos superados

Cada obstáculo requirió un enfoque diferente. No bastaba con aplicar buenas prácticas estándar: había que adaptarlas a un entorno con restricciones técnicas y culturales específicas.

  • Librería propietaria sin documentación: Aplicamos ingeniería inversa sobre una librería crítica heredada de Ikea, sin acceso al código fuente ni documentación pública. El código estaba en el ordenador personal del arquitecto principal. Usando herramientas de análisis estático y dinámico, entendimos su funcionamiento e implementamos mejoras sin romper nada.
  • Testing en entorno hostil: La librería no estaba diseñada para ser testeada. Diseñamos tests black-box que validaban comportamiento sin necesidad de entender detalles internos. Creamos pipelines para ejecutar estos tests en cada PR, pasando de 0% a 50-90% de coverage.
  • Modernización sin detener desarrollo: Cada mejora se implementó sin pausar sprints ni bloquear al equipo. Usamos feature flags y despliegues progresivos para validar cambios sin interrumpir la operación.
  • Cambio cultural en el equipo: Pasamos de un equipo reacio al testing a uno que escribe tests en cada PR. De silos de conocimiento a pair programming activo y espacios de formación como el IT.all.

Innovaciones aplicadas

Nuestras soluciones aportaron capacidades concretas al equipo:

  • Tipado progresivo sin TypeScript: jsconfig.json permitió detectar errores sin cambiar el stack, eliminando la resistencia del equipo de arquitectura.
  • Testing como documentación viva: Los tests de integración documentan el comportamiento de cada endpoint. Un desarrollador nuevo puede leerlos y entender la API sin documentación adicional.
  • Observabilidad desde el diseño: Adopción de Open Telemetry para que el equipo considere trazabilidad desde la primera línea de código, no como parche posterior.
  • Formación continua: Pair programming y revisiones de código convirtieron cada tarea en transferencia de conocimiento.

De caos técnico a operación profesional

Los resultados se miden en cambios concretos que eliminaron los principales cuellos de botella técnicos de Holafly.

90% de test coverage

El sistema pasó de 0% a un rango entre 50% y 90% de coverage en servicios críticos. Los pipelines rechazan automáticamente código sin tests. El tipado detecta errores de parámetros antes de compilar.

Resultado: menos bugs en producción y menos hotfixes de emergencia.

Velocidad de entrega

La plataforma de soporte, bloqueada durante meses, salió a producción en menos de 1 semana:

  • Reestructuración completa de todas las APIs
  • 6 pantallas nuevas y 8 endpoints funcionales creados en 2 semanas
  • El equipo de soporte pudo empezar a operar de forma efectiva

Trazabilidad moderna

La adopción de Open Telemetry eliminó los puntos ciegos del sistema. Las trazas muestran el recorrido de cada petición a través de microservicios. Los dashboards identifican el servicio exacto que falla.

Impacto: de horas buscando errores a minutos identificando la causa raíz.

Transferencia de conocimiento

El conocimiento dejó de estar en 2-3 desarrolladores clave:

  • Cualquier desarrollador puede ahora trabajar en cualquier servicio mediante pair programming y formación continua
  • No hay bloqueos por vacaciones ni dependencias de personas específicas para despliegues críticos
  • Los tests funcionan como documentación viva del sistema

Tecnología utilizada

  • JavaScript – Lenguaje runtime
  • jsconfig.json – Type safety sin TypeScript
  • Node.js – Entorno de ejecución
  • Open Telemetry – Estándar de trazas distribuidas
  • SonarCloud – Análisis de calidad de código
  • Kubernetes – Orquestación de contenedores
  • Cursor AI – Desarrollo asistido por IA
  • GitHub Actions/CI – Pipelines automatizados

Sigue nuestro viaje construyendo agentes IA desde dentro