5 abr 2007

El modelo de calidad de McCall

El modelo de Jim McCall, desarrollado inicialmente para la Fuerza Aérea de los EE.UU en 1977., es uno de los más renombrados actualmente. Este modelo busca reducir la brecha entre usuarios y desarrolladores enfocándose en un número de factores de calidad que reflejen las prioridades de ambos. El modelo establece una jerarquía de Perspectivas (3), Factores (11), Criterios de Calidad (23) y Métricas (41).

El modelo establece tres perspectivas para definir e identificar la calidad de un producto software:

1. Revisión del producto
    • Mantenibilidad
    • Flexibilidad
    • Verificabilidad (testability)
2. Transición del producto
    • Portabilidad
    • Reusabilidad (en otro contexto)
    • Interoperabilidad
3. Operaciones del producto
    • Corrección (cumplimiento con la especificación)
    • Confiabilidad
    • Eficiencia (De ejecución y de almacenamiento)
    • Integridad (protección contra accesos no autorizados)
    • Usabilidad
Los 23 criterios de calidad del modelo son: Facilidad de operación, Facilidad de comunicación, Facilidad de aprendizaje, Control de accesos, Facilidad de auditoría, Eficiencia en ejecución, Eficiencia en almacenamiento, Precisión, Consistencia, Tolerancia a fallos, Modularidad, Simplicidad, Completitud, Trazabilidad, Auto descripción, Capacidad de expansión, Generalidad, Instrumentación, Independencia del S.O., Independencia del HW, Compatibilidad de comunicaciones, Compatibilidad de datos y Consición.

Otros modelos de calidad conocidos:
  • Modelo de Calidad de Boehm (1978)
  • FURPS y FURPS+
  • Modelo de Dromey
  • ISO 9126

Costos de identificación de defectos

Según los estudios realizados, el costo de identificación de los defectos aumenta conforme se avanza en las actividades del ciclo de vida de software.

IBM reporta un costo de 1x (x pueden ser dólares, horas hombre, etc.) si un defecto se identifica en la fase de requerimientos:
  • 1.5x si es en la fase de diseño
  • 60x en la fase de pruebas
  • 100x si es en la operación
TRW establece algunas cifras interesantes:
  • 1x en Requerimientos
  • 3x-6x en Diseño
  • 10x en Codificación
  • 30x-70x en pruebas
  • 40x-1000x en operación
Al parecer, lo más inteligente es tratar de identificar los defectos cuanto antes en el ciclo de vida, tristemente sin embargo, una práctica común es dejar esta responsabilidad a la fase de pruebas al final del proyecto.

Costo de la calidad

El costo de la calidad normalmente se divide en 3:

1. Costos de Prevención
    • Identificar las causas de los defectos y establecer las acciones de prevención
2. Costos de Evaluación
      • Determinar el nivel de calidad del producto
        • Verificación y Validación
        • Pruebas
3.Costos de Falla
      • Encontrar una falla y diagnosticarla
        • Pruebas
        • Debugging
      • Corregir las fallas
        • Retrabajo
      • Impacto en la operación del cliente
        • Fallas en su operación
        • Imposibilidad de operar
        • Daño financiero
        • Daño a terceros
        • otros...

Calidad del software

