Blog - Vicent Tortajada

Portada de Dialogos I

Dialogos I

Ahora respondedme a otro punto. ¿Creéis vos que en dialéctica, en retórica, en física, en metafísica, en matemática y, finalmente, en la totalidad de los razonamientos, existen argumentos capaces de persuadir y demostrar a uno tanto las conclusiones falsas como las verdaderas?

— Sagredo, diálogo sobre los dos máximos sistemas del mundo

Unos viernes atrás. 17:30. Estoy terminando de prepararme para salir de casa cuando recibo un mensaje: “Quizás me retrase un poco, luego os cuento”. Ya me lo veía venir, nos iba a tocar esperar. Aún así decidimos hacerlo tomando un café en el bar donde habíamos quedado.

20:30. Libro casi terminado. Incluso he tenido tiempo de comprar un par de cosas en la ferretería. Recibo una llamada:

—Disculpa, estoy saliendo ahora, acabo de pedir una pizzas directamente a tu casa —entiendo que es su forma de pedir disculpas—. Os cuento mientras cenamos.

20:58. Llega el repartidor. 21:03. Llega mi amigo, claramente agotado. Aunque quizás menos que el repartidor, todo sea dicho. Descorchamos la botella de vino que ha traído —¿qué mejor maridaje para la comida basura?— y procede a contarnos:

—Hemos acabado el despliegue a las ocho y cuarto.

—¿Un viernes? ¿Por la tarde?

—Bueno, es que teníamos que haber desplegado ayer, pero no se pudo. Así que han decidido que hoy. Y donde hay patrón no manda marinero.

—Pero no se despliega nunca un viernes —dije anonadado—. Y menos si no va a haber nadie de guardia durante el fin de semana.

—De guardia, dice.

En su empresa no había guardias, sólo llamadas en pleno fin de semana porque algo se ha roto.

—Y, además, ¿a las cinco y media? —pregunté, sin salir del asombro.

—Bueno, tiene sentido hacerlo fuera del horario de oficina. Por no molestar a los clientes.

Eso es verdad, pero…

—¿Y no es mejor hacerlo antes? La gente está más fresca que después de todo el día trabajando.

—Pero, ¿y si sale mal? Hay más horas a partir de las seis de la tarde que de seis a ocho de la mañana. Además hemos apurado porque se había prometido una funcionalidad que tenía que estar esta semana sí o sí, y la hemos terminado a última hora.

—¿Qué clase de actitud es “¿Y si sale mal?”? ¿Tan poca confianza en lo que vais a desplegar tenéis? ¿Para eso hacéis tests?

—Bueno…

—¡¿Pero no pedían TDD1 de requisitos cuando entraste?! —empezaba a ser yo el que se enfadaba.

Sin una buena batería de tests, tanto unitarios como de integración, es muy difícil asegurar que el más mínimo cambio no vaya a afectar a la funcionalidad del sistema.

—Sí, pero igual que pedían microservicios y luego resulta que la idea de microservicio es que compartan todos la misma base de datos. Tests hacemos pocos, la verdad. Por un lado, porque corre la idea de que mientras haces tests no estás programando. Por otro, hay gente del equipo que no tiene experiencia en testing, y en palabras de un superior “aquí se viene enseñado de casa”.

—Entonces probáis todo antes en un entorno de staging. Entiendo que es un poco engorroso pero una vez probado todo —asumiendo que existe un buen plan de pruebas, pensé para mis adentros— el despliegue debería ser sencillo.

—No te creas. No suele ser tan sencillo. Sobre todo cuando el entorno de staging no es idéntico al de producción. Hemos tenido de todo: distintas versiones de base de datos, distintas configuraciones, distintas dependencias…, así que hay que probarlo todo de nuevo para estar seguros.

Empezaba a entender por qué no desplegaban a primera hora.

—En general la desplegabilidad2 es muy mala —sigue mi amigo—, y esto es casi todas las semanas, así que se van muchas horas del sprint en esto. Y eso sin contar todo el tiempo que el servicio está caído durante los despliegues.

—No te entiendo —o más bien no quería hacerlo—. Con lo fácil que sería…

—Sí, tener una máquina verde y otra azul3. Además así podríamos volver atrás si la cosa sale mal.

La substitución de una instancia por otra dependerá de cada diseño, por ejemplo cambiando los registros DNS o la configuración de un proxy, si se tratase de servicios web.

—Bueno, mientras ningún cliente trabaje a partir de las cinco y media, tampoco hay tanto problema —digo con tono burlón—. Aunque limita bastante el huso horario para el que vender el servicio.

—Aunque no todo es tan malo. Antes era peor, cuando se desplegaba el monolito entero y todo el servicio quedaba inutilizado. Ahora que hemos podido extraer algunos microservicios —ya está, ya lo ha dicho. La palabra prohibida— sólo dejamos inservible ese servicio en concreto.

—¿Ahora sois el nuevo Netflix?¿Cómo van los microservicios a aportar utilidad a nada? —No puedo ocultarle mi aversión a los microservicios. O mejor dicho al uso indebido que se hace de ellos. Algún día me abriré un blog y escribiré sobre ello, pienso para mis adentros.

—No, pero con moderación son útiles. Además, eres tú el que se llena la boca con los bounded context —auch—. En este caso ayuda con los despliegues porque sólo interrumpes el servicio que estás desplegando. Ahora el módulo de alertas, luego el de estadísticas, como el barco de Teseo.

Seguimos charlando un rato más, pero ya de temas no relacionados con el trabajo, para no aburrir al resto de la mesa. Sin embargo creo que se pueden extraer algunas conclusiones al respecto:


Foto de Swello en Unsplash


  1. TDD (por sus siglas en inglés Test-Driven Development) es, a grandes rasgos y generalizando mucho —mucho—, una práctica que consiste en escribir las pruebas unitarias antes que la implementación. Esto permite refactorizar el código de forma segura porque mientras los requisitos no cambien, las pruebas tampoco. Además, fuerza a escribir el código de forma más modular. ↩︎

  2. La desplegabilidad (que he traducido a las bravas del inglés deployability) es, según Software Architecture in Practice, 4th ed, la propiedad del software que indica que puede ser desplegada en una cantidad predecible y aceptable de tiempo. También se implica que puede revertirse en una cantidad aceptable y predecible de tiempo. Esta cualidad está íntimamente ligada a la testability por motivos obvios. Afecta, a su vez, a la disponibilidad del sistema. ↩︎

  3. Blue/green es uno de los patrones que se utilizan para mejorar la desplegabilidad. Consiste en instalar una instancia del nuevo servicio (green), y una vez se ha inicializado el servicio, éste substituye a la instancia original (blue). Una vez se comprueba que la instancia green funciona correctamente, se puede liberar blue. Por otro lado, si hubiese algún problema, sólo haría falta substituir green por blue de nuevo. De esta forma se permite desplegar o volver atrás sin apenas interrupción del servicio. ↩︎