Penso che in realtà siano due domande in una: cercherò di rispondere ad entrambe.
1) Come possiamo ridurre il codice duplicato in una base di codice.
Aiuta a ricordare a noi stessi il vantaggio di fare questo: si traduce in un minor numero di bug a causa della duplice logica aziendale e meno codice deve essere mantenuto. Il modo migliore per evitare che ciò accada è attraverso la comunicazione, come indicato nelle altre risposte. Concordo fermamente con la raccomandazione di utilizzare le revisioni del codice con l'ulteriore avvertimento che è necessario condividere le responsabilità di revisione del codice allo stesso modo per diffondere correttamente le conoscenze. Dovresti anche usare stand-up giornalieri in modo che gli sviluppatori riconoscano spesso quando qualcuno sta cercando di risolvere un problema per il quale esiste un codice utile esistente. Dovresti anche considerare l'associazione del codice poiché aumenta la condivisione delle conoscenze e aiuta a mantenere disciplinati i programmatori.
Consiglierei anche di avvicinare il più possibile i tuoi sviluppatori, preferibilmente nella stessa stanza. Con un sacco di lavagne e spazio condivisi. Quindi inviarli insieme per i pasti. Più i tuoi sviluppatori "legano", meglio comunicano tra loro.
Non sono d'accordo con la raccomandazione di utilizzare un wiki o simile al codice del documento. Non importa quanto gli sviluppatori disciplinati provino a essere la documentazione deriverà dal codice originale. Un approccio più efficace sarebbe l'uso della specifica mediante test di stile di esempio. Questi documentano il codice in un modo che chiarisce come dovrebbe essere usato e i tuoi test falliranno se qualcuno cambia il codice senza cambiare gli esempi.
Hai già una base di codice di grandi dimensioni con un sacco di codice duplicato, quindi probabilmente dovresti lavorare sul refactoring di questo. Può essere difficile trovare codice duplicato che non è stato tagliato e incollato. Quindi, piuttosto che farlo, ti suggerisco di analizzare la cronologia delle modifiche. Cerca i file che cambiano spesso allo stesso tempo. Questo probabilmente indicherà problemi con l'incapsulamento se non indica l'effettivo codice duplicato e vale comunque la pena ripulire. Se riesci anche ad analizzare la cronologia delle correzioni dei bug rispetto alle modifiche del codice, potresti trovare particolari hotspot dove spesso sono necessarie correzioni. Analizza questi hotspot e probabilmente scoprirai che molti di essi sono dovuti a una duplice logica aziendale che uno sviluppatore ha modificato in un solo punto senza rendersi conto che doveva essere cambiato due volte.
2) Come dovremmo affrontare la creazione di widget, componenti, librerie, ecc. Condivisi che possono essere utilizzati in altri progetti .
In questo caso non dovresti cercare di racchiudere la logica aziendale, ma condividere un utile codice del framework. Questo può essere un equilibrio complicato poiché il costo di creazione e manutenzione di un insieme di componenti condivisi può essere piuttosto elevato e può essere difficile prevedere in quali casi vale la pena farlo. L'approccio che suggerirei qui è una regola dei tre colpi. Non preoccuparti di scrivere due volte un codice simile, ma quando devi farlo per la terza volta trasformalo in un componente condiviso. A questo punto puoi essere ragionevolmente sicuro che sarà utile e hai una buona idea dei requisiti più ampi per il componente. Ovviamente, la comunicazione tra sviluppatori è vitale qui.
Valuta di rendere il maggior numero possibile di componenti condivisi open source possibile. Non è una logica di business, quindi non darà molti vantaggi ai tuoi concorrenti, ma significa che otterrai revisori e manutentori extra gratuitamente.