El tema de calidad parece ser uno de los más elusivos en la Ingeniería de Software. Para comenzar, no existe una definición unificada de Calidad:

  • Enfoque en el cliente: “Calidad es... Lo que el cliente diga que es Calidad”
  • Enfoque romántico: “La calidad está en los ojos del que la mira”
  • Enfoque filosófico (Pirsig): “Si la Calidad existe en el objeto, entonces debes explicar porqué los instrumentos científicos no son capaces de detectarla...Por otro lado, si la Calidad es subjetiva, existiendo sólo en el observador, entonces esta Calidad es sólo un nombre fancy para cualquier cosa que quieras...La calidad no es objetiva. No reside en el mundo material...La calidad no es subjetiva. No reside sólo en la mente"
  • Perspectivas de la Calidad (David Garvin)
    • Vista trascendental: Calidad es algo que puede ser reconocido pero no definido
    • Vista del Usuario: Fitness for purpose
    • Vista de manufactura: Conformidad con la especificación
    • Vista de producto: La calidad está ligada a características inherentes del producto
    • Vista basada en Valor: Depende de cuánto está dispuesto a pagar el cliente por ella
  • Crosby: “Hacerlo bien a la primera”
  • Deming: "Conformidad con los requisitos y confianza en el funcionamiento"
  • Juran: "Adecuación para su uso"
  • Shewart: "Hay un lado subjetivo de la calidad"
  • Feigenbaum: "La calidad está determinada por el cliente, no por el ingeniero, no por mercadotecnia, no por la administración en general. Está basada en la experiencia actual del cliente con el producto o servicio medida contra sus requerimientos, sean estos expresados o no expresados, conscientes o no, operacionales o subjetivos"
  • ISO 8402: "Suma de todos aquellos aspectos o características de un producto o servicio que influyen en su capacidad para satisfacer las necesidades, expresadas o implícitas"
  • IEEE 729-83: "Grado con el cual el cliente o usuario percibe que el software satisface sus expectativas"
  • DoD 2168: "Capacidad del producto software para satifacer los requisitos establecidos"
  • Glosario Estándar de Terminología de Ingeniería de Software del IEEE: “El grado en el que un sistema, componente, o proceso cumple (1) requerimientos especificados, y (2) necesidades y expectativas del cliente”
  • Definitions in Software Quality Management: “El conjunto de todos los atributos que describen el grado de excelencia del sistema de computadora"
  • Donald Reifer, State of Art in Software Quality Management: “El grado en el que un producto software poses un conjunto especificado de atributos necesarios para cumplir con un propósito enunciado”
  • Watts Humphrey: “El producto debe proveer de cierta funcionalidad cuando el usuario la necesite. Si no lo hace, nada de lo demás importa. Segundo, el producto debe trabajar. Si tiene tantos defectos que no funciona con cierta consistencia, el usuario no lo utilizará sin importar otros atributos”
Mi favorita:
  • Handbook of Software Quality Assurance: “Calidad es el cumplimiento del software con el uso intencionado"

El problema con el software es que no está sujeto a las Leyes de la Física y, por lo tanto, deja fuera todos aquellos instrumentos que utilizamos para medir en el mundo físico como, por ejemplo, el uso de un nivel para verificar la horizontalidad de un piso. El software es la codificación de conceptos que buscan dar respuesta a problemas específicos, esto es, el software es una construcción conceptual y por lo tanto cualquier definición de calidad tiene un elemento subjetivo. Adicionalmente, aunque se han identificado atributos de calidad de software (ver la norma ISO 9126) no existe un criterio universal para medir dichos atributos por lo que siempre interviene la percepción del cliente/usuario sobre qué tanto el software cumple sus expectativas. Por ello, es importante siempre tratar de comprender y hacer explícitas todas las expectativas del cliente/usuario.

4 abr 2007

Procesos y proyectos

Existen diversos procesos que intervienen en el desarrollo de software. Cada uno de estos procesos puede o no ser utilizado en un proyecto. Dado que cada proyecto es diferente, los proceso deberán poder ser ajustados a las características del proyecto. Este proceso ajustado es el que será utilizado en el proyecto una o más veces. Un ejemplo de un proceso que se utiliza más de una vez es el de control de cambios. A cada "utilización" del proceso se le denomina una instancia. Puede haber instancias de un mismo proceso realizándose en paralelo.

eXtreme Programming

A principios de los 90's, Kent Beck y Ward Cunningham trabajaron sobre cómo hacer más simple el desarrollo de Software. A finales de la misma década, Beck comenzó un proyecto en Daimler Chrysler del cual resultó el método Extreme Programming o XP.

Kent Beck identificó 4 dimensiones sobre las cuales mejorar un proyecto de desarrollo de software:
  • Comunicación
  • Simplicidad
  • Retroalimentación
  • Coraje
XP se recomienda para proyectos de alto riesgo con requerimientos cambiantes.

Las reglas y prácticas de XP se enuncian a continuación:

  • Planificación
    • Escribir historias de usuario
    • Planificar las liberaciones
    • Hacer frecuentes pequeñas liberaciones
    • Medir la velocidad del proyecto
    • Dividir el proyecto en iteraciones
    • Planear cada iteración al inicio
    • Mover a la gente
    • Hacer una reunión de presentación cada día
    • Cambiar el proceso XP cuando no funcione
  • Diseño
    • Simplicidad
    • Usar una metáfora del sistema
    • Usar tarjetas CRC
    • Crear soluciones "clavo" para reducir el riesgo
    • No añadir funcionalidad adicional al inicio
    • Hacer refactoring
  • Codificación
    • El cliente estará siempre disponible
    • El código debe escribirse para cumplir estándares de codificación
    • Codificar la prueba unitaria primero
    • Realizar programación en pares
    • Integración secuencial
    • El código es de todos
    • Dejar la optimización para el final
    • No trabajar horas extras
  • Pruebas
    • Todo el código debe tener pruebas unitarias
    • Todo el codigo debe pasar pruebas unitarias antes de ser liberadas
    • Cuando se encuentra un "bug" se crean pruebas
    • Las pruebas de aceptación se realizan continuamente y se publican los resultados

