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

11 feb 2007

El modelo de ciclo de vida de desarrollo de software

¿Qué es el ciclo de vida de desarrollo de software? El ciclo de vida se refiere a las etapas o fases que transforman las necesidades de los usuarios en un producto final de software. El ciclo de vida se representa con modelos que muestran de manera general las etapas o subprocesos (requisitos, diseño, construcción, prueba) y el orden en que se realizan. El modelo de ciclo de vida más conocido es el Ciclo de vida de cascada (waterfall) que se muestra en la figura.

¿Qué importancia tiene el ciclo de vida para el desarrollo de software? Vemos que, por ejemplo, el Capability Maturity Model del SEI establece como parte de los "activos" del proceso la descripción de los modelos de ciclo de vida aprobados para su uso y como parte de las subprácticas de Planeación del proyecto la definición del ciclo de vida para el proyecto (Subpráctica 1.3) lo cual, además, tiene un impacto en la forma de realizar las estimaciones. Por su parte, el Rational Unified Process establece como predeterminado un ciclo de vida iterativo. Pero, bueno ¿y qué importancia tiene? ¿no basta con tomar cualquier modelo de ciclo de vida y aplicarlo al proyecto? Resulta que no, que dependiendo de las características de nuestro proyecto en particular debemos analizar y seleccionar el modelo de ciclo de vida más adecuado y que de eso puede depender el éxito o fracaso de nuestro proyecto.

En las siguientes secciones analizaremos diferentes modelos de ciclos de vida y sus implicaciones para los proyectos de desarrollo de software.

8 feb 2007

¿Para qué construímos software?

Se está volviendo un cliché el decir que "el software está en todos lados", pero es cierto. El software nos rodea, nos envuelve, nos facilita la vida (aún no hablo de pantallas azules de error) y cada vez nos es más indispensable: celulares, PDAs, automóviles, satélites, Internet. Basta recordar que el fallo en los lentes del telescopio Hubble pudo corregirse vía software. El software nos permite comunicarnos lo mismo que facilita la administración y operación de una empresa o el llevar el expediente clínico de un paciente.

De manera que el software (cuando funciona bien) nos permite resolver problemas o buscar áreas de oportunidad en nuestra vida y en la sociedad en general.

Problemas en el desarrollo de software

Para poder entender claramente la necesidad de la Ingeniería de Software como disciplina, es necesario adentrarse en los problemas que se presentan en los proyectos de desarrollo de software y sus causas.

Es sabido que muchos proyectos de desarrollo de software no cumplen sus objetivos de tiempo, costo y calidad (ver por ejemplo Chaos Report de Standish Group) ¿cuáles son las razones?. Según Standish Group, las 3 razones más importantes de falla en los proyectos son:

1. Falta de información por parte de los usuarios
2. Requerimientos y especificaciones incompletas
3. Requerimientos y especificaciones cambiantes

Eso nos da una pista importante (ya lo había dicho Frederick Brooks en No Silver Bullet): "La parte más dificil de desarrollar un sistema es decidir qué desarrollar... ninguna otra parte hace fallar tanto el sistema resultante si se hace mal. Ninguna otra parte es más difícl de rectificar después". Brooks define las dificultades de desarrollar software en Esenciales (o inherentes al software) y Accidentales, siguiendo el pensamiento aristotélico y dice que el software es una construcción conceptual que toma múltiples representaciones muy detalladas, y que la dificultad esencial radica en la especificación, diseño y prueba de esta construcción conceptual ( dificultad semántica), y no tanto en la labor de representarla y probar esta representación (dificultad sintáctica).

Existen otros problemas relacionados con los requerimientos, como el hecho de que es difícil representar el conocimiento experto o que la mayoría de las personas pueden hacer bien su trabajo sin que necesariamente puedan explicar bien cómo o porqué lo hacen.

Por otro lado y refiriéndome a la causa No. 3 del reporte de Standish Group, Ed Bersoff estableció que "No importa donde te encuentres en el ciclo de vida, el Sistema cambiará y el deseo de cambiar persistirá durante todo el ciclo de vida".

¿Tiene la Ingeniería de Software una solución para estos problemas?

Es importante hacer notar que estamos aquí en la parte del Qué desarrollar y aun no entramos al Cómo desarrollarlo.

Definición de Ingeniería de Software

¿Qué es la Ingeniería de Software? Una frase con humor negro en la industria dice que "Ingeniería de Software es... un buen deseo". Podríamos decir que los grandes fracasos en los proyectos de desarrollo de software apoyan esta tesis (ver, por ejemplo, el "Salón de la vergüenza del software") y que en realidad estamos muy lejos de poder unir las palabras ingeniería y sofware en una misma oración.

Al parecer, el término Ingeniería de Software data de 1968 y se debe a Friedrich Ludwig Bauer, científico en computación alemán quien, entre otras cosas, también propició el que se estableciera por primera vez la carrera de ciencias de la computación en varias universidades alemanas y participó en el desarrollo del lenguaje Algol 60. En ese año (¡hace 38 años ya!) se habló ya también de la Crisis del software. De modo que el término no es nuevo (ni el problema que trata de resolver). Bueno, 38 años pareciera mucho tiempo para poder hablar ya de Ingeniería de Software, sin embargo, no hay que olvidar que otras áreas del conocimiento tienen hasta miles de años de antigüedad, como la arquitectura.

Aquí nos puede ser útil presentar ya alguna definición de Ingeniería de Software y tomaremos la de la Computer Society de la IEEE: "La aplicación de una aproximación sistemática, disciplinada y cuantificable al desarrollo, operación y mantenimiento de software, esto es la aplicación de la ingeniería al software". Pero ¿qué problemas trata de resolver entonces la Ingeniería de Software? ¿de qué nos sirve un enfoque sistemático? ¿qué aporta la disciplina aquí? ¿porqué querríamos cuantificar?