Lo que usted describe es, al menos en mi experiencia, un patrón emergente bastante común de equipos que intentan "ser ágiles". Está abierto a debate si esto es realmente parte de Agile en sí mismo o una implementación errónea común del mismo, está en contra del manifiesto / principios ágiles o una consecuencia inherente del mismo, y así sucesivamente. Solo desde un punto de vista empírico y basándome en mi propia pequeña muestra de experiencia (y las personas con las que hablo), si un equipo es ágil, parece tener una probabilidad mayor que la media de encontrarse con este patrón. Dejémoslo así y centrémonos en su ejemplo concreto.
Hay dos aspectos separados de lo que describe:
- Falta de comprensión / visión común y, por lo tanto, no es eficiente
- Cómo medir el éxito / progreso y el costo total
Ir por el camino equivocado o correr en círculos
En mi experiencia, la razón principal para que esto suceda es que, en un intento de producir código rápidamente, los equipos rechazan activamente los casos de uso o requisitos que ya conocen o que podrían descubrir fácilmente. Piénselo de esta manera: hace 10-20 años, las personas intentaron escribir especificaciones gigantes y pensar en todo de antemano y con frecuencia fallaron. O tardaron demasiado o pasaron por alto algo. Uno de los aprendizajes del pasado es que en el desarrollo de software hay cosas que no puedes saber y las cosas cambian mucho, de ahí la idea de iterar rápidamente y producir algo de salida sensible rápidamente. Lo cual es un muy buen principio. Pero hoy, estamos en el otro extremo: "No me importa esto porque es parte del próximo sprint" o "No presento ese error, lo soluciono cuando vuelve a aparecer".
- Reúna todos los casos de uso de alto nivel , requisitos, dependencias y restricciones que pueda encontrar. Póngalo en una wiki para que todos los interesados y desarrolladores puedan verlos. Agréguelos cuando surja algo nuevo. Hable con sus accionistas y usuarios. Use esto como una lista de verificación mientras desarrolla para evitar la implementación de cosas que no contribuyen al producto final o son soluciones / hacks que resuelven un problema pero causan tres nuevos.
- Formular un concepto de alto nivel . No me refiero al diseño de interfaces o clases, sino que esbozo el bosquejo del problema. ¿Cuáles son los principales elementos, mecanismos e interacciones en la solución final? En su caso, debería ser obvio cuando se utiliza la solución jquery-workaround como un paso intermedio y cuando solo causa trabajo adicional.
- Valide su concepto utilizando la lista que recopiló. ¿Hay algún problema obvio en ello? ¿Tiene sentido? ¿Hay formas más eficientes de lograr el mismo valor de usuario sin causar deudas tecnológicas a largo plazo?
No te excedas. Solo necesita algo para que todos en el equipo (incluidos los que no son desarrolladores) tengan un entendimiento común sobre cuál es el mejor camino hacia su MVP. Todos deberían estar de acuerdo en que no hay descuidos obvios y que realmente podría funcionar. En general, esto ayuda a evitar caer en callejones sin salida o tener que rehacer lo mismo varias veces. Agile puede ayudarlo a lidiar mejor con lo inesperado, no es un argumento para ignorar lo que se sabe.
Tenga en cuenta la falacia del costo hundido : si comienza con una arquitectura o tipo de base de datos, la mayoría de las personas dudan en cambiarla a mitad del proyecto. Por lo tanto, es una buena idea invertir algo de tiempo en tener una "mejor conjetura" antes de comenzar a implementar cosas. Los desarrolladores tienen una tendencia a querer escribir código rápidamente. Pero a menudo tener un par de simulacros, prototipos en vivo, capturas de pantalla, estructura alámbrica, etc. permite una iteración aún más rápida que escribir código. Solo tenga en cuenta que cada línea de código escrita o incluso las pruebas unitarias hacen que sea más difícil cambiar su concepto general nuevamente.
Medición del éxito
Un aspecto completamente separado es cómo mides el progreso. Digamos que el objetivo de su proyecto es construir una torre de 1 m de altura utilizando cosas que se encuentran por ahí. Construir un castillo de naipes puede ser una solución totalmente válida si, por ejemplo, el tiempo de comercialización es más importante que la estabilidad. Si su objetivo es construir algo que dure, usar Lego hubiera sido mejor. El punto es: lo que se considera un truco y qué solución elegante depende completamente de cómo se mide el éxito del proyecto .
Su ejemplo de "carga" es bastante bueno. Tuve cosas como esta en el pasado donde todos (incluyendo ventas, PO, usuarios) acordaron que era molesto. Pero no tuvo impacto en el éxito del producto y no causó deuda a largo plazo. Así que lo descartamos porque había cosas más valiosas que hacer con los recursos de desarrollo.
Mi consejo aquí es:
- Guarde todo, incluso pequeños errores, como tickets en su sistema de tickets . Tome una decisión activa sobre lo que está dentro del alcance del proyecto y lo que no. Cree hitos o filtre de otro modo su cartera de pedidos para que siempre tenga una lista "completa" de todo lo que aún debe hacerse.
- Tenga un orden estricto de importancia y un punto de corte claro donde el proyecto pueda considerarse un éxito. ¿Qué nivel de estabilidad / calidad de código / documentación necesita realmente el producto final? Intente pasar cada día de trabajo lo mejor posible eligiendo desde la parte superior. Cuando trabaje en un boleto, intente resolverlo completamente sin introducir nuevos boletos (a menos que tenga sentido posponer las cosas debido a la menor prioridad). Cada compromiso debe llevarlo hacia su objetivo final, no hacia los lados o hacia atrás. Pero para enfatizarlo de nuevo: ¡a veces un truco que produce trabajo adicional más adelante puede ser positivo para el proyecto!
- Use su PO / usuarios para calcular el valor del usuario, pero también haga que sus desarrolladores calculen el costo tecnológico . Los no desarrolladores generalmente no pueden juzgar cuál es el verdadero costo a largo plazo (¡no solo el costo de implementación!), Así que ayúdenlos. Tenga en cuenta el problema de la rana hirviendo: muchos problemas pequeños e irrelevantes pueden con el tiempo detener al equipo. Intente cuantificar qué tan eficiente puede trabajar su equipo.
- Esté atento a la meta general / costos. En lugar de pensar de sprint en sprint, más bien tenga una mentalidad de "¿podemos nosotros como equipo hacer todo lo necesario hasta el final del proyecto" . Los sprints son solo una forma de descomponer las cosas y tener puntos de control.
- En lugar de querer mostrar algo temprano, trace su curso en el camino más rápido hacia un producto mínimo viable que pueda proporcionarle al usuario. Aún así, su estrategia general debería permitir resultados verificables en el medio.
Entonces, cuando alguien hace algo que no se ajusta a su objetivo de implementación final, idealmente no considere la historia como hecha. Si es beneficioso cerrar la historia (por ejemplo, para obtener comentarios de los clientes), abra inmediatamente una nueva historia / error para abordar las deficiencias. ¡Haga transparente que tomar atajos no reduzca los costos, solo los oculta o los retrasa!
El truco aquí es discutir con el costo total del proyecto: si, por ejemplo, una OP presiona para tomar atajos para establecer una fecha límite, ¡cuantifique la cantidad de trabajo que debe hacerse después para considerar el proyecto realizado!
También tenga cuidado con la optimización basada en criterios : si su equipo se mide por la cantidad de historias que pueden mostrar en una revisión de sprint, la mejor manera de lograr un buen "puntaje" es dividir cada historia en diez pequeñas. Si se mide por la cantidad de pruebas unitarias escritas, tenderá a escribir muchas innecesarias. No cuente historias, más bien tenga una medida de cuánto funciona la funcionalidad necesaria del usuario, qué tan grande es el costo de la deuda tecnológica que se resolverá dentro del alcance del proyecto, etc.
Resumen
Para reducirlo: ir rápido y mínimo es un buen enfoque. El problema está en interpretar "rápido" y "mínimo". Uno siempre debe considerar el costo a largo plazo (a menos que tenga un proyecto donde esto sea irrelevante). El uso de un atajo que solo toma 1 día pero produce una deuda tecnológica de 1 mes después de la fecha de envío le cuesta a su compañía más que una solución que tomó 1 semana. Inmediatamente comenzar a escribir las pruebas parece rápido, pero no si su concepto es defectuoso y consolidan un enfoque equivocado.
Y tenga en cuenta lo que significa "a largo plazo" en su caso: conozco a más de una empresa que fracasó al intentar escribir un código excelente y, por lo tanto, se envió demasiado tarde. Una buena arquitectura o un código limpio, desde la perspectiva de la empresa, solo es valioso si el costo para lograrlo es menor que el costo de no tenerlo.
¡Espero que ayude!