Software Deployment Strategies
Tags: webdev, devops, cloud
Published: 2023-10-09 16:11:32

## ℹ️ Introducción

El mundo del desarrollo de software ha evolucionado a un ritmo sin precedentes. Lo que antes se consideraba un proceso secuencial y lineal, se ha transformado en un flujo continuo de integraciones, pruebas y despliegues. Este avance, aunque provee velocidad y eficiencia, también introduce desafíos propios de un paradigma recién emergente.

Cuando hablamos de “Estrategias de despliegue de software”, nos referimos a las metodologías que permiten liberar el software al público con agilidad, y mínima intervención humana, después de cada modificación esencial en el producto.

Sin embargo, actuar sin una estrategia de despliegue bien definida o acumular improvisaciones y deudas técnicas, puede sumir a las organizaciones en prácticas perjudiciales, por ejemplo:

1. **Despliegues manuales:** Donde la intervención manual puede elevar el riesgo de errores convirtiendo, lo que debería ser una operación sencilla, en un posible punto de fallo.
2. **Falta de pruebas:** Donde al omitir pruebas esenciales o no validar adecuadamente los criterios de aceptación, podría resultar en la liberación de software defectuoso en producción.
3. **Resistencia al cambio:** Donde las organizaciones que no abrazan una estrategia de despliegue robusta suelen resistirse a cambios, estancando la innovación, la creatividad y, consecuentemente, el progreso.
4. **Tiempo de inactividad:** Porque sin una planificación adecuada, podrían surgir periodos inesperados de inactividad, afectando la experiencia del usuario y deteriorando la imagen del producto o de la organización.

Al comprender y abordar estos desafíos o malos hábitos, las organizaciones pueden garantizar que sus procesos de despliegue sean más fluidos, eficientes y, sobre todo, efectivos. Por ello, en esta publicación, nos adentraremos en estrategias de despliegue de software diseñadas para superar estos y otros obstáculos.

---

## ⌛️ Historia

El despliegue de software no es un concepto nuevo, pero su forma y metodología han sufrido transformaciones radicales a lo largo de los años.

En los primeros días de la computación, el software se distribuía físicamente. Esto podía ser en tarjetas perforadas, cintas magnéticas o, más tarde, en discos. El proceso de actualización era lento, manual y propenso a errores. Las versiones del software eran estáticas durante largos períodos, y cualquier modificación requería una re-configuración completa del sistema.

Con la llegada de la era de Internet, la distribución de software comenzó a migrar hacia la descargas en línea. Esto permitió actualizaciones más frecuentes, pero aún requería intervención manual debido al caos generado por las solicitudes. Las organizaciones empezaron a experimentar con despliegues más regulares, pero sin una estrategia coherente.

Hoy en día, podemos encontrar vestigios de algunas prácticas sin una implementación de un “Sistema de Gestión de Versiones” (VCS o Version Control System), donde se gestiona manualmente versiones de código o total de un producto digital.

A medida que los equipos de desarrollo adoptaron metodologías ágiles (como SCRUM o Kanban), el ritmo de producción del software aumentó. La necesidad de despliegues más frecuentes y confiables, llevaron al surgimiento de la integración continua (CI) y, eventualmente, al despliegue continuo (CD), también conocido como DevOps. Estas prácticas buscan automatizar la mayoría, si no todos, los aspectos del proceso de despliegue, reduciendo errores y acelerando la entrega.

> _DevOps, es un conjunto de prácticas, herramientas y una cultura organizacional que automatiza e integra procesos despliegue y entrega continua; a su vez, un rol en un equipo de desarrollo de software._
> 

A medida que el despliegue continuo se volvía más común, la industria reconoció la necesidad de estandarizar y formalizar estas prácticas. Se han propuesto numerosos marcos y herramientas, buscando definir un conjunto de mejores prácticas y estándares. Este impulso hacia la estandarización, ha sido en parte motivado por la creciente complejidad del software y la infraestructura (adopción de tecnologías como cómputo remoto en la nube), así como por la necesidad de garantizar la calidad y seguridad en cada despliegue.

---

## 5 Estrategias más populares de despliegue de software

Continuando con la evolución del despliegue de software, te presento las cinco estrategias más populares y utilizadas en el desarrollo moderno de software. Cada una ofrece un enfoque único, con sus propias ventajas, restricciones y complejidades.

### 💥 Bing-Bang


![Bing-Bang (@roremdev)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/snwrl32u6t81jncxnffa.png)

Es una estrategia de despliegue referida como “todo a la vez” (all-to-once). Refiriendo a la estrategia de despliegue de software que reemplaza por completo a la versión anterior en un solo paso.

**Beneficios:**

1. **Simplicidad:** Dada su naturaleza directa, no requiere de complejos procesos de implementación ni de herramientas avanzadas.
2. **Rapidez:** Si todo va bien, esta estrategia permite una transición rápida entre versiones.
3. **Familiaridad:** Al ser una de las estrategias más antiguas y básicas, muchos equipos están familiarizados con ella y pueden implementarla sin una curva de aprendizaje significativa.

