Contrastando todos os negativistas, vamos assumir a necessidade real dos negócios.
(por exemplo, entrega é código fonte, os clientes são da mesma linha de negócios e, portanto, concorrentes entre si, e o 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 filiais, ou seja, mão-de-obra (digamos 100 desenvolvedores dedicados à mesclagem, assumindo um atraso de liberação de 5 dias; ou 10 desenvolvedores assumindo um atraso de liberação de 50 dias como OK), ou tais testes incrível automatizado que funde automatizados são verdadeiramente testado tanto a especificação do núcleo e especificação de extensão em todos os ramos, e, portanto, somente as alterações que não se fundem "limpa" exigem intervenção humana. Se seus clientes pagarem não apenas pelas personalizações, mas também pela manutenção, esse pode ser um modelo de negócios válido.
Minha pergunta (e não-dizer) é: você tem uma pessoa dedicada responsável pela entrega a cada cliente? Se você é, digamos, uma empresa de 10.000 pessoas, pode ser o caso.
Isso pode ser tratado pela arquitetura de plug-ins em alguns casos, digamos que seu núcleo seja tronco, os plug-ins podem ser mantidos em tronco ou ramificações e a configuração de cada cliente é um arquivo com nome exclusivo ou é mantida na ramificação do cliente.
Os plug-ins podem ser carregados em tempo de execução ou integrados em tempo de compilação.
Na verdade, muitos projetos são feitos assim, fundamentalmente o mesmo problema ainda se aplica - alterações simples e básicas são triviais para integrar, alterações de conflito devem ser revertidas ou são necessárias alterações em muitos plug-ins.
Há casos em que os plug-ins não são bons o suficiente, é quando tantos internos do núcleo precisam ser aprimorados que a contagem da interface do plug-in se torna muito grande para lidar.
Idealmente, isso seria tratado pela programação orientada a aspectos , em que tronco é o código principal e ramificações são aspectos (código extra e instruções sobre como conectar extras ao núcleo)
Um exemplo simples, você pode especificar que o costume foo
é executado antes ou depois do núcleo klass.foo
ou que o substitui ou que o envolve e pode 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 - fusões limpas são tratadas pela AOP e os conflitos ainda precisam de intervenção humana.
Finalmente, esses negócios realmente precisam se preocupar com a manutenção das agências , ou seja, o recurso específico do cliente X é tão comum que é mais barato movê-lo para o núcleo, mesmo que nem todos os clientes estejam pagando por isso?