En comparant tous les opposants, supposons un réel besoin commercial.
(Par exemple, le livrable est un code source, les clients appartiennent au même secteur d’activité et sont donc concurrents, et votre modèle d’entreprise promet de garder le secret sur eux.)
De plus, supposons que votre société dispose des outils nécessaires pour gérer toutes les branches, c’est-à-dire soit de la main-d’œuvre (par exemple, 100 développeurs dédiés à la fusion, avec un délai de publication de 5 jours; ou 10 développeurs en supposant qu’un délai de publication de 50 jours est acceptable), ou de tels tests automatisés géniaux que les fusions automatisées sont réellement testées à la fois par rapport aux spécifications principales et aux spécifications d' extension dans chaque branche, et donc uniquement les modifications qui ne fusionnent pas "proprement" nécessitent une intervention humaine. Si vos clients paient non seulement pour des personnalisations, mais pour leur maintenance, il peut s’agir d’un modèle commercial valide.
Ma question (et non-dire) est: avez-vous une personne dédiée responsable de la livraison à chaque client? Si vous êtes, par exemple, une entreprise de 10 000 personnes, cela peut être le cas.
Cela peut être géré par l’ architecture de plug-in dans certains cas, disons que votre cœur est un trunk, que les plug-ins peuvent être conservés dans des trunk ou des branches, et que la configuration de chaque client est un fichier portant un nom unique ou est conservée dans une branche du client.
Les plugins peuvent être chargés au moment de l'exécution ou intégrés à la compilation.
Vraiment, de nombreux projets sont réalisés de la sorte, mais le problème est fondamentalement le même: des modifications de base simples sont faciles à intégrer, les modifications de conflit doivent être soit annulées, soit nécessaires pour de nombreux plug-ins.
Il y a des cas où les plugins ne sont pas assez bons, c'est-à-dire que de nombreux internes du noyau doivent être peaufinés, ce qui fait que le nombre d'interfaces de plugins devient trop important pour être géré.
Idéalement, cela serait géré par une programmation orientée aspect , où trunk est le code principal et les branches sont des aspects (c'est-à-dire du code supplémentaire et des instructions sur la manière de connecter des extras au noyau).
Un exemple simple, vous pouvez spécifier que personnalisé foo
est exécuté avant ou après le noyau, klass.foo
qu'il le remplace ou qu'il l'enveloppe et qu'il peut modifier l'entrée ou la sortie.
Il existe une tonne de bibliothèques pour cela, mais le problème des conflits de fusion ne disparaît pas - les fusions saines sont gérées par AOP et les conflits nécessitent toujours une intervention humaine.
Enfin, une telle activité doit réellement concerner la maintenance des succursales , à savoir: la fonctionnalité X spécifique au client est-elle si commune qu'il est moins coûteux de la transférer au cœur du système, même si tous les clients n'en paient pas le coût?