Je pense qu'il s'agit en fait de deux questions en une - je vais essayer de répondre aux deux.
1) Comment réduire le code en double dans une base de code.
Cela permet de nous rappeler les avantages de cette opération: cela entraîne moins de bogues en raison de la logique métier en double et moins de code à maintenir. La meilleure façon d'éviter que cela ne se produise est la communication - comme mentionné dans les autres réponses. Je suis tout à fait d'accord avec la recommandation d'utiliser des révisions de code avec la mise en garde supplémentaire que vous devez partager les responsabilités de révision de code de manière égale pour diffuser correctement les connaissances. Vous devez également utiliser des stand-ups quotidiens afin que les développeurs reconnaissent souvent quand quelqu'un essaie de résoudre un problème pour lequel il existe du code utile. Vous devriez également envisager l'association de code car elle augmente le partage des connaissances et aide à garder les programmeurs disciplinés.
Je recommanderais également de rapprocher vos développeurs le plus possible, de préférence dans la même pièce. Avec beaucoup de tableaux blancs et d'espace partagés. Envoyez-les ensuite pour les repas ensemble. Plus vos développeurs «se lient» mieux ils communiqueront entre eux.
Je ne suis pas d'accord avec la recommandation d'utiliser un wiki ou similaire au code du document. Quelle que soit la discipline des développeurs, la documentation dérivera du code d'origine. Une approche plus efficace consisterait à utiliser des spécifications par des exemples de tests de style. Ceux-ci documentent le code d'une manière qui indique clairement comment il doit être utilisé et vos tests échoueront si quelqu'un modifie le code sans changer les exemples.
Vous avez déjà une grande base de code avec beaucoup de code en double, vous devriez donc probablement travailler sur la refactorisation. Il peut être difficile de trouver du code en double qui n'a pas été coupé et collé. Donc plutôt que de faire cela, je vous suggère d'analyser votre historique des changements. Recherchez les fichiers qui changent souvent en même temps. Cela indiquera probablement des problèmes d'encapsulation si cela n'indique pas un code en double réel et vaut la peine d'être nettoyé de toute façon. Si vous pouvez également analyser votre historique de corrections de bogues par rapport à vos modifications de code, vous pouvez trouver des points d'accès particuliers où des corrections sont souvent nécessaires. Analysez ces points chauds et vous constaterez probablement que beaucoup d'entre eux sont dus à une logique métier en double qu'un développeur n'a changé qu'à un seul endroit sans se rendre compte qu'il devait être changé deux fois.
2) Comment devrions-nous aborder la création de widgets, composants, bibliothèques, etc. partagés qui peuvent ensuite être utilisés dans d'autres projets .
Dans ce cas, vous ne devriez pas essayer d'envelopper la logique métier mais de partager un code de cadre utile. Cela peut être un équilibre délicat car le coût de création et de maintenance d'un ensemble de composants partagés peut être assez important et il peut être difficile de prédire dans quels cas cela vaut la peine. L'approche que je suggérerais ici est une règle en trois temps. Ne vous inquiétez pas d'écrire deux fois un morceau de code similaire, mais lorsque vous devez le faire une troisième fois, refactorisez-le dans un composant partagé. À ce stade, vous pouvez être raisonnablement sûr qu'il sera utile et vous avez une bonne idée des exigences plus larges du composant. De toute évidence, la communication entre développeurs est vitale ici.
Envisagez de créer autant de composants partagés open source que possible. Ce n'est pas une logique commerciale, donc cela ne donnera pas beaucoup d'avantages à vos concurrents, mais cela signifie que vous obtiendrez gratuitement des réviseurs et des mainteneurs supplémentaires.