Minha empresa está fundindo sucursais erradas?


28

Recentemente, deparei com um artigo do MSDN sobre ramificação e mesclagem e SCM: Ramificando e mesclando iniciador - Chris Birmele .

No artigo, eles dizem que 'big bang merge' é um antipadrão em fusão:

Big Bang Merge - adiando a ramificação que se une ao final do esforço de desenvolvimento e tentando mesclar todas as ramificações simultaneamente.

Percebi que isso é muito semelhante ao que minha empresa está fazendo com todos os ramos de desenvolvimento que são produzidos.

Eu trabalho em uma empresa muito pequena, com uma pessoa atuando como autoridade de revisão final + mala direta. Temos 5 desenvolvedores (incluindo eu), cada um de nós terá uma tarefa / bug / projeto separado e cada um dos ramos do tronco atual (subversão) será executado e, em seguida, realizaremos o trabalho de desenvolvimento em nosso ramo, testamos os resultados, escrevemos documentação. se necessário, faça uma revisão por pares e um loop de feedback com os outros desenvolvedores e envie a ramificação para revisão + mesclagem em nosso software de gerenciamento de projetos.

Meu chefe, a única autoridade no repositório de troncos, na verdade adiará todas as revisões de ramificações até um único momento em que ele executará revisões o máximo que puder, algumas ramificações serão devolvidas para aprimoramentos / correções, algumas ramos se fundem diretamente no tronco, alguns ramos serão jogados de volta por causa de conflitos etc.

Não é incomum termos 10 a 20 ramos ativos na fila de revisão final para serem mesclados no tronco.

Também temos frequentemente que resolver conflitos no estágio final de revisão e mesclagem, porque duas ramificações foram criadas no mesmo tronco, mas modificaram o mesmo trecho de código. Normalmente, evitamos isso apenas reorganizando o tronco e reaplicando nossas alterações e resolvendo os conflitos e enviando o novo ramo para revisão (rebase do pobre homem).

Algumas perguntas diretas que tenho são:

  • Estamos exibindo o próprio antipadrão que foi descrito como o 'big bang merge'?
  • Alguns dos problemas que estamos vendo são resultado desse processo de mesclagem?
  • Como podemos melhorar esse processo de mesclagem sem aumentar o gargalo no meu chefe?

Edit: Duvido que meu chefe afrouxe o controle sobre o repositório de troncos ou permita que outros desenvolvedores se unam ao tronco. Não sei quais são suas razões para isso, mas eu realmente não planejo abordar o assunto, porque ele foi abordado antes e abatido rapidamente. Eu acho que eles simplesmente não confiam em nós, o que não faz sentido, porque tudo é rastreado de qualquer maneira.

Qualquer outra visão sobre essa situação seria apreciada.


2
Por que a fusão é adiada? Geralmente, há uma razão para não fazê-lo imediatamente. o cara solteiro está sobrecarregado e a carteira de pedidos fica tão grande? existe alguma outra razão pela qual a fusão não é feita em tempo hábil?
Polygnome

1
Eu estava em uma posição semelhante à sua, várias vezes. Por experiência pessoal, posso dizer que muitas empresas fazem controle de versão, especialmente ramificação, terrivelmente errado.
MechMK1

3
O que acontece quando o chefe sai de férias?
Liath

Como você definiria a estratégia de ramificação / mesclagem do kernel do linux?
Braiam

As alterações que são retrocedidas devido a conflitos, mas não a outros defeitos, precisam passar pelo processo de aprovação novamente depois que os conflitos forem resolvidos ou são consideradas "aprovadas provisoriamente"?
Gregory Nisbet

Respostas:


60

