Assolutamente.
Il refactoring dovrebbe essere fatto su un progetto funzionante e "passeggero". Quando tutti i test (a livello di unità, sistema e accettazione) passano, sai che il tuo prodotto soddisfa i requisiti. Quando si effettua il refactoring, è possibile continuare a confermare che tutti i test continuano a passare. Se qualche test inizia a fallire, allora hai fatto qualcosa di sbagliato e devi correggerlo. In caso di test falliti, è necessario correggerli prima di procedere al refactoring in modo da poter sempre garantire che il refactoring non stia cambiando la funzionalità del sistema.
Questo è anche un momento perfetto per il refactoring, presupponendo che tu abbia il tempo e le risorse per eseguire il refactoring e comunque fornire tempo e budget. Refactoring ora renderà più semplice la comprensione e la manutenzione del tuo sistema, così come aggiungi ancora più nuove funzionalità, diventa più facile. Devi combattere contro decomposizione del codice e entropia del software .
Poiché Joel Etherton indica nei commenti, devi gestire l'ambito del refactoring. Concentrati sul refactoring delle parti del sistema a cui presto aggiungerai funzionalità, eseguendo refactoring che renderanno più facile lavorare con o aggiungere le nuove funzionalità. L'uso dell'analisi statica, degli strumenti di metrica e delle revisioni del codice può aiutarti a identificare le aree più critiche. Non vuoi perdere le scadenze perché eseguivi il refactoring: devi comunque continuare ad aggiungere valore al cliente.
Dici che il cliente non vede il valore nel refactoring. In genere, il cliente non si preoccupa della qualità del codice, ma del prodotto. Il refactoring faciliterà il mantenimento di un'elevata qualità del prodotto e continuerà a fornire un prodotto in grado di soddisfare le mutevoli esigenze del cliente. Prova a negoziare il tempo necessario per eseguire il refactoring nel tuo programma (il cliente desidera funzionalità X in giorni Y, prova a vedere se non puoi ottenere i giorni Y + Z o le funzionalità XN in modo da poter dedicare tempo alla progettazione, al refactoring e all'implementazione), se possibile.