O que é uma maneira realista de lidar com patches de software específicos do cliente?


16

Estou tentando reunir maneiras eficazes pelas quais outras pessoas resolveram o seguinte problema. No trabalho, fomos forçados a lançar um patch de software (a ser instalado nos sistemas do usuário final) que queremos apenas visível para um cliente específico. O código personalizado está em sua própria ramificação de controle de origem. O problema é que temos duas linhas de código paralelas (e construímos scripts) para mantermos sincronizadas, e toda vez que corrigimos o código original, precisamos corrigir e testar o código específico do cliente.

Estou curioso, como outras organizações lidam com esse cenário? Estamos abertos a soluções de negócios e não apenas técnicas (relacionadas ao controle de fonte). Por exemplo, falamos em dizer ao cliente que ele não pode receber atualizações nessa filial.

Nossa estratégia de ramificação é assim (com base no Guia de ramificação do Visual Studio TFS , embora estejamos usando o Subversion) insira a descrição da imagem aqui


Se você estava usando hgou gitposso sugerir que você use Filas de Correção ( Mercurial Queues Extension ou Stacked Git ), mas não sei se o TFS tem algo semelhante.
Mark Booth

Talvez eu devesse ter especificado, estamos usando o Subversion, mesmo usando uma estratégia de ramificação sugerida pelo TFS: P As filas de correção reduziriam os testes necessários? Parece que estes são para patches de controle de origem? Estamos lidando com as correções que o cliente instala nos sistemas do usuário final.
Vimes

2
Uma solução comercial seria: não faça isso.
Jeffo

@JeffO good call =) De qualquer forma, existe alguma maneira de fazer disso uma opção de tempo de execução orientada a dados?
Patrick Hughes

1
@ JohnB - Desculpe, eu não sei, mas se você tiver patches de origem, seu sistema de compilação deve ser capaz de automatizar os testes, além de manter os patches por cliente fora dos svnmeios para que eles não atrapalhem seu fluxo de trabalho normal. Se as Filas de Patch parecerem úteis, você poderá testá-las usando git-svn ou hgsubversion . O uso de um front end do DVCS para suavizar um fluxo de trabalho complicado svnpode até encorajar as pessoas a considerar mudar para um atacado DVCS, para obter todos os outros benefícios.
Mark Booth

Respostas:


5

Quando você começa a distribuir patches específicos do cliente, criou imediatamente uma nova versão do seu produto que deve ser mantida ao lado dele. Isso significa que as mudanças precisam ser propagadas entre as duas versões. Normalmente, as correções específicas do cliente são personalizações que devem pertencer ao cliente, incluindo o código-fonte.

Parece improvável que um patch para corrigir algo não consiga entrar na ramificação da linha principal, a menos que seja uma correção temporária abaixo do ideal para um problema imediato. Se for esse o caso, o patch precisará ser mantido apenas até que a correção esperada chegue à linha principal.


5

Parece-me que a chave é "visível" - que tal não ter uma ramificação de código separada, mas uma opção de configuração que altera o comportamento?


Isso pode funcionar para personalizações simples, mas as mais complexas podem tornar o produto mais complicado e instável para todos os clientes.
FrustratedWithFormsDesigner

3
@FrustratedWithFormsDesigner Personalizações complexas para clientes únicos representam negligência grave no design e gerenciamento de produtos. Qualquer solução que exija uma filial separada para um único cliente de um produto representa uma inadequação grosseira no produto para atender a todas as necessidades dos clientes e uma má administração por parte do proprietário do produto.
maple_shaft

2
Eu também vi isso morder meu empregador anterior repetidamente. É apenas uma prática ruim, mas geralmente é algo que a gerência deseja e não recua. Especialmente se você estiver usando o Subversion, este é apenas um pesadelo que não desaparecerá - manter o código em sincronia doerá uma e outra vez.
18712 Steve Steve

1
@ maple_shaft - Mas você pensou em fazer a pergunta "você já usou ramificação de código para implementar a internacionalização"?
Psr

3
@ maple_shaft - Eu estava brincando, mas, na verdade, era esse o meu ponto, usar a ramificação para lidar com a internacionalização é pelo menos tão ruim quanto as filiais específicas do cliente. Não é discutível no sentido de que você provavelmente também não quer trabalhar nesse lugar. É discutível que eu estava saindo bastante do assunto.
Psr

3

Você vê isso como algo de curto ou longo prazo? O fato é que a empresa já decidiu acomodar esse cliente tão rapidamente que já é uma decisão comercial a ser resolvida principalmente pelas práticas de negócios (aceitando o custo extra / cobrando ao cliente pelo custo).

Se a longo prazo, você provavelmente obterá economia se refazer o software para acomodar facilmente as necessidades dos clientes por meio de configuração (ou instalação, etc.).

Se for relativamente curto prazo, significa que em breve você mesclará essas mudanças novamente no ramo principal / de desenvolvimento e todos os usuários também verão as alterações, provavelmente será aceitável trabalhar dentro das limitações da sua situação atual. Como eu disse, a decisão do que fazer deveria ter sido tomada quando a decisão de acomodar o cliente foi tomada.

Longa história curta. A longo prazo, conserte tecnicamente, a curto prazo, trate disso.

Claro que há um ponto em que é um sorteio. Se você estiver nesse ponto, eu faria o que os desenvolvedores preferirem.


2

Também usamos o subversion - e encontramos exatamente esse cenário.

Aqui estão alguns pontos-chave a serem lembrados:

  1. Embora seja necessário evitar filiais específicas para os clientes, a necessidade deve ser minimizada quanto possível; sempre pergunte se é possível generalizar a solução que pode funcionar para todos.

  2. As filiais específicas do cliente devem se originar de uma nova versão. Suponha que você tenha uma versão 1.2 e que tenha derivado da versão 1.2.1 até 1.2.11 - as filiais do cliente devem receber todos os patches, portanto, a filial do cliente deve permanecer compatível com a versão principal.

  3. É necessário criar uma filial específica do cliente quando você inicia uma nova versão não compatível. A parte infeliz é que, de alguma forma, você pode precisar refazer o trabalho. Uma solução pode ser a criação de todos os patches das filiais do cliente, que precisam ser extraídos e o que for compatível ainda pode ser aplicado à nova filial do cliente.

  4. Sempre, em nenhuma circunstância, você deve enviar alterações específicas do cliente de volta para liberar filial ou tronco. No entanto, idealmente, deve-se tentar generalizar o trabalho de forma que esse trabalho específico do cliente seja reduzido.

Tentei juntar essas idéias para mostrar diagrama abaixo:


1

Que tal introduzir um mecanismo de extensão no seu código?

Seu código principal possui:

class Foo
{
}

Quando o programa é iniciado, ele procura DLL / equivalente moral, em sua pasta de inicialização, para personalizações locais. Se encontrar um, ele carrega e pode conter a versão específica da empresa do Foo

class FooForABC : Foo
{
}

O FooForABC implementa o mesmo comportamento do Foo, mas substitui as funções necessárias para fornecer o comportamento específico que o ABC precisa. A técnica deve ser flexível o suficiente para lidar com qualquer cenário que você precise oferecer suporte.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.