Je travaille sur un grand projet logiciel hautement personnalisé pour divers clients du monde entier. Cela signifie que nous avons peut-être 80% de code qui est commun entre les différents clients, mais aussi beaucoup de code qui doit changer d'un client à l'autre. Dans le passé, nous avons fait notre développement dans des référentiels séparés (SVN) et lorsqu'un nouveau projet a commencé (nous avons peu de clients, mais de gros clients), nous avons créé un autre référentiel basé sur le projet précédent qui a la meilleure base de code pour nos besoins. Cela a fonctionné dans le passé, mais nous avons rencontré plusieurs problèmes:
- Les bogues corrigés dans un référentiel ne sont pas corrigés dans d'autres référentiels. Cela peut être un problème d'organisation, mais je trouve difficile de corriger et de corriger un bogue dans 5 référentiels différents, en gardant à l'esprit que l'équipe qui gère ce référentiel pourrait être dans une autre partie du monde et nous n'avons pas leur environnement de test , ne connaissent ni leur emploi du temps ni leurs exigences (un "bug" dans un pays peut être une "fonctionnalité" dans un autre).
- Les fonctionnalités et les améliorations apportées à un projet, qui pourraient également être utiles pour un autre projet, sont perdues ou si elles sont utilisées dans un autre projet, elles provoquent souvent de gros maux de tête en les fusionnant d'une base de code à une autre (car les deux branches peuvent avoir été développées indépendamment pendant un an ).
- Les refactorisations et les améliorations de code apportées dans une branche de développement sont perdues ou causent plus de tort que de bien si vous devez fusionner tous ces changements entre les branches.
Nous discutons maintenant de la façon de résoudre ces problèmes et, jusqu'à présent, nous avons proposé les idées suivantes pour résoudre ce problème:
Gardez le développement dans des branches distinctes, mais organisez mieux en ayant un référentiel central où les corrections de bogues générales sont fusionnées et en faisant en sorte que tous les projets fusionnent les modifications de ce référentiel central dans les leurs sur une base régulière (par exemple quotidienne). Cela nécessite une grande discipline et beaucoup d'efforts pour fusionner entre les branches. Je ne suis donc pas convaincu que cela fonctionnera et nous pouvons garder cette discipline, surtout lorsque le temps presse.
Abandonnez les branches de développement distinctes et disposez d'un référentiel de code central où tout notre code vit et faites notre personnalisation en ayant des modules enfichables et des options de configuration. Nous utilisons déjà des conteneurs d'Injection de dépendances pour résoudre les dépendances dans notre code et nous suivons le modèle MVVM dans la plupart de notre code pour séparer proprement la logique métier de notre interface utilisateur.
La deuxième approche semble être plus élégante, mais nous avons de nombreux problèmes non résolus dans cette approche. Par exemple: comment gérer les modifications / ajouts dans votre modèle / base de données. Nous utilisons .NET avec Entity Framework pour avoir des entités fortement typées. Je ne vois pas comment nous pouvons gérer les propriétés requises pour un client mais inutiles pour un autre client sans encombrer notre modèle de données. Nous pensons résoudre ce problème dans la base de données en utilisant des tables satellites (ayant des tables séparées où nos colonnes supplémentaires pour une entité spécifique vivent avec un mappage 1: 1 avec l'entité d'origine), mais ce n'est que la base de données. Comment gérez-vous cela dans le code? Notre modèle de données réside dans une bibliothèque centrale que nous ne pourrions pas étendre pour chaque client en utilisant cette approche.
Je suis sûr que nous ne sommes pas la seule équipe aux prises avec ce problème et je suis choqué de trouver si peu de matériel sur le sujet.
Mes questions sont donc les suivantes:
- Quelle expérience avez-vous avec un logiciel hautement personnalisé, quelle approche avez-vous choisie et comment cela a-t-il fonctionné pour vous?
- Quelle approche recommandez-vous et pourquoi? Est-ce qu'il y a une meilleure approche?
- Y a-t-il de bons livres ou articles sur le sujet que vous pouvez recommander?
- Avez-vous des recommandations spécifiques pour notre environnement technique (.NET, Entity Framework, WPF, DI)?
Modifier:
Merci pour toutes les suggestions. La plupart des idées correspondent à celles que nous avions déjà dans notre équipe, mais il est vraiment utile de voir l'expérience que vous avez eue avec elles et des conseils pour mieux les mettre en œuvre.
Je ne suis toujours pas sûr de la direction que nous prendrons et je ne prends pas de décision (seul), mais je transmettrai cela dans mon équipe et je suis sûr que ce sera utile.
Pour le moment, le ténor semble être un référentiel unique utilisant divers modules spécifiques au client. Je ne suis pas sûr que notre architecture soit à la hauteur ou combien nous devons investir pour l'adapter, donc certaines choses peuvent vivre dans des référentiels séparés pendant un certain temps, mais je pense que c'est la seule solution à long terme qui fonctionnera.
Merci encore pour toutes les réponses!