(Una aproximación a la medición de la calidad)
Estrategias evaluativas
Sin importar cualquiera que sea el tipo de software a ser desarrollado sea de sistemas (Son programas que sirven a otros programas en el trabajo de desarrollo como compiladores, editores, ..), tiempo real (Software encargado de analizar datos del mundo en forma real tales como análisis de datos, control automatizado, monitoreo de datos), gestión (a esta categoría se incluye el software comercial a nivel empresarial nominas, inventarios), ingeniería y científico (es software que posee un amplio manejo numérico usado en biología, astronomía, CAD, …), empotrado (software que se encuentra residente en memoria, tales como : controles automáticos en los vehículos, sistemas de background, partes del sistema operativo, …), computación personal (software comercial de uso local como procesadores de texto, hojas electrónicas, navegadores web, calendarios, agendas, recetarios, …), inteligencia artificial (software de procesamiento especial sistemas expertos, sistemas basados en el conocimiento, generalmente no usan algoritmos numéricos). Todos los tipos de software mencionados requieren que los analistas, diseñadores y desarrolladores apliquen características y elementos de calidad para que se logren productos a las necesidades del usuario, estas necesidades se comienzan a encontrar un camino de solución a través de la aplicación de elementos de calidad, así se presentan dos de los más valiosos como son la eficiencia y la eficacia.
El uso eficiente y eficaz de la tecnología de los computadores es un objetivo que aún está distante. Para representar lo anterior, sólo basta señalar los reportes de fracasos y dificultades de muchos proyectos en los que se pretende involucrar a la tecnología de los computadores.
La ingeniería del software pretende utilizar los recursos computacionales de tal manera que se produzcan soluciones eficientes y eficaces a los problemas informáticos, el éxito de un proyecto involucra elementos como la planeación, la administración y la utilización de metodologías de desarrollo de software.
A través de la planeación se determinan los recursos necesarios para el desarrollo del proyecto, la factibilidad del mismo y el tiempo estimado de desarrollo; unido a ello con la administración se controla, evalúa y corrige la dirección de acuerdo a las contingencias y demás elementos que se vayan presentando durante el desarrollo; finalmente, a través del uso de una metodología se busca lograr el acople de los participantes y la garantía de una determinada calidad. Debe notarse que las metodologías de desarrollote software sólo constituyen uno de los mecanismos que actualmente se utilizan para alcanzar software de calidad; no debemos dejar de lado aspectos de la dirección de proyectos que también buscan calidad en el proceso de desarrollo y en el producto final.
Considerando que la calidad es un término bastante impreciso se ha decidido establecer este tema como punto de partida. Como complemento se trata el tema del manejo de la complejidad puesto que es un tópico fundamental dentro de una metodología, que es la herramienta fundamental con la que se pretende guiar el proceso de elaboración de un producto software de alta calidad.
Calidad en la ingeniería del software. En una versión sucinta la calidad en la ingeniería del software es un grupo de características que representa la efectividad y la eficiencia de un sistema de información. Es importante enfatizar en dos puntos :
Para ilustrar el concepto de calidad de manera más profunda, es necesario considerar algunos aspectos fundamentales que caracterizan al software de calidad como son : solidez, exactitud, completitud, mantenibilidad, reutilizabilidad, claridad en la documentación, entre otros que serán descritos a continuación.
La descripción que se hace de los factores que influyen en un software de calidad se basan principalmente en las ideas presentadas por Robert Dunn, Philip Crosby y Roger S. Pressman. Sin embargo, también se han tomado algunos aportes de Bertrand Meyer y Mauricio Fernando Alba.
Robert Dunn presenta la calidad en el software tomando dos puntos de vista : la calidad en el proceso de desarrollo y la calidad en el producto final, estos dos grupos principales los agrupa en los siguiente aspectos de calidad : confiabilidad, utilizabilidad, mantenibilidad, y adaptabilidad.
Roger Pressman describe similares factores de calidad agrupados en tres grupos : calidad en operación, calidad en revisión y calidad en transición.
A continuación se presentan los factores de calidad de acuerdo al orden dado por Dunn.
Confiabilidad. Este termino es necesario sea separado en varios elementos que permiten darle al software el matiz de fiable. Sus componente son :
Usabilidad. Si bien es cierto que la confiabilidad es un factor muy importante en la calidad del software también lo es el hecho de que es necesario considerar otros factores como los que se mencionan en esta sección puesto que de nada sirve un software que funcione correcta y confiablemente si el usuario prefiere no utilizarlo.
Mantenibilidad. Este aspecto de calidad involucra los elementos que simplifican la labor de prevención, corrección o ampliación del código del programa. Retomar un código escrito meses antes es un trabajo dispendioso y agobiante, en especial cuando las aplicaciones no cuentan con la característica a la cual aquí se hace referencia. Se pueden considerar como atributos de este aspecto :
Portabilidad. Es la capacidad que posee un sistema de información que le permite funcionar en diferentes plataformas ya sean hardware o de software.
A continuación se describen cada uno de los aspectos de calidad mencionados:
Calidad en los procesos de desarrollo. Se resume en la frase "bien planeado y cuidadosamente ejecutado". Este aspecto asegura la confiabilidad, puesto que el plan que se realice para desarrollar el sistema, debe incluir pruebas bien seleccionadas que evalúen la confiabilidad del programa en cualquier situación.
Claridad y amigabilidad de la interfaz. De igual forma la interfaz debe ser clara y agradable al usuario, las interfaces complejas son causa de la no utilización de los sistemas de información.
Claridad y exactitud de la documentación. Hay que anotar que toda aplicación requiere de una documentación suficientemente clara con el fin de que cualquier persona con conocimientos básicos en computación pueda aprender la forma de operación sin que requiera la asesoría de los desarrolladores o conocedores de la herramienta, a menos que se trate de eventualidades donde realmente sea necesario consultar al proveedor.
Completitud o adecuación. Se refiere a que los resultados de operaciones sean acordes al comportamiento del mundo real desde todos los estados y condiciones permitidos por la aplicación, es decir, el programa debe reflejar la realidad. Un programa es inconsistente si presenta respuestas erróneas en algunos casos. Una mala especificación de rangos en un dominio sobre los cuales realizan diferentes operaciones matemáticas puede llevar a que algunos cálculos se realicen dentro de límites inapropiados, obteniéndose resultados erróneos. Otro caso de inconsistencia se presenta cuando ocurren eventos que paran abruptamente la ejecución del programa, sólo un sistema de calidad podrá conservar datos consistentes después de una falla.
Eficiencia y verificabilidad del software. Otro aspecto que no debe pasar por alto es el de la verificablidad, puesto que es imprescindible contar con los requerimientos, y sobretodo en aquellos sistemas donde se obtengan resultados que no sean visibles.
Exactitud de los procesos. Un programa no será utilizado por un usuario si sus resultados no son exactos. Tampoco se puede garantizar el uso de un programa que no presta las utilidades que el usuario requiere, es decir, que sea incompleto. Además, un programa ineficiente que no cumpla con los requerimientos de tiempo, memoria o flexibilidad no podrá satisfacer las expectativas de quienes lo utilizan.
Robustez o solidez. Se refiere a la capacidad del software de defenderse de las acciones anormales que llevan al sistema a un estado no deseado o por lo menos no previsto, causando un comportamiento inesperado, indeseado y posiblemente erróneo. El software de hoy, debe estar en capacidad de analizar los datos que recibe para hacer cumplir requerimientos o condiciones del software y enfrentar de la mejor manera los errores cometidos por un usuario al utilizar la aplicación. Es importante resaltar, que la solidez no siempre es generada por la digitación inapropiada del usuario, sino también por un mal procesamiento o un mal encadenamiento de procesos. El resultado de un proceso, aunque sea correcto, puede estar fuera de los límites permitidos en los parámetros del módulo que lo recibe y si este módulo no controla los parámetros que le entran caerá en un estado inesperado.
Seguridad y auditabilidad. Son importantes, puesto que un usuario no puede confiar en los datos de un sistema que no le ayude a controlar el acceso de personas no autorizadas o a detectar errores de operación en los que se introducen y generan datos erróneos.
Simplicidad. Promueve la utilización de estructuras de fácil manipulación con el fin de evitar que el programador se aleje del problema que desea resolver. Además, se reduce la probabilidad de cometer errores. Así que, no es aconsejable hacer uso de estructuras complejas a menos que se necesite cumplir con requerimientos de vital importancia tales como tiempos máximos de proceso u otros similares.
Uno de los elementos que permite dar garantía acerca de la calidad del software es la aplicación de métricas, estas son medidas estadísticas aplicadas a un software determinado, garantizando calidad así como lo afirma Pressman: "La garantía de calidad del software, es una "Actividad de protección" que se aplica a lo largo de todo el proceso de ingeniería del software"
Todos los elementos anteriormente enumerados indican herramientas que se deben tener en cuenta al momento de desarrollar un software, agrupando en una definición estos elementos se afirma que : Un software debe estar desarrollado "En concordancia con los requisitos funcionales y de rendimiento explícitamente establecidos, con los estándares de desarrollo explícitamente documentados y con las características implícitas que se espera de todo software" , si cumple los aspectos señalados se puede afirmar que se posee un software de calidad. Teniendo en cuenta esto, se puede afirmar
Para estar seguros de las anteriores afirmaciones se tienen en cuenta factores que se pueden medir estos son llamados factores de calidad. Los factores de calidad se agrupan en dos bloque así :
Otro autor que contribuye con el aspecto de las medidas en el software es McCall, él y sus colegas proponen tres factores de calidad y sus partes así :
Factor 1. Características operativas, relacionadas con las operaciones del producto.
Factor 2. Capacidad de soportar cambios, relacionado con la revisión del producto.
Factor 3. Adaptabilidad, relacionado con la transición del producto.
McCall propone para las métricas asociadas al software un nivel de evaluación entro cero (0) y diez (10) como medidas. Además, aclara que las métricas y la evaluación son procesos subjetivos. Los elementos que se pueden tener en cuenta para la evaluación son :
El análisis y diseño, como elementos esenciales del proceso de desarrollo, obligan a tener especial atención y por tal motivo se han ido creando metodologías que sirven de base para tomar las decisiones que afectarán el producto final. Con el advenimiento de la disciplina de la ingeniería del software se inicial el proceso de desarrollo de metodologías las primeras de ellas fueron las estructuradas, y en forma posterior aparecen las metodologías orientadas a objetos, siendo estas últimas las mas difundidas actualmente en el medio.
Una metodología de desarrollo de software presenta una forma de modelar el mundo real con el fin de llevarlo al dominio del computador, a través del modelo se puede obtener una visión global del sistema, para facilitar la especificación de los requerimientos, las restricciones del sistema, y de la solución del problema.
Mostow sugiere que el propósito de diseñar es construir un sistema que :
La construcción de modelos en ingeniería tienen gran aceptación por tomar los conceptos de descomposición, abstracción y jerarquía. Cada modelo en un diseño describe un aspecto específico del sistema que esta en consideración.
"Un método de diseño de renombre está basado en fundamentos teóricos sólidos y ofrece grados de libertad para innovación artística"
Como elementos principales de los métodos se han considerado : la notación (Es el lenguaje para expresar las especificaciones del sistema) y el proceso (Son los pasos generales para la construcción del sistema). Estos pasos son complementados con procedimientos específicos o técnicas que sirven para construir modelos. Entre estas técnicas se pueden mencionar : Modelo entidad-relación, diagramas de flujos de datos, modelos objetos, diagramas de actores, diagramas de transición, entre otros.
Un tercer elemento que se relaciona con los anteriores y día a día es más esencial agrupa a las herramientas (CASE) o instrumentos que eliminan el tedio de construir modelos. Gracias a ellos se obliga a hacer uso de las reglas de los modelos y por ende los errores y las inconsistencias pueden ser expuestos para que sean eliminados por el diseñador.
El enfoque estructurado. Presentar las características de las metodologías orientadas a objetos.
El enfoque orientado a objetos. El paradigma orientado a objetos se caracteriza por la solución de problemas a través del estudio y representación de los objetos del mundo real y las interacciones entre sí.
Yourdon representa la orientación a objetos en la ecuación :
Orientado_Objeto = Clases y objetos + Herencia + Comunicación con mensajes cohesión
Coad y Yourdon consideran las siguientes razones para hacer uso del enfoque orientado a objetos :
Otras razones del uso del enfoque orientado a objetos son las siguientes :
En los procesos de calidad de software uno de los elementos que más puede inquietar a los diseñadores es el adecuado manejo de los algoritmos y su eficiencia, para que el resultado sea óptimo al momento de ser implementado, para eliminar esta preocupación por parte del diseñador aparece en la disciplina de la ingeniería del software un tema que es el análisis de algoritmos, en este tema aparecen elementos como la complejidad computacional, verificación de programas, entre otros.
Complejidad computacional - La complejidad computacional estudia los costos de cómputo necesarios para resolver un problema; entendiéndose por costos los recursos de espacio de almacenamiento y de, principalmente, tiempo de cómputo. La complejidad temporal tiene que ver con el tiempo que tarda un programa para ejecutarse, la complejidad espacial estudia la cantidad de almacenamiento que es necesario para una operación. Al analizar la complejidad de un algoritmo, el tiempo está expresado en términos de pasos de computación elementales (asignaciones, comparaciones, operaciones matemáticas básicas, etc), por ejemplo, una operación de asignación ocupa una unidad de tiempo para ejecutarse, un ciclo ocupa el número de iteraciones en que está definido, etc.
Para cualquier tiempo de ejecución que se desea determinar siempre se asumirá el peor de los casos.
Sea el siguiente ejemplo :
(1) suma = 0
(2) for (i=1; i<= n; i++)
(3) suma += i;
La instrucción (1) ocupa una unidad de tiempo.
La instrucción (3) ocupa dos unidades de tiempo, una para la suma y otra para la asignación, y es ejecutada N veces, por lo que ocupa 2N unidades de tiempo.
La instrucción (2) tiene involucrada una asignación que utiliza una unidad de tiempo, N+1 comparaciones y N incrementos, por lo que ocupa 2N+2 unidades de tiempo.
El tiempo total del algoritmo es T(N) = 1+2N+2+2N, esto es : T(N) = 4N + 3
De otra forma se podría ver como la existencia de tiempos para cada una de las posibles operaciones individuales, así : Ta – Tiempo de asignación, Tc – Tiempo de comparación, To – Tiempo de operación, Ti – Tiempo de incremento.
La instrucción (1) posee Ta
La instrucción (3) posee un Ta y un To.
La instrucción (2) posee un Ta para i=1, Tc para i<=n, Ti para i++
Con base en estas valoraciones los tiempos serían así para el ciclo for las instrucciones internas se hacen la cantidad de veces que indique el ciclo, la instrucción interna tarda (Ta + To) el ciclo se realiza n-veces, lo cual indica un tiempo de n(Ta+To), ahora el ciclo realiza n veces el incremento de i++ es decir n(Ti) y las comparaciones son n+1 ya que el ciclo debe llegar hasta n+1 para que el ciclo pueda terminar, es por ello que es (n+1)Tc, y falta la asignación de i=1 es decir Ta, el tiempo total del algoritmo es : T(n) = n(Ta + To) + n(Ti) + (n+1)Tc + Ta + Ta, el total eliminando las agrupaciones es : n(Ta) + n(To) + n(Ti) + n(Tc) + Tc + Ta + Ta, factorizando n(Ta + To + Ti + Tc) + Tc + Ta + Ta, se aplica que cada uno de los tipos de operación tarda una unidad de tiempo, esta difiere en cada computador, por ello se toma general para este caso lo asumimos con valor 1, por ello sería el total final n(4) + 3, es decir el tiempo
T(n) = 4n + 3.
La pretensión de la segunda forma de evaluación es que se determine cuanto tiempo se tarda en cada uno de los tipos de operación, en caso de ser necesario.
Orden de un algoritmo – La función que define el tiempo de ejecución de un programa proporciona información interesante para clasificar los diferentes algoritmos que existen para resolver problemas. Con esta función es posible comparar el desempeño de diferentes algoritmos desarrollados para un problema en particular.
Para simplificar el estudio de la complejidad, se han adoptado ciertas convenciones en su notación, una de ellas es el concepto de orden, que indica, de forma simple, el grado de complejidad de un algoritmo sin considerar por completo la función de tiempo.
Sea el siguiente algoritmo :
for (i=1; i<n; i++)
for (j=i+1; j<=n; j++)
if (vec[i] <= vec[j])
{
temp = vec[i];
vec[i] = vec[j];
vec[j] = temp;
}
El anterior algoritmo lo pueden reconocer como el ordenamiento de burbuja, el cual posee una función de tiempo de n(n-1)/2, la demostración de este valor se deja como ejercicio para el lector, esto es igual a (n2 – n)/2, y se dice que es de orden n2 , o simplemente O(n2). Para determinar el orden un algoritmo, a partir de su función de tiempo, se eliminan todos los términos excepto el de mayor grado y se eliminan todos los coeficientes del término mayor.
Existen algunas reglas que son útiles para determinar el orden de un algoritmo:
Regla 1 (Ciclos FOR) : El tiempo de ejecución de un ciclo FOR es al menos el tiempo de ejecución de las instrucciones dentro de él multiplicado por el número de iteraciones.
Ejemplo : Para orden O(n).
for (i=1; i<=n; i++)
suma += i;
La función de tiempo para el algoritmo es T(N) = 4N+2, ya que ciclo ocupa 2n+2 y la sumas 2n, por lo que tiene un orden O(n).
Regla 2 (Ciclos FOR anidados) : Se analiza desde dentro hacia fuera. El tiempo de una instrucción dentro de un conjunto de ciclos anidados es igual al tiempo de ejecución de las instrucciones internas multiplicado por el producto del tamaño de los ciclos.
Ejemplo : Para orden O(n2)
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
suma += i*j;
Regla 3 (Condicional) : El tiempo de ejecución nunca es mayor que el tiempo de ejecución de la condicional más el mayor de los tiempos de ejecución de las alternativas.
Ejemplo : Algoritmo es O(n2)
If (i==j)
for (i=1; i<=n; i++)
suma += i;
else
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
suma += i*j;
Debido a que el tiempo de ejecución de la condición es de orden O(1) más el mayor tiempo de ejecución de las alternativas : cuando se cumple la condición es o(n) y cuando no se cumple es O(n2), por lo cual el orden es O(1) + O(n) + O(n2), pero, como ya se ha dicho, solo se toma el mayor, quedando el orden del programa en O(n2).
A los algoritmos de orden n se les llama de orden lineal, los de n2 de orden cuadrado, etc.
A continuación una gráfica muestra la características de orden de los algoritmos.

