Este artículo narra una experiencia de desarrollo de software donde una tarea aparentemente sencilla se convirtió en un complejo 'rabbit hole' (conejo de Alicia) debido a la necesidad de modernizar una aplicación web heredada. El objetivo inicial era simple: agregar un botón de descarga para un archivo ZIP que contuviera los datos de la aplicación. El desarrollador, Jesse Skinner, inicialmente optó por automatizar la creación del ZIP dentro del pipeline de despliegue para evitar la necesidad de actualizar manualmente el archivo.
La primera complicación surgió al descubrir que el contenedor Docker utilizado en el pipeline era obsoleto y carecía de la herramienta zip. Intentar solucionar esto instalando zip y rsync en un contenedor Node.js más reciente generó un nuevo error: la aplicación web utilizaba Webpack v4, una versión antigua que era incompatible con versiones modernas de Node.js. Esto llevó a un intento de usar un contenedor Node.js más antiguo para que Webpack funcionara, pero esto a su vez reveló problemas de compatibilidad con el sistema operativo base del contenedor.
En este punto, Skinner reconoció que estaba yendo por un camino incorrecto. La solución más sensata era modernizar la aplicación, reemplazando Webpack con Vite, una herramienta de construcción más moderna y eficiente. Aunque esta decisión implicaba un esfuerzo considerable y estaba fuera del alcance original del proyecto, Skinner argumentó que era crucial para la salud a largo plazo del sistema, evitando futuras complicaciones y mejorando el rendimiento. La migración a Vite resultó ser menos laboriosa de lo esperado.
Finalmente, para completar la tarea original, Skinner implementó una solución que generaba el archivo ZIP directamente en el navegador del usuario utilizando la biblioteca jszip. Esto eliminó la necesidad de incluir la herramienta zip en el pipeline de despliegue. La lección clave es que, aunque la simplicidad es un objetivo importante, a veces es necesario asumir una complejidad inicial para entregar una solución robusta y sostenible a largo plazo, incluso si eso implica ir más allá de lo inicialmente previsto y modernizar componentes del sistema. El cliente, ajeno a la complejidad interna, recibió la funcionalidad solicitada y una aplicación modernizada como beneficio adicional.
