Fase de concepción Objetivo: definir la razón de ser y el alcance del proyecto. Estudio de oportunidad. Visión = QUÉ + PARA QUÉ + CUÁNTO Actividades Especificación de los criterios de éxito del proyecto Definición de los requerimientos Estimación de los recursos necesarios Cronograma inicial de fases Artefactos Documento de definición del proyecto
Fase de elaboración Objetivo: establecer un plan de proyecto y una arquitectura correcta del sistema Actividades Análisis del dominio del problema Definición de la arquitectura básica Análisis de riesgos Planificación del proyecto Artefactos Modelo del dominio Modelo de procesos Modelo funcional de alto nivel Arquitectura básica
Fase de construcción Objetivo: desarrollar el sistema a lo largo de una serie de iteraciones Actividades Análisis Diseño Codificación Pruebas (individuales, de integración)
XP: eXtreme Programming
eXtreme Programming Es una metodología ágil Diseñada para entornos dinámicos Pensada para equipos pequeños (hasta 10 programadores) Orientada fuertemente hacia la codificación Énfasis en la comunicación informal, verbal
Valores que fomenta XP Comunicación
Simplicidad
Retroalimentación
Coraje
Roles Programador (Programmer) Responsable de decisiones técnicas Responsable de construir el sistema Sin distinción entre analistas, diseñadores o codificadores En XP, los programadores diseñan, programan y realizan las pruebas Jefe de Proyecto (Manager) Organiza y guía las reuniones Asegura condiciones adecuadas para el proyecto
Cliente (Customer) Es parte del equipo Determina qué construir y cuándo Establece las pruebas funcionales
Roles Entrenador (Coach) Responsable del proceso Tiende a estar en un segundo plano a medida que el equipo madura Encargado de Pruebas (Tester) Ayuda al cliente con las pruebas funcionales Se asegura de que las pruebas funcionales se superan Rastreador (Tracker) Metric Man Observa sin molestar Conserva datos históricos
Captura de requisitos Historias del Usuario (User-Stories) Establecen los requisitos del cliente Trozos de funcionalidad que aportan valor Se les asignan tareas de programación con un nº de horas de desarrollo Las establece el cliente Son la base para las pruebas funcionales
Planificación Planificación por entregas (releases) Se priorizan aquellas user-stories que el cliente selecciona porque son más importantes para el negocio Entregas: Son lo más pequeñas posibles Se dividen en iteraciones (iteración = 2 o 3 semanas) Están compuestas por historias A cada programador se le asigna una tarea de la user-story
Programación La programación de tareas se realiza por parejas
La pareja diseña, prueba, implementa e integra el código de la tarea
Código dirigido por las pruebas
Código modular, intentando refactorizar siempre que se pueda
Modelo de un proyecto
Prácticas
El juego de la planificación Entregas pequeñas Metáfora Diseño simple Pruebas Refactoring
Programación en parejas Propiedad colectiva Integración contínua Semana de 40 horas Cliente in situ Estándares de programación
El juego de la planificación Decisiones de negocio (cliente): Alcance ? ¿Cuándo debe estar listo el producto para que sea valioso en producción? Prioridad ? Prioriza la incorporación de las user-stories Composición de entregas ? ¿Qué se necesita para que el negocio sea mejor antes de tener el sw? Fechas de entrega ? Fechas cuando el software funcionando causaría una gran diferencia
El juego de la planificación Decisiones técnicas (programadores y otros): Estimaciones ? ¿Cuánto tiempo tardará en implementarse una user-story? Consecuencias ? Tener en cuenta las consecuencias técnicas de determinadas decisiones de negocio Proceso ? Organización del proceso y el equipo Planificación detallada ? Dentro de una entrega, qué user-stories se realizan primero. Intentar trasladar los segmentos de desarrollo más arriesgados al principio, intentando respetar las prioridades del negocio
Cada entrega es lo más corta posible: Contenga requisitos más valiosos del sistema (básicos) Reducen el riesgo ? mayor retroalimentación desde el cliente, y más frecuente Minimizar el nº de user-stories que componen una entrega ? No realizar user-stories a medias
Entregas pequeñas
Se diseña "la cosa más simple que pueda funcionar" Uso de tarjetas CRC Diseño de software correcto, es aquel que: Supera todas las pruebas No tiene lógica duplicada Pone de manifiesto las intenciones importantes de los programadores Tiene el mínimo número de clases y métodos
Diseño simple
Las pruebas unitarias se escriben ANTES que el código Pruebas automatizadas Permiten el desarrollo de proyectos de forma rápida y segura Pruebas unitarias ? programadores Pruebas funcionales ? cliente Resultado ? Un programa cada vez más seguro Pruebas
NUnit Framework para pruebas unitarias Escritura de pruebas Ejecución de pruebas Hacer un Assert de los resultados Mostrar los fallos o éxitos Mantener un código que pase los tests http://nunit.org/
Ejemplo de un test en NUnit
Fallo en ejecución de los tests
Éxito en ejecución de los tests
Refactorización = Mejora del código
Intentar eliminar complejidad
Código duplicado ? Refactorización
Se plantea su aplicación después de implementar cada user-story
Refactoring
C# Refactoring Herramientas integradas con Visual Studio Simplifican la refactorización del código Métricas para el análisis del código http://www.xtreme-simplicity.net/
Integración con Visual Studio
Métricas de análisis del código
Refactoring con C# Refactory
Toda el código se escribe en parejas Se produce código de mayor calidad
Extiende el conocimiento
"Se realiza el trabajo de 1 persona en casi la mitad del tiempo y mejor" (cuestionable)
Programación en parejas
Cualquiera puede modificar el código en cualquier momento ? Se evitan cuellos de botella en la codificación
Todos asume las responsabilidades sobre el conjunto del sistema
Todos conocen algo sobre todas las partes y conocen muy bien aquéllas en las que trabajan Propiedad colectiva
El código se integra y se prueba después de pocas horas
Existe una ordenador dedicado para la integración
Cada pareja integra su código en dicho ordenador
Integración contínua
Cliente real = Aquel que usará el sistema cuando esté en producción
El cliente real debe estar con el equipo de trabajo: Responder preguntas Resolver disputas Establecer prioridades Discutir mejoras Cliente in situ
Son fundamentales cuando los programadores cambian de pareja o hacen refactoring del código de otros
Se consigue un código con el mismo estilo, homogéneo, legible Estándares de programación
Patrones de diseño software
Definición "Cada patrón describe un problema que ocurre una y otra vez en nuestro ambiente, y luego describe el núcleo de la solución a ese problema, de tal manera que puedes usar esa solución un millón de veces más, sin hacer jamás la misma cosa dos veces" (Christopher Alexander) "Son soluciones reutilizables a problemas recurrentes que encontramos durante el desarrollo de software"
Ventajas que ofrece el uso de patrones "Diseñar código orientado a objetos es costoso, y diseñar código orientado objetos reutilizable aún lo es más" "Los patrones permiten a los programadores reconocer un problema e inmediatamente determinar la solución sin tener que pararse a analizar el problema primero" Permiten trabajar a un nivel de abstracción mayor Aumentan la productividad, la reutilización del código y su consistencia
Ventajas que ofrece el uso de patrones Capturan la experiencia en diseño. Los patrones se crean a partir de ejemplos prácticos de diseño Utilizar patrones de diseño es reutilizar la experiencia adquirida diseñando Estudiar los patrones existentes es una manera de aprender cómo los "expertos" diseñan sistemas Los patrones definen un conjunto de términos que forman un vocabulario con el que poder hablar de diseño de software
Componentes que constituyen un patrón Nombre Resumen o esencia de la solución Contexto al que se aplica Razones para utlizar o no el patrón Consideraciones de implementación Consecuencias e implicaciones de su uso Ejemplo de uso (Test Case) Patrones relacionados
Proceso de aplicación de patrones Problema Contexto Solución Beneficios Patrones relacionados Consecuencias Fuerza
Clasificación de los patrones Fundamentales De creación De partición Estructurales De comportamiento De concurrencia
Fundamentales Son los patrones más básicos y fundamentales: Muchos del resto de patrones utiliza al menos uno de ellos Son tan básicos que muchas veces no se mencionan dándolos por supuestos
Delegate Interface Abstract superclass Interface + abstract class Immutable Proxy Fundamentales
Provee de una guía de cómo crear objetos cuando su creación precisa de la toma de decisiones: "Las decisiones normalmente involucran la determinación de forma dinámica de qué clase instanciar o a qué objeto delegar la responsabilidad" Estos patrones nos ayudan a estructurar y encapsular las decisiones De creación
De creación Factory Builder Prototype Singleton Object pool
De partición Siguen el paradigma de "divide y vencerás" "Nos proporcionan la guía de cómo particionar las clases e interfaces para llegar a un buen diseño"
De partición Filter Composite Read-only interface
Estructurales "Describen las formas más comunes en las que diferentes tipos de objetos pueden organizarse para trabajar conjuntamente"
Estructurales Adapter Iterator Bridge Façade Flyweight Dynamic linkage Virtual proxy Decorator Cache management
De comportamiento "Patrones utilizados para organizar, gestionar y combinar comportamiento"
De comportamiento Chain of responsibility Command Little language Mediator Snapshot Observer State Null object Strategy Template method Visitor
De concurrencia Patrones para la coordinación de operaciones concurrentes y que permiten solucionar dos problemas principalmente: Recursos compartidos Secuenciación de operaciones
De concurrencia Single threaded execution Lock object Guarded suspension Balking Scheduler Read/Write lock Producer-consumer Two-phase termination Double buffering Asynchronous processing Future
Arquitecturas dirigidas por modelos (MDA)
Nueva orientación de las actividades del OMG La base de todo son los modelos (ni su implementación, ni la plataforma) Basado en el desarrollo de modelos independientes de la plataforma (PIM) Define un segundo nivel en el que diseñamos para una plataforma concreta pero de forma abstracta (PSM) Definición de transformaciones de PIM a PSM Aunque la plataforma cambie, siempre mantenemos el PIM Introducción
PIM, PSM y transformaciones en MDA Reglas de transformación (Gp:) Modelo específico (PSM)
(Gp:) Modelo independiente de la plataforma (PIM)
(Gp:) Modelo específico (PSM)
Ejemplos con MOF/XMI (Gp:) UML Model (PIM) (Gp:) < Auto> < Color> Red < /Color> < Door> 4 < /Door> < Engine> 2 < /Engine> < /Auto> (Gp:) XMI Document (PSM) (Gp:) XMI (Gp:) < !Element Auto (Color*, Door*, Engine*)> (Gp:) XMI DTD, Schema (PSM) (Gp:) X M I (Gp:) M O F (Gp:) interface Auto { };
(Gp:) IDL, Java. (PSM) (Gp:) Class Auto {public String color; public int Door; public int Engine; }
Herramientas de apoyo al modelado
Herramientas comerciales generales: Borland Together IBM Rational Suite Herramientas libres o con versiones básicas gratuitas: Argo UML Poseidon Umbrello Eclipse UML2 Eclipse Omondo Integración con los IDEs existentes Herramientas de apoyo al modelado
Herramientas con soporte de ingeniería inversa Herramientas de generación en un solo sentido Herramientas de soporte MDA: Together AndroMDA Ayuda a la generación de código
Formato XMI Importación y exportación a este formato por parte de las herramientas Base para las transformaciones en MDA Intercambio de metadatos
Página anterior | Volver al principio del trabajo | Página siguiente |