Métodos ágiles

La mayor parte (si no todos) los métodos ágiles toman como base el Manifesto for Agile Software Development, que más o menos reza lo siguiente:

"Estamos buscando mejores maneras de desarrollar software, tanto desarrollándolo como ayudando a otros a desarollarlo. A través de este trabajo hemos llegado a valorar:
  • Individuos e interacciones sobre procesos y herramientas
  • Software corriendo sobre documentación completa
  • Colaboración con el cliente sobre negociación del contrato
  • Responder al cambio sobre seguir un plan
Esto es, aún cuando hay valor en la parte derecha de las oraciones, valoramos más la parte izquierda"

Existen una gran cantidad de métodos ágiles, siendo los más reconocidos:
  • Xtreme Programming o XP
  • SCRUM
  • Dynamic Systems Development Method
  • Evo
  • Crystal Method
  • Adaptive Software Development
  • Agile Modeling, y
  • Lean Development
Un elemento común es la respuesta al cambio que estos métodos plantean y que lleva a establecer un ciclo de vida iterativo; adicionalmente plantean una interacción continua con el cliente y los usuarios (en el caso de XP inclusive implica que el cliente/usuario esté permanentemente con el equipo de desarrollo).

Otro aspecto importante de estos métodos es que ponen a las personas por sobre los procesos y las herramientas.

El estándar IEEE 1074-1997

Este estándar ha sido desarrollado por la IEEE para determinar el conjunto de actividades esenciales que deben ser incorporadas en el desarrollo de un producto software, sin recomendar un ciclo de vida específico. Cabe mencionar que el IEEE 1074 requiere adaptarse a cada proyecto. Las actividades que no se incluyan deben justificarse.

El IEEE 1074 contempla 17 grupos de actividades y 65 actividades en total. Los grupos de actividades son:
  • De Gestión del Proyecto (17 actividades)
    • Iniciación (4 actividades)
    • Planificación (8)
    • Monitoreo y control (5)
  • De pre-desarrollo (11)
    • Exploración de conceptos (4)
    • Asignación al Sistema (3)
    • Importación al software (4)
  • De desarrollo (10)
    • Requisitos (3)
    • Diseño (4)
    • Implementación (3)
  • De post-desarrollo (12)
    • Instalación (3)
    • Operación y soporte (3)
    • Mantenimiento (3)
    • Retiro (3)
  • Integrales (15)
    • Evaluación (7)
    • Gestión de configuración (3)
    • Desarrollo de documentación (2)
    • Capacitación (3)

Modelos de ciclo de vida y niveles de abstracción

Davis y Alexander (2004) plantean dos niveles de abstracción para los ciclos de vida:

  • Nivel alto
    • Modelo convencional
      • Determinar el problema
      • Desarrollar el producto
      • Utilizarlo y mantenerlo
    • Modelo incremental
    • Modelo evolutivo
      • Modelo en Espiral
      • Modelo Win-Win
  • Nivel de actividades
    • Cascada
    • Prototipo
    • Especificación operativa
Una primera distinción es si los requisitos del usuario se subdividen o no para su construcción. Para los que no se subdivide están los modelos:
  • Convencional
  • Cascada
Los que consideran una subdivisión de los requisitos son:
  • Incremental
  • Evolutivo
La principal diferencia entre el incremental y el evolutivo es que en el incremental se conocen todos los requisitos al inicio mientras que en el evolutivo se van descubriendo.

¿Procesos o no procesos?

Actualmente existe una disputa quasi-ideológica entre los que postulan los procesos como LA solución vs. los Agilistas (que apoyan los métodos ágiles centrados en la persona).

En mi humilde opinión todas las empresas siguen uno (o varios) procesos para desarrollar software. El que dicho proceso esté documentado o no, que sea muy pesado o ágil, que sea institucional o se improvise en ese momento, no implica que no exista un proceso.

¿Cuál es el mejor enfoque? Ese, como decía mi abuelita "es otro cantar"

El proceso software

Primeramente ¿cómo definimos un proceso? Proceso viene del latín processus: Progresión, acción de avanzar, esto es, algo que se desarrolla gradualmente. Comúnmente se confunde proceso con procedimiento. Sin embargo procedimiento viene del latín procedere - Modo de obrar, y se refiere mayormente a un instructivo de cómo realizar algo.

