Contenidos
Los procesos de desarrollo del software, es decir, las formas estructuradas y más o menos aceptadas, que existen de abordar el desarrollo de software, que, en general, definen una serie de pasos o recomendaciones a seguir cuando nos enfrentamos a la construcción de software. A estos modelos se les conoce como ciclos de vida (del software).
Cascada
El software se aborda en una serie de fases aisladas y sucesivas (requisitos o requerimientos, análisis, diseño, etc.) tal y como muestra la figura. Estas fases se completan (en teoría) de manera lineal, una única vez, y el inicio de una fase coincide con el fin de la fase anterior.
Esta naturaleza lineal es típica de la construcción de productos físicos (dos razones por las que fabricar software no es lo mismo que fabricar coches o construir casas), y su principal problema viene de que no deja claro cómo responder cuando el resultado de una fase no es el esperado.
Espiral
Para resolver los problemas del ciclo de vida en cascada, en 1984 Barry Boehm presenta el ciclo de vida en espiral, en el que propone que cada una de las fases identificadas por el ciclo de vida en cascada termine con una evaluación de riesgos y un prototipo.
El ciclo de vida incremental
Cada iteración (una iteración es un periodo de tiempo, no confundir con el ciclo de vida iterativo, que veremos luego, siendo este uno de los principales malentendidos que dan lugar a definiciones confusas) contiene las fases identificadas por el cascada estándar, pero en cada iteración se trabaja sobre un subconjunto de la funcionalidad que debe proporcionar el producto. La entrega total del proyecto se divide en subsistemas priorizados.
En otras palabras, se desarrolla el producto software por partes, para después integrarlas a medida que se completan, agregando cada vez más funcionalidad al sistema.
El ciclo de vida iterativo
En cada ciclo, iteración, se revisa y mejora el producto. Un ejemplo de desarrollo iterativo es aquel basado en refactorizaciones (te dejamos un post de introducción a la refactorización), en el que cada ciclo mejora más la calidad del producto.
Es importante señalar que este ciclo no implica añadir nuevas funcionalidades en el producto, si no simplemente revisarlo y la mejorarlo.
El ciclo de vida iterativo e incremental
El ciclo de vida iterativo e incremental es una de las buenas prácticas de ingeniería del software más antiguas, su primer uso en el software data de los 50 y probablemente la visión más intuitiva corresponde a Alistair Cockburn, uno de sus impulsores: Incremental = añadir, Iterativo = retrabajo.
La idea es ir liberando partes del producto (prototipos) periódicamente, en cada iteración, de forma que cada nueva versión aumenta la funcionalidad y mejora la calidad respecto a la anterior.
Además, el ciclo de vida iterativo e incremental es una de las bases de un proyecto ágil, más concretamente, con iteraciones cortas en tiempo, de pocas semanas, normalmente un mes y raramente más de dos.
Ciclos de vida de las metodologías ágiles
A la hora de analizar cuál es el ciclo de vida adoptado por las metodologías ágiles, podríamos decir que éste sería un ciclo de vida iterativo e incremental, con iteraciones cortas (semanas) y sin que dentro de cada iteración deba haber fases lineales (tipo cascada).
A partir de esta definición de mínimos, caben infinitas matizaciones, adaptaciones, etc., una por cada metodología ágil que existe e incluso una por cada organización que la aplica y adapta a sus necesidades.
Quizá la metodología ágil más popular sea Scrum. Hace ya sus años, en el año 85, y en la primera presentación oficial de Scrum, Ken Schwaber, uno de sus creadores, hablaba sobre el ciclo de vida de Scrum, y de sus diferencias con los anteriores ciclos de vida
Según comenta Schwaber, el ciclo de vida en Cascada y el Espiral cierran el contexto y la entrega al inicio de un proyecto. La principal diferencia entre cascada, espiral e iterativo y los ciclos de vida ágiles, concretamente el que adopta Scrum, es que estos últimos asumen que el análisis, diseño, etc., de cada iteración (o Sprint) son impredecibles.