**Restricciones:**

1. **Riesgo de Fallos:** Cualquier error en la nueva versión afectará a todos los usuarios inmediatamente después del despliegue.
2. **Tiempo de Inactividad:** Es probable que los usuarios experimenten interrupciones durante el cambio de versión.
3. **Reversión Compleja:** Si algo sale mal, volver a la versión anterior puede ser difícil y tomar tiempo.

La estrategia es ideal para proyectos pequeños que buscan agilidad y rapidez, donde los riesgos entre versiones y/o tiempo de inactividad son tolerables. Su adopción en el equipo de desarrollo es rápido, ya que no involucra pasos complicados y su implementación suele estar delegada al proveedor host del producto (por ejemplo, Railway, Heroku, Render, entre otros).

Por proyectos pequeños, me refiero a aquellos que buscan explorar ideas o implementar funcionalidades emergentes, también conocidos como MVE o Experimento Mínimo Viable (Minimum-viable-experiment). Sin embargo, proyectos intencionados para productos como MVP o Producto Mínimo Viable (Minimum-viable-product), se recomiendan otras estrategias más apropiadas, ofreciendo mayor control y, minimizando los riesgos asociados por versiones y cambios de funcionalidades críticas o esenciales.

### 📈 **Rolling**


![Rolling (@roremdev)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9l6tcin24vm9nq1a3ig.png)

Esta estrategia de despliegue, conocida también como despliegue gradual, implementa la nueva versión en fases, reemplazando poco a poco las instancias de la versión antigua hasta que toda la aplicación ha sido actualizada.

**Beneficios:**

1. **Minimización de Riesgos:** Al desplegar en fases, es posible identificar y rectificar errores tempranamente, protegiendo así a la mayoría de los usuarios de fallos potenciales.
2. **Disponibilidad Continua:** Al no actualizar todas las instancias a la vez, se mantiene la disponibilidad del servicio durante el proceso de despliegue.
3. **Feedback Temprano:** Al recibir respuestas de los usuarios en las primeras fases, se pueden hacer ajustes rápidos antes del despliegue total.

**Restricciones:**

1. **Complejidad:** Requiere de herramientas y procesos más elaborados para gestionar los despliegues graduales y para revertir los cambios si es necesario.
2. **Tiempo:** Puede llevar más tiempo completar el despliegue total comparado con estrategias como Big-Bang.

La estrategia Rolling es muy adecuada para proyectos de tamaño medio a grande, donde la continuidad del servicio y la minimización de riesgos son prioritarias. Es ideal cuando se busca mantener una alta disponibilidad del servicio y se dispone del tiempo y las herramientas necesarias para gestionar el despliegue gradual.

Los equipos de desarrollo podrían necesitar un tiempo de adaptación y formación para implementar y gestionar correctamente esta estrategia, siendo particularmente útil en entornos donde la calidad del servicio es crucial, como en aplicaciones de comercio electrónico (E-Commerce) o plataformas de streaming (como Netflix, Spotify, etc.).

### 🔁 Blue-Green

![Blue-Green (@roremdev)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1xo6w53qlexhyfe122is.png)

Blue-Green es una estrategia de despliegue que implica tener dos entornos de producción paralelos: "Blue", que es la versión actualmente en uso, y "Green", donde se prepara la nueva versión. Una vez que la versión "Green" está lista y probada, se cambia el tráfico de usuarios al entorno "Green", haciendo que esta se convierta en la versión activa.

**Beneficios:**

1. **Cero Tiempo de Inactividad:** Al cambiar el tráfico entre los entornos, las actualizaciones pueden realizarse sin interrupciones para los usuarios.
2. **Gestión de Versiones:** Si se detectan problemas en el entorno "Green", se puede volver rápidamente al entorno "Blue". Y viceversa, antes de hacer el cambio, se puede probar la versión "Green" en un entorno que es idéntico al de producción.

**Restricciones:**

1. **Recursos Duplicados:** Se requiere mantener y gestionar dos entornos de producción, lo que puede aumentar los costos.
2. **Complejidad de Coordinación:** Asegurar que ambos entornos sean idénticos y sincronizar bases de datos u otros recursos compartidos puede ser un desafío.

Blue-Green es altamente recomendado para proyectos donde el tiempo es crucial y la reversión de cambios, en caliente, es vital. Es especialmente útil para aplicaciones críticas, como sistemas bancarios en línea, ofreciendo a los usuarios una experiencia fluida y sin interrupciones, incluso durante las actualizaciones más grandes y críticas.

Para los equipos de desarrollo, esta estrategia requiere una comprensión clara de cómo gestionar y coordinar dos entornos paralelos. Es apropiado para organizaciones que pueden invertir en infraestructura adicional para mantener la alta disponibilidad y calidad del servicio.

### 🐥 Canary

![Canary (@roremdev)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vu30bxm7w8g46dlhc7f8.png)

