¿Con qué frecuencia los desarrolladores tienen que tirar el trabajo realizado en sprints anteriores en un entorno ágil?

No deberían estar haciendo eso y, si lo están, deberían tener un propósito al respecto.

Comencemos desde arriba. Todo el código debe reescribirse eventualmente. La reescritura ocurre cuando los requisitos cambian y sucede a medida que cambia la tecnología. En algún lugar del mundo hay un sistema vital para la red global de control de tráfico aéreo que se escribió una vez en Fortran, se volvió a tocar alrededor de 1999 y ha estado ronroneando felizmente desde entonces. Esa cosa es una pesadilla. Todos los que lo sepan deberían mirarlo todos los días preguntándose cuándo el error no descubierto en él va a criar su fea cabeza y esperando poder encontrar a alguien que recuerde a Fortran cuando lo haga. Sistemas como ese representan una forma de deuda técnica y dejarlos funcionando, sin mantenimiento y sin tocar durante décadas es un problema.

Ok, pero eso claramente no es de lo que estamos hablando. A corto plazo, el código debe reescribirse cuando cambian los requisitos. Esto tiene sentido; el código se escribió con algún requisito y cambiar el requisito debería requerir un cambio en el código. El Principio de Responsabilidad Única sugiere que cada módulo en el código debe tener una única responsabilidad y que debe haber un único requisito que, si se modifica, puede forzar un cambio en ese código. Una reescritura es un cambio bastante significativo, pero dependiendo de qué tan desacoplado esté su código, podría ser apropiado. Si esto está sucediendo mucho, es un síntoma de problemas con el liderazgo y la priorización. Lo más probable es que sus desarrolladores estén tan molestos como las personas que pagan sus salarios y necesita hablar con el propietario de su producto.

Pero eso probablemente tampoco sea de lo que estás hablando. Parece que lo que estás diciendo es que, sin cambios en los requisitos, los desarrolladores están reescribiendo elementos del sprint N en el sprint N + 1. Eso es un problema. Sugiere que los desarrolladores no sabían cuál era la visión a largo plazo del proyecto en el sprint N o que deliberadamente asumieron una deuda técnica para aumentar las métricas en el sprint N. Por el contrario, puede significar que tienes algún tipo de desglose en el proceso de promoción y revisión de código de manera que los desarrolladores se encuentren con un código subestándar en el sprint N + 1 y se vean obligados a reescribirlo porque se promovió por error en el sprint N.

Por supuesto, hay momentos en que es apropiado asumir una deuda técnica. No siempre sabemos cómo funcionará un componente dado o es posible que queramos comenzar con los aspectos de una integración antes de que uno de los elementos base esté completo. En esos casos, el equipo debe acordar emprender una solución barata a corto plazo para llenar el vacío hasta que se realice el trabajo más sustantivo y volver a escribir más tarde para incorporar el nuevo sistema. Pero esa debería ser una tarea poco frecuente y todos los involucrados deberían estar adecuadamente motivados para sacar las cosas temporales lo más rápido posible.

Si el trabajo que se le ha dado al equipo se ha evaluado, diseccionado (verticalmente) correctamente y hay un conjunto de automatización debidamente establecido para probar los cambios en el código, entonces la respuesta sería muy pequeña. Advierto esta afirmación con lo siguiente:

Como hay muchas variables que pueden descarrilar a un equipo y hacer que se haga un trabajo adicional, cosas como las dependencias y los compromisos de entrega llevan a los desarrolladores a desconectar el código, a fin de proporcionar datos falsos para pasar a través del entorno de prueba. Al final, está realmente impulsado por la estructura org / dev y si existe una suite de automatización satisfactoria.

En pocas palabras … Agile no hace que el código se reescriba. O las malas elecciones hechas por el equipo de desarrollo o las organizaciones mal estructuradas, como las tiendas que se enmarcan en un marco orientado a componentes en lugar de un marco orientado a productos.

Esa no es la manera correcta de hacer cumplir el desarrollo ágil.

No me impresiona esta forma de descartar el trabajo.

Piense en la actividad de ser una “Rata de paquete digital”, como admite Linus of Linus Tech Tips, se da a las personas que conservan todo lo que han creado digitalmente.

Yo hago casi lo mismo; algunos proyectos se archivan en almacenamiento en frío (discos ópticos y cintas magnéticas), almacenamiento a mediano plazo (discos magnéticos), corto plazo (en vivo reciente) y almacenamiento en caché (en vivo ahora) (ambos basados ​​en flash).

El código trabajado podría ser útil a tiempo pero no ahora.

El codificador fue pagado para codificar; codificó, pero el código que produjo no era útil actualmente, no significa que no será útil en el futuro.

Si yo fuera el dueño del negocio, no estaría contento con que el gerente o el codificador destruyeran su código, especialmente porque el negocio pagaba por ese desarrollo.

Podría modificarse o usarse en una versión posterior o podría ser mejor para otro proyecto. Incluso podría conducir a una nueva característica.

No estoy seguro de haber entendido mencionar “ágil” en este contexto. ¿Te refieres a características que nadie está usando al final? ¿O te refieres a refactorizar en general?

En mi experiencia, en realidad es bastante raro tener un trabajo completo de descarte. ¿Refactorización significativa? Seguro. No descartable. El desecho llega mucho más tarde.