24/04/2009
Desarrolladores CONTENIDO 1 | EL MODELADO
¿Qué es un sistema? / ¿Qué es el software? / Ingeniería del Software 2 | PARADIGMAS Y SOFTWARE
Metodología y paradigma / El proceso de software / Paradigmas de desarrollo / Desarrollo orientado a objetos / Programación orientada a objetos 3 | SOFTWARE
Desarrollo de software / Metodologías tradicionales / Desarrollo de sistemas Jackson / Ingeniería de la información / Método de análisis y diseño estructurado / Métrica / PMBOK / PRINCE2 /
08:56 a.m.
PÆgina 1
Desarrollador .NET Este libro brinda las herramientas necesarias para acercar al trabajo diario del desarrollador los avances más importantes en cuanto a la producción de software. Está destinado a Analistas, Ingenieros de Software y estudiantes de carreras afines que sientan que las técnicas tradicionales les resultan inadecuadas o insuficientes para alcanzar metas de tiempo y calidad a la hora de brindar soluciones a sus clientes. En sus páginas se exponen los métodos utilizados en la vanguardia del desarrollo, haciendo, previamente, un recorrido por la evolución de los métodos tradicionales para entender mejor la filosofía ágil. Sebastián Priolo, autor de un libro sobre Ruby, de esta misma editorial, pone a nuestra disposición toda su capacidad didáctica, y ahora nos alcanza una obra para ayudarnos a utilizar estas modernas metodologías con seguridad y sin temor a cometer errores, facilitando su implementación en nuestros desarrollos.
Desarrolladores Desarrolladores
tapa metodos agiles2.qxp
» Modelos y procesos de desarrollo » Metodologías tradicionales » Gestión dinámica y ágil » Programación extrema » Scrum » Calidad del software, pruebas y evaluación
Metodologías ágiles / Seleccionar una metodología
Proyectos / Crystal Clear / Feature Driven Development (FDD) / Adaptive Software Development (ASD) / Dynamic Systems Development Method (DSDM) / Lean Development (LD) y Lean Software Development (LSD) / Evolutionary Project Management (Evo) 5 | PROGRAMACIÓN EXTREMA
¿Qué es XP? / Valores de XP / El proceso XP / Equipo / Roles en XP / Artefactos de XP / Las balas de plata / Pruebas en XP / Críticas a XP
libros.redusers.com En este sitio encontrará una gran variedad de recursos y software relacionado, que le servirán como complemento al contenido del libro. Además, tendrá la posibilidad de estar en contacto con los editores, y de participar del foro de lectores, en donde podrá intercambiar opiniones y experiencias.
Servicio de Atención al Lector
usershop@redusers.com
6 | SCRUM
ARGENTINA (11) 4110 8700 CHILE (2) 335 7477 ESPAÑA (93) 635 4120 MÉXICO (55) 5350 3099
¿Qué es Scrum? / Ventajas de Scrum / Valores de Scrum / Modelo de desarrollo / Ciclo de vida de un proyecto / Dificultades de implementación / La gestión del riesgo en Scrum 7 | TRADICIONAL Y ÁGIL
Rational Unified Process (RUP) / Principios / AUP / Microsoft Solutions Framework (MSF) / OpenUP 8 | PRUEBAS Y CALIDAD
Calidad del software / Medir la calidad del software /
AGILE METHODS A book that will help us to understand how to use these modern methodologies and provide the necessary tools to make successful implementations improving the results obtained with traditional techniques.
Métricas / Capability Maturity Model (CMM - CMMI) / Pruebas 9 | HERRAMIENTAS
Aplicaciones ágiles / Servidor Web / Servidor de base
NIVEL
de datos / Gestores de base de datos / Ruby / Modelo
EXPERTO
de objetos / Patrones de diseño
AVANZADO INTERMEDIO
APÉNDICE: UML, LENGUAJE DE MODELADO
Sebastián Priolo
Para más información comuníquese con nuestro
PRINCIPIANTE
Métodos ágiles
4 | GESTIÓN ÁGIL
Métodos ágiles
Una alternativa real y competitiva a los procesos tradicionales de desarrollo
RT_Bombo_LIBROMetodosAgiles.qxp
27/04/2009
12:06
Página RT2
CONÉCTESE CON LOS MEJORES
LIBROS DE COMPUTACIÓN usershop.redusers.com
LA HERRAMIENTA IDEAL PARA LA TOMA DE DECISIONES
DOMINE EL SISTEMA OPERATIVO MÁS ESTABLE
PROFESSIONAL TOOLS I 256 páginas I ISBN 978-987-1347-84-1
MANUALES USERS I 320 páginas I ISBN 978-987-1347-94-0
CONOZCA LAS TÉCNICAS DE LOS HACKERS
APRENDA A PROGRAMAR CON EL LENGUAJE MÁS FLEXIBLE
MANUALES USERS I 320 páginas I ISBN 978-987-1347-93-3
DESARROLLADORES I 368 páginas I ISBN 978-987-1347-81-0
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 15
Métodos ágiles
Capítulo
1
Sistemas y software En este primer capítulo nos acercaremos a las definiciones de sistema y de software, y conoceremos sus características esenciales. Presentaremos al software como un proceso intelectual y a su vez como un producto de consumo.
SERVICIO DE ATENCIÓN AL LECTOR: lectores@redusers.com
¿Qué es un sistema? Parámetros de los sistemas ¿Qué es un sistema informático? ¿Qué es el software? Clasificaciones de software Características del software Complejidad inherente al software Elementos de la complejidad Dominar la complejidad Ingeniería del Software Crisis del software Situación actual del desarrollo Resumen Actividades
16 18 19 20 21 22 24 25 27 31 32 33 33 34
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 16
1. SISTEMAS Y SOFTWARE
¿QUÉ ES UN SISTEMA? Antes de introducirnos en los sistemas computacionales, debemos conocer algunos conceptos básicos que nos servirán de plataforma para nuestros aprendizajes futuros. Primero es necesario saber delimitar un sistema y conocer su definición, sus características y sus principios. Decimos que un sistema es un conjunto de elementos interrelacionados que operan en combinación para obtener un resultado deseado (propósito). Esto significa que está compuesto por partes que se conectan en una forma definida o determinada. Todo sistema tiene una estructura y una lógica internas, como así también mecanismos que permiten la comunicación entre los elementos constituyentes. Más adelante veremos que no sólo es importante mejorar los componentes aisladamente, sino también su interacción y formas de comunicación. La alteración de uno de los elementos afecta a todas las partes (globalismo o totalidad) y el conjunto final resultante es diferente. Como consecuencia, los ingenieros trabajan para construir sistemas que sean menos susceptibles a las fallas en el caso de la modificación de un componente. Otra de las dificultades es la fijación de límites, ya que las pequeñas diferencias en las determinaciones provocan grandes errores en el análisis del problema. Aunque aquí apenas comentamos estos detalles, son el centro de muchos de los inconvenientes del desarrollo de sistemas de software. Según la definición antes propuesta y lo declarado por Ludwig von Bertalanffy (biólogo austríaco), decimos que los sistemas tienen las siguientes características: • Propósito: toda la estructura del sistema se conforma para lograr un objetivo. En la mayoría de los casos existe más de un propósito definido y las prioridades de esos objetivos forman parte esencial de las respuestas del sistema. • Totalidad: los cambios en los elementos repercuten en el resto del sistema, produciendo alteraciones de diversa índole. • Entropía: es la tendencia de los sistemas a desgastarse o desintegrarse. Es directamente proporcional al lapso de vida del sistema, es decir que aumenta con el tiempo transcurrido. Según algunas teorías, el elemento que permite disminuir o controlar la entropía es la información (negentropía).
SISTEMAS ADAPTABLES La adaptabilidad es el proceso por el cual un sistema se organiza, adquiere información, la procesa y aprende para poder resistir a su destrucción. En el caso de los sistemas informáticos, esto no es sencillo de imitar. La búsqueda de sistemas adaptables ha hecho posible no sólo la creación de métodos originales sino de nuevas disciplinas dentro de los equipos de desarrollo.
16
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 17
¿Qué es un sistema?
• Homeostasis: es el equilibrio existente entre las partes del sistema. La adaptación para la supervivencia hace que el sistema se modifique, que se organice internamente a partir de sus elementos para resistir a las alteraciones externas. Los sistemas pueden ser clasificados según su constitución en:
Entropía (S)
• Sistemas físicos: conformados por elementos y objetos concretos, reales. • Sistemas abstractos: se refieren a conceptos, ideas, hipótesis. Son generalmente representados mediante símbolos que reflejan sus atributos.
Número de estados (W)
Figura 1. Representación gráfica del aumento de la entropía de acuerdo al número de estados de un sistema.
Además de observar la composición, de acuerdo a la interacción (o naturaleza) existen dos tipos de sistemas: • Cerrados: no se relacionan con elementos situados fuera de ellos. Si aceptamos esta definición, debemos decir que carecen de conexión con elementos externos. Dado que es difícil pensar que no haya ningún tipo de intercambio, muchas veces se hace uso de este término para destacar a aquellos sistemas que son rítmicos, como por ejemplo un reloj.
SISTEMAS ABIERTOS Es muy importante destacar que en esta instancia de nuestro aprendizaje, al hablar del término sistemas abiertos lo hacemos para referirnos a la descripción de las características de un sistema y no a los sistemas de software abiertos que estudiaremos más adelante en el libro y que no tienen relación con el concepto aquí tratado.
17
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 18
1. SISTEMAS Y SOFTWARE
• Abiertos: son los sistemas que tienen un intercambio con el exterior en forma de entradas y salidas de materia o energía.
Figura 2. Posible representación de un sistema abierto y uno cerrado.
Parámetros de los sistemas Todos los sistemas tienen parámetros en común, que veremos a continuación: • Entrada: es el material o energía, comúnmente denominado input, que permite el inicio de la operación del sistema. • Salida: es el producto objetivo resultante para el cual fue creado el sistema. Se denomina output. • Proceso: es el conjunto de operaciones que realiza el sistema para convertir la entrada en salida. • Feedback: es la función de retroalimentación del sistema, que puede ser sobre el producto o la comparación de éste con un criterio determinado. • Entorno: es el ambiente en el cual está inmerso el sistema. Opera en muchos casos junto a él, aunque puede hacerlo también en forma contraria. Como hemos visto, todo sistema presenta constante interacción con su medio.
SISTEMA INFORMÁTICO Las distintas definiciones de sistema informático varían, principalmente, por ubicar al usuario o a las personas dentro o fuera de él. Este punto, aunque simple, puede ser muy importante a la hora de considerar una equivocación humana como error del sistema o del ambiente, cambiando las condiciones del análisis y del diseño.
18
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 19
¿Qué es un sistema?
Entorno Sistema Entrada
Procesos
Salida
Entorno
Figura 3. Vemos que la etapa de proceso que nos interesa en principio es interna al sistema.
¿Qué es un sistema informático? Conociendo los elementos básicos, comenzaremos a introducirnos en el tema central. Un sistema informático es el conjunto de recursos disponibles para la resolución de problemas, la simulación de la realidad, el almacenaje de información, el procesamiento de datos y otro tipo de tareas mediante el uso de las ciencias de la computación. Todo sistema informático se compone de: • Hardware: computadoras, periféricos, circuitos electrónicos, dispositivos técnicos. • Software: sistemas operativos, software de aplicación, controladores. • Personas: todos los que interactúan con el sistema, desde los desarrolladores hasta los usuarios finales. • Documentos: reglas sobre el uso, normas y otro tipo de documentación técnica. Hardware (la computadora)
Software (programas)
Datos (información)
Personas (usuarios)
Figura 4. Un sistema informático está compuesto por elementos de hardware y de software, personas y documentos. 19
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 20
1. SISTEMAS Y SOFTWARE
¿QUÉ ES EL SOFTWARE? En este momento no discutiremos sobre cuándo nació el software o si puede existir independientemente del hardware, pero debemos establecer de forma clara a qué nos referimos con el término. Repasemos dos definiciones alternativas: • El software es el conjunto de instrucciones que posibilitan y son responsables de que el hardware realice su tarea. • Según la definición del IEEE, “software es la suma total de los programas de ordenador, procedimientos, reglas, la documentación asociada y los datos que pertenecen a un sistema de cómputo”. Actualmente, se acepta la definición más amplia (que incluye a la documentación, entre otras cosas, dentro del software), y todas las prácticas de ingeniería se desprenden de ella. Pero el software no son sólo los programas sino todos los documentos asociados, la configuración y el conjunto de datos necesarios para lograr que los programas operen correctamente. Entonces, el sistema de software estará compuesto por: • • • •
Programas. Archivos de configuración asociados. Documentación del desarrollo. Documentación para el usuario final. Sistema de software
Archivos de configuración
Programas Documentación de desarrollo
Documentación de usuario
Figura 5. Todo lo incluido en el sistema de software también debe ser desarrollado en el proyecto. 20
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 21
¿Qué es el software?
Clasificaciones de software Como ingenieros, nos gusta clasificar las cosas de acuerdo a distintos criterios, y lo mismo podemos hacer con el software. La división más simple que podemos realizar es a partir del destino o utilidad que tiene el producto final. De acuerdo a esto observamos lo siguiente: • Software de sistemas: son los programas que permiten a otros poder operar. En general, están construidos para interactuar con el hardware disponible y responder a las peticiones de software de mayor nivel. Su desarrollo suele ser crítico y de acuerdo a esto se podrá obtener mayor rendimiento del hardware. Un ejemplo de este tipo de software son los sistemas operativos. • Software tiempo real: son programas que interactúan de manera natural con el ambiente. Accionan y responden relacionados con sucesos del mundo real a medida que estos aparecen. La tolerancia a fallas y la velocidad de respuesta son dos de sus elementos destacados. Su correcto funcionamiento depende no sólo de la respuesta sino de la velocidad en que la desarrolla y entrega. Este tipo de software generalmente se encuentra en ambientes de producción, ventas y gestión, aunque todos los programas que estamos acostumbrados a utilizar hoy en día podrían caer, en mayor o menor medida, en esta definición. • Software ingeniería: es el software de asistencia a prácticas de ingeniería o científicas. Son herramientas que facilitan la toma de datos, los cálculos, la generación de imágenes, el modelado de objetos y otro tipo de apoyo. • Software embebido: está instalado en otros elementos o productos industriales, comúnmente conocido como software empotrado. Su profundidad o sencillez dependen del destino dado. Incorpora elementos de software en tiempo real, de sistemas y de aplicación.
Usuario final Programas de aplicaciones Utilidades Sistema operativo Hardware de computadora
Figura 6. Vemos claramente cómo el software de sistemas o de bajo nivel (por su ubicación) soporta al resto. 21
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 22
1. SISTEMAS Y SOFTWARE
Características del software Ahora que hemos tenido un acercamiento a la realidad del software, nos debemos interesar por sus características distintivas. Actualmente, las más aceptadas son las que define Roger Pressman en su libro Ingeniería del Software. Éstas son: • El software se desarrolla, no se fabrica. • El software no se estropea. • La mayor parte del software se hace a medida. Fallos normales
Fallos de desgaste
Tasa de fallos
Fallos infantiles
Tiempo t
Figura 7. Curva de bañera, representando al desarrollo normal de componentes.
El software se desarrolla Las diferencias entre la producción de un objeto y el desarrollo de un software son notables, y la falta de percepción de éstas hace que muchos de los proyectos sean mal administrados. Mientras que el valor del producto se centra en la fabricación, del software puede decirse que ésta es económica pero tiene grandes costos en su proceso de ingeniería. A pesar de esto, sí existen productos a los
INSTITUTE OF ELECTRICAL AND ELECTRONICS ENGINEERS
El IEEE o Instituto de Ingenieros en Electricidad y Electrónica es la sociedad técnica profesional más grande del mundo y se dedica a fomentar la innovación tecnológica y a contribuir al desarrollo profesional. Continuamente, podemos encontrar documentación de valor en su sitio web, cuya dirección es www.ieee.org.
22
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 23
¿Qué es el software?
que el software se asemeja en el proceso de elaboración y a los cuales puede imitar para lograr el éxito. Las mayores similitudes se dan con aquellos que tienen un alto grado de innovación. Al mencionar que el costo de fabricación es despreciable, hacemos referencia a la tendencia que considera la elaboración del software como el proceso de creación del ejecutable, que como todos sabemos es casi gratuito. El verdadero costo del software se ubica, mucho antes, en el proceso y tiene que ver con los conocimientos y recursos que se deben destinar a él.
El software no se estropea Los errores en el software tienen distinto impacto y su manifestación no es igual que en el hardware. Generalmente, el software no es susceptible a los males del entorno que sí provocan destrucción o deterioro en otros elementos (hardware). La posibilidad de corrección de fallas en el software no lo deja exento de volver a sufrir problemas, ya sea por viejos errores no conocidos o por los nuevos creados en su mantenimiento y corrección. Vemos, una vez más, que la necesidad de un software desacoplado es indispensable para evitar la introducción de elementos basura en el código. La alta cohesión de los componentes es vital para que el desacople se dé como un proceso natural del desarrollo. A medida que iteremos en el ciclo de vida aparecerán nuevos detalles de construcción, que pueden ser mejor identificados y ubicados en aquel software cuyos desarrolladores se han tomado el trabajo, desde un principio, de pensar en un diseño que sea susceptible de ser mantenido.
La mayor parte del software se hace a medida Casi todo el software se desarrolla para situaciones muy específicas y, por lo tanto, se hace a medida o se lo modifica para adaptarlo a la realidad. No existen los componentes estándar a los que un arquitecto o ingeniero pueda recurrir y de los cuales ya se tienen referencias y especificaciones aceptables. Esto transforma el proceso de desarrollo en un conjunto de pasos casi artesanales donde un líder con mayor capacidad puede marcar una diferencia entre el éxito y el fracaso. Actualmente, todas las metodologías y tendencias de desarrollo
COHESIÓN Y ACOPLAMIENTO Cuando hablamos de cohesión nos estamos refiriendo al grado de cercanía entre dos o más elementos. Es un conjunto de características que los une y, por lo tanto, los agrupa bajo un mismo denominador. Por su parte, el acoplamiento mide el grado de dependencia que existe entre dos o más elementos.
23
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 24
1. SISTEMAS Y SOFTWARE
apuntan y preparan el escenario para tener un conjunto de componentes que puedan ser altamente reutilizados. El desarrollo orientado a objetos ha sido uno de los pilares de este tipo de premisas.
Índice de fallas
Incremento del índice de fallas por efectos laterales
cambio Curva real Curva idealizada Tiempo
Figura 8. Toda corrección del software puede provocar el desajuste de estructuras previas, introduciendo errores.
Estas características descriptas, junto con los temas que veremos a continuación, son los factores principales que provocan la alta tasa de fracasos en el desarrollo de software a nivel empresarial. Teniendo presente estos elementos, corremos menos riesgos y podremos alterar el circuito sin insertar posibles puntos débiles.
Complejidad inherente al software Dentro del mundo de los profesionales del software existe una frase que aparece repetidamente en la bibliografía existente: la complejidad inherente al software. Con esta expresión tratamos de escudarnos ante posibles fracasos, pero no es menos real que el software, gracias a sus características, posee dificultades de comprensión que deben ser minimizadas. El software de grandes dimensiones o de tareas críticas tiene un conjunto muy rico de comportamientos, y estos deben ser tratados particularmente pero también en forma global. A esta integración corresponden muchas de las tareas que hoy en día se desempeñan en un proceso de desarrollo de software. Este tipo de sistemas de software posee las siguientes características: • Análisis de requisitos complejo: todo sistema de volumen industrial o de alta innovación pondrá al desarrollador frente al cliente y a las limitantes que éste im24
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 25
¿Qué es el software?
• • •
•
ponga para su sistema. Esto, sumado a las tareas que deberá cumplir el sistema, dificulta el conocimiento de todo el dominio. Ciclo de construcción largo: la naturaleza del sistema hace que el desarrollo requiera de varios meses o incluso años para completarse. Ciclo de vida largo: desde el comienzo de desarrollo hasta el estado de obsolescencia pasan varios ciclos tecnológicos. Amplia cantidad de usuarios: es importante señalar que, por lo general, la cantidad de usuarios del sistema se medirá en decenas y además supondrá distintos niveles de conocimiento, interacción y acceso. Distinto tipo de profesionales en su desarrollo: la interacción de distintos tipos de disciplinas es común y puede dar como resultado dificultades de comunicación de tipo técnicas o interpersonales.
Sistema X Cargar productos
Usuario 1
Realizar reporte Gestionar permisos
Responsable
Figura 9. Representación de dos actores con distintos roles frente a un caso del sistema. Podemos observar las diferentes categorías de usuarios con las que el sistema interactúa.
Según Grady Booch, “la característica del software de dimensión industrial es que resulta sumamente difícil para el desarrollador comprender todas las sutilezas de su diseño”. En este caso, la capacidad intelectual humana se ve desbordada por los pequeños mecanismos necesarios existentes para que el software funcione y lo haga realmente como los usuarios esperan. Para minimizar los problemas que comienzan a aparecer ante estas dificultades, se han creado disciplinas que nos permiten analizar, gestionar, desarrollar y entregar sistemas de software de forma eficiente. De esto hablaremos más adelante a lo largo de este libro.
Elementos de la complejidad Siguiendo con nuestra tendencia de citar a Booch, decimos que existen cuatro elementos que hacen que la complejidad sea esencial en el software: 25
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 26
1. SISTEMAS Y SOFTWARE
• • • •
Complejidad del dominio del problema. Dificultad de gestionar el proceso de desarrollo. Flexibilidad alcanzable a través del software. Problemas de la caracterización del comportamiento de sistemas discretos.
A continuación, veremos con mayor detalle cada uno de estos elementos.
La complejidad del dominio del problema Cuando trasladamos escenarios o problemas de la vida real al ambiente computarizado, no sólo nos encontramos con las limitaciones propias existentes sino que aparecen infinitos requerimientos que generalmente se contradicen. Los términos como facilidad de uso, costo, fiabilidad y adaptabilidad son elementos externos que se introducirán en el proyecto. Además, estaremos obligados a trabajar con usuarios que dominan el problema en el ambiente real pero cuyos conocimientos sobre el software pueden ser deficientes. Es necesario crear metodologías, modelos o símbolos que permitan acercar las visiones y no introducir preconceptos en el análisis del dominio del problema.
Dificultad de gestionar el proceso de desarrollo La creación de un software de gran alcance puede requerir de distintos especialistas que conformarán grupos heterogéneos, y por eso no sólo nos estaremos enfrentando continuamente a los requerimientos de un elemento abstracto sino que tendremos que lidiar con los pormenores de la administración de los recursos humanos encargados de desarrollar el software. En todo sistema de gran tamaño los tiempos de respuesta ante el error plantean un inconveniente que únicamente puede ser atacado mediante un desarrollo que se enfoque en la reusabilidad, la fiabilidad y la transparencia. Sin embargo, elaborar un aplicativo que además de funcionar bien contemple estos elementos puede ser crítico y agregar mayor dificultad al proceso.
Flexibilidad alcanzable a través del software El software generalmente será introducido en ambientes donde coexistirá con otros elementos de hardware o software ajenos a él y a sus desarrolladores.
GRADY BOOCH Diseñador de software muy conocido por su método denominado Booch para el desarrollo orientado a objetos y, además, por ser uno de los padres del lenguaje unificado de modelo (UML) junto a Ivar Jacobson y James Rumbaugh. El UML ha evolucionado y ha dejado de ser utilizado sólo por la informática para representar también otro tipo de sistemas.
26
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 27
¿Qué es el software?
La existencia de estos elementos hace que el software no sólo deba adaptarse a la situación problemática puntual sino a un conjunto de variables que limitarán su operación y por lo tanto su desarrollo.
Problemas de la caracterización del comportamiento de sistemas discretos El estado de una aplicación depende de la conjunción de miles de variables con valores más todos los procesos. Al ser un sistema discreto, los estados posibles son finitos y pueden ser alterados por los eventos externos. Esto posibilita que un evento cambie el estado de un sistema produciendo una respuesta indeseada por el solo hecho de que sus desarrolladores olvidaron introducir un comportamiento esperado a dicho suceso. Los distintos esquemas de pruebas que veremos más adelante tienen esta descripción como realidad e intentan hacer todo lo posible para recorrer todos los caminos de un software.
Dominar la complejidad A pesar de que la complejidad esencial del software no puede ser eliminada, sí se puede combatir. Para comprender mejor esto, podemos analizar lo que dice Edsger Dijkstra: “La técnica de dominar la complejidad se conoce desde tiempos remotos, divide et impera (divide y vencerás)”. Esto quiere decir que un problema con cierta complejidad debe ser atacado dividiéndolo en pequeñas partes que puedan ser inteligibles, con menor complejidad, y resueltas por separado para luego volver a componer el todo. La separación en el desarrollo se puede materializar mediante: Descomposición algorítmica: este tipo de división implica que los procesos del sistema serán representados en pequeñas partes altamente cohesionadas. Los métodos de análisis y diseño estructurado son los que se utilizan para este caso. El principal objetivo es centrarnos en los procesos y los flujos de datos del sistema: entradas, internos (entre procesos) y salidas. Generalmente, este tipo de descomposición nos lleva a un desarrollo utilizando lenguajes imperativos.
MAGAZINE DE SOFTWARE
Software Development Magazine (www.sdmagazine.com) es una revista virtual que ofrece una serie de artículos y contenidos actualizados sobre desarrollo y tendencias de software. Mucha de la información publicada luego es utilizada por los usuarios para discutir sobre la posibilidad o no de la introducción en el ambiente real. La revista se unió a Dr. Dobb's Journal (www.ddj.com).
27
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 28
1. SISTEMAS Y SOFTWARE
Figura 10. Descomposición algorítmica tradicional en un enfoque estructurado.
Descomposición orientada a objetos: se identifica de forma semántica el dominio del problema, que intentará ser representado mediante un conjunto de elementos independientes. Esto se observa en el diseño y la programación orientados a objetos. Los objetos interactúan mediante un protocolo o paso de mensajes que puede ser familiarizado con el flujo de datos que mencionamos anteriormente. Se utilizan lenguajes declarativos y, por supuesto, orientados íntegramente a objetos.
Figura 11. Los objetos trabajando en conjunto corresponden con la idea que tenemos de sistema.
A pesar de que a simple vista estos conceptos puedan parecer contradictorios, en realidad son complementarios en niveles bajos de abstracción. Todos los objetos que reconozcamos también tendrán, tarde o temprano, algún tipo de descomposición algorítmica aunque en un alcance diferente. Como veremos más adelante, las metodologías, en mayor o menor medida, hacen uso de la descomposición y el refinamiento.
Cohesión y acoplamiento Sabemos que tenemos que dividir el problema para ser capaces de resolverlo. Existen criterios que debemos seguir para evitar tener tantos fragmentos que se hagan imposibles de manejar. Para entender qué es lo que se quiere conseguir, es necesario acla28
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 29
¿Qué es el software?
rar dos conceptos: cohesión y acoplamiento. Una máxima técnica dice que todo buen software posee alta cohesión y bajo acoplamiento. La cohesión se refiere a la manera en que agrupamos unidades de software en unidades mayores. El término unidades de software se utiliza, actualmente, para denominar a una parte de software que realiza una o más funciones fácilmente identificables. Tradicionalmente, una unidad de software es un módulo, una clase, una librería, etcétera. De acuerdo al criterio que se tome para agrupar funcionalidad en la unidad, podemos hablar de: • Cohesión funcional: los elementos se agrupan en una unidad (o varias unidades) pensando principalmente en el tipo de función que cumplen y sus resultados directos. Es la clase de cohesión más buscada por los desarrolladores. • Cohesión secuencial: se utiliza para dividir un problema, teniendo como máxima que la salida del proceso es el ingreso de la etapa siguiente. • Cohesión de datos: todas las unidades seleccionadas necesitan el mismo conjunto de datos para operar correctamente. • Cohesión lógica: se agrupan de esta manera cuando todas las unidades realizan la misma operatoria desde el punto de vista lógico; por ejemplo, las bibliotecas gráficas, las matemáticas, las de input, etcétera. • Cohesión temporal: las unidades son agrupadas tomando como parámetro el tiempo en que deben ser ejecutadas, como en el caso en que deben ser ejecutadas en paralelo, de forma secuencial, etcétera. • Cohesión casual: se agrupa según el gusto del desarrollador, cuando ninguno de los criterios anteriores son válidos. Es el tipo de cohesión que hay que evitar. Sistema X
Alto acoplamiento Desacoplado
Figura 12. Observemos que un subsistema muy acoplado será difícil de modificar sin interferir con otros subsistemas.
El acoplamiento se refiere al grado de dependencia que existe entre las unidades de software. Si observamos dos unidades de software que pueden trabajar independientemente, sin necesitar a la otra, decimos que se encuentran desacopladas. Un desarrollo de este tipo es ideal aunque improbable, ya que siempre 29
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 30
1. SISTEMAS Y SOFTWARE
alguna de nuestras unidades dependerá de otra. Sin embargo, se busca minimizar esa subordinación para lograr que la alteración de una de las unidades de software no produzca efectos adversos en las otras. Al igual que en la cohesión, existen distintos tipos de acoplamiento: • Acoplamiento ideal (desacopladas): estos métodos son los que producen resultados independientes. static int suma(int a, int b) { return a + b; } static int resta(int a, int b) { return a - b; }
• Acoplamiento normal: donde un método es dependiente de la ejecución y resultado del otro. Pueden darse casos en los que esto sea válido para uno o para los dos. En el ejemplo, el método multiplica es dependiente del método resta, pero éste puede operar por sí mismo. static int multiplica(int a, int b) { int c = resta(a, b); ; return 2 * c; } static int resta(int a, int b) { return a - b; }
• Acoplamiento de datos: las unidades de software se encuentran acopladas cuando requieren y utilizan el mismo conjunto de datos. • Acoplamiento por control: es un tipo de acoplamiento poco deseable, la unidad de software es dependiente, básicamente, del resultado de otra, en base al cual se determinará la acción que tomará ésta. 30
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 31
Ingeniería del Software
• Acoplamiento global y por contenido: son los tipos que no deben aparecer en el software y casi siempre es posible evitarlos, tomando las medidas necesarias. El acoplamiento global implica que las unidades de software trabajan sobre un conjunto de datos en común sin pasárselos entre métodos sino accediendo a ellos directamente. El acoplamiento por contenido supone que un desarrollador que quiere modificar una unidad determinada deberá conocer a fondo otras unidades que no tienen relación directa con el problema o con su solución. Cualquier software que se analice y desarrolle con base en la calidad obtendrá la cohesión y el acoplamiento adecuados. En muchos casos, cuando se hace a conciencia, el refinamiento permite que el software se adecue a las mejores prácticas, permitiendo que las unidades sean reinterpretadas o modificadas para facilitar el desarrollo y futuro mantenimiento.
INGENIERÍA DEL SOFTWARE El término ingeniería del software aparece al final de los años 60 para referirse al desarrollo para computadoras. Según Bauer, “la Ingeniería del Software es el establecimiento y uso de firmes principios y métodos de ingeniería para la obtención económica de software fiable y que funcione en máquinas reales”. Por otro lado, Bauen nos dice que “la Ingeniería de Software es la aplicación de la ciencia y las matemáticas mediante la cual la capacidad de los equipos computacionales se hace útil al hombre a través de programas de computador, procedimientos y la documentación asociada”. Para simplificar, concluiremos que la Ingeniería del Software se encarga de analizar situaciones para resolverlas, utilizando técnicas que faciliten su manejo y el del desarrollo del futuro escenario.
Figura 13. El IEEE (www.ieee.org.ar) es la sociedad técnica profesional más grande del mundo. Es el organismo representante de los estándares. 31
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 32
1. SISTEMAS Y SOFTWARE
Como todo inicio, el del software no estuvo exento de problemas. En los primeros desarrollos se confiaba demasiado en las capacidades del programador y el análisis de las situaciones problemáticas era bastante pobre. A pesar de los esfuerzos para la introducción de técnicas más avanzadas, el desarrollo de software siguió topándose con dificultades. A fines de los años 60, la mayoría de los proyectos encarados por las grandes industrias tendía al fracaso. En ese contexto apareció lo que se denominó crisis del software a principios de los años 70. Básicamente, los líderes de los proyectos y la comunidad científica se preguntaban: • • • • • •
¿Cómo debemos estimar los costos y los tiempos? ¿Por qué las desviaciones en el proceso son tan grandes? ¿Cómo se debe detectar el error? ¿A qué se debe la alta tasa de fallas? ¿Cómo responder a los requerimientos del cliente? ¿Cómo manejar requisitos volátiles?
Las respuestas a estos interrogantes surgirían de la introducción de elementos que aportaron rigurosidad científica al desarrollo de software, y con esto estaba comenzando lo que denominamos Ingeniería del Software.
Crisis del software La etapa mencionada como crisis del software sigue siendo, en la actualidad, un punto de inflexión a partir del cual han surgido muchas de las metodologías que se utilizan hoy en día y se han creado las bases para métodos y herramientas que aún no se han materializado a nivel práctico, pero cuyo marco teórico ha crecido desde ese momento. Decimos que la crisis del software puede ser dividida en cinco fases. • Primera fase, los albores (1945-1955): se desarrolla, básicamente, con lenguaje máquina o ensamblador. El software es básico y sólo permite realizar las mínimas tareas para darle utilidad al hardware. • Segunda fase, el florecimiento (1955-1965): los desarrollos pretenden ganar alcance y como resultado de esto aparecen distintos lenguajes de programación para facilitar la tarea de desarrollo y minimizar los errores. • Tercera fase, la crisis (1965-1970): en esta etapa sucede la gran crisis que provoca que matemáticos, ingenieros y científicos en general comiencen a investigar no sólo las causas sino los efectos de todas las actividades relacionadas con el software. La mayoría de los desarrollos fracasan por distintos motivos y se hace esencial la búsqueda de refinamientos. Se plantean grandes desafíos pero ninguno de estos proyectos parece llegar a buen puerto. La gran cantidad de errores en el software y la ineficacia para su gestión hacen que muchas empresas opten por detener sus futuros proyectos. 32
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 33
Ingeniería del Software
• Cuarta fase, innovación conceptual (1970-1980): los fundamentos de programación empiezan a ser establecidos formalmente, en conjunto con metodologías estructuradas que permiten la representación de los sistemas complejos como análisis de requisitos y mejoras del diseño. Los conceptos sobre pruebas comienzan a semejarse a los que manejamos hoy en día. Aparecen las primeras tendencias o ideas académicas que en la actualidad son pilares de la industria. • Quinta fase, el diseño es el problema (1980-?): el modelado o manejo de los requisitos y su posterior análisis ya no presentan tantos inconvenientes. El peso de los proyectos comienza a caer en el diseño. Los desarrollos empiezan a limitarse por términos tales como fiabilidad, jerarquía, redundancia, reutilización, modularidad. Las mejoras en los entornos de desarrollo y los lenguajes de alto nivel favorecen a los grandes grupos de programadores. Se introduce la POO (Programación orientada a objetos).
Situación actual del desarrollo Las metodologías tradicionales han perdido impulso, por la cantidad de herramientas que han mejorado la producción de código, haciendo que muchos esquemas no puedan adaptarse a la realidad. El conocimiento de estas metodologías resulta útil por la facilidad con que pueden ser interpretadas y aplicadas en distintos ámbitos de desarrollo y porque es mejor que carecer de metodología de desarrollo. En el próximo capítulo estudiaremos las metodologías y en el siguiente veremos los enfoques más tradicionales. Es bueno destacar que ninguno de estos ha logrado solucionar de manera concluyente los problemas de desarrollo. Es por eso que las nuevas metodologías harán uso de los avances en distintas disciplinas, desde matemáticas hasta psicología, para poder mitigar las antiguas falencias.
… RESUMEN Cualquier elemento de software es un sistema y por lo tanto posee las características de éste. Conocer la teoría de sistemas y construir en base a ella puede ser de gran ayuda en los momentos en que las metodologías no nos alcanzan. El desarrollo de software es una de las industrias con mayor crecimiento, que en sus inicios pasó por momentos críticos, superados sólo parcialmente. Su evolución ha permitido que en la actualidad podamos elegir diversas formas de producir, desarrollar, distribuir y mantener software con cierto éxito.
33
01_Metodos Agiles_Ajustado.qxd
4/30/09
4:05 PM
Page 34
ACTIVIDADES PREGUNTAS TEÓRICAS 1 ¿Qué entendemos por sistema?
EJERCICIOS PRÁCTICOS 1 Investigue acerca de las diferencias entre sistemas abiertos y cerrados.
2 ¿A qué denominamos software? 2 Proponga alternativas para la 3 ¿Qué papel tiene el conocimiento del
clasificación de sistemas.
problema en el desarrollo? 3 Enumere posibilidades para dominar la 4 ¿En qué se diferencia un software
complejidad.
empotrado del resto? 4 Investigue acerca de los métodos de 5 ¿Qué elementos caracterizan al software? 6 ¿En qué se distingue el desarrollo de software del de otros productos? 7 ¿A qué se debe la complejidad del software? 8 ¿Cuáles son los métodos más utilizados para atacar la complejidad? 9 ¿A qué se denomina crisis del software? 10 ¿Cuáles fueron las consecuencias de la crisis del software?
34
desarrollo y sus principios básicos. 5 Busque información sobre la conocida bala de plata en el desarrollo.
REDISEテ前 BOMBOS LIBROS - ISSU - Base Editable - Sep 10.indd 1
08/09/2010 15:54:03