Una vez una nueva release del producto software ha sido codificada y convenientemente probada, es necesario poner a disposición del usuario el producto. El despliegue del software consiste en instalar el software en un entorno productivo que permite a los usuarios hacer uso de él.
Durante los 60s el software era construido de forma artesanal. El mismo programador que codificaba el software era quién lo desplegaba. Por entonces, el software estaba estrechamente ligado al hardware, el programador era, por lo tanto, un buen conocedor de la infraestructura sobre la que iba a correr su programa.
A partir de los 70s, al surgir la Ingeniería de Software, la obra artesanal del programador es sustituida por el producto software. Los procesos y la sistematización permiten aislar conocimiento y separar responsabilidades. Por otro lado, las infraestructuras donde se instalan los productos crecen en complejidad al aumentar enormemente las necesidades de servicio de los usuarios. Esto empuja a la industria a crear nuevos silos de conocimiento.
Los “responsables de explotación”, los “gestores de despliegue/implantación”, los “técnicos de operación”, los “administradores del sistema”, pasan a ser los encargados de instalar el software en la infraestructura servidora y de mantener dicho software con una adecuada calidad de servicio evitando su degradación. Esta separación de responsabilidades es conocida con el aforismo “You Build It, Ops Runs It”.
El equipo de desarrollo no conoce las peculiaridades de la infraestructura servidora, por ejemplo, desconoce cuántos publicadores y nodos serán utilizados. Son ajenos al dimensionamiento del servidor web o la potencia asignada al motor de base de datos. El diseño de la infraestructura que soportará la ejecución del software, así como su instalación y mantenimiento, le corresponde a otro equipo formado por técnicos especialistas.
Es posible desplegar el producto software en infraestructura (servidores, publicadores, etc.) ofrecida por un tercero. Estos proveedores de infraestructura en la “nube” (cloud) permiten el acceso al producto software a través de internet. Esto elimina la necesidad de adquirir infraestructura física al dueño del producto software. El software en la nube se caracteriza por mejorar la movilidad, reducir los costos de inversión, reducir los tiempos de implementación y ser escalable de una manera muy rápida.
A diferencia del software basado en la nube, el software on-premise está instalado en los servidores y dispositivos locales. Esto permite tener acceso físico a la información y control directo de la configuración, manejo y seguridad de esos datos. El software on-premise no depende directamente de una conexión de internet.
La visión adaptativa de la construcción de productos software pretende entregar software en producción iterativamente para ofrecer valor al usuario de forma temprana. Para ello es necesario eliminar los silos de especialistas. Las empresas ágiles no se organizan verticalmente en equipos de analistas, diseñadores, programadores o testers. En su lugar existen equipos multidisciplinares de desarrollo en los que la suma de competencias de los individuos que los componen permite llevar a cabo todas las actividades necesarias para la construcción del producto software. Sin embargo, es habitual que llegados a la entrega del software surjan roces y malentendidos con el “equipo de despliegue”. Además, los cada vez más exigentes plazos de entrega (time-to-market) han provocado un considerable aumento del número de despliegues (10 despliegues cada día en Flickr en 2009). La estrategia “you build it, Ops runs it” basada en silos (equipo de especialistas en despliegues) no es eficaz para la entrega intensamente iterativa.
Devops pretende eliminar el silo de “operaciones” difuminando las fronteras entre los equipos de desarrollo y de operación (despliegue). Devops es un conjunto de metodologías que permite a los equipos de desarrollo y de operaciones trabajar de forma más cercana entre ellos, aportando mayor agilidad al proyecto y notables incrementos de productividad. Pretende dar agilidad y responder a las necesidades del flujo de desarrollo, optimizando los procesos de desarrollo, tests, despliegue, resolución de bugs, paso a producción y monitorización.
🔍 DevOps (acrónimo inglés de development -desarrollo- y operations -operaciones-) es una práctica de ingeniería de software que tiene como objetivo unificar el desarrollo de software (Dev) y la operación del software (Ops). La principal característica del movimiento DevOps es defender enérgicamente la automatización y la monitorización en todos los pasos de la construcción del software, desde la integración, las pruebas, el despliegue, hasta la implementación y la administración de la infraestructura. DevOps apunta a ciclos de desarrollo más cortos, mayor frecuencia de implementación, lanzamientos más confiables, en estrecha alineación con los objetivos comerciales.
Así, es el propio equipo de desarrollo quién asume la responsabilidad de desplegar su software, “you build it, you run it”.
Pero, ¿cómo adquiere el equipo de desarrollo todo el conocimiento que aportan los silos de especialistas? Los pilares de la cultura devops son la automatización y las buenas prácticas. Estas son algunas prácticas que ayudan a adquirir una cultura devops:
Entrega continua. La entrega continua se basa en automatizar todo el proceso de despliegue de la aplicación en cualquiera de los entornos disponibles (Desarrollo, Preproducción o Producción). El objetivo es hacer despliegues predecibles, automáticos y rutinarios en cualquier momento.
Infraestructura como código. Una vez virtualizada la infraestructura es posible administrarla escribiendo código como si de un programa se tratase.
Contenedores. La creación de contenedores es un enfoque de desarrollo de software en el que una aplicación o producto software, sus dependencias y su configuración se empaquetan en un archivo “contenedor”.
Microservicios. El término “arquitectura de microservicios” ha surgido en los últimos años para describir una forma particular de diseñar aplicaciones de software como conjuntos de servicios funcionalmente autónomos y desplegables independientemente en contraposición con la “arquitectura monolítica”.
Además, es necesario establecer una estrategia de ramas en el Sistema de Control de Versiones que ayude a acortar los tiempos de despliegue reduciendo las mezclas de ramas. En este sentido la industria está apostando intensamente por el Trunk Base Development. Asimismo, es esencial dotar a la organización de un sistema de monitorización que permita supervisar el funcionamiento del software y registrar cómo el usuario se relaciona con el software. La monitorización es una herramienta crucial para entender cómo funciona, dónde falla y qué hay que mejorar en el software. De esta forma, el equipo de desarrollo será mucho más eficiente a la hora de realizar cambios en el producto software.
DevOps plantea un cambio cultural en las organizaciones que tiene como pilares la comunicación y cooperación entre Desarrollo y Operaciones.