3.1 MODELO EN CASCADA
El modelo en cascada, es el enfoque
metodológico que ordena rigurosamente las etapas del proceso para el desarrollo de software, de tal forma que
el inicio de cada etapa debe esperar a la finalización de la etapa anterior.
Un ejemplo de una metodología de desarrollo en
cascada es:
- Análisis de requisitos.
- Diseño del Sistema.
- Diseño del Programa.
- Codificación.
- Pruebas.
- Implantación.
- Mantenimiento.
De esta forma, cualquier error de diseño detectado
en la etapa de prueba conduce necesariamente al rediseño y nueva programación
del código afectado, aumentando los costes del desarrollo. La palabra cascada sugiere, mediante la metáfora
de la fuerza de la gravedad, el esfuerzo necesario para introducir un cambio en
las fases más avanzadas de un proyecto.
Análisis de
requisitos
En esta fase se
analizan las necesidades de los usuarios finales del software para determinar
qué objetivos debe cubrir. De esta fase surge una memoria llamada SRD
(documento de especificación de requisitos), que contiene la especificación
completa de lo que debe hacer el sistema sin entrar en detalles internos.
Es importante
señalar que en esta etapa se debe consensuar todo lo que se requiere del
sistema y será aquello lo que seguirá en las siguientes etapas, no pudiéndose
requerir nuevos resultados a mitad del proceso de elaboración del software.
Diseño del Sistema
Descompone y
organiza el sistema en elementos que puedan elaborarse por separado,
aprovechando las ventajas del desarrollo en equipo. Como resultado surge el SDD
(Documento de Diseño del Software), que contiene la descripción de la estructura
relacional global del sistema y la especificación de lo que debe hacer cada una
de sus partes, así como la manera en que se combinan unas con otras.
Es conveniente
distinguir entre diseño de alto nivel o arquitectónico y diseño detallado. El
primero de ellos tiene como objetivo definir la estructura de la solución (una
vez que la fase de análisis ha descrito el problema) identificando grandes
módulos (conjuntos de funciones que van a estar asociadas) y sus relaciones.
Con ello se define la arquitectura de la solución elegida. El segundo define
los algoritmos empleados y la organización del código para comenzar la
implementación.
Diseño del Programa
Es la fase en donde
se realizan los algoritmos necesarios para el cumplimiento de los
requerimientos del usuario así como también los análisis necesarios para saber
que herramientas usar en la etapa de Codificación.
Codificación
Es la fase en donde
se implementa el código fuente, haciendo uso de
prototipos así como de pruebas y ensayos para corregir errores.
Dependiendo del
lenguaje de programación y su versión se crean las bibliotecas y componentes
reutilizables dentro del mismo proyecto para hacer que la programación sea un
proceso mucho más rápido.
Pruebas
Los elementos, ya
programados, se ensamblan para componer el sistema y se comprueba que funciona
correctamente y que cumple con los requisitos, antes de ser entregado al
usuario final.
Verificación
Es la fase en donde
el usuario final ejecuta el sistema, para ello el o los programadores ya
realizaron exhaustivas pruebas para comprobar que el sistema no falle.
Mantenimiento
Una de las etapas
mas criticas, ya que se destina un 75% de los recursos, es el mantenimiento del
Software ya que al utilizarlo como usuario final puede ser que no cumpla con
todas nuestras expectativas.
Variantes
Existen
variantes de este modelo; especialmente destacamos la que hace uso de prototipos y en la que se establece un ciclo
antes de llegar a la fase de mantenimiento, verificando que el sistema final
este libre de fallos.
Desventajas
En la vida
real, un proyecto rara vez sigue una secuencia lineal, esto crea una mala
implementación del modelo, lo cual hace que lo lleve al fracaso.
El proceso
de creación del software tarda mucho tiempo ya que debe pasar por el proceso de
prueba y hasta que el software no esté completo no se opera. Esto es la base
para que funcione bien.
Cualquier
error de diseño detectado en la etapa de prueba conduce necesariamente al
rediseño y nueva programación del código afectado, aumentando los costos del
desarrollo.
3.2. MODELOS EVOLUTIVOS
El software evoluciona con el tiempo, los
requisitos del usuario y del producto suelen cambiar conforme se desarrolla el
mismo. Las fechas de mercado y la competencia hacen que no sea posible esperar
a poner en el mercado un producto absolutamente completo, por lo que se
aconsejable introducir una versión funcional limitada de alguna forma para
aliviar las presiones competitivas.
En esas u otras situaciones similares los
desarrolladores necesitan modelos de progreso que estén diseñados para
acomodarse a una evolución temporal o progresiva, donde los requisitos
centrales son conocidos de antemano, aunque no estén bien definidos a nivel
detalle.
En el modelo cascada y cascada realimentado no se
tiene demasiado en cuenta la naturaleza evolutiva del software, se plantea como
estático, con requisitos bien conocidos y definidos desde el inicio.
Los evolutivos son modelos iterativos, permiten
desarrollar versiones cada vez más completas y complejas, hasta llegar al
objetivo final deseado; incluso evolucionar más allá, durante la fase de
operación.
Los modelos
«iterativo incremental» y «espiral» (entre otros) son dos de los más conocidos
y utilizados del tipo evolutivo.
3.3. MODELOS ESPECIALES
Modelo iterativo incremental: En
términos generales, se puede distinguir, en la figura 4, los pasos generales
que sigue el proceso de desarrollo de un producto software. En el modelo de
ciclo de vida seleccionado, se identifican claramente dichos pasos. La
descripción del sistema es esencial para especificar y confeccionar los
distintos incrementos hasta llegar al producto global y final. Las actividades
concurrentes (especificación, desarrollo y validación) sintetizan el desarrollo
pormenorizado de los incrementos, que se hará posteriormente.
Diagrama
genérico del desarrollo evolutivo incremental.
Muestra en
forma muy esquemática, el funcionamiento de un ciclo iterativo incremental, el
cual permite la entrega de versiones parciales a medida que se va construyendo
el producto final.6 Es decir,
a medida que cada incremento definido llega a su etapa de operación y
mantenimiento. Cada versión emitida incorpora a los anteriores incrementos las
funcionalidades y requisitos que fueron analizados como necesarios.
El
incremental es un modelo de tipo evolutivo que
está basado en varios ciclos Cascada Realimentados aplicados repetidamente, con
una filosofía iterativa. En la figura se muestra un refino del diagrama previo, bajo un
esquema temporal, para obtener finalmente el esquema del modelo de ciclo de
vida Iterativo Incremental, con sus actividades genéricas asociadas. Aquí se
observa claramente cada ciclo cascada que es aplicado para la obtención de un
incremento; estos últimos se van integrando para obtener el producto final completo.
Cada incremento es un ciclo Cascada Realimentado, aunque, por simplicidad, en
la figura se muestra como secuencial puro.
Se observa que existen actividades de
desarrollo (para cada incremento) que son realizadas en paralelo o
concurrentemente, así por ejemplo, en la figura, mientras se realiza el diseño
detalle del primer incremento ya se está realizando en análisis del segundo. La
figura es sólo esquemática, un incremento no necesariamente se iniciará
durante la fase de diseño del anterior, puede ser posterior (incluso antes), en
cualquier tiempo de la etapa previa. Cada incremento concluye con la actividad
de «operación y mantenimiento» (indicada como «Operación» en la figura), que es
donde se produce la entrega del producto parcial al cliente. El momento de
inicio de cada incremento es dependiente de varios factores: tipo de sistema;
independencia o dependencia entre incrementos (dos de ellos totalmente
independientes pueden ser fácilmente iniciados al mismo tiempo si se dispone de
personal suficiente); capacidad y cantidad de profesionales involucrados en el
desarrollo; etc.
Bajo este modelo se entrega software «por partes funcionales más
pequeñas», pero reutilizables, llamadas incrementos. En general cada incremento
se construye sobre aquel que ya fue entregado.
Como
se muestra en la figura, se aplican secuencias Cascada en forma escalonada,
mientras progresa el tiempo calendario. Cada secuencia lineal o Cascada produce
un incremento y a menudo el primer incremento es un sistema básico, con muchas
funciones suplementarias (conocidas o no) sin entregar.
El cliente utiliza inicialmente ese sistema básico, intertanto, el
resultado de su uso y evaluación puede aportar al plan para el desarrollo
del/los siguientes incrementos (o versiones). Además también aportan a ese plan
otros factores, como lo es la priorización (mayor o menor urgencia en la
necesidad de cada incremento en particular) y la dependencia entre incrementos
(o independencia).
Luego de cada integración se entrega un producto con mayor
funcionalidad que el previo. El proceso se repite hasta alcanzar el software
final completo.
Siendo iterativo, con el
modelo incremental se entrega un producto parcial pero completamente
operacional en cada incremento, y no una parte que sea usada para
reajustar los requerimientos (como si ocurre en el modelo de construcción de prototipos).
El enfoque incremental resulta muy útil cuando se dispone de baja
dotación de personal para el desarrollo; también si no hay disponible fecha
límite del proyecto por lo que se entregan versiones incompletas pero que
proporcionan al usuario funcionalidad básica (y cada vez mayor). También es un
modelo útil a los fines de versiones de evaluación.
Nota: Puede ser considerado y útil, en cualquier momento o
incremento incorporar temporalmente el paradigma MCP como complemento, teniendo así una
mixtura de modelos que mejoran el esquema y desarrollo general.
Ejemplo:
Un procesador de texto que sea desarrollado bajo el
paradigma Incremental podría aportar, en principio, funciones básicas de
edición de archivos y producción de documentos (algo como un editor simple). En un
segundo incremento se le podría agregar edición más sofisticada, y de
generación y mezcla de documentos. En un tercer incremento podría
considerarse el agregado de funciones de corrección ortográfica, esquemas de paginado y plantillas; en un
cuarto capacidades de dibujo propias y ecuaciones matemáticas. Así
sucesivamente hasta llegar al procesador final requerido. Así, el producto va
creciendo, acercándose a su meta final, pero desde la entrega del primer
incremento ya es útil y funcional para el cliente, el cual observa una
respuesta rápida en cuanto a entrega temprana; sin notar que la fecha límite
del proyecto puede no estar acotada ni tan definida, lo que da margen de
operación y alivia presiones al equipo de desarrollo.
Como se dijo, el Iterativo Incremental es un modelo del tipo
evolutivo, es decir donde se permiten y esperan probables cambios en los
requisitos en tiempo de desarrollo; se admite cierto margen para que el
software pueda evolucionar9
. Aplicable cuando los requisitos son medianamente bien conocidos pero no son
completamente estáticos y definidos, cuestión esa que si es indispensable para
poder utilizar un modelo Cascada.
El
modelo es aconsejable para el desarrollo de software en el cual se observe, en
su etapa inicial de análisis, que posee áreas bastante bien definidas a cubrir,
con suficiente independencia como para ser desarrolladas en etapas sucesivas.
Tales áreas a cubrir suelen tener distintos grados de apremio por lo cual las mismas se deben priorizar en un análisis
previo, es decir, definir cual será la primera, la segunda, y así
sucesivamente; esto se conoce como «definición de los incrementos» con base en
la priorización. Pueden no existir prioridades funcionales por parte del
cliente, pero el desarrollador debe fijarlas de todos modos y con algún
criterio, ya que basándose en ellas se desarrollarán y entregarán los distintos
incrementos.
El hecho de que existan incrementos funcionales del software lleva
inmediatamente a pensar en un esquema de desarrollo modular,
por tanto este modelo facilita tal paradigma de diseño.
En resumen, un modelo incremental lleva a pensar en un desarrollo
modular, con entregas parciales del producto software denominados «incrementos»
del sistema, que son escogidos según prioridades predefinidas de algún modo. El
modelo permite una implementación con refinamientos sucesivos (ampliación o
mejora). Con cada incremento se agrega nueva funcionalidad o se cubren nuevos
requisitos o bien se mejora la versión previamente implementada del producto
software.
Este modelo brinda cierta flexibilidad para que durante el
desarrollo se incluyan cambios en los requisitos por parte del usuario, un
cambio de requisitos propuesto y aprobado puede analizarse e implementarse como
un nuevo incremento o, eventualmente, podrá constituir una mejora/adecuación de
uno ya planeado. Aunque si se produce un cambio de requisitos por parte del
cliente que afecte incrementos previos ya terminados (detección/incorporación
tardía) se debe evaluar la
factibilidad y realizar un acuerdo con el cliente, ya que puede impactar
fuertemente en los costos.
La selección de este modelo permite realizar entregas
funcionales tempranas al cliente (lo cual es beneficioso tanto para él como
para el grupo de desarrollo). Se priorizan las entregas de aquellos módulos o
incrementos en que surja la necesidad operativa de hacerlo, por ejemplo para
cargas previas de información, indispensable para los incrementos siguientes.
El modelo iterativo incremental no obliga a especificar con
precisión y detalle absolutamente todo lo que el sistema debe hacer, (y cómo),
antes de ser construido (como el caso del cascada, con requisitos congelados).
Sólo se hace en el incremento en desarrollo. Esto torna más manejable el
proceso y reduce el impacto en los costos. Esto es así, porque en caso de
alterar o rehacer los requisitos, solo afecta una parte del sistema. Aunque,
lógicamente, esta situación se agrava si se presenta en estado avanzado, es
decir en los últimos incrementos. En
definitiva, el modelo facilita la incorporación de nuevos requisitos durante el
desarrollo.
Con un paradigma incremental se reduce el tiempo de desarrollo
inicial, ya que se implementa funcionalidad parcial. También provee un impacto
ventajoso frente al cliente, que es la entrega temprana de partes operativas
del software.
El modelo proporciona todas las ventajas del modelo en cascada
realimentado, reduciendo sus desventajas sólo al ámbito de cada incremento.
El modelo incremental no es recomendable para casos de sistemas de
tiempo real,
de alto nivel de seguridad, de procesamiento distribuido, o de alto
índice de riesgos.
Modelo espiral: El
modelo espiral fue propuesto inicialmente por Barry
Boehm. Es un modelo evolutivo que conjuga la naturaleza iterativa
del modelo MCP con los aspectos controlados y sistemáticos del
Modelo Cascada. Proporciona potencial para desarrollo rápido de versiones
incrementales. En el modelo Espiral el software se construye en una serie de
versiones incrementales. En las primeras iteraciones la versión incremental
podría ser un modelo en papel o bien un prototipo. En las últimas iteraciones
se producen versiones cada vez más completas del sistema diseñado.
El modelo se divide en un número de Actividades de marco de
trabajo, llamadas «regiones de tareas». En general existen entre tres y
seis regiones de tareas (hay variantes del modelo). En la figura se muestra el
esquema de un Modelo Espiral con 6 regiones. En este caso se explica una
variante del modelo original de Boehm, expuesto en su tratado de 1988; en 1998
expuso un tratado más reciente.
Fig. - Modelo espiral para el ciclo de
vida del software.
Las regiones definidas en el modelo de la figura son:
- Región 1 - Tareas requeridas para establecer la comunicación entre el cliente y el desarrollador.
- Región 2 - Tareas inherentes a la definición de los recursos, tiempo y otra información relacionada con el proyecto.
- Región 3 - Tareas necesarias para evaluar los riesgos técnicos y de gestión del proyecto.
- Región 4 - Tareas para construir una o más representaciones de la aplicación software.
- Región 5 - Tareas para construir la aplicación, instalarla, probarla y proporcionar soporte al usuario o cliente (Ej. documentación y práctica).
- Región 6 - Tareas para obtener la reacción del cliente, según la evaluación de lo creado e instalado en los ciclos anteriores.
Las actividades enunciadas para el marco de trabajo son generales
y se aplican a cualquier proyecto, grande, mediano o pequeño, complejo o no.
Las regiones que definen esas actividades comprenden un «conjunto de tareas»
del trabajo: ese conjunto sí se debe adaptar a las características del proyecto
en particular a emprender. Nótese que lo listado en los ítems de 1 a 6 son
conjuntos de tareas, algunas de las ellas normalmente dependen del proyecto o
desarrollo en si.
Proyectos pequeños requieren baja cantidad de tareas y también de
formalidad. En proyectos mayores o críticos cada región de tareas contiene
labores de más alto nivel de formalidad. En cualquier caso se aplican
actividades de protección (por ejemplo, gestión de configuración del software,
garantía de calidad, etc.).
Al inicio del ciclo, o proceso evolutivo, el equipo de ingeniería
gira alrededor del espiral (metafóricamente hablando) comenzando por el centro
(marcado con ๑
en la figura 6) y en el sentido indicado; el primer circuito de la espiral
puede producir el desarrollo de una especificación
del producto; los pasos siguientes podrían generar un prototipo
y progresivamente versiones más sofisticadas del software.
Cada paso por la región de planificación provoca ajustes en el
plan del proyecto; el coste y planificación se realimentan en función de la
evaluación del cliente. El gestor de proyectos debe ajustar el número de
iteraciones requeridas para completar el desarrollo.
El modelo espiral puede ir adaptándose y aplicarse a lo largo de
todo el Ciclo de vida del software
(en el modelo clásico, o cascada, el proceso termina a la entrega del
software).
Una visión alternativa del modelo puede observarse examinando el
«eje de punto de entrada de proyectos». Cada uno de los circulitos (๏)
fijados a lo largo del eje representan puntos de arranque de los distintos
proyectos (relacionados); a saber:
- Un proyecto de «desarrollo de conceptos» comienza al inicio de la espiral, hace múltiples iteraciones hasta que se completa, es la zona marcada con verde.
- Si lo anterior se va a desarrollar como producto real, se inicia otro proyecto: «Desarrollo de nuevo Producto». Que evolucionará con iteraciones hasta culminar; es la zona marcada en color azul.
- Eventual y análogamente se generarán proyectos de «mejoras de productos» y de «mantenimiento de productos», con las iteraciones necesarias en cada área (zonas roja y gris, respectivamente).
Cuando la espiral se caracteriza de esta forma, está operativa hasta
que el software se retira, eventualmente puede estar inactiva (el proceso),
pero cuando se produce un cambio el proceso arranca nuevamente en el punto de
entrada apropiado (por ejemplo, en «mejora del producto»).
El modelo espiral da un enfoque realista, que evoluciona igual que
el software; se adapta muy bien para desarrollos a gran escala.
El Espiral utiliza el MCP
para reducir riesgos y permite aplicarlo en cualquier etapa de la evolución.
Mantiene el enfoque clásico (cascada) pero incorpora un marco de trabajo
iterativo que refleja mejor la realidad.
Este modelo requiere
considerar riesgos técnicos en todas las etapas del proyecto; aplicado
adecuadamente debe reducirlos antes de que sean un verdadero problema.
El Modelo evolutivo como el Espiral es particularmente apto para
el desarrollo de Sistemas Operativos (complejos); también en sistemas de altos
riesgos o críticos (Ej. navegadores y controladores aeronáuticos) y en todos
aquellos en que sea necesaria una fuerte gestión del proyecto y sus riesgos,
técnicos o de gestión.
Desventajas importantes:
- Requiere mucha experiencia y habilidad para la evaluación de los riesgos, lo cual es requisito para el éxito del proyecto.
- Es difícil convencer a los grandes clientes que se podrá controlar este enfoque evolutivo.
Este modelo no se ha usado tanto, como el Cascada (Incremental) o MCP, por lo que no se tiene bien medida su eficacia, es un paradigma
relativamente nuevo y difícil de implementar y controlar.
Modelo espiral Win & Win
Una variante interesante del Modelo Espiral previamente visto en
la Figura es el «Modelo espiral Win-Win» (Barry
Boehm). El Modelo Espiral previo (clásico) sugiere la comunicación con
el cliente para fijar los requisitos, en que simplemente se pregunta al cliente
qué necesita y él proporciona la información para continuar; pero esto es en un
contexto ideal que rara vez ocurre. Normalmente cliente y desarrollador entran
en una negociación, se negocia coste frente a funcionalidad, rendimiento,
calidad, etc.
«Es así que la obtención de requisitos
requiere una negociación, que tiene éxito cuando ambas partes ganan».
Las mejores negociaciones se fuerzan en obtener «Victoria &
Victoria» (Win & Win), es decir que el cliente gane obteniendo el producto
que lo satisfaga, y el desarrollador también gane consiguiendo presupuesto y
fecha de entrega realista. Evidentemente, este modelo requiere fuertes
habilidades de negociación.
El modelo Win-Win define un conjunto de actividades de negociación
al principio de cada paso alrededor de la espiral; se definen las siguientes
actividades:
- Identificación del sistema o subsistemas clave de los directivos(*) (saber qué quieren).
- Determinación de «condiciones de victoria» de los directivos (saber qué necesitan y los satisface)
- Negociación de las condiciones «victoria» de los directivos para obtener condiciones «Victoria & Victoria» (negociar para que ambos ganen).
(*) Directivo: Cliente escogido con interés directo en el
producto, que puede ser premiado por la organización si tiene éxito o criticado
si no.
El modelo Win & Win hace énfasis en la negociación inicial,
también introduce 3 hitos en el proceso llamados «puntos de fijación», que
ayudan a establecer la completitud de un ciclo de la espiral, y proporcionan
hitos de decisión antes de continuar el proyecto de desarrollo del software.
3.4. EL PROCESO UNIFICADO DE DESARROLLO DE
SOFTWARE.
El Proceso Unificado de Desarrollo Software
o simplemente Proceso Unificado es un marco de
desarrollo de software que se caracteriza por estar dirigido por casos de uso, centrado en la
arquitectura y por ser iterativo
e incremental. El refinamiento más conocido y documentado del Proceso Unificado es el
Proceso Unificado de Rational o simplemente RUP.
El Proceso Unificado no es simplemente un proceso,
sino un marco de trabajo extensible que puede ser adaptado a organizaciones o
proyectos específicos. De la misma forma, el Proceso Unificado de Rational, también es un marco de trabajo
extensible, por lo que muchas veces resulta imposible decir si un refinamiento
particular del proceso ha sido derivado del Proceso Unificado o del RUP. Por
dicho motivo, los dos nombres suelen utilizarse para referirse a un mismo
concepto.
El nombre Proceso
Unificado se usa para describir el proceso genérico que incluye aquellos
elementos que son comunes a la mayoría de los refinamientos existentes. También
permite evitar problemas legales ya que Proceso
Unificado de Rational o RUP
son marcas registradas por IBM (desde su compra
de Rational Software Corporation en 2003). El
primer libro sobre el tema se denominó, en su versión española, El Proceso Unificado de Desarrollo de Software
(ISBN 84-7829-036-2) y fue publicado
en 1999 por Ivar
Jacobson, Grady
Booch y James
Rumbaugh, conocidos también por ser los desarrolladores del UML, el Lenguaje Unificado de Modelado. Desde entonces los autores que publican libros
sobre el tema y que no están afiliados a Rational utilizan el término Proceso Unificado, mientras que los
autores que pertenecen a Rational favorecen el nombre de Proceso Unificado de Rational.
-CARACTERISTICAS
Iterativo e Incremental
El Proceso Unificado es un marco de desarrollo iterativo e incremental compuesto de cuatro
fases denominadas Inicio, Elaboración, Construcción y Transición. Cada una de
estas fases es a su vez dividida en una serie de iteraciones (la de inicio sólo
consta de varias iteraciones en proyectos grandes). Estas iteraciones ofrecen
como resultado un incremento
del producto desarrollado que añade o mejora las funcionalidades del sistema en
desarrollo.
Cada una de estas iteraciones se divide a su vez en una serie de
disciplinas que recuerdan a las definidas en el ciclo de vida clásico o en cascada: Análisis de requisitos, Diseño,
Implementación y Prueba. Aunque todas las iteraciones suelen incluir trabajo en
casi todas las disciplinas, el grado de esfuerzo dentro de cada una de ellas
varía a lo largo del proyecto.
Diagrama ilustrando como el énfasis
relativo en las distintas disciplinas cambia a lo largo del proyecto.
Dirigido por los casos de uso
En el Proceso Unificado los casos
de uso se utilizan para capturar los requisitos funcionales y para
definir los contenidos de las iteraciones. La idea es que cada iteración tome
un conjunto de casos de uso o escenarios
y desarrolle todo el camino a través de las distintas disciplinas: diseño,
implementación, prueba, etc. el proceso dirigido por casos de uso es el rup.
Nota: en UP se está Dirigido por requisitos y riesgos de acuerdo con el
Libro UML 2 de ARLOW, Jim que menciona el tema.
Centrado en la arquitectura
El Proceso Unificado asume que no existe un modelo único que cubra
todos los aspectos del sistema. Por dicho motivo existen múltiples modelos y
vistas que definen la arquitectura de software de un sistema. La analogía con
la construcción es clara, cuando construyes un edificio existen diversos planos
que incluyen los distintos servicios del mismo: electricidad, fontanería, etc.
Enfocado en los riesgos
El Proceso Unificado requiere que el equipo del proyecto se centre
en identificar los riesgos críticos en una etapa temprana del ciclo de vida.
Los resultados de cada iteración, en especial los de la fase de Elaboración,
deben ser seleccionados en un orden que asegure que los riesgos principales son
considerados primero.
El Lenguaje unificado de modelado no es el sucesor de la oleada de
métodos de análisis y diseño orientados a objetos que surgió a finales de la década
de los 1980 y principios de la siguiente. El UML unifica, sobre todo, los métodos
de Booch, Rumbaugh, Brühl (OMT) y Jacobson, pero su alcance ha llegado a formar
parte fundamental de la Ingeniería de Software tras su estandarización en 1997
con el OMG (Object Management Group o Grupo de administración de objetos).
¿Por qué analizar y diseñar?
En resumidas cuentas, la cuestión fundamental del desarrollo del
software es la escritura del código. Después de todo, los diagramas son solo imágenes
bonitas. Ningún usuario va a agradecer la belleza de los dibujos; lo que el
usuario quiere es software que funcione (UML Gota a Gota, Addison Wesley, Pag
7). Por lo tanto, cuando considere usar el UML es importante preguntarse por
qué lo hará y como le ayudara a usted cuando llegue el momento de escribir el
código. No existe una evidencia empírica adecuada que demuestre si estas
técnicas son buenas o malas.
3.5. Modelo de Proceso de Software
IEEE.
Análisis de requerimientos
Extraer los requisitos y requerimientos de un producto de software
es la primera etapa para crearlo. Mientras que los clientes piensan que ellos
saben lo que el software tiene que hacer, se requiere de habilidad y
experiencia en la ingeniería de software para reconocer requerimientos
incompletos, ambiguos o contradictorios. El resultado del análisis de requerimientos
con el cliente se plasma en el documento ERS, Especificación de Requerimientos del Sistema, cuya estructura
puede venir definida por varios estándares, tales como CMMI.
Asimismo, se define un diagrama de Entidad/Relación, en el que
se plasman las principales entidades que participarán en el desarrollo del
software.
La captura, análisis y especificación de requerimientos (incluso
pruebas de ellos), es una parte crucial; de esta etapa depende en gran medida
el logro de los objetivos finales. Se han ideado modelos y diversos procesos de
trabajo para estos fines. Aunque aún no está formalizada, ya se habla de la Ingeniería de requerimientos,
por ejemplo en dos capítulos del libro de Sommerville "Ingeniería del
software" titulados "Requerimientos del software" y
"Procesos de la Ingeniería de Requerimientos".
La IEEE Std. 830-1998 normaliza la creación de las
especificaciones de requerimientos de software (Software Requirements
Specification).
Especificación
La especificación de requisitos describe el comportamiento
esperado en el software una vez desarrollado. Gran parte del éxito de un
proyecto de software radicará en la identificación de las necesidades del
negocio (definidas por la alta dirección), así como la interacción con los usuarios
funcionales para la recolección, clasificación, identificación, priorización y
especificación de los requisitos del software.
Entre las técnicas utilizadas para la especificación de requisitos
se encuentran:
Siendo los primeros más rigurosos y formales, los segundas más
ágiles e informales.
Arquitectura
La integración de infraestructura, desarrollo de aplicaciones,
bases de datos y herramientas gerenciales, requieren de capacidad y liderazgo
para poder ser conceptualizados y proyectados a futuro, solucionando los
problemas de hoy. El rol en el cual se delegan todas estas actividades es el
del Arquitecto.
El arquitecto de software es la persona que añade valor a los
procesos de negocios gracias a su valioso aporte de soluciones tecnológicas.
La arquitectura de sistemas en general, es una actividad de
planeación, ya sea a nivel de infraestructura de red y hardware, o de software.
La arquitectura de software consiste en el diseño de componentes
de una aplicación (entidades del negocio), generalmente utilizando patrones de
arquitectura. El diseño arquitectónico debe permitir visualizar la interacción
entre las entidades del negocio y además poder ser validado, por ejemplo por
medio de diagramas de secuencia. Un diseño arquitectónico describe en general
el cómo se construirá una aplicación de software. Para ello se documenta
utilizando diagramas, por ejemplo:
Siendo los dos primeros los mínimos necesarios para describir la
arquitectura de un proyecto que iniciará a ser codificado. Depende del alcance
del proyecto, complejidad y necesidades, el arquitecto elige qué diagramas
elaborar.
Las herramientas para el diseño y modelado de software se
denominan CASE, (Computer Aided
Software Engineering) entre las cuales se encuentran:
- Enterprise Architect
- Microsoft Visio for Enterprise Architects
Programación
Reducir un diseño a código puede ser la parte más obvia del trabajo de ingeniería de software, pero no necesariamente es la que demanda mayor trabajo y ni la más complicada. La complejidad y la duración de esta etapa está íntimamente relacionada al o a los lenguajes de programación utilizados, así como al diseño previamente realizado.Prueba
Consiste en comprobar que el software realice correctamente las
tareas indicadas en la especificación del problema. Una técnica de prueba es
probar por separado cada módulo del software, y luego probarlo de forma
integral, para así llegar al objetivo. Se considera una buena práctica el que
las pruebas sean efectuadas por alguien distinto al desarrollador que la
programó, idealmente un área de pruebas; sin perjuicio de lo anterior el
programador debe hacer sus propias pruebas. En general hay dos grandes formas
de organizar un área de pruebas, la primera es que esté compuesta por personal
inexperto y que desconozca el tema de pruebas, de esta forma se evalúa que la
documentación entregada sea de calidad, que los procesos descritos son tan
claros que cualquiera puede entenderlos y el software hace las cosas tal y como
están descritas. El segundo enfoque es tener un área de pruebas conformada por
programadores con experiencia, personas que saben sin mayores indicaciones en
qué condiciones puede fallar una aplicación y que pueden poner atención en
detalles que personal inexperto no consideraría.
Documentación
Todo lo concerniente a la documentación del propio desarrollo del
software y de la gestión del proyecto, pasando por modelaciones (UML),diagramas
de casos de uso, pruebas, manuales de usuario, manuales técnicos, etc. todo con
el propósito de eventuales correcciones, usabilidad, mantenimiento futuro y
ampliaciones al sistema.
Mantenimiento
Fase dedicada a mantener y mejorar el software para corregir
errores descubiertos e incorporar nuevos requisitos. Esto puede llevar más
tiempo incluso que el desarrollo del software inicial. Alrededor de 2/3 del
tiempo de ciclo de vida de un proyecto2
está dedicado a su mantenimiento. Una pequeña parte de este trabajo consiste
eliminar errores (bugs); siendo
que la mayor parte reside en extender el sistema para incorporarle nuevas
funcionalidades y hacer frente a su evolución.
Modelos y filosofías de desarrollo de software
La
ingeniería de software dispone de varios modelos, paradigmas
y filosofías
de desarrollo, en los cuales se apoya para la construcción del software, entre
ellos se puede citar:
- Modelo en cascada o Clásico (modelo tradicional)
- Modelo de prototipos
- Modelo en espiral
- Desarrollo por etapas
- Desarrollo iterativo y creciente o Iterativo e Incremental
- RAD (Rapid Application Development)
- Desarrollo concurrente
- Proceso Unificado
- RUP (Proceso Unificado de Rational)
Naturaleza de la IS
La ingeniería de software tiene que ver con varios campos en
diferentes formas:
Matemáticas
Los programas tienen muchas propiedades matemáticas. Por ejemplo
la corrección y la complejidad de muchos algoritmos son
conceptos matemáticos que pueden ser rigurosamente probados. El uso de
matemáticas en la IS es llamado métodos
formales.
Creación
Los programas son construidos en una secuencia de pasos. El hecho
de definir propiamente y llevar a cabo estos pasos, como en una línea de
ensamblaje, es necesario para mejorar la productividad de los desarrolladores y
la calidad final de los programas. Este punto de vista inspira los diferentes
procesos y metodologías que se encuentran en la IS.
Gestión de Proyectos
El desarrollo de software de gran porte requiere una adecuada
gestión del proyecto. Hay presupuestos, establecimiento de tiempos de entrega,
un equipo de profesionales que liderar. Recursos (espacio de oficina, insumos,
equipamiento) por adquirir. Para su administración se debe tener una clara
visión y capacitación en Gestión de Proyectos.
Arte
Los programas contienen muchos elementos artísticos. Las
interfaces de usuario, la codificación, etc. Incluso la decisión para un nombre
de una variable o una clase. Donald
Knuth es famoso por argumentar a la programación como un arte.
3.6. HERRAMIENTAS CASE.
Las herramientas CASE (Computer Aided Software Engineering, Ingeniería
de Software Asistida por Computadora) son diversas aplicaciones
informáticas destinadas a aumentar la productividad en el desarrollo de software
reduciendo el costo de las mismas en términos de tiempo y de dinero. Estas
herramientas nos pueden ayudar en todos los aspectos del ciclo de vida de
desarrollo del software en tareas como el proceso de realizar un diseño del proyecto,
cálculo de costos, implementación de parte del código automáticamente con el
diseño dado, compilación automática, documentación o detección de errores entre
otras, que analizaba la relación existente entre los requisitos de un problema
y las necesidades que éstos generaban, el lenguaje en cuestión se denominaba
PSL (Problem Statement Language) y la aplicación que ayudaba a buscar las
necesidades de los diseñadores PSA (Problem Statement Analyzer).
Aunque ésos son los inicios de las herramientas
informáticas que ayudan a crear nuevos proyectos informáticos, la primera
herramienta CASE fue Excelerator que salió a la luz en el año 1984 y trabajaba
bajo una plataforma PC.
Las herramientas CASE alcanzaron su techo a
principios de los años 90. En la época en la que IBM había conseguido una
alianza con la empresa de software AD/Cycle para trabajar con sus mainframes,
estos dos gigantes trabajaban con herramientas CASE que abarcaban todo el ciclo
de vida del software. Pero poco a poco los mainframes han ido siendo menos
utilizados y actualmente el mercado de las Big CASE ha muerto completamente
abriendo el mercado de diversas herramientas más específicas para cada fase del
ciclo de vida del software.
Objetivos
- Mejorar la productividad en el desarrollo y mantenimiento del software.
- Aumentar la calidad del software.
- Reducir el tiempo y coste de desarrollo y mantenimiento de los sistemas informáticos.
- Mejorar la planificación de un proyecto
- Aumentar la biblioteca de conocimiento informático de una empresa ayudando a la búsqueda de soluciones para los requisitos.
- Automatizar el desarrollo del software, la documentación, la generación de código, las pruebas de errores y la gestión del proyecto.
- Ayuda a la reutilización del software, portabilidad y estandarización de la documentación
- Gestión global en todas las fases de desarrollo de software con una misma herramienta.
- Facilitar el uso de las distintas metodologías propias de la ingeniería del software.
Clasificación
Aunque no es fácil y no existe una forma única de clasificarlas,
las herramientas CASE se pueden clasificar teniendo en cuenta los siguientes
parámetros:
- Las plataformas que soportan.
- Las fases del ciclo de vida del desarrollo de sistemas que cubren.
- La arquitectura de las aplicaciones que producen.
- Su funcionalidad.
La siguiente clasificación es la más habitual basada en las fases
del ciclo de desarrollo que cubren:
- Upper CASE (U-CASE), herramientas que ayudan en las fases de planificación, análisis de requisitos y estrategia del desarrollo, usando, entre otros diagramas UML.
- Middle CASE (M-CASE), herramientas para automatizar tareas en el análisis y diseño de la aplicación.
- Lower CASE (L-CASE), herramientas que semi-automatizan la generación de código, crean programas de detección de errores, soportan la depuración de programas y pruebas. Además automatizan la documentación completa de la aplicación. Aquí pueden incluirse las herramientas de Desarrollo rápido de aplicaciones.
Existen otros nombres que se le dan a este tipo de herramientas, y
que no es una clasificación excluyente entre sí, ni con la anterior:
- Integrated CASE (I-CASE), herramientas que engloban todo el proceso de desarrollo software, desde análisis hasta implementación.
- MetaCASE, herramientas que permiten la definición de nuestra propia técnica de modelado, los elementos permitidos del metamodelo generado se guardan en un repositorio y pueden ser usados por otros analistas, es decir, es como si definiéramos nuestro propio UML, con nuestros elementos, restricciones y relaciones posibles.
- CAST (Computer-Aided Software Testing), herramientas de soporte a la prueba de software.
- IPSE (Integrated Programming Support Environment), herramientas que soportan todo el ciclo de vida, incluyen componentes para la gestión de proyectos y gestión de la configuración activa.
Por funcionalidad podríamos diferenciar algunas como:
- Herramientas de generación semiautomática de código.
- Editores UML.
- Herramientas de Refactorización de código.
No hay comentarios:
Publicar un comentario