Este artículo fue publicado anteriormente en dotNetmania.
Realizar estimaciones es uno de los más complejos problemas de los varios que los desarrolladores de software enfrentamos día a día. Además es uno que históricamente hemos fallado a la hora de resolver. Por eso precisamente es esta la cuestión que he elegido para mi primera participación en esta columna.
Aprovecho también para comentar que no pretendo dar desde estas páginas soluciones concretas, más que nada porque, en mi opinión, en el desarrollo de software no existen recetas universales, sino mover a la gente que la lea a pensar de otra manera, de una manera ágil, en los problemas que nos encontramos día a día cuando tratamos de desarrollar software.
Voy a hablar, en la presente entrega, sobre que armas hemos utilizado tradicionalmente los desarrolladores a la hora de realizar estimaciones, de cómo este es un problema complejo, quizás irresoluble, y de cómo las metodologías ágiles los asumen y conviven con ello. Pero antes de nada me gustaría dejar claro, una vez más, que en este tema, quizás más que en ningún otro, la única verdad absoluta es que ha quedado totalmente demostrado que no existen balas de plata.
Hagamos un repaso de cómo se ha enfrentado el problema de la estimación hasta ahora y que ventajas y problemas, a muy grandes rasgos, tiene cada aproximación.
Primero, se utilizo el juicio del experto. Es un enfoque simple y directo. Basta con buscar a un desarrollador que haya desarrollado un sistema lo más similar posible al que queremos estimar y que nos diga cuál es su estimación. Las pegas de esta aproximación son: Primero, que es difícil encontrar alguien que haya construido un sistema lo suficientemente similar como para obtener una buena estimación, se suelen desarrollar sistemas que no existen, si lo que necesita nuestro cliente ya existe es mejor que simplemente lo compre. Segundo, cada proyecto es un mundo. Cada proyecto evoluciona de un modo diferente, se desarrolla en un entorno diferente, con un equipo diferente, en una tecnología diferente. Luego es claro que el juicio del experto no es demasiado fiable. Además se trata de la voz de una única persona, lo que siempre introduce riesgos.
El siguiente paso fue abordar el problema desde un enfoque más ingenieril, más matemático. De aquí surgieron toda una serie de técnicas basadas en utilizar la matemáticas, como COCOMO y surgieron bastantes herramientas que implementaba este modelo. El problema es que descubrimos que alimentar de datos estas herramientas era demasiado costoso para obtener unos resultados que no era mucho más ajustados que el que se obtenían usando el juicio del experto.
La siguiente aproximación fue los puntos función. La idea es simple, utilizando datos históricos podemos evaluar lo que en nuestra empresa cuesta hacer un formulario o un informe, basándonos en lo que informes o formularios similares costaron anteriormente. Luego, a la hora de estimar un desarrollo, simplemente tendremos que multiplicar ese valor por el número de informes o formularios que tenemos. Pero resulto que aunque el método es simple y sin duda funciona, es muy difícil recopilar una cantidad significativa de datos fiables que soporten subsiguientes estimaciones. Recopilar estos datos es algo que exige tiempo, y en ese tiempo se producen cambios (tecnológicos, humanos u organizativos, por citar algunos) que invalida los datos anteriormente recogidos.
Es evidente que antes de la aparición de las herramientas RAD era mucho más complejo hacer un formulario o un informe, por poner un ejemplo fácilmente entendible.
Que estimar sea un problema difícil, no quiere decir que no sea un problema importante. Los desarrolladores tenemos una continua relación con las estimaciones: damos estimaciones, recibimos estimaciones y sufrimos estimaciones que gente equivocada, comerciales, gerentes, departamentos de marketing, etc, sin suficiente conocimiento del problema, hace por nosotros comprometiéndonos. Muchos problemas y riesgos habituales que aparecen en la gestión de los proyectos tienen que ver con una estimación deficiente. Es un problema que merece mucha de nuestra atención.
Pero no podemos obviar la relación que nuestra industria ha tenido con las estimaciones, la cruda realidad que todos vivimos: nunca se respetan y nunca son suficientemente ajustadas, da igual la técnica que usemos. Por lo tanto es muy importante a la hora de estimar no consumir demasiado tiempo. Al fin y al cabo, la fecha o el precio de proyecto probablemente ya se hayan fijado por motivos ajenos al desarrollo de software, mucho antes de que el equipo de desarrollo haya podido siquiera construir su estimación. Incluso, en muchos casos antes de que exista un equipo de desarrollo. Además las estimaciones se basan en los requisitos y los requisitos cambian constantemente o por lo menos, desde el planteamiento de las metodologías ágiles así lo asumimos.
Otro fenómeno claro que tendemos a olvidar, es que las estimaciones son muchísimo más fiables cuanto más información tenemos sobre las cuestiones que estamos estimando. En proyectos de desarrollo de software, generalmente esto es equivalente a decir que solo podemos tener estimaciones fiable sobre las parte del desarrollo que vamos a abordar en un futuro cercano. Con esto y con el principio de economía en mente (estimar tiene un coste alto, para el que buscamos una rentabilidad), las metodologías ágiles proponen solo estimar el futuro cercano y no poner demasiado esfuerzo en esa estimación. La idea subyacente es que realizar una estimación aporta mucho, pero que refinar mucho una estimación o utilizar métodos muy formales, generalmente costosos en cuanto a tiempo dedicado, no aporta tanto y sobre todo, no es económico desde el punto de vista de la relación entre esfuerzo y resultados. Resumiendo, estimar si, pero lo justo y solo en referencia al futuro cercano.
La siguiente pregunta es evidente, si estimar es inevitable y los métodos formales tradicionales exigen un esfuerzo que no tiene suficiente recompensa, ¿qué nos queda?. Una aproximación a la estimación que está ganando partidarios día a día es Wideband Delphi un proceso de estimación muy ligero y que obtiene unos resultados muy similares a procesos de estimación más pesados o complejos. El proceso es simple y no exige mucha preparación o formación previa.
- Se reúne unas cuantas personas (de dos a cinco). Idealmente se contará con personas que haya trabajado en aplicaciones similares y personas que no, es interesante contar con diferentes perspectivas.
- Cada persona contará con una descripción general de la cuestión a estimar y quien mejor la conozca expondrá de viva voz sus conocimientos sobre la misma.
- Cada persona presente en la reunión de estimación realizará y anotará su estimación sin colaborar con los demás. No se mostrará aun esta estimación al resto de participantes.
- Un facilitador revela los cálculos de manera anónima y seguidamente, tiene lugar un debate sobre las suposiciones en que se basan los cálculos. Quien lo desee puede revelar cual fue su estimación.
- El paso 3 se repite hasta que los cálculos converjan. Lo que se pretende es que cada persona aprende de los demás participantes, actualiza sus estimaciones y proporcione una nueva.
Existen varias variaciones sobre está técnica, por ejemplo hacer publicas las estimaciones de manera simultanea y que, para agilizar, solo los propietarios de estimaciones extremas, la más pesimista y la más optimista, debatan el por qué de sus estimaciones. Desde hace algún tiempo utilizo este método de estimación en un proyecto gestionado con Scrum para estimar y planificar cada uno de los Sprints, y la verdad es que tras el necesario proceso inicial de ajuste, puedo decir que esta funcionando excelentemente.