Quando il tuo istinto ti dice che probabilmente dovresti fare un po 'di refactoring, è probabile che il tuo istinto ti dica un po' tardi che hai rimandato qualcosa di importante per troppo tempo.
Capisco "odori di codice", refactor rosso-verde e altri pensieri, ma spesso sento che il momento migliore per refactoring non è la prima volta che scrivi il codice, ma la seconda o la terza volta che usi il codice e ti rendi conto che in realtà è un problema ed è attualmente in uso.
Esistono effettivamente due livelli di refactoring. Il primo sono gli ovvi problemi che compaiono al primo codice. Queste sono le piccole ottimizzazioni che ti costano molto poco da fare in anticipo. Cose come mantenere piccoli i metodi e le classi e aderire a DRY e SRP. Quindi hai la fase aggiuntiva di gestire i principali difetti nel tuo design, che potrebbe non essere immediatamente evidente fino a quando il tuo codice ha un paio di miglia sotto di esso. È di questo secondo livello di cui stai parlando, e tuttavia per garantire che il refactoring successivo non sia troppo costoso, devi aver già scritto il tuo codice in modo tale che lo sforzo che in seguito pensi sia reso più semplice e meno costoso, il che significa fare un refactoring anticipato.
Come ha detto Jeff nella sua risposta, "il tempo è denaro" , in particolare nelle aziende in cui il carico di lavoro è elevato e i rischi sono ancora più elevati. Il tempo speso in anticipo per assicurarsi che il codice sia nel suo stato migliore possibile è tempo risparmiato in seguito, quando prendere in giro quello che avrebbe dovuto essere un semplice refactoring risulta essere un'operazione importante.
Quando si scrive un software, ogni momento speso per migliorare il codice in anticipo viene risparmiato tempo in seguito, quando ne avrai davvero bisogno. Prima fai il refactoring, più chiare saranno le tue modifiche successive. È come effettuare un acconto in dollari di oggi contro il debito tecnico futuro che sarà in dollari gonfiati di domani.
In ogni caso, il refactoring non dovrebbe essere un compito che rimandare a qualche misterioso futuro quando il software è già completo e stabile, poiché aumenta i rischi in seguito quando la posta in gioco è molto più alta e il prodotto molto più difficile da cambiare. Il refactoring dovrebbe essere una parte delle tue attività quotidiane e questa è l'essenza della filosofia Red-Green-Refactor che hai citato.