Porque deberías implementar devops para mejorar tu empresa

En 2021 ya no es una novedad que las empresas tienen que ser dinámicas. Con las metodologías agiles como scrum, se a derribado el mito de las jerarquías y aéreas de trabajo en silos. Todo eso suenan a empresa de producción de los 90. El enfoque de hoy es entregar un excelente servicio al cliente y ofrecerle una gran experiencia al usuario.

En el área de tecnológica entregar un buen servicio es clave para el éxito. Nadie se imagina que la pagina de Amazon pase en el suelo o que Uber Eats no funcione bien un viernes por la noche. ¿Se han puesto a pensar que tienen las grandes empresas tecnológicas en común? podríamos decir que tienen al cliente en el centro del foco, que sus sistemas son extremadamente estables y fáciles de usar (entre muchas otras cosas)

Teniendo como objetivo la estabilidad, nos adentramos a un bosque oscuro como el de Fangorn en el señor de los anillos. Tenemos que empezar a hacer zoom y ver dentro de cada proceso, servicio, etc. Una variable que afecta la estabilidad es cuando debes hacer una actualización de tu apps. Podemos explicar que existe un flujo desde que se crea un software mediante un código en un lenguaje X y este termina en un servidor web. Los pasos intermedios en ese proceso son muy variados y con el tiempo de han creado una inimaginable lista de software que te ayudan en ese proceso, tanto para versionar código, ejecutar tareas de deployment y dejar tu app lista en el servidor.

Remontémonos no hace mucho tiempo cuando existían software monolitos (una sola pieza) el equipo de desarrollo coordinaba la actualización del software para un día en la noche o un día sábado. Toda la empresa sabia que el área TI iba a hacer un cambio y todos les pedían a sus dioses que todo saliera bien. El área Ti por en tanto llevada el saco de dormir y la esperanza de que el upgrade funcionara. Como hacían pocas actualizaciones del software (deploy) por el infierno que podías pasar si este no funcionaba, trataban de hacerlo lo menos posible.

Una nueva perspectiva comenzó a rondar hace un tiempo en que detecto entre otras cosas, que el problema de hacer pocos deployment hacían que el software fuera complejo de actualizar y que la probabilidad de que hubiese algún problema que impactara en el entorno de producción fuera mayor. Ya habíamos comentado de que las grandes empresas tecnológicas se destacan por siempre tener un buen uptime.

DevOps nació como una sinergia entre desarrollo y operaciones que consiste en desarrollar, implementar y hacer eficiente la operación de software de la más alta calidad posible. Esta filosofía se basa en 3 principios que son la cultura, la automatización y la medición (muy parecido a scrum transparencia, inspección y adaptación)

El objetivo de la filosofía DevOps es eliminar las ineficiencias que existen a lo largo de la canalización del desarrollo, implementación y operaciones (pipelines) promoviendo al mismo tiempo la máxima calidad. DevOps mitiga las inestabilidades potenciales causadas por el cambio constante.

Si tu empresa requiere liberar funcionalidades a tus clientes de forma rápida y que esto no sea un obstáculo en los sistemas de producción, entonces deberías adoptar DevOps en tu organización.

¿Cómo empiezo?

El trabajo en equipo es fundamental para el éxito de tu producto. Bajo esa perspectiva tener departamentos en donde todos cuiden su intereses no es buena idea. Ese modelo solo fomenta la fricción y el espíritu de echarle la culpa al otro. La meta tiene que ser aportar valor a tu cliente, y esa entrega la haces entregando nuevas funcionalidades, que la aplicación sea segura y tratar que siempre este disponible. Crear equipos cross-functional o multidiciplinarios en donde existan desarrolladores, sys-admin, QA, ingeniero de seguridad y que todos ellos tengan una sola meta que es entregar un producto de calidad es mucho mejor idea que utilizar el modelo antiguo.

Si comienzas bajo esa premisa de equipo multifuncional, adoptar una metodología ágil como scrum, te será mas sencillo ya que ahí tienes en parte el development team, tambien la visión de un equipo orientado a un objetivo. Agregarle capas como el encargado de optimizar el producto backlog y un evangelizador que se encargue adoptar la metodologia, es mas simple

Automatización en DevOps

La automatización vendría siendo como definición, el crear procesos con la mínima intervención humana posible. Tambien destacamos que la automatización provee consistencia, escalabilidad y calidad.

