Penso che in realtà si tratti di due domande in una: proverò a rispondere entrambe.
1) Come riduciamo il codice duplicato in un codebase.
Aiuta a ricordare a noi stessi il vantaggio di fare questo: si traduce in un minor numero di bug dovuti alla logica aziendale duplicata e meno codice da mantenere.
Il modo migliore per evitare che questo accada è attraverso la comunicazione, come menzionato nelle altre risposte. Sono assolutamente d'accordo con la raccomandazione di utilizzare le revisioni del codice con l'avvertenza in più che è necessario condividere le responsabilità di revisione del codice allo stesso modo per diffondere correttamente le conoscenze. Dovresti inoltre utilizzare gli 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'abbinamento del codice in quanto aumenta la condivisione delle conoscenze e aiuta a mantenere disciplinati i programmatori.
Raccomando anche di avvicinare i tuoi sviluppatori il più vicino possibile, preferibilmente nella stessa stanza. Con molte lavagne e spazi condivisi. Poi mandali fuori a mangiare insieme. Più i tuoi sviluppatori si "legano" e meglio si comunicheranno tra loro.
Non sono d'accordo con la raccomandazione di utilizzare un wiki o simile al codice del documento. Indipendentemente dal modo in cui gli sviluppatori disciplinati cercano di essere la documentazione deriverà dal codice originale. Un approccio più efficace sarebbe l'uso della specifica mediante prove di stile di esempio. Questi documentano il codice in un modo che rende chiaro come dovrebbe essere usato e i test falliranno se qualcuno cambia il codice senza cambiare gli esempi.
Hai già una grande base di codice con un sacco di codice duplicato, quindi dovresti probabilmente lavorare per rifattorizzarlo. Può essere difficile trovare codice duplicato che non sia 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. Ciò probabilmente indicherà problemi di incapsulamento se non indica un codice duplicato effettivo e vale comunque la pena di essere pulito. Se è anche possibile analizzare la cronologia delle correzioni di bug in base alle modifiche al codice, è possibile trovare determinati hotspot in cui sono spesso necessarie correzioni. Analizza questi hotspot e probabilmente scoprirai che molti di questi sono dovuti alla doppia logica di business che uno sviluppatore ha modificato solo in un punto, senza rendersi conto che sarebbe stato necessario cambiarlo due volte.
2) Come dovremmo avvicinarci alla creazione di widget, componenti, librerie, ecc. condivisi che possono poi essere utilizzati in altri progetti .
In questo caso non dovresti cercare di racchiudere la logica aziendale ma condividere un utile codice framework. Questo può essere un difficile equilibrio poiché il costo di creare e mantenere un insieme di componenti condivisi può essere piuttosto ampio 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 una parte di codice simile, ma quando hai bisogno di rifarla una terza volta 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 gli sviluppatori è vitale qui.
Considera di rendere possibile la maggior parte del tuo componente condiviso open source. Non è una logica aziendale, quindi non darà molti vantaggi alla tua concorrenza, ma significa che avrai gratuitamente revisori e manutentori extra.