Supponete di avere un progetto che (secondo la vostra opinione) è per lo più decentemente ben scritto, modularizzato, ecc. e volete mantenere gran parte della sua funzionalità. Tuttavia, una parte essenziale di questo progetto non è ben progettata e non può essere facilmente risolta con modifiche minori. L'unico modo per risolverlo è strappare un sacco di codice; non è così male che hai bisogno (o dovresti) di iniziare da zero, ma è molto pervasivo.
Supponiamo che il codice sia qualcosa come 20.000 righe di non-spazio bianco, non-singole parentesi graffe, non-comment Java, C ++, C #, codice PHP o Ruby. Si stima che circa 2000-3000 linee debbano essere eliminate o modificate. Nel caso di qualcosa come Java o C #, uno dei tuoi pacchetti / spazi dei nomi sarà probabilmente interamente riscritto da zero e molti dei riferimenti a tali classi cambieranno.
Ecco la parte più impegnativa: il codice che doveva cambiare era la COLLA nel sistema. Ecco un'immagine molto semplice che riassume il problema:
Questaèlasituazioneincuisonostatocondottoaquestadomanda:
Come puoi vedere, non sono solo le parti del codice che stavano eseguendo l'elaborazione interna, ma anche le parti che stavano comunicando con le altre parti del sistema. Sia le API che le strutture dati interne erano insufficienti. Il tentativo di mantenere entrambi i set di API funzionanti per modifiche incrementali sarebbe stato ridondante.
Naturalmente, mi sono ramificato prima di fare qualsiasi cosa, ma ogni cambiamento che ho apportato ha prodotto un prodotto che semplicemente non funzionava. In molti casi ho creato errori di compilazione. Questo mi ha portato a rimandare continuamente i commit, perché pensavo "sì, ho ricollegato questi pezzi insieme, ma ho ancora bisogno di implementare questa altra nuova interfaccia, scrivere questa funzionalità essenziale, ecc." Ciò ha comportato il peccato capitale di non controllare nulla, un errore che preferirei non ripetere se dovessi essere di nuovo in questa situazione. Ciò è stato mitigato dal fatto che tutte le mie API erano interne, tranne che dovevo conformarmi alle API del mondo esterno e ai moduli di terze parti, ma i miei wrapper per quelle sezioni stavano cambiando.
Una soluzione alternativa ovvia sarebbe accettare semplicemente il fatto che ogni modifica comporterà un prodotto complessivo rotto, ma dal momento che si sta verificando un ramo, va bene. Soprattutto perché sono l'unico sviluppatore che lavora su questo codice e usa queste API. Quindi forse questa è la cosa giusta da fare. O forse la cosa giusta da fare è provare a ridefinire prima l'API a quella nuova, senza effettivamente modificare la funzionalità (se possibile), anche se alcuni argomenti sono fittizi o saranno eventualmente rimossi, e quindi le modifiche incrementali sono molto più utili contenute. O forse c'è un modo migliore del tutto?