# Procesos de desarrollo software

En esta lección se estudian los principales modelos a seguir para implementar procesos de desarrollo de software.

## Introducción

En Ingeniería del Software, un modelo de proceso de desarrollo de software puede verse como una manera de dividir el trabajo en distintas actividades (o el ciclo de vida del producto en distintas fases) con la intención de lograr la mejor gestión y el mejor resultado para el proyecto. Estos modelos pueden incluir la definición previa de entregables específicos y otros artefactos que son creados y completados por el equipo para diseñar, codificar, probar y mantener el software en cuestión.
A continuación se describen algunos de los modelos y las metodologías de gestión y desarrollo de proyectos mas conocidos dentro del mundo del software: el desarrollo en cascada, el desarrollo mediante prototipos, el desarrollo en espiral y el desarrollo ágil.

## Fases del proceso

Todos los modelos de procesos están compuestos en su mayoría por distintas fases que varían, aunque ligeramente, de modelo en modelo.
* Fase de definición
** Planificación del proyecto de desarrollo software
** Ingeniería de requisitos / Extracción de información
** Análisis (estudio) de esos requisitos
* Fase de desarrollo
** Diseño del software
** Generación del código
** Pruebas del software
* Fase de mantenimiento
** Corrección de errores y reajustes que a veces provienen de nuevos requisitos e implican repetir las actividades de fases anteriores

## Modelo en cascada

El modelo en cascada es un enfoque secuencial de desarrollo en el cual el trabajo fluye de manera secuencial ("como una cascada") a través de las distintas fases:
* Especificación de requisitos
* Diseño de software
* Implementación
* Pruebas
* Integración
* Despliegue
* Mantenimiento
El modelo en cascada es un enfoque, casi utópico, de la Ingeniería tradicional aplicado a la Ingeniería de Software. Un modelo en cascada estricto desaprueba la revisión y repetición de etapas anterior una vez estas se han completado. Sin embargo existe un enfoque más flexible (realista) que permite realizar arreglos y cambios en etapas ya completadas e incluso solapar actividades de fases consecutivas para evitar la rigidez del flujo de trabajo.

## Desarrollo mediante prototipos

Este es un enfoque del desarrollo de software que se basa en la creación de prototipos (software con funcionalidad parcial, incompleta). Se suele usar como parte de otros modelos de proceso más tradicionales.
Los principios básicos son:
* Reducir los riesgos inherentes del proyecto estableciendo el desarrollo en fragmentos mas pequeños y logrando, en un entorno propenso a cambios, que estos tengan menor impacto.
* El usuario involucrado durante el desarrollo (probando prototipos) incrementa la aceptación de la implementación del producto final.
* Pequeños prototipos con modificaciones son mostrados al cliente y sirve para confirmar que se han comprendido sus requisitos.
* Muchos de los prototipos se generan con la expectativa de ser descartados, sin embargo, en algunos casos el prototipo puede evolucionar y convertirse en el producto final.
* Es necesario un entendimiento fundamental de los problemas del negocio para evitar resolver los problemos incorrectos, despilfarrando esfuerzo al desarrollar prototipos que son prescindibles.

## Desarrollo en espiral

En 1988, se realiza la presentación formal del modelo en espiral por Barry Boehm que combina los aspectos claves del modelo en cascada y la rápida metodología de prototipo en un esfuerzo por combinar las ventajas de ambos modelos. Hace énfasis en el área clave en la que han fallado otros modelos: no llevar un análisis de riesgo iterativo, especialmente adecuado para sistemas complejos a gran escala.
Los principios básicos son:
* Se enfoca en la evaluación y minimización de los riesgos del proyecto al dividirlo en segmentos más pequeños y proporcionar más facilidad de cambio durante el proceso de desarrollo, así como proporcionar la oportunidad de evaluar los riesgos y ponderar las actividades de la continuación del proyecto durante todo el ciclo de vida.
* Cada ciclo implica una progresión a través de la misma secuencia de pasos, para cada parte del producto y para cada uno de sus niveles de elaboración, desde un documento general de operación hasta el código de cada programa individual.
* Cada vuelta del ciclo atraviesa 4 cuadrantes básicos:
** Cuadrante 1: Determinar objetivos, alternativas y restricciones de la iteración
** Cuadrante 2: Evaluar alternativas, identificar y resolver riesgos
** Cuadrante 3: Desarrollar y verificar entregables de la iteración
** Cuadrante 4: Planificación de la siguiente iteración
* Cada ciclo comienza con la identificación de las condiciones de éxito por parte de los dueños del producto y concluyen con una revisión y compromiso.

## Desarrollo ágil

Son métodos que ponen el énfasis en agilizar el desarrollo, cuidando más la interacción auto-organizada entre personas y la entrega de software funcionando que la elaboración de documentación o el seguimiento estricto de protocolos y procesos de actuación. Algunos métodos ágiles de desarrollo de software:
* Adaptive Software Development (ASD)
* Agile Unified Process (AUP)
* Crystal Clear
* Feature Driven Development (FDD)
* Lean Software Development (LSD)
* Kanban
* Open Unified Process (OpenUP)
* Programación Extrema (XP)
* Método de desarrollo de sistemas dinámicos (DSDM)
* Scrum

## Conclusiones

El desarrollo de software es uno de los pilares fundamentales de la Informática y al cual se dedican muchas horas de esfuerzos en universidades, centros de investigación y empresas de todos los tamaños.
Conforme la tecnología va avanzando, van apareciendo nuevas soluciones, nuevas formas de programación, nuevos lenguajes, y un sin fin de herramientas que intentan realizar el trabajo del desarrollador un poco mas fácil. También surgen nuevos modelos de proceso de desarrollo y nuevas metodologías que tratan de adaptar la manera de trabajar a las necesidades concretas de una organización y de sus proyectos. Es importante conocer bien estos modelos, para tener un esquema mental que nos permita gestionar proyectos y organizar equipos de manera racional, cuando abordemos el desarrollo de software, especialmente en el caso de aplicaciones grandes y complejas.

## Lecciones relacionadas

* Metodologías pesadas de desarrollo software
* Proceso Unificado de Desarrollo
* Metodologías ágiles de desarrollo software
* Scrum