He estado en un proyecto que ha tenido este problema y no lo ha solucionado con eficacia.
La calidad local del código, sobre la escala de un paquete, por ejemplo, no era mala. Pero había problemas a mayor escala; cosas como duplicación de lógica (pero no código) entre paquetes, uso de trabajos de recalculación por lotes donde deberíamos utilizar enfoques basados en eventos, dividir el sistema en servicios separados en el lugar equivocado, etc.
Ninguno de estos problemas podría se puede arreglar refactorizando una sola clase o paquete. Como resultado, nunca sucedieron en el curso normal de los eventos. Hicimos refactorizaciones a menor escala: al agregar una función, nos refactorizaríamos en esa área antes de comenzar, y nuevamente después de que termináramos (además de esforzarnos para escribir un buen código mientras íbamos). Pero eso nunca llevó a refactorizar las preocupaciones arquitectónicas más grandes.
Todos éramos conscientes de los problemas, simplemente no teníamos nada en nuestro proceso que nos permitiera repararlos.
Una victoria notable que tuvimos fue donde había duplicación entre dos módulos relacionados lejanamente. Básicamente, había un código para representar una página web que mostraba los resultados de un conjunto de cálculos, y también un trabajo en segundo plano para generar informes que realizaban cálculos similares. El código de cálculo fue compartido, pero el código para configurar los cálculos no; uno fue impulsado por las preferencias de vista del usuario, mientras que el otro fue impulsado por un trabajo de informes configurado. Teníamos una función para implementar que habría implicado agregar un nuevo aspecto a los cálculos, lo que habría significado agregar más elementos a ambos tipos de configuración y luego agregar lógica comercial a ambos conjuntos de códigos de configuración de cálculo. Logramos que el gerente de producto (nuestro proxy de cliente) acordara presupuestar el tiempo suficiente para el trabajo que pudiéramos refactorizar para unir las ideas de las preferencias de vista del usuario y el trabajo de informes configurado, descartando uno de los lados de la duplicación, luego implementar la característica. Esto tomó más tiempo que simplemente implementarlo dos veces, pero el gerente de producto fue lo suficientemente inteligente como para darse cuenta de que esto nos permitiría implementar funciones futuras que abarcan tanto las páginas como los informes más rápidamente.
El mecanismo en el proceso por el cual lo hicimos fue escribir historias para el trabajo de refactorización. Esencialmente, algo así como "Como gerente de producto, quiero que las páginas y los informes usen un código de configuración de cálculo común, de modo que pueda obtener funciones agregadas más rápidamente". Esta no es una historia propiamente dicha, pero encajaba en el sistema e hizo el trabajo.
Creo que si el funcionamiento de este proyecto hubiera sido un poco más saludable, entonces habría habido un flujo constante de historias como esta. Reconoceríamos que teníamos muchas deudas arquitectónicas, y que trabajar para pagarlo tenía un valor, y asignarle una fracción fija de nuestro tiempo, tal vez alrededor del 20% (lo que realmente significaría un par a la vez). Podríamos haber generado funciones/épicas, historias y tareas tal como lo hicimos para el trabajo orientado al cliente. Estos se originarían del equipo mismo, en lugar de los gerentes de producto.
Lamentablemente, no hubo suficiente comunicación y confianza entre las partes de desarrollo y administración de productos que esto era factible; podríamos decir al producto que teníamos un problema, que era importante y que tomaría tanto tiempo arreglarlo, y no podían saber si eso era cierto o no.Como tal, generalmente no estaban dispuestos a programar el horario para hacerlo. Lo triste fue que todos estaban de acuerdo en que había problemas y que sería bueno solucionarlos, simplemente tuvimos un punto muerto por el que realmente lo estábamos haciendo.
Estoy votando para cerrar esta pregunta como fuera de tema porque la gestión de proyectos está fuera de tema. Dichas preguntas deben formularse en [https://pm.stackexchange.com/](https://pm.stackexchange.com/) – BDL
Voy a votar para cerrar esta pregunta como fuera de tema porque esas preguntas deben formularse en https://pm.stackexchange.com/ –