Veremos algunas definiciones de proceso:
  • “Una secuencia de pasos realizadas con un propósito específico”. IEEE-STD-610
  • “Una serie de actividades relacionadas entre sí que producen insumos en productos”. Morris y Brandon, Reingeniería: Cómo aplicarla con éxito a los negocios, MC Graw Hill, 1994
  • “Un conjunto de actividades lógicamente relacionadas, las cuales usan los recursos de una organización para proporcionar los resultados requeridos de acuerdo a los objetivos estratégicos de esta” Davidson, 1993
Ahora bien ¿qué sería un proceso software? Aquí existen básicamente dos tipos de definiciones:
  • Aquellas que ven al proceso software como la transformación de necesidades en software (proceso clave) y que se complementa con otros procesos
  • Aquellas que ven al proceso software como el conjunto de procesos (clave y procesos administrativos y de soporte)
La definición de Zahran se incluye dentro de las segundas:

“El conjunto de actividades, métodos, prácticas y transformaciones que la gente utiliza para desarrollar y mantener software y los productos asociados (Ej. planes de proyecto, documentos de diseño, código, casos de prueba y manuales de usuario”

La definición del que esto escribe sería "Proceso software es el conjunto de actividades, personas, roles, métodos, técnicas y herramientas necesarias para transformar las necesidades de los usuarios en un producto software que cumpla con su uso intencionado"

El proceso de software y la resolución de problemas

El proceso de sofware para una empresa obedece a la necesidad de resolver problemas existentes, anticiparse a problemas que se preveen a futuro, buscar la optimización de sus actividades o buscar ventajas competitivas.

La resolución de un problema podría ser, por ejemplo, la imposibilidad para una gran tienda de registrar la información de los artículos vendidos a mano; una agencia de viajes que prevee crecimiento podría anticiparse a los problemas de manejo de información, mientras que otra podría buscar una mejor comunicación entre los diferentes vendedores; respecto a la búsqueda de ventajas competitivas está, por ejemplo, la venta de boletos por internet para una línea aérea (ventaja existente hasta que el resto también ofrezcan el servicio).

En general el proceso de software parte de las necesidades del cliente (y de los usuarios) y, mediante un proceso de transformación genera un producto software que (en teoría) satisface dichas necesidades. Aquí es importante introducir la distinción entre dominio del problema (necesidades del cliente y usuarios) y dominio de la solución (modelos, código y en general todos los artefactos requeridos para llegar al software).

El proceso de software transforma pues, las necesidades en la especificación de requisitos, ésta en modelos de análisis y en necesidades arquitectónicas, éstos en modelos de diseño detallado y éstos últimos en el código. Es importante no olvidar los manuales de usuario y el sistema de pruebas, por ejemplo. Sin embargo la esencia del proceso software es la transformación:

Requisitos -> Modelos de análisis -> Arquitectura -> Diseño detallado -> Código

De aquí se derivan muchos de los debates actuales sobre el nivel de documentación del diseño requerido, por ejemplo. Las metodologías ágiles hacen hincapié en un minimo de documentación de diseño y un mayor énfasis en el código. La postura del que escribe es que el nivel de documentación y detalle debe estar dado por:

- ¿Qué tanto necesito modelar para comprender? Si el problema es muy simple quizá no necesite un modelo formal con el mayor detalle. El modelado está basado en aquella premisa de "es más simple (y menos costoso) cambiar una idea que un programa"
- ¿Qué tanta necesidad de comunicación tengo? Si no es importante que otros comprendan el modelo (ahora o más adelante) no necesitaré documentarlo. Quizá el código se explica por si mismo.

El nivel de especificación de requisitos debe estar dado por la necesidad del cliente mientras que el nivel del diseño debe estar dado por la cantidad y complejidad de los requisitos. Es decir, si tengo un contrato, por ejemplo, mi especificación de requisitos deberá ser lo más completa posible y libre de errores mientras que si el software es para algo muy trivial bastará con un bosquejo; en relación con el diseño, si los requisitos apuntan a un software complejo y con muchas piezas, entonces mi diseño deberá ser lo más completo posible. Esto se contrapone a las metodologías y métodos que plantean un nivel de especificación y diseño a priori, independientemente del problema a resolver.

Visto de otra manera:
  • La especificación de requisitos es lo que me permitirá llegar de las necesidades del usuario al diseño
  • El diseño es lo que me permitirá llegar de la especificación de requisitos al código
Lo que menos tiene sentido , sin embargo, es codificar y después, haciendo ingeniería en reversa, construir los modelos.

Siguiendo el proceso de resolución general de problemas, las actividades a realizar dentro del proceso software para transformar las necesidades en software son:

- Definición del qué -> Ingeniería de requisitos
- Definición del cómo -> Análisis, Diseño y Codificación