Hai ragione: copia e incolla funziona alla grande, e DRY non ha senso quando il tuo compito è quello di produrre un programma per il quale il modello o la copia copiati non dovranno essere mantenuti o evoluti in futuro. Quando questi due componenti software hanno un ciclo di vita completamente diverso, accoppiandoli insieme refactoring del codice comune in una lib comune che è essa stessa sotto forte sviluppo può effettivamente avere effetti imprevedibili per lo sforzo. D'altra parte, quando si copiano sezioni di codice all'interno di un programma o di un sistema di programma, tutte queste parti avranno generalmente lo stesso ciclo di vita. Illustrerò di seguito cosa significa DRY e project management.
Seriamente, ci sono molti di questi programmi là fuori: ad esempio, l'industria dei videogiochi produce molti programmi che devono essere mantenuti per un breve periodo di alcuni mesi o un anno al massimo, e quando quel tempo è finito, copia-incolla il vecchio codice di un gioco precedente in cui è stato superato il periodo di manutenzione, nella base di codici di un nuovo gioco va benissimo e potrebbe accelerare le cose.
Sfortunatamente, il ciclo di vita della maggior parte dei programmi che ho dovuto affrontare negli ultimi anni è molto diverso da quello. Il 98% dei requisiti o richieste di correzione di bug che mi sono arrivati erano richieste di modificaper i programmi esistenti. E ogni volta che devi cambiare qualcosa in un software esistente, la "gestione del progetto" o la pianificazione funzionano meglio quando i tuoi sforzi di test e debugging sono piuttosto bassi - il che non sarà il caso se cambi qualcosa in un posto, ma a causa della copia logica aziendale superata che dimentichi facilmente che devi cambiare anche una dozzina di altre posizioni nella base di codice. E anche se riesci a trovare tutti quei posti, il tempo per cambiarli tutti (e testare le modifiche) è probabilmente molto più alto come se avessi un solo posto dove cambiare. Quindi anche tu potresti fare una stima accurata per il cambiamento, avendo i costi una dozzina di volte più alti di quanto deve essere può facilmente scontrarsi con il budget del progetto.
TLDR - ogni volta che si sviluppa un programma in cui non è necessaria o responsabilità per la correzione di errori e la manutenzione dell'originale o della copia, sentirsi liberi di copiare. Ma se tu, il tuo team o la tua azienda sei o potresti diventare responsabile, applica DRY ogni volta che puoi.
Esempio
Come addendum, lasciami spiegare cosa significa "correzione e correzione di bug" e come ciò porta a imprevedibilità nella pianificazione, specialmente all'interno di un prodotto, da un esempio reale. In realtà ho visto accadere questo genere di cose nella realtà, probabilmente non con 100 istanze, ma i problemi possono anche iniziare quando hai solo un'istanza duplicata.
Il compito: creare 100 report diversi per un'applicazione, ogni report sembra molto simile, alcune differenze di requisiti tra i report, alcune logiche diverse, ma tutto sommato, non molte differenze.
Lo sviluppatore che ottiene questa attività crea la prima (diciamo che impiega 3 giorni), dopo che alcune modifiche o correzioni di bug minori dovute al controllo qualità e all'ispezione del cliente è terminata, sembra funzionare correttamente. Quindi ha iniziato a creare il rapporto successivo copiando e incollando tutto, quindi il successivo, e per ogni nuovo rapporto ha bisogno di circa 1 giorno in media. Molto prevedibile, a prima vista ...
Ora, dopo che i 100 report sono "pronti", il programma passa alla produzione reale e si verificano alcuni problemi che sono stati trascurati durante il QA. Forse ci sono problemi di prestazioni, forse i rapporti si bloccano su base regolare, forse altre cose non funzionano come previsto. Ora, quando era stato applicato il principio DRY, il 90% di questi problemi poteva essere risolto cambiando la base di codice in un unico posto. Ma a causa dell'approccio copia-incolla, il problema deve essere risolto 100 volte anziché una volta. E a causa delle modifiche già applicate da un report all'altro, lo sviluppatore non può copiare e incollare rapidamente la correzione per il primo report nell'altro 99. Deve esaminare tutti i 100 report, leggerli, tradurre la modifica nella modifica segnalare, testarlo e forse eseguire il debug di ciascuno di essi singolarmente. Per il Primo Ministro, questo inizia a diventare davvero difficile - può ovviamente prendersi il tempo per una correzione di bug "regolare" (diciamo, 3 ore) e moltiplicarlo per 100, ma in realtà, questa è probabilmente una stima sbagliata, alcune delle correzioni potrebbero essere più facile da realizzare rispetto ad altri, altri potrebbero essere più difficili. E anche se questa stima è corretta, avere il debug costa 100 volte più alto del necessario e costerà alla tua azienda un sacco di soldi.
Lo stesso accadrà la prossima volta in cui il cliente chiederà di cambiare il colore dell'emblema della sua azienda in tutti quei rapporti, di rendere configurabile la dimensione della pagina o di qualche altro nuovo requisito che influisca su tutti i rapporti in modo simile. Quindi, in tal caso, è possibile effettuare una stima dei costi e fatturare al cliente 100 volte il prezzo che dovrebbe pagare quando il codice fosse stato ASCIUTTO. Tuttavia, provalo alcune volte e il cliente annullerà il progetto perché probabilmente non sarà disposto a pagare i tuoi esorbitanti costi di evoluzione. E forse a quel punto qualcuno farà la domanda sul perché ciò sia accaduto e indicherà con il dito la persona che ha preso la decisione per questa programmazione copia-incolla.
Il mio punto è: quando produci software per gli altri, hai sempre almeno per un breve periodo di tempo la responsabilità di far funzionare la cosa, correggere bug, adattare il programma ai mutevoli requisiti ecc. Anche in un progetto green-field, questi le parti possono rapidamente aggiungere molto di più rispetto allo sforzo di sviluppo inizialmente previsto. E soprattutto quando tutto il tuo codice incollato è all'interno di un prodotto, il periodo di responsabilità è uguale per tutte le parti, il che è abbastanza diverso dalla situazione in cui hai incollato del codice precedente da un progetto morto che non è più sotto manutenzione attiva.