Estimación del Software

No es la primera vez que sale por aquí el tema de la estimación software, una de las áreas menos madura en las organizaciones de desarrollo, como comentábamos hace tiempo revisando datos reales de proyectos software;  
“No se puede predecir lo que no se puede medir” (Norman Fenton)
Comentaba McConnell (en mi opinión quien tiene los trabajos más prácticos sobre estimación software) que “una estimación software es una predicción de cuánto tiempo durará o costará un proyecto”. El propósito de una estimación software es determinar si los objetivos, los tiempos de que disponemos para realizar el proyecto, son suficientemente realistas.
Hacer una buena estimación software antes de ofertar un proyecto nos puede ayudar a detectar proyectos que no conviene abordar y que no son rentables. Aunque la realidad diga que normalmente negocio, o la parte comercial, fija inamoviblemente, y sin estimación previa, el tiempo del proyecto, esto no debería evitar las estimaciones, ya que estas nos ayudarán entonces a saber de qué tamaño es el problema en que nos hemos metido. Mejor saber al principio que es imposible hacer el proyecto en el tiempo ofertado que al final del plazo, cuando ya hay muy poco margen de maniobra.
Existen numerosos métodos de estimación software, si bien estos se pueden clasificar en dos grandes grupos: aquellos que siguen un enfoque heurístico o los que siguen un enfoque paramétrico.
Los métodos heurísticos estimación software
Los métodos heurísticos se basan en la experiencia, y los principales son:
  • El método basado en juicio experto. Más comúnmente llamado “a ojo”, y que consiste básicamente en preguntar a alguien con experiencia (o sin ella) cual es en su opinión la estimación software. Y que como podéis deducir… es el método más usado. Pero que tiene el problema de que se depende mucho del experto, de la experiencia que tenga y que además tiene el riesgo de que un día el experto deje la empresa y nos quedemos sin forma de estimar.
  • El método por analogía. Que es una importante evolución del anterior, ya que se basa en experiencias documentadas de cómo fueron los tiempos en proyectos previos. El método compara el proyecto a estimar con proyectos terminados previamente que sean similares. Aquí la importante aportación es que disponemos de un método, y de que la experiencia se va guardando en una BBDD (o más comúnmente en una hoja Excel).

Los métodos paramétricos de estimación software
  •  COCOMO (Constructive Cost Model) II, de Boehmn, que estima el esfuerzo (horas hombre) del proyecto. Para estimar el esfuerzo requiere previamente una estimación del tamaño (funcionalidad, líneas de código, etc., este tema lo veremos luego).
  • SLIM (Software LIfecycle Management), de Putnam, que de manera similar contiene un conjunto de fórmulas de estimación software. Estas fórmulas se extrajeron de estudiar grandes bases de datos de proyectos, observando cómo se comportaron la estimación software y distribuciones de esfuerzo.

Los dos anteriores sirven principalmente para obtener una estimación del esfuerzo (horas hombre de proyecto) y se basan que exista previamente un cálculo del tamaño del software a desarrollar. Para determinar el tamaño del software se utilizan principalmente dos unidades de medición: las líneas de código y los puntos función. Como las líneas de código son poco exactas, lo normal es estimar el tamaño en puntos función, y para ello existen:
  • ·   Numerosos métodos de estimación software basados en puntos función (FPA de IFPUG, COSMIC-FFP, Puntos Casos de Uso, etc.), que estiman el tamaño funcional de un producto software desde los requisitos.

“Cuando puedes medir y expresarte con números sabes realmente de lo que hablas; pero cuando no puedes medir, cuando no puedes expresarte con números, tus conocimientos son escasos y poco satisfactorios” (Lord Kelvin)

La métrica más obvia para estimar el tamaño de un producto software es la LOC (Lines Of Code), pero esta métrica suele tener muchos problemas. Algunos problemas de utilizar LOC como métrica para estimar el tamaño son: la falta de una definición universal de qué es una línea de código (¿un conjunto de tokens? ¿lo que hay antes de un punto y coma?, etc.), su dependencia del lenguaje de desarrollo (no es lo mismo una línea en Java que en C++), la dificultad de estimar LOC en fases iníciales del desarrollo, que no está claro que un número de LOC corresponda con un número de funcionalidades desarrolladas (la misma funcionalidad se puede desarrollar con muy diferentes números de LOC), etc. Para paliar estos problemas, surgió una métrica para medir el tamaño en base a los requisitos, funcionalidad, y no en la tecnología que se va a utilizar, denominada puntos función (PF).

Los Puntos Función son “una métrica para establecer el tamaño y complejidad software en base a la cantidad de funcionalidad requerida y entregada a los usuarios” o “una función que  mide el tamaño lógico o funcional de los proyectos”.

Así como existe el “metro” como unidad de medición para longitudes, Puntos Función es “el metro” para medir el tamaño de una aplicación de software. Aunque para ser exactos, los Puntos Función no serían como el “metro”, ya que no son una medida universal, y prácticamente no hay dos empresas que midan Puntos Función de la misma manera, y hay muchos métodos de calcular los Puntos Función. Ejemplos, algunos de los métodos que más se usan (o más hemos visto nosotros en empresas) para calcular los Puntos Función.


Comentarios