Introducción a la automatización de tareas de desarrollo

Publicado el en Tecnología por Jaime Gómez Obregón.

El Universo entero tiende a la complejidad y el caos, y los proyectos de software, lejos de ser una excepción, confirman y aceleran esta tendencia cosmogónica. Y a medida que se amplían en alcance, complejidad o equipo, también crece el esfuerzo necesario para mantenerlos, evolucionarlos y desplegarlos tras cada nueva versión.

Parte de este esfuerzo proviene del conflicto existente entre las prioridades del proyecto en su entorno de desarrollo, donde prima la ergonomía del desarrollador y la legibilidad del código, y las características que ha de tener la aplicación ya publicada, donde esto se convierte en irrelevante y se prioriza la eficiencia y la economía de recursos.

Muchos frameworks de desarrollo web incorporan mecanismos más o menos transparentes al desarrollador para —por ejemplo— concatenar y minimizar scripts y hojas de estilos. De este modo el programador puede trabajar con componentes modulares y ficheros optimizados para la legibilidad, que son transformados al vuelo en versiones optimizadas para la velocidad de descarga o de interpretación.

Pero a medida que el proyecto gana en complejidad o en requisitos de eficiencia esta facilidad puede resultar insuficiente. Pongamos otro ejemplo: para trabajar con iconos un diseñador puede preferir trabajar con una miríada de ficheros independientes generados en lotes por su herramienta de diseño favorita y que le resultan fáciles de mantener. Y unos metros más allá su compañero desarrollador o administrador de sistemas puede ver con terror como esta práctica dispara las peticiones HTTP necesarias para servir la página, y con ello el consumo de recursos y el tiempo de transferencia.

¿Cómo resolver este conflicto? En los últimos dos o tres años están cobrando relevancia algunas herramientas dirigidas a programadores y que podríamos denominar de automatización de tareas o de compilación de proyectos (frontend build tools, developer automation tools, task runners o streaming build systems). Se trata fundamentalmente de Grunt (2012), que mantiene con Gulp (2013) un interesante duelo por el favor de los desarrolladores, y GNU Make (1977. Sí: mil novecientos setenta y siete), la popular y casi omnipotente utilidad del mundo Unix.

Más allá de las diferencias conceptuales o técnicas, la idea detrás de estas herramientas es común y sencilla: automatizar la ejecución de tareas repetitivas con la finalidad de transformar un proyecto de su forma óptima para desarrollo a su forma óptima para publicación o despliegue.

Un ejemplo probablemente común en proyectos online que han adquirido una cierta complejidad podría ser un workflow consistente en todas o algunas de las siguientes tareas:

  1. Linting de código, particularmente JavaScript.
  2. Optimización de las imágenes del proyecto, recortando, recomprimiendo, ajustando la calidad o realizando conversiones de formato.
  3. Minimización o conversión de ficheros de tipografía.
  4. Generación de una hoja de sprites a partir de ficheros con iconos independientes.
  5. Compilación de ficheros Sass, Less, CoffeScript...
  6. Ejecución de tests unitarios, de integración o de usuario (Selenium).
  7. Comprobación automática de enlaces rotos.
  8. Supresión de comentarios y compactación de la salida.
  9. Generación automática de documentación o APIs a partir del código.
  10. Validación semántica de lenguajes W3C.
  11. Concatenación y minimización de scripts u hojas de estilos.
  12. Vaciado (flush) de cachés.
  13. Despliegue automático en producción.

El coste de tener que realizar manualmente estas tareas puede ser inasumible, especialmente en proyectos con un desarrollo ágil, iteraciones frecuentes y muchas versiones y publicaciones. Esta es la dificultad que tratan de resolver las herramientas descritas. En ningún orden en particular:

  • Grunt, originaria del mundo de JavaScript, implementa una filosofía basada en configuración mejor que programación, y sus numerosísimos plugins facilitan las tareas más frecuentes y minimizan la curva de aprendizaje.
  • Gulp, más reciente, está basada en el concepto de streams de Node.js y está ganando momento recientemente gracias a un API más elegante y limpio.
  • GNU Make, la herramienta con que nuestros abuelos compilaban sus programas Fortran en pantallas de fósforo verde, goza de excelente salud y proporciona a los usuarios más fieles a la filosofía Unix workflows potentes y flexibles desde una herramienta estándar y casi universal.

Con la potencia y flexibilidad de estas herramientas ya no hay excusa para no publicar o desplegar proyectos optimizados para un consumo de recursos mínimo sin sacrificar la ergonomía de tu entorno de desarrollo.

(Artículo publicado originalmente en Cantabria TIC).