Me gustaría saber cuál es el impacto general de la planificación de recursos en un proyecto de software, donde los requisitos y el diseño del proyecto se basan en pruebas de aceptación automatizadas y pruebas unitarias, en contraste con un enfoque más "tradicional" para el desarrollo de software.
¿Cuál es, en su experiencia, el efecto general sobre los requisitos de recursos para completar un proyecto de software bajo TDD, en oposición a las metodologías de desarrollo más "tradicionales"? Me parece evidente que la calidad aumentaría, y la cantidad de incertidumbre disminuye porque las pruebas se realizan antes, pero requerir pruebas por adelantado parece que requeriría más horas de desarrollador para lograrlo. ¿Cuánto aumenta el esfuerzo de desarrollo, o en realidad disminuye debido a la eliminación inicial de errores?
¿Cuánto más esfuerzo se requiere del cliente? ¿Tienen que cambiar la forma en que se relacionan con el proyecto, especialmente si están acostumbrados a grandes diseños desde el principio? ¿El número de horas requeridas por el cliente en general aumenta o realmente disminuye?
Me imagino que las estimaciones de tiempo serían muy vagas en un proceso iterativo de TDD al comienzo de un proyecto TDD (ya que no existe un Plan de Desarrollo de Software). ¿Hay un punto, digamos, del 20% en un proyecto, donde la confianza aumenta lo suficiente como para que se pueda proporcionar al cliente una estimación de tiempo y dinero más o menos estable?
Nota: No estoy buscando opiniones o teorías subjetivas aquí, así que no especules. Estoy buscando más experiencia en el mundo real en TDD.
fuente
Respuestas:
Lo primero que hay que decir es que TDD no necesariamente aumenta la calidad del software (desde el punto de vista del usuario). No es una bala de plata. No es una panacea. Disminuir el número de errores no es por eso que hacemos TDD.
TDD se realiza principalmente porque da como resultado un mejor código. Más específicamente, TDD da como resultado un código que es más fácil de cambiar .
Si desea o no usar TDD depende más de sus objetivos para el proyecto. ¿Será este un proyecto de consultoría a corto plazo? ¿Está obligado a apoyar el proyecto después de la puesta en marcha? ¿Es un proyecto trivial? La sobrecarga agregada puede no valer la pena en estos casos.
Sin embargo, según mi experiencia, la propuesta de valor para TDD crece exponencialmente a medida que el tiempo y los recursos involucrados en un proyecto crecen linealmente.
Las buenas pruebas unitarias ofrecen las siguientes ventajas:
Un efecto secundario de TDD podría ser menos errores, pero desafortunadamente, según mi experiencia, la mayoría de los errores (particularmente los más desagradables) generalmente son causados por requisitos poco claros o deficientes o no estarían necesariamente cubiertos por la primera ronda de pruebas unitarias.
Resumir:
El desarrollo en la versión 1 podría ser más lento. El desarrollo en la versión 2-10 será más rápido.
fuente
Hay un capítulo en Making Software sobre Test-Driven Development, que cita el artículo discutido aquí .
Si estos resultados son generalizables para su caso es, por supuesto, algo que los defensores de TDD argumentarán es obvio y los detractores de TDD argumentarán que no es cierto.
fuente
No tengo ningún documento de investigación o estadística que darle, pero relataré mi experiencia de trabajar en un equipo / organización que históricamente tuvo una cobertura de prueba unitaria de baja a media y sin pruebas de punta a punta, y gradualmente moviendo la barra a donde estamos ahora, con un enfoque más de ATDD (pero, irónicamente, no TDD tradicional).
Específicamente, así es como se desarrollaban los cronogramas del proyecto (y aún se juegan en otros equipos / productos en la misma organización):
Esto parece una sobrecarga ridícula , pero en realidad es muy común, a menudo está enmascarado en muchas organizaciones por falta de control de calidad o ineficaz. Tenemos buenos evaluadores y una cultura de pruebas intensivas, por lo que estos problemas se detectan temprano y se solucionan por adelantado (la mayoría de las veces), en lugar de permitir que se desarrollen lentamente en el transcurso de muchos meses / años. La sobrecarga de mantenimiento del 55-65% es inferior a la norma comúnmente aceptada del 80% del tiempo dedicado a la depuración, lo cual parece razonable, porque teníamos algunas pruebas unitarias y equipos multifuncionales (incluido el control de calidad).
Durante el primer lanzamiento de nuestro equipo de nuestro último producto, habíamos comenzado a actualizar las pruebas de aceptación, pero no estaban a la altura del tabaco y todavía teníamos que confiar en muchas pruebas manuales. El lanzamiento fue algo menos doloroso que otros, IMO en parte debido a nuestras pruebas de aceptación al azar y también en parte debido a nuestra muy alta cobertura de pruebas unitarias en relación con otros proyectos. Aún así, pasamos casi 2 semanas en regresión / estabilización y 2 semanas en problemas de posproducción.
Por el contrario, cada lanzamiento desde ese lanzamiento inicial ha tenido criterios de aceptación temprana y pruebas de aceptación, y nuestras iteraciones actuales se ven así:
En otras palabras, progresamos de 55-65% de gastos generales de mantenimiento a 20-30% de gastos generales de mantenimiento. El mismo equipo, el mismo producto, la principal diferencia es la mejora progresiva y la racionalización de nuestras pruebas de aceptación.
El costo de mantenerlos es, por sprint, 3-5 días para un analista de control de calidad y 1-2 días para un desarrollador. Nuestro equipo tiene 4 desarrolladores y 2 analistas de control de calidad, por lo que (sin contar UX, gestión de proyectos, etc.) eso es un máximo de 7 días hábiles de 60, que redondearé a una sobrecarga de implementación del 15% solo para estar en El lado seguro.
Dedicamos el 15% de cada período de lanzamiento a desarrollar pruebas de aceptación automatizadas, y en el proceso podemos reducir el 70% de cada lanzamiento haciendo pruebas de regresión y reparando errores de preproducción y posproducción.
Es posible que haya notado que la segunda línea de tiempo es mucho más precisa y también mucho más corta que la primera. Eso es posible gracias a los criterios de aceptación y las pruebas de aceptación iniciales, ya que simplifica enormemente la "definición de hecho" y nos permite tener mucha más confianza en la estabilidad de una versión. Ningún otro equipo (hasta ahora) ha tenido éxito con un cronograma de lanzamiento quincenal, excepto tal vez cuando se realizan lanzamientos de mantenimiento bastante triviales (solo corrección de errores, etc.).
Otro efecto secundario interesante es que hemos podido adaptar nuestro calendario de lanzamientos a las necesidades comerciales. Una vez, tuvimos que alargarlo a aproximadamente 3 semanas para que coincidiera con otra versión, y pudimos hacerlo mientras brindamos más funcionalidad pero sin gastar tiempo adicional en pruebas o estabilización. En otra ocasión, tuvimos que acortarlo a aproximadamente 1½ semanas, debido a días festivos y conflictos de recursos; tuvimos que asumir menos trabajo de desarrollo, pero, como era de esperar, pudimos dedicar correspondientemente menos tiempo a las pruebas y la estabilización sin introducir ningún defecto nuevo.
Entonces, en mi experiencia, las pruebas de aceptación, especialmente cuando se realizan muy temprano en un proyecto o sprint, y cuando se mantienen bien con los criterios de aceptación escritos por el Propietario del producto, son una de las mejores inversiones que puede hacer. A diferencia del TDD tradicional, que otras personas señalan correctamente se centra más en la creación de código comprobable que en el código libre de defectos : ATDD realmente ayuda a detectar defectos mucho más rápido; es el equivalente organizacional de tener un ejército de probadores haciendo una prueba de regresión completa todos los días, pero mucho más barata.
¿ATDD lo ayudará en proyectos a más largo plazo realizados en RUP o (ugh) estilo Cascada, proyectos que duran 3 meses o más? Creo que el jurado todavía está en eso. En mi experiencia, los riesgos más grandes y más feos en proyectos de larga duración son plazos poco realistas y requisitos cambiantes. Los plazos poco realistas harán que las personas tomen atajos, incluidos los atajos de prueba, y los cambios significativos en los requisitos probablemente invaliden una gran cantidad de pruebas, lo que requerirá que se reescriban y posiblemente inflen la sobrecarga de la implementación.
Estoy bastante seguro de que ATDD tiene una recompensa fantástica para los modelos Agile, o para los equipos que no son oficialmente Agile pero tienen calendarios de lanzamiento muy frecuentes. Nunca lo he probado en un proyecto a largo plazo, principalmente porque nunca he estado o incluso he oído hablar de una organización dispuesta a intentarlo en ese tipo de proyecto, así que inserte aquí el descargo de responsabilidad estándar. YMMV y todo eso.
PD En nuestro caso, no se requiere un esfuerzo adicional del "cliente", pero tenemos un propietario de producto dedicado y a tiempo completo que realmente escribe los criterios de aceptación. Si está en el negocio de "consultoría", sospecho que podría ser mucho más difícil lograr que los usuarios finales escriban criterios de aceptación útiles. Un propietario de producto / gerente de producto parece un elemento bastante esencial para hacer ATDD y, aunque una vez más solo puedo hablar desde mi propia experiencia, nunca he oído hablar de ATDD que se practique con éxito sin alguien para cumplir ese papel.
fuente
Requerimientos de recursos
En mi experiencia, el costo de requerir pruebas iniciales se mitiga de inmediato definiendo un criterio de aceptación claro por adelantado y luego escribiendo a la prueba. No solo se mitiga el costo de las pruebas iniciales, también he encontrado que generalmente acelera el desarrollo general. Aunque esas mejoras de velocidad pueden ser eliminadas por una definición deficiente del proyecto o cambios en los requisitos. Sin embargo, todavía podemos responder bastante bien a ese tipo de cambios sin un impacto severo. ATDD también reduce significativamente el esfuerzo del desarrollador para verificar el comportamiento correcto del sistema a través de su conjunto de pruebas automatizadas en los siguientes casos:
Esto supone un equipo que esté familiarizado con el proceso y las prácticas involucradas.
Involucramiento del cliente
Tienen que estar mucho más involucrados de manera continua. He visto una gran reducción en la inversión de tiempo inicial, pero una demanda mucho mayor en curso. No he medido, pero estoy bastante seguro de que es una inversión de tiempo más grande para el cliente.
Sin embargo, descubrí que la relación con el cliente mejora enormemente después de 5 o más demostraciones donde ven que su software toma forma lentamente. El compromiso de tiempo del cliente disminuye algo con el tiempo a medida que se desarrolla una relación, todos se acostumbran al proceso y las expectativas involucradas.
Estimacion del proyecto
He descubierto que, por lo general, es una cuestión de qué tan bien definida está la solicitud y si los líderes técnicos pueden sacar el proyecto (incluida la estimación de la tarjeta). Suponiendo que el proyecto esté bien organizado y tenga un promedio de velocidad razonable y una desviación estándar, hemos descubierto que es fácil obtener una estimación decente. Obviamente, cuanto más grande es el proyecto, mayor es la incertidumbre, por lo que generalmente divido un proyecto grande en un proyecto pequeño con la promesa de continuar más tarde. Esto es mucho más fácil de hacer una vez que haya establecido una relación con el cliente.
Por ejemplo:
Los "sprints" de mi equipo duran una semana y tenemos un promedio de carrera y estándar. desviación de las últimas 14 semanas. Si el proyecto es de 120 puntos, tenemos una media de 25 y una estándar. la desviación de 6 y luego estimar la finalización de un proyecto es:
Usamos el 2 Std. Regla de desviación para nuestra estimación de confianza del 95%. En la práctica, generalmente completamos el proyecto bajo el primer estándar. desviación, pero por encima de nuestra media. Esto generalmente se debe a refinamientos, cambios, etc.
fuente
Esto en realidad no es cierto. Si sus desarrolladores están escribiendo pruebas unitarias (y deberían hacerlo), entonces el tiempo debería ser aproximadamente el mismo, o mejor. Dije mejor, ya que su código se probará por completo y tendrán que escribir solo el código para cumplir con los requisitos.
El problema con los desarrolladores es que tienden a implementar incluso cosas que no son necesarias para que el software sea lo más genérico posible.
Eso no debería importar. Quien haga los requisitos debe hacerlo lo mejor posible.
Si realiza una forma ágil de desarrollo, eso no significa un gran diseño por adelantado. Pero, cuanto mejor se cumplan los requisitos, la arquitectura y el diseño, la calidad del código aumentará y el tiempo para finalizar el software disminuirá.
Por lo tanto, si les gusta hacer BDUF, que lo hagan. Te hará la vida más fácil como desarrollador.
fuente