Se puede decir que un algoritmo tiene complejidad polinomial, o se ejecuta en tiempo polinomial, si tiene un orden O(nx). Estos algoritmos se dice que son algoritmos eficientes y los problemas que se resuelven con estos algoritmos se dice son problemas tratables.
Un algoritmo tiene complejidad exponencial si la función de tiempo T(n) tiene un orden O(xn). Los problemas que se resuelven usando algoritmos de tiempo exponencial se conocen como problemas intratables y a los algoritmos como algoritmos ineficientes.
Ejemplo : El problema de las Torres de Hanoi tiene complejidad exponencial de orden 2n. El algoritmo es el siguiente :
void Hanoi(int N, int A, int B, int C)
{
if (n==1)
MueveAnillo(A,B);
else{
Hanoi(n-1,A,C,B);
MueveAnillo(A,B);
Hanoi(n-1,C,B,A);
}
}
Debido a que el algoritmo es recursivo, el tiempo de ejecución puede ser descrito por la función T(n) = 2t(n-1) + constante, al aumentar el tamaño de la entrada, el tiempo se duplica (factor de dos), por lo que se puede deducir que el orden del algoritmo es O(2n).
Matemáticas de los algoritmos. (Para el caso de medición en el peor de los casos y para la media)
Sea M(n) el valor medio del tiempo de ejecución de todas las entradas de tamaño n. Para este caso se define los siguientes elementos :
Dn – conjunto de entradas de tamaño n.
T(i) – número de operaciones básicas correspondientes a la entrada I <- Di
P(n) - Tiempo de ejecución en el peor de los casos
P(n) = Max(T(i), V I є Dn)
M(n) = Media del número de operaciones básicas