El primer paso en el proceso de desarrollo es la codificación y como entregamos ese artefacto listo para su puesta en producción, libre de errores, hoyos de seguridad, etc. para este proceso se creo la integración continua (continuos integration) este vendría siendo como un proceso en el cual existe un repositorio compartido en donde los desarrolladores van agregando funcionalidades al código versionado, luego se aplican pruebas y cualquier fallo se le debería notificar al desarrollador para que este lo pueda corregir de inmediato. Se entiende que el proceso de integración continua vendría siendo un sistema de validación y mejora en la cual solo el mejor código escrito es el que se selecciona

Existen dos funciones básicas para que la integración continua funcione como tal:

  • Control de versiones: herramientas como git o mercurial te permiten crear versionamiento distribuido
  • Automatización de built/test: este sistema debe realizar pruebas para que cada commit contribuya a reducir conflictos de lógica y problemas de dependencias. Herramientas con Jenkins con muy utilizadas

Entrega continua (continuos delivery) Luego de tener un código que cumple las pruebas y esta listo para ser puesto en producción, la siguiente tarea en la automatización es poner ese código en un entorno especifico cuando lo necesites. los deploy deben ser incrementales y pequeños y deben cumplir con la mas alta calidad posible. La entrega continua tiene muchos beneficios en las que se destacan: el incremento de calidad, mejora el ciclo de vida, mejora la administracion de recursos, reduce los riesgos en los deployment, entre otros.

En esta área de deploy dependiendo de como quieras establecer tu infraestructura tienes ciertas herramientas que te ayudaran a automatizar esta labor. Existen dos tipos de infraestructura que son la mutable e inmutable. La primera cambia con el tiempo dependiendo de actualizaciones de sistemas, reglas de firewall. La infraestructura inmutable no cambia y se crea junto con tu código, si existe algún cambio o deploy nuevo, el servidor antiguo de destruye y se crea otro. No es objetivo de este post decidir cual es mejor o peor.

Con masiva adopción de los microservicios, la infraestructura inmutable a ganado terreno, también herramientas como Terraform, contenedores como Docker y orquestadores como Kubernetes han hecho de esta una gran opción.

Para infraestructura mutable podemos encontrar software que funcionan como configuration manager, que se encargan de aprovisionar un ambiente según los parámetros que tu le des. herramientas como Ansible, Chef y puppet con una buena opción.

Métricas, logs

En todo campo medir lo que se esta haciendo te permite determinar si lo que estas haciendo funciona o no. Aca no es diferente. exsiten varios indicadores que te permiten saber si lo estas haciendo bien

  • Frecuencia de deployment: cuandos deployment hago por semana/mes/día
  • MTTR mean time to recover: cuanto tiempo se tarda en resolver un problema
  • MTTD mean time to discovery: cuanto tiempo ocurre entre que la falla existe y nos dimos cuenta de ella
  • System availability: cuanto tiempo mi sistema esta operativo y que probabilidad existe que falle
  • Services performance: verifica que los sistemas están funcionando bajo los parámetros configurados
  • Lead Time: plazo de entrega entre que se creo el requerimiento y que esta se lanzo

El monitoreo de sistemas te ayudaran a tener en consideración desempeños, si alguna funcionalidad que se implemento hace poco esta consumiendo más recursos de lo necesario. Para esto te puedes apoyar en las mismas herramientas de proveedores cloud como Network Watcher en Azure y CloudWatch en AWS. Tambien exsiten herramientas externas como DataDog, Nagios, Grafana, etc.

Cloud: AWS, Azure, GCP?

Por la simplicidad y innumerables opciones considero que no viene entrar en la duda si debo tener mi infraestructura en la nube o on-premises. todos los proveedores tienen una capa gratuita y unos precios bastante asequibles para comenzar. Esta vendría siendo una batalla sagrada como las del tipo AMD/Intel, (AMD es mejor) no viene al caso explayarme mas en eso.

Debes tener en consideración al momento de evaluar las alternativas un par de cosas que a mi parecer son importantes

  • Existe algún partner local que me pueda ofrecer soporte
  • Voy a pagar con tarjeta de crédito y en dólares todo el tiempo que tenga los servicios alojados en el proveedor? o voy a necesitar pagar en moneda local+iva?
  • Si mi ingles no es el mejor, el proveedor tiene soporte en mi idioma
  • Si voy a usar X tecnología (Kubernetes por ejemplo) quien tiene la mejor infraestructura y quien me ofrece un mejor costo/beneficio
  • Si por algún motivo necesito un especialista, podre encontrar en el mercado a alguien que me pueda ayudar a un precio razonable?

Si ya tienes una idea de como abordar mejor el cumplimiento de los objetivos de tu producto (apps, software, ecommerce) con este humilde post, mi tarea valió la pena. Si te gusto por favor compártelo con tus colegas/emprendedores/jefes. Si tienes alguna idea de como mejorar esta entrada escríbenos a contacto@netko.cl