BUENAS PRACTICAS EN DESARROLLO DE SOFTWARE APUNTES DE UNA EXPERIENCIA Contenido Una metodología para el desarrollo de software debe ser un instrumento que permita gestionar un proceso dado, existen hoy en día diferentes metodologías las cuales no son en forma absoluta comparable, es decir, no existe en forma absoluta una metodología mejor a otra sino que la metodología debe estar alineadas a la cultura de la organización, tamaño y complejidad del proyecto, así como al ciclo de vida del producto que pretende desarrollar. En el presente documento se explica muy brevemente los aspectos que involucra el proceso de desarrollo de software y la metodología adoptada, a partir de un proyecto particular, ante determinadas condiciones y cultura de la organización. Contenido ........................................................................................ 1 Introducción al desarrollo de Software ............................................ 2 Metodología para Proyectos de Desarrollo de Software ................... 3 Necesidades planteadas ............................................................... 3 Metodología adoptada .................................................................. 4 Ciclo de vida ................................................................................. 6 Características que posee la metodología ..................................... 7 Página 1 de 7 Introducción al desarrollo de Software Existen distintos tipos de software, desde software embebido en hardware, sistemas operativos, compiladores, etc. Sin querer generar una clasificación, el presente documento se enfoca en el desarrollo de software de aplicación. Consideremos como software de aplicación aquel que permite a los usuarios llevar a cabo una o varias tareas específicas, en cualquier campo de actividad susceptible de ser automatizado o asistido1. Igualmente muchos principios y lineamientos aquí expuestos son aplicables a otros tipos de software. La construcción del software puede involucrar elementos de una gran complejidad, lo que en muchos casos no es tan evidente. Las potencialidades existentes en lo que respecta a las tecnologías de información y comunicación han potenciado que se puedan construir soluciones para atacar problemas cada vez más complejos. La complejidad inherente a cualquier desarrollo de software generalmente esta asociada a los siguientes aspectos: Complejidad del dominio del problema: cuando se va a desarrollar un software para un dominio específico se debe lograr entender el problema, conceptualizando el mismo y realizando las abstracciones necesarias. Dentro de esta actividad se debe poder obtener los requisitos para la construcción del software. La elicitación de estos requisitos genera un gran desafío; en general los mismos están en permanente competencia entre ellos y en muchos casos son opuestos. A su vez existe una dificultad en poder lograr que los usuarios de la futura aplicación puedan exponer en forma clara sus necesidades. Dinámica de las personas: Por otro lado existe una situación que es constante en cualquier proceso, el cambio. Ya sea por la dinámica de la problemática o la mejor comprensión por parte de las parte de la solución necesaria, el cambio es un elemento presente en cualquier proceso de desarrollo. Este genera nuevas necesidades que deben ser atendidas en una forma adecuada. Gestión de los equipos: al tratarse de problemáticas complejas es requerido poder coordinar el trabajo de los miembros del equipo del proyecto. Al aumentar la complejidad del proyecto se requiere en muchos casos de disponer de mayores recursos por lo que su gestión y coordinación es una problemática a atender. La complejidad tecnológica: la tecnología posee una dinámica no igualable en otras áreas de trabajo. El hecho de generar código, aplicar los mejores patrones de diseño, herramientas para la generación de código, utilizar tecnología actual pero testeada, son aspectos que deben ser considerados durante el proceso de desarrollo. A su vez hay un aspectos muy importante a considerar, 1 http://es.wikipedia.org/wiki/Software Página 2 de 7 estas tecnologías aplicadas deben estar alineadas a satisfacer las necesidades (requisitos) específicos del dominio. La dificultad propia del desarrollo de software, y su impacto en el negocio, han puesto de manifiesto las ventajas – y en muchos casos la necesidad de aplicar una metodología formal para llevar a cabo los proyectos de este tipo. El objetivo es convertir el desarrollo de software en un proceso formal, con resultados predecibles, que permitan obtener un producto final de alta calidad, que satisfaga las necesidades y expectativas del cliente. Atrás dejamos el modo de trabajar artesanal, que a menudo requiere de esfuerzos heroicos para llegar a buen puerto, con los consecuentes desfases de fechas y coste, y el más que probable desgaste personal del equipo de proyecto2. El proceso formal para la construcción de un producto de software requiere llevar adelante las siguientes actividades: Análisis y especificación de los requisitos: Extraer los requisitos de un producto de software es la primera etapa para crearlo. Diseño y arquitectura de la solución: Se refiere a determinar como funcionará de forma general. Consiste en incorporar consideraciones de la implementación tecnológica. Programación: en base al diseño propuesto realizar la codificación para satisfacer los requisitos de la solución. Prueba: Consiste en comprobar que el software realice correctamente las tareas indicadas en la especificación del problema. En la actualidad existen numerosos estándares y metodologías en los cuales nos podemos basar y que explicitan las consideraciones a tener en su implementación. Independientemente del marco, modelo o estándar elegido como referencia, la implantación de una metodología de desarrollo de software en una organización plantea diversos retos. Metodología para Proyectos de Desarrollo de Software Necesidades planteadas Dada las características de los proyectos que se desarrollan donde los mismos son de innovación tecnológica en áreas donde el uso de las tecnologías de la información y las comunicaciones no son ampliamente utilizadas. Se requirió disponer de una metodología que permita: Adaptar el proceso: El proceso de construcción de la solución debía adaptarse a las características propias del proyecto y de la organización. El tamaño de cada proyecto, su tipo y las regulaciones que lo condicionen, influyen. 2 http://www.tecsisa.com/index.igw?item=1619 Página 3 de 7 Equilibrar prioridades: Los requerimientos de los diversos participantes pueden ser diferentes, contradictorios o disputarse recursos limitados. La metodología debe permitir realizar una adecuada gestión de los requerimientos que permita encontrar un equilibrio que satisfaga los deseos de todos. Gracias a este equilibrio se podrán gestionar los desacuerdos que surjan en el futuro. Elevar el nivel de abstracción: Este principio motiva el uso de conceptos reutilizables. Esto evita que los ingenieros de software vayan directamente de los requisitos a la codificación de software a la medida del cliente, sin saber con certeza qué codificar para satisfacer de la mejor manera los requerimientos. Un alto nivel de abstracción también permite discusiones sobre diversos niveles y soluciones arquitectónicas. Generar entregas tempranas: la metodología debe contemplar la gestión de iteraciones. Las cuales una vez finalizada deben permitir evaluar la opinión de los interesados, la estabilidad y calidad del producto, y realizar los ajustes que se consideren necesarios en la dirección del proyecto así como también de los riesgos involucrados. Enfocarse en la calidad: El control de calidad debe estar presente en todos los aspectos de la producción del producto. El aseguramiento de la calidad debe ser parte del proceso de desarrollo y no de encontrase en forma independiente. Metodología adoptada En base a estas necesidades se evaluaron distintas alternativas optando por la utilización y adaptación del Proceso Unificado de Rational (Rational Unified Process – RUP). Este es un proceso de desarrollo de software y que junto con el Lenguaje Unificado de Modelado UML, constituye una metodología estándar para el análisis, implementación y documentación de sistemas orientados a objetos. Esta metodología fue adaptada a las características de la organización y se realizan ajustes en base a las características específicas de cada proyecto. El conjunto de disciplinas básico utilizado contempla: Gestión de requerimientos: se definió un plan de gestión de requerimientos que contempla: o realización de reuniones y entrevistas (preliminares y específicas) que son documentadas, o confección de un documento de visión a partir del proyecto base, ajustando y precisando las necesidades de alto nivel en base a lo relevado en las reuniones preliminares. Se focaliza en las necesidades de los stakeholders y los usuarios finales y en porque esas necesidades existen. o Realizar el análisis detallado, profundizando en cada una de las características obteniendo los requerimientos funcionales y no funcionales que deben ser atendidos. Página 4 de 7 Confeccionar un glosario: dada la necesidad de trabajar en forma interdisciplinaria en prácticamente todo los proyectos es de vital importancia confeccionar un glosario o diccionario que permita unificar el lenguaje a utilizar en la ejecución del proyecto. Este glosario se realiza con la técnica de Léxico extendido del Lenguaje. o Confección del diagrama de casos de uso y determinación de los casos de uso: a través del conocimiento de los requerimientos funcionales comenzar la construcción del diagrama de casos de uso, determinación de actores del sistema y definir los atributos necesario que permitan ser utilizados para estimar el esfuerzo para la construcción de la solución. Análisis: a partir del diagrama de caso de usos confeccionado se comienza el refinamiento y especificación de cada uno. Se ajustan y revisan los atributos para cada uno de los casos de uso. Se confeccionan el modelo de datos preliminar definiendo las entidades y sus atributos. Diseño Preliminar: se construyen bocetos de interfaces de usuarios por grupos de interfaz y se define la arquitectura del sistema. Diseño Detallado: Esta actividad se basa en el diseño detallado de las clases y componentes como así también sus relaciones y dependencias. En esta actividad se contempla la construcción del Modelo de Clases, Modelo de iteración, interfaces del sistema, transiciones de Estados, diagramas de actividad. Los modelos y artefactos a construir como así también el nivel de detalle dependen de cada uno de los proyectos. Diseño de casos de prueba: se confeccionan los casos de prueba en base a la estrategia de testeo definida para el proyecto. Implementación: construir la solución requerida para el proyecto. Ejecución de las pruebas: se ejecutan cada uno de los casos de prueba diseñados con el objetivo de lograr una ejecución ordenada y coherente a los objetivos del proyecto logrando un producto de acuerdo a las necesidades planteadas. Gestión de los cambios: esta disciplina esta muy relacionada con la gestión de requerimientos y el objetivo es permitir evaluar los cambios y defectos de manera que permita conocer cual es el impacto que tienen los mismos sobre el proyecto y derivar en una evaluación del costo del mismo, la cual permita planificarlo o descartarlo según sea el caso. o Página 5 de 7 Ciclo de vida La metodología adaptada contempla las siguientes disciplinas y fases: Por cada una de las 4 fases se definen la cantidad de iteraciones en base a la particularidad del proyecto. Se suele utilizar una iteración en la fase de Inicio y de Elaboración, varias iteraciones de construcción y transición. En la Figura se muestra cómo varía el esfuerzo asociado a las disciplinas según la fase en la que se encuentre el proyecto. Durante la fase de inicio las iteraciones hacen mayor énfasis en actividades relacionadas a los requerimientos. En la fase de elaboración, las iteraciones se orientan al desarrollo de la línea base de la arquitectura, abarcan más los flujos de trabajo de refinamiento de los requerimientos, análisis, diseño y una parte de implementación orientado a la línea base de la arquitectura. En la fase de construcción, se lleva a cabo la construcción del producto por medio de una serie de iteraciones. Para cada iteración se selecciona algunos Casos de Uso, se refina su análisis y diseño y se procede a su implementación y pruebas. Se realiza una pequeña cascada para cada ciclo. Se realizan tantas iteraciones hasta que se termine la implementación de la nueva versión del producto. En la fase de transición se pretende garantizar que se tiene un producto preparado para su entrega a la comunidad de usuarios. Página 6 de 7 Como se puede observar en cada fase participan todas las disciplinas, pero que dependiendo de la fase el esfuerzo dedicado a una disciplina varía. Características que posee la metodología Forma disciplinada de asignar tareas y responsabilidades (quién hace qué, cuándo y cómo) Pretende implementar las mejores prácticas en Ingeniería de Software Desarrollo iterativo Administración de requisitos Uso de arquitectura basada en componentes Control de cambios Modelado visual del software Verificación de la calidad del software A su vez la misma se caracteriza por ser iterativo e incremental, estar centrado en la arquitectura y guiado por los casos de uso. Página 7 de 7