En la practica casi siempre es más difícil determinar el tiempo de ejecución promedio que el del peor caso, pues si las p(i) no son iguales, cosa que normalmente ocurre, el análisis se hace intratable en matemáticas, y la noción de entrada "promedio" puede carecer de un significado claro.
Para el caso de la búsqueda secuencial.
i=1
mientras ((i=n) and (A[i] <> x)) haga
i = i + 1
fin mientras
En forma general P(n) es n si se toma como operación la comparación de elementos del arreglo.
Vector A.
I – Entrada iesima
|
|
|
|
|
x |
|
|
|
|
1 n
![]()
Con base en la medida del valor medio, se tiene

Sea q la probabilidad de x estar en el vector, significando con la entrada I – iesima que el elemento x ocupa la posición iesima.
Los valores de p(I) son iguales :
q (probabilidad de que el elemento este en la lista) en (i) número de iteraciones realizadas para encontrar (x).
(1-q) (probabilidad de que el elemento no este en la lista) en (n) número de iteraciones posibles en el vector. Este valor de determina por el principio básico de la estadística de un valor máximo (100%) corresponde a uno (1).
Es por ello que aparece la siguiente ecuación : (1-q)*n + q*i, este valor me representa el 100% de efectividad, en el proceso. Luego se aplican los elementos que componen la ecuación de la media y se reemplazan

Factorizando

Asumiendo que q sea 1 el resultado es : M(n) = (n+1)/2
Trabajo practico ( Ejercicio : Medición de los tiempos de asignación, operación, comparación e incremento)
Trabajos relacionados
Ver mas trabajos de Software |
|
Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo en formato DOC desde el menú superior.