Cuando tu instinto te dice que probablemente deberías hacer algunas refactorizaciones, es probable que tus instintos te digan un poco tarde que has estado posponiendo algo importante durante demasiado tiempo.
Entiendo "olores de código", refactor rojo-verde y otros pensamientos, pero a menudo siento que el mejor momento para refactorizar no es la primera vez que escribes el código, sino la segunda o tercera vez que estás usando el código y te das cuenta que es realmente un problema y está en uso real.
Hay efectivamente dos niveles para refactorizar. El primero son los problemas obvios que aparecen cuando codifica por primera vez. Estas son las pequeñas optimizaciones que le cuestan muy poco hacer por adelantado. Cosas como mantener sus métodos y clases pequeños, y adherirse a DRY y SRP. Luego tiene la etapa adicional de lidiar con fallas importantes en su diseño, que pueden no ser evidentes de inmediato hasta que su código tenga un par de millas debajo. Es de este segundo nivel del que está hablando y, sin embargo, para garantizar que la refactorización posterior no sea demasiado costosa, debe haber escrito su código de tal manera que el esfuerzo que prevé más adelante sea más fácil y menos costoso, lo que significa hacer una refactorización temprana.
Como Jeff mencionó en su respuesta, "el tiempo es dinero" , particularmente en compañías donde la carga de trabajo es alta y los riesgos aún mayores. El tiempo dedicado por adelantado para asegurarse de que el código esté en su mejor estado posible se ahorra tiempo más tarde, cuando descubrir lo que debería haber sido una refactorización fácil resulta ser una operación importante.
Al escribir software, cada momento dedicado a mejorar su código por adelantado es tiempo ahorrado más tarde, cuando realmente lo va a necesitar. Cuanto antes refactorice, más claros serán sus cambios posteriores. Es como hacer un pago inicial en dólares de hoy contra la deuda técnica futura que estará en dólares inflados de mañana.
En cualquier caso, la refactorización no debería ser una tarea que posponga hasta un futuro misterioso cuando el software ya esté completo y estable, ya que aumenta sus riesgos más adelante cuando las apuestas son mucho más altas y el producto es mucho más difícil de cambiar. La refactorización debe ser parte de sus actividades diarias, y esta es la esencia de la filosofía de refactorización rojo-verde que mencionó.