Con todos los comentarios sobre la sobreestimación, creo que se pierde una cantidad modesta de puntos (buena oportunidad).
No se trata de estimar el tiempo necesario para realizar el cambio (solo) y luego agregar algunos, se trata de estimar el tiempo requerido para modificar el código (¡refactorizar!) Para llevarlo a un punto donde el cambio se pueda realizar de forma segura y luego realizar el cambio cambio (probablemente algo unidas). Ok, esto equivale a lo mismo ... pero no se trata de forzar o estirar o sobreestimar, es solo una cuestión de decir que para hacer esto primero necesito hacer eso y esto es cuánto tiempo tomará en total. La clave aquí es que trabajas en aquellas partes del sistema de las que depende el cambio y no más: si hay un código horrible en otra parte ... difícil, tómalo cuando estés allí.
Volviendo un poco a la pregunta original: después de muchos años, todo se reduce a esto para mí, cuando implementas algo a menos que sepas (no creas, no esperes (¿sospechas?), No pienses pero sabes ) que cosas adicionales son también se requiere, entonces debe hacer lo que necesita para implementar ese requisito y no más de la manera más ordenada y elegante que pueda.
Cuando venga a implementar lo siguiente, un poco más tarde, tomará los pasos necesarios para llevar la base de código (y la base de datos y lo que sea) al estado necesario para implementar esa funcionalidad de la manera más ordenada y elegante posible. Esta refactorización es donde lidias con el desorden que surge naturalmente a medida que evoluciona un proyecto, y con suerte evitas crear más desorden (o al menos mantener el nivel constante).
Una de las áreas de discusión aquí es "Deuda técnica": es como un sobregiro, tiene que pagarlo y cuanto más tiempo lo deje, más intereses (en este caso, tiempo necesario para corregir) se acumularán, lo que le da un buen argumento para gastar parte de su tiempo minimizando la deuda técnica.
Aquí también es donde comienzan las pruebas unitarias y otras pruebas automatizadas (si pudiera hacerlo tan bien como digo, ¡estoy bastante seguro de que sería una persona más feliz!) Combinado con un servidor de compilación adecuado (que puede ejecutar al menos algunos de tus pruebas). Combinados con esos, pero de valor en sí mismos, hay patrones como inyección de dependencia e inversión de control (nunca estoy seguro de cuánto son "iguales" esos dos) porque hacen que sea más fácil cambiar la tubería y, por lo tanto, lidiar con los cambios en aislamiento.
Por último, recuerde, si no está roto, no lo arregle. Poner en orden su código solo por el hecho de ordenarlo puede ser satisfactorio, pero también es una oportunidad para introducir errores, por lo que puede ser doloroso si no necesita cambiarlo y no lo está construyendo, puede ser mejor dejar algunos grumos solo: ¡la oportunidad de arreglar o reemplazar llegará eventualmente!