Contrastando todos os mais dissimulados, vamos supor uma necessidade comercial real.
(por exemplo, o entregável é o código-fonte, os clientes são da mesma linha de negócios e, portanto, concorrentes entre si, e seu modelo de negócios promete manter seus segredos em segredo)
Além disso, vamos supor que sua empresa tenha as ferramentas para manter todas as ramificações, ou seja, mão de obra (digamos 100 desenvolvedores dedicados à mesclagem, assumindo atraso de lançamento de 5 dias ou 10 devs supondo atraso de lançamento de 50 dias é OK), ou testes automatizados tão impressionantes que as mesclagens automatizadas são realmente testadas para especificação principal e especificação de extensão em cada ramificação e, assim, apenas as alterações que não se fundem "de forma limpa" requerem intervenção humana. Se seus clientes pagarem não apenas por personalizações, mas por manutenção, isso pode ser um modelo de negócios válido.
A minha pergunta (e sim) é, você tem uma pessoa dedicada responsável pela entrega para cada cliente? Se você é, digamos, uma empresa de 10.000 pessoas, pode ser o caso.
Isso pode ser feito pela arquitetura de plug-in em alguns casos, digamos que seu núcleo seja tronco, plug-ins podem ser mantidos no tronco ou ramificações e a configuração para cada cliente é um arquivo com nome exclusivo ou realizada no ramo de clientes.
Os plugins podem ser carregados em tempo de execução ou incorporados em tempo de compilação.
Realmente muitos projetos são feitos assim, fundamentalmente o mesmo problema ainda se aplica - mudanças básicas simples são triviais de integrar, mudanças de conflito devem ser revertidas ou mudanças são necessárias para muitos plugins.
Existem casos em que os plugins não são bons o suficiente, quando muitos internos do núcleo precisam ser ajustados para que a contagem da interface do plug-in seja muito grande para ser manipulada.
Idealmente, isso seria tratado pela programação orientada a aspectos , onde trunk é o código principal, e branches são aspectos (isto é, código extra e instruções de como conectar extras ao core)
Um exemplo simples, é possível especificar que o foo
personalizado seja executado antes ou depois do núcleo klass.foo
ou que ele seja substituído ou que o envolva e possa alterar a entrada ou a saída.
Há uma tonelada de bibliotecas para isso, no entanto, o problema dos conflitos de mesclagem não desaparece - as fusões limpas são tratadas pela AOP e os conflitos ainda precisam de intervenção humana.
Por fim, esse negócio precisa se preocupar com a manutenção de agências , ou seja, o recurso X específico do cliente é tão comum que é mais barato transferi-lo para o núcleo, embora nem todos os clientes estejam pagando por ele. ?