La estrategia de despliegue Canary toma su nombre de la antigua práctica minera de llevar canarios a las minas para detectar la presencia de gases tóxicos. En el contexto de despliegue de software, implica lanzar la nueva versión inicialmente solo a un pequeño grupo de usuarios (el "canario") antes de desplegarla al conjunto total de usuarios. Esto permite evaluar y monitorizar el comportamiento y el rendimiento de la actualización en un entorno real y con una muestra real de usuarios.

**Beneficios:**

1. **Detección Temprana de Problemas:** Al desplegar primero a un grupo pequeño, los problemas potenciales pueden identificarse antes de que afecten a toda la base de usuarios.
2. **Feedback Rápido:** Se obtiene una respuesta rápida de los usuarios "canarios" sobre la nueva versión.
3. **Mitigación de Riesgos:** Reduce el impacto de posibles fallos, ya que solo afectaría a un subconjunto de usuarios.

**Restricciones:**

1. **Selección de Usuarios:** Es esencial elegir adecuadamente al grupo "canario" para asegurarse de que sea representativo.
2. **Gestión de Versiones:** Puede ser complicado gestionar varias versiones del software simultáneamente si los despliegues canarios se extienden por largos períodos.
3. **Complejidad Adicional:** Requiere herramientas y procesos más avanzados para dirigir el tráfico de usuarios y monitorizar el despliegue.

Canary es ideal para proyectos que buscan minimizar riesgos y obtener un feedback rápido en entornos vivos. Beneficiándose en aquellas aplicaciones con una gran base de usuarios donde los fallos pueden tener un impacto significativo.

Los equipos de desarrollo deben estar preparados para actuar rápidamente en función del feedback y las métricas obtenidas del grupo "canario". Por lo que generar módulos o sistemas de monitoreo mediante soluciones [MELT](https://dev.to/roremdev/melt-la-observabilidad-web-4h5h), son vitales para su éxito.

Esta estrategia es muy popular entre las grandes plataformas o productos web, ya que conocen sus audiencias poseen un conocimiento transversal de su valor diferencial. Con ello en mente, la estrategia les permite probar nuevas características de manera simultánea e incluso, completamente aislada de regiones enteras de una población.

### 👁️‍🗨️ A/B Testing

![A/B Testing (@roremdev)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r4g6yvdml5xcfbcdfq2b.png)

A/B Testing, o prueba dividida, es una estrategia de despliegue que implica lanzar simultáneamente dos o más versiones de un software o de una característica específica a diferentes segmentos de usuarios. Estas versiones son evaluadas en función de métricas específicas, como tasas de conversión, tiempo de permanencia en la página, entre otras, para determinar cuál de ellas es más efectiva en términos de rendimiento, usabilidad o cualquier otro criterio de éxito definido.

**Beneficios:**

1. **Decisiones Basadas en Datos:** Permite tomar decisiones sobre características o cambios basándose en datos reales de comportamiento del usuario.
2. **Optimización Constante:** Facilita la mejora continua del software al probar constantemente nuevas ideas y soluciones.
3. **Reducción de Riesgos:** Al lanzar nuevas características a segmentos pequeños y controlados de usuarios, se puede evaluar su impacto y aceptación antes de un despliegue total.

**Restricciones:**

1. **Complejidad Analítica:** Requiere herramientas de análisis robustas y la capacidad de interpretar correctamente los resultados.
2. **Gestión de Versiones:** Manejar múltiples versiones en paralelo puede ser un desafío técnico y logístico.
3. **Factores Externos:** Los resultados del A/B Testing pueden verse afectados por factores externos, donde es crucial aislar y entender estos factores para interpretar correctamente los resultados.

A/B Testing es particularmente útil para plataformas y aplicaciones centradas en el usuario donde se busca optimizar la experiencia del usuario.

Los equipos de desarrollo, marketing y de producto, suelen colaborar estrechamente en estas pruebas para garantizar que las métricas analizadas sean relevantes y que los resultados se interpreten adecuadamente. Al adoptar el A/B Testing, las organizaciones pueden asegurarse de que sus despliegues y actualizaciones estén alineados con las necesidades y preferencias reales de sus usuarios, lo que a su vez puede llevar a una mayor retención, satisfacción y conversión.

---

### 🍻 **Conclusión**

La entrega de software es un arte que va más allá de simplemente escribir código. Es una amalgama de prácticas, herramientas y, sobre todo, estrategias que aseguran que cada lanzamiento sea fluido, eficiente y, lo más importante, efectivo. Como hemos visto, existen múltiples estrategias de despliegue, y cada una tiene sus fortalezas y contextos ideales de aplicación. Lo más crucial es entender profundamente el proyecto que estás desarrollando, sus necesidades y su audiencia. Eso te permitirá elegir la estrategia que mejor se alinee con tus objetivos.

La Ingeniería de Software, constantemente te reta a emplear nuevas estrategias, a experimentar con ellas y a combinarlas si es necesario. No hay una talla única en el mundo; lo que funciona para un proyecto podría no ser adecuado para otro.

Explora, pregunta y amplia tu conocimiento para que te beneficies como profesional y amplíes tu cartera de éxitos.

> _Encuentra tu equilibrio en el mismo movimiento. Camina hacia el futuro._