Algumas sugestões:

  • Não há nada errado em ter muitas ramificações de recursos ou correções, desde que as alterações feitas em cada ramificação sejam pequenas o suficiente, e você ainda poderá lidar com os conflitos de mesclagem resultantes de maneira eficaz. Esse deve ser seu critério se sua maneira de trabalhar estiver correta, não em algum artigo do MSDN.

  • Sempre que um ramo é mesclado no tronco, o tronco deve ser mesclado em todos os ramos de desenvolvimento abertos o mais rápido possível. Isso permitiria que todas as pessoas da equipe resolvessem conflitos de mesclagem em paralelo em seu próprio ramo e, portanto, sobrecarregassem o porteiro do porta-malas.

  • Isso funcionaria muito melhor se o gatekeeper não esperasse até que 10 ramificações estivessem "prontas para serem incorporadas ao tronco" - a resolução de conflitos de mesclagem das últimas integrações de tronco precisa sempre de algum tempo para a equipe; portanto, provavelmente é melhor trabalhar em intervalos de tempo entrelaçados - uma integração pelo gatekeeper, uma re-fusão pela equipe, próxima integração pelo gatekeeper, próxima re-fusão pela equipe e assim por diante.

  • Para manter as ramificações pequenas, pode ser útil dividir os recursos maiores em várias tarefas menores e desenvolver cada uma dessas tarefas em uma ramificação própria. Se o recurso não estiver pronto para produção até que todas as subtarefas sejam implementadas, oculte-o da produção atrás de um alternador de recurso até que todas as subtarefas sejam concluídas.

  • Mais cedo ou mais tarde, você encontrará tarefas de refatoração que afetam muitos arquivos na base de código - elas têm um alto risco de causar muitos conflitos de mesclagem com muitas ramificações. Essas podem ser tratadas melhor comunicando-as claramente na equipe e certifique-se de lidar com elas exatamente como eu escrevi acima: integrando-as primeiro em todos os ramos de desenvolvimento antes da reintegração e dividindo-as em sub-refatorações menores.

  • Para o tamanho atual da sua equipe, ter um único gatekeeper ainda pode funcionar. Mas se sua equipe crescer em tamanho, não há como contornar um segundo guardião (ou mais). Observe que não estou sugerindo permitir que todos entrem no tronco, mas isso não significa que apenas seu chefe seja capaz de fazer isso. Provavelmente, há um ou dois desenvolvedores seniores que também poderiam ser candidatos para o trabalho do porteiro. E mesmo para o tamanho da sua equipe atual, um segundo gatekeeper poderia facilitar a integração da sua equipe ao tronco com mais frequência e mais cedo, ou quando seu chefe não estiver disponível.


2
Acho que você tem o melhor comentário aqui, reconhecendo que não podemos simplesmente abrir o tronco para todo mundo e que nossa pilha de ramificações nem sempre é exatamente um problema (somente quando elas entram em conflito). Acho que você fez um bom trabalho apontando como podemos reduzir conflitos e garantir que o ciclo de mesclagem seja suave. Também acho que você está completamente correto quando diz que podemos precisar de outro gatekeeper. Muito obrigado por essa visão!
user6567423

@ user6567423 Outra coisa que você pode considerar é criar ramificações para cada versão de desenvolvimento (por exemplo, 5.2.3 ou o que for), que cada desenvolvedor pode ramificar para o trabalho de recursos e depois fundir, e que podem ser mescladas novamente para a principal liberar ramo pelo chefe quando o desenvolvimento estiver concluído.
nick012000

@ nick012000: essa sugestão não tornaria mais difícil para o gatekeeper aceitar ou rejeitar ramificações de recursos individuais a favor / contra a integração no tronco? Quero dizer, se vários recursos forem misturados em um ramo de desenvolvimento, a reintegração dessas mudanças parcialmente no tronco se tornaria realmente difícil. Ou eu estou esquecendo de alguma coisa?
Doc Brown

10
" resolva conflitos de mesclagem em paralelo em seu próprio ramo e, portanto, tire um fardo do porteiro do porta-malas. " - Sinto que essa parte é injustamente reduzida a uma nota lateral. "É melhor para a empresa, mas também mais fácil para você " parece o principal ponto de venda ao sugerir isso ao chefe. Isso vai mais para a política do escritório de direção, da qual a SE não se refere - mas nessa situação, sem a aceitação do chefe, tudo o mais nessa resposta tecnicamente excelente simplesmente não acontecerá.
R. Schmitz

@DocBrown Sim, seria, mas também significaria que você teria muito menos conflitos entre os desvios de desenvolvimento e ainda daria a você o grau de segurança dado por não se mesclar diretamente ao ramo principal - e ele pode simplesmente recusar a aceitar o trabalho como Concluído e executar a mesclagem até que ele esteja satisfeito com o estado do código como um todo.
nick012000

18

Estamos exibindo o próprio antipadrão que foi descrito como o 'big bang merge'?

Parece que sim.

Alguns dos problemas que estamos vendo são resultado desse processo de mesclagem?

Definitivamente

Como podemos melhorar esse processo de mesclagem sem aumentar o gargalo no meu chefe?

Na minha empresa, todo desenvolvedor tem a capacidade de mesclar. Atribuímos uma solicitação de mesclagem a outro desenvolvedor, passamos pelo ciclo de revisão / feedback / atualização até que ambas as partes estejam satisfeitas. Em seguida, o revisor mescla o código.

De 10 a 20 filiais aguardando fusão, é um sinal de que seu processo está com defeito. Se tivéssemos tantos, todo o trabalho de desenvolvimento parava até que fosse esclarecido.


1
Não é a resposta que eu estava procurando, porque duvido que meu chefe afrouxe o controle sobre o repositório de troncos. Mas uma resposta incrivelmente útil, no entanto, obrigado pela compreensão!
user6567423

5
@ user6567423: Se o seu chefe se tornar um gargalo, o que ele agora está de acordo com a sua descrição, ele terá que mudar sua abordagem ou aceitar que ele é a causa de atrasos (pelos quais seus funcionários não podem ser responsabilizados). Recusar-se a mudar sua abordagem, ignorar os problemas que você está criando e colocar a culpa nos outros não é uma maneira de administrar um negócio.
Flater

1
Ele concorda que é o gargalo e certamente não culpa os outros por isso. Mas sim, eu estava procurando por dicas que possam não ser prontamente óbvias e que possam reduzir nosso gargalo. Obrigado pela compreensão
user6567423

1
@ user6567423 Estou curioso para saber se ele já explicou por que é o único que pode se unir ao tronco.
Matthew

13

É basicamente assim que muitos projetos de código aberto funcionam, incluindo o kernel Linux, que tem muito mais ramificações do que você em um determinado momento. A maneira típica de evitar mesclagens do big bang nesses projetos é criar outra ramificação (ou várias ramificações) para integração contínua. Esse é o ramo que você usa para garantir que suas alterações funcionem em conjunto com seus colegas, e ele é periodicamente reencaminhado para o tronco quando o gatekeeper faz as revisões.

Opcionalmente, você pode usar essa ramificação para combinar várias de suas próprias solicitações pull em uma grande solicitação coesa para que seu chefe analise. Linus Torvalds normalmente recebe solicitações pull que foram integradas em dois ou mais níveis de profundidade e podem ter um tamanho da ordem de, por exemplo, um novo driver de sistema de arquivos completo.


Obrigado. Acho que as dicas sobre a combinação de filiais e a prevenção de conflitos provavelmente serão nosso melhor curso de ação.
user6567423

8

Concordo com o Doc Brown, mas também vejo outro antipadrão:

Meu chefe, a única autoridade no repositório de troncos , na verdade adiará todas as revisões de ramificações até um único momento em que ele executará revisões o máximo que puder, algumas ramificações serão devolvidas para aprimoramentos / correções, algumas ramos se fundem diretamente no tronco, alguns ramos serão jogados de volta por causa de conflitos etc.

Na minha humilde, existem alguns antipadrões de gestão:

  1. Ele / ela é o único ponto de estrangulamento que restringe a velocidade da equipe. Seu fator de barramento é 1. A teoria das restrições diz que você deve se esforçar para melhorar a parte mais lenta da cadeia.
  2. Seu gerente está tornando seu ciclo de feedback mais lento e reduzindo a agilidade da sua equipe. Você pode liberar toda semana?
  3. Mescla complexidade cresce exponencialmente com a quantidade de código. É melhor fazer 10 mesclagens com 100 linhas que 1 de 1000 linhas. Essa é apenas uma das razões pelas quais você deve fazê-lo o mais rápido possível
  4. Se você detectar uma falha no tronco, fará isso mais tarde. Qual dos vários ramos foi o problemático
  5. As decisões devem ser tomadas por aqueles que têm mais conhecimento sobre elas. Quem sabe mais nesse caso? Aposto que os desenvolvedores que criaram o código.
  6. Você não pode corrigir um erro na produção se o seu gerente estiver nos feriados.
  7. Você está refazendo o trabalho e jogando de volta galhos. Isso é uma perda de tempo. O tempo de espera para chegar à produção também é desperdício.

Recomendações:

  • Seu gerente precisa delegar responsabilidade à equipe. Você precisa mostrar que a equipe é madura, profissional. Deixe claro que eles podem confiar na equipe
  • Implemente algum método de revisão. Pode ser que você precise da aprovação de outros dois membros da equipe.
  • Talvez o uso do SVN esteja dificultando. Experimente o Git e veja se isso ajuda você. Ainda mais. Se você usa o GitHub, pode usar o mecanismo Pull Request para que uma mesclagem exija certos votos.
  • Leia e compartilhe informações sobre práticas ágeis, integração contínua e DevOps.

7
Eu trabalhei profissionalmente com o SVN e o git, e eu diria que o SVN é definitivamente parte do problema: força uma política de consolidação de consolidação única nas ramificações que não está presente no git. No git, todas as mesclagens são iguais, no SVN, algumas são mais iguais que outras. Além disso, a falta de confirmações locais torna muito mais difícil experimentar o SVN do que com o git, e a falta de uma zona de preparação apenas contribui para a inflexibilidade do SVN. Há uma razão pela qual Torvalds não usou apenas o SVN em vez de desenvolver o git ...
cmaster

Git é muito melhor do que svn na minha opinião pelas razões que o @cmaster apresentou e muito mais
reggaeguitar

Concordo que o git provavelmente resolveria alguns dos nossos problemas de fusão, e, meu Deus, eu adoraria ter uma recuperação disponível. Mas acho que não vamos mudar tão cedo :(
user6567423

1
@ user6567423, fiz uma consulta no ano passado em que ajudei uma pequena equipe a fazer a transição do svn para o Git e alterei o fluxo de trabalho, incluindo treiná-los no Git e configurá-los com a edição da comunidade GitLab (que é de código aberto) para revisões de código e colaboração . Eles estavam muito entusiasmados com isso; era uma diferença de noite e dia. (Também levou apenas três dias.)
Wildcard

2

Quando você trabalha com recursos em ramificações separadas, não pode realizar facilmente nenhum teste de integração até que uma das ramificações seja mesclada ao tronco e puxada para as outras ramificações de recursos. Na minha experiência, esse é o principal problema com o antipadrão do Big Bang Merge. Idealmente, você faria o trabalho do recurso, testaria-o na ramificação do recurso, mesclaria-o no tronco e, nesse ponto, estará pronto com o recurso. Se não tiver sido mesclado, você deverá revisá-lo sempre que algo mais for mesclado ao tronco antes dele. A dor desse antipadrão é que você tem muitos bugs do tipo integração que aparecem no final do ciclo de desenvolvimento.


1

Então você tem 20 filiais. A ramificação 1 é apenas mesclada. Em seguida, o desenvolvedor da ramificação 2 precisa mesclar a ramificação 1 em sua ramificação para poder mesclar na main sem conflito, e depois se mescla. Em seguida, o desenvolvedor da ramificação 3 precisa mesclar a ramificação 1 e a ramificação 2 em sua ramificação para poder mesclar a main sem conflito e, em seguida, mesclar.

Exercício para o leitor: escreva um programa que imprima meu post completo :-)

Isso é loucura. Você estará gastando uma quantidade incrível de tempo se fundindo.


Bem, não necessariamente, a menos que os ramos estejam em conflito, ele pode mesclá-los todos no tronco sem problemas. Em geral, tentaremos evitar conflitos ao fazer uma mesclagem de teste antes de enviar a ramificação para revisão, mas os conflitos surgem inevitavelmente à medida que o número de ramificações na fila aumenta. Eu concordo que parece loucura.
user6567423

2
Comportamento normal de fusão do SVN, até onde eu sei ...
cmaster 17/05

0

Dada a maneira como você trabalha e que seu chefe é um maníaco responsável pelo controle, a ramificação parece ser o problema. Em vez de criar uma ramificação para cada recurso, peça a cada desenvolvedor confirmar seu recurso em partes, diretamente no tronco. Isso coloca o ônus da integração no desenvolvedor em várias etapas menores (ganha-ganha). O gatekeeper pode acompanhar as alterações menores por um período mais longo no início do ciclo de desenvolvimento e ainda ser o revisor principal.

Ramificar em si é algo que você não deseja fazer, a menos que tenha um bom motivo para fazê-lo ou não tenha outra opção. Você é pequeno o suficiente para manter as coisas sincronizadas com mais força, o que será mais fácil e seguro.


1
E como você vai lidar com o lançamento se apenas um desses recursos apresentar um bug ou não terminar a tempo? "A ramificação em si é algo que você não deseja fazer, a menos que tenha um bom motivo para fazer" - Depois de ter 5 pessoas trabalhando em vários recursos cada, é necessário usar a ramificação, a menos que você tenha uma boa razão para não fazê-lo.
Ivo van der Veeken

Eram duas coisas: o chefe quer continuar sendo o único guardião do portão e as coisas não devem divergir muito. Sim, haverá um momento em que algo foi empurrado que ainda está para ser examinado pelo chefe. Ele deve conseguir fazer isso rapidamente e, no caso improvável de precisar entregar imediatamente, ele pode reverter as confirmações mais recentes. Isso manterá as coisas sincronizadas e, se você falhar em alguma coisa, certamente falhará rapidamente. Parece-me um bom compromisso para a situação em questão.
Martin Maat

1
Eu consideraria isso como último recurso
reggaeguitar
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.