Mostrando las entradas con la etiqueta Ingeniería de software. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Ingeniería de software. Mostrar todas las entradas

viernes, 3 de febrero de 2012

Razones por las que no es aconsejable realizar estimaciones de puntos de función en proyectos de gran escala


Algún tiempo atrás, un cliente  me solicitó realizar contar los puntos de función (PF) para un proyecto de gran envergadura. Debido a que ya he realizado este tipo de estimaciones varias veces, intuí que lo que me estaban pidiendo no era factible.
En vez de iniciar la cuenta de manera similar a como lo había hecho en otros proyectos (siguiendo principalmente los lineamientos del manual gratuito de Longstreet Consulting), comencé a estimar el esfuerzo asociado a la estimación en sí, que preliminarmente resultó de un par de meses de dedicación exclusiva.
En este artículo explicaré cómo logre de todos modos aproximar el tamaño en puntos de función para el proyecto, las razones que me llevaron a anticipar que realizar una cuenta de la forma tradicional no era posible, para terminar explicando por qué no es aconsejable realizar una cuenta de puntos de función para proyectos de gran envergadura.
En primer lugar, lograr una aproximación (que necesariamente incorpora un error, pero que de todos modos resulta aceptable) de un proyecto en puntos de función es extremadamente fácil utilizando una técnica que se llama backfiring. La técnica del backfiring se sustenta en que hay miles de instituciones que han entregado a instituciones, como la Software Productivity Research, sus cuentas de puntos de función y el tamaño en líneas de código de sus proyectos. Esto ha permitido establecer un “promedio industrial de líneas de código en un lenguaje X necesario para producir 1 punto de función”. La Software Productivity Research publica año a año una tabla con tasas de conversión para más de 700 lenguajes y dialectos de programación.
En el caso de Java, este número mágico es 53. Es decir, se requieren 53 líneas de código Java, con toda su documentación y artefactos asociados (casos de uso, análisis, diseño, pruebas, matrices de trazabilidad, javadoc, y un largo etc.), para producir el equivalente a un punto de función.
Con esto, la estimación es sencilla: Se cuentan las líneas de código en Java, y se dividen por 53, y se obtiene la aproximación a PF.
Dado esto, considerando que el proyecto para el cual se me pidió la estimación tiene 1.119.124 LOCs al día de hoy, su cuenta en puntos de función es de aproximadamente 21.115,5 PFs.
(El proyecto que menciono, probablemente tenga un tamaño en PFs mayor al mencionado, debido a que si bien la mayor parte está construida en Java, hay una parte considerable – que estimo sobre el 30% – que está construida en base a otros lenguajes que no consideré para el estudio.)
Obviamente, el backfiring tiene una limitación severa (además de su falta de precisión): El software al que se le quiere estimar el tamaño en PFs debe tener un tamaño en LOCs conocido para poder aplicarlo, lo que no obviamente no está disponible si uno estimando un software a construir en el futuro. Es por eso que su uso principal es en actividades de benchmarking, y no de estimación. Sin embargo, cabe destacar que también puede ser utilizado con un buen grado de precisión para estimar el esfuerzo de modificaciones de software de tamaño inferior a 15 PFs.

Para entender por qué supe que la cuenta que me estaban pidiendo no era factible de realizar, consideren que un equipo auto-organizado, siguiendo metodologías ágiles tiene una productividad promedio de 15 PFs por miembro al mes. Para equipos donde todos son expertos, esto puede llegar a 20 PFs por miembro al mes, y cuando son novatos, puede bajar a 10 PFs por miembro al mes.
Si tomamos el promedio (15 PF), y asumimos una metodología ágil (en particular SCRUM, complementado con cualquier técnica ágil con excepción de pair programming), un equipo de 5 personas tendrá una productividad mensual de 75 PFs, y una anual de 900 al año, lo que cae en el rango de los proyectos pequeños.
Considerando que en Chile el sueldo promedio de un Ingeniero Civil en Informática con 5 años de experiencia es de $1,532.210, es decir, al dólar de hoy U$3.167,7, el costo de un punto de función es en promedio de $102.147 pesos, o U$211 aprox. Por lo que el proyecto pequeño del que hablo, costaría aproximadamente $91.932.300, o U$189.900
Si comparamos los $189.900 de este proyecto pequeño y ficticio, con los más de U$24.000.000 del proyecto grande y real para el cual se me pidió la estimación (haciendo la abstracción no menor del markup de las empresas proveedoras), no parece irracional asumir que realizar una cuenta de PFs para este proyecto es un desafío mayor e involucrará un consumo de recursos probablemente difícil de justificar.
 Pero ¿Por qué generalizar a que no se deben hacer cuentas de PFs para proyectos de gran envergadura (más de 10.000 PFs)? (a menos que obviamente hayan razones informadas para hacerlo)
Consideren lo siguiente:
  1. Un experto en contar PFs es capaz de contar entre 400 y 600 por día
  2. La tasa promedio del mercado (al año 2010) para las firmas especializadas en contar PFs era de U$3000 al día (en USA), lo que lleva a un costo entre U$5 y U$7 por cada PF contado.
Con estos antecedentes, y a modo de ejemplo, se deduce que contar los puntos de función para el proyecto que estaba analizando habría tenido un costo de U$105.577,5 y U$147.808,5 (considerando el dólar de hoy a $483,7 pesos chilenos por dólar, sólo contar los PFs habría salido entre $51.067.836,75 y $71.494.971).
El esfuerzo asociado a la actividad de contarlos además habría oscilado entre los 35 y lo 53 días – persona.
Generalizando, se puede afirmar que, tomando un costo promedio de U$6 por PF, un proyecto de más de 10.000 PFs costará inmediatamente U$60,000 más si se cuentan sus puntos de función.
A lo anterior, se debe agregar que si los requerimientos no están aceptablemente completos y correctamente levantados, la estimación tendrá fuertes retrasos y errores.

Esto lleva a la siguiente conclusión: Si bien teóricamente, es posible estimar los puntos de función de cualquier proyecto, en la práctica para proyectos grandes, los costos, tiempo y riesgo involucrados se elevan tanto que esta actividad se vuelve difícil de justificar.
Es por esto que en la práctica, los puntos de función se utilizan para proyectos de un tamaño proyectado inferior a los U$5.000, y la mayoría de las veces para proyectos pequeños de menos de U$1.000.
Pero, si entonces los proyectos de gran escala (más de 10.000 PFs) no se pueden estimar de manera económicamente conveniente usando puntos de función, ¿Existe una forma de hacerlo?
La respuesta es , y la forma es la siguiente…

(Fin a lo Matrix Reloaded)

Referencias:

martes, 10 de enero de 2012

Problemas y desafíos de la arquitectura de software

Las siguientes figuras son obtenidas de fuentes de prestigio y reconocimiento en la industria TI, y evidencian un problema general dentro de la industria del desarrollo de software:
Arquitectura de la aplicación Java EE PetStore
Fuente: Originalmente de http://sun.java.com, pero obtenida de www.theserverside.com
Arquitectura de servidor de mensajería Sun Java CommunicationSuite
Arquitectura del Microframework .Net
La documentación de los sistemas de software generalmente incluyen una sección denominada “arquitectura del sistema”, la cual presenta una serie de diagramas similares a los expuestos.
Si bien a primera vista estos diagramas parecieran ser una buena guía para entender el sistema, una observación más cuidadosa permite constatar que todos ellos se caracterizan por:
·         la utilización de texto descriptivo y la utilización de diagramas de cajas y líneas
·         tener muy baja precisión, y ser más bien informales.
·         apelar a la intuición y pericia técnica del lector.
El uso de estos diagramas, hacen que en general la arquitectura de software sea considerado por muchos una “vista de alto nivel” del sistema, muchas veces abstracta e inherentemente imprecisa. Esto hace que las definiciones de  arquitectura sean sólo un punto de partida, y estén muy lejos de cumplir el rol de su análogo en la industria de la construcción.
De ahí que la ya no tan incipiente disciplina de arquitectura de software, tenga como sus grandes desafíos establecer los lineamientos teóricos y prácticos para que la arquitectura de software sea utilizada como un artefacto de ingeniería, basada en principios claros y no en definiciones ad-hoc, capaz de contribuir a (i) la comunicación entre las diferentes partes involucradas y (ii) la reducción del riesgo en el desarrollo mediante la captura precisa de las principales decisiones técnicas.
Otro gran desafío de la disciplina es la de permitir la construcción de sistemas con una base arquitectónica sólida e intelectualmente manejable. Como objetivos relacionados, se busca que los sistemas:
·         Puedan ser construidos en función de una composición de partes
·         Adhieran a la arquitectura definida para su construcción, manifestando en consecuencia las propiedades deseadas para ellos.
·         Utilicen crecientes grados de arquitecturas de integración estándares
·         Sean documentados de manera que la organización que los crea pueda reutilizar el conocimiento arquitectónico
·         Reducir los costos de producción de sistemas a gran escala mediante la definición de líneas de productos.

Fuentes: