Como você gerencia a refatoração com uma grande base de código e muitos desenvolvedores?

13

Gostaria de evitar uma situação em que dois desenvolvedores refatore o mesmo código simultaneamente sem falar primeiro sobre ele, provavelmente usando algum tipo de ferramenta, talvez um plug-in do Eclipse. Você pode ajudar?

Temos 4,5 milhões de linhas de código e mais de 20 equipes de desenvolvedores em quatro continentes.

Idealmente, eu gostaria que o segundo dos desenvolvedores mencionado anteriormente notasse que alguém está trabalhando no mesmo trecho de código e conversasse com o primeiro antes de modificar qualquer coisa.

Você conhece uma solução?

Roger CS Wernersson
fonte
1
Não conheço nenhum plug-in do Eclipse ... parece mais um trabalho para o sistema de controle de versão.
SL Barth - Restabelece Monica
Por que você quer impedir isso? É para evitar complicações (bugs) ou economizar tempo do desenvolvedor? A solução depende muito da resposta a esta IMO.
precisa saber é o seguinte
Por que você não experimenta SVN, Apache Subversion ou Tortoise svn, será bom para isso.
1
Por que vinte equipes editam a mesma fonte?
Temos um VCS. Acabamos de mudar do ClearCase para Git.
Roger CS Wernersson

Respostas:

14

Muitos sistemas de controle de origem de segunda geração funcionam usando um "checkout" conectado que informa o servidor que você pretende modificar um arquivo. Exemplos incluem TFS, SourceGear Vault e muitos outros. Dessa forma, você pode cumprir tecnicamente seus requisitos. Como apontou Adam Butler, esses tipos de ferramentas vêm com seus próprios problemas (sem entrar em um longo debate - suporte limitado ao trabalho offline e geralmente fluxo de trabalho de desenvolvimento contraproducente).

Definitivamente, eu sugeriria algum tipo de abordagem hierárquica para alocar o trabalho de refatoração. Os desenvolvedores podem ser agrupados logicamente em sub-equipes, cada uma responsável por áreas específicas do código. Dependendo de como você deseja estruturar as equipes, cada uma delas pode ter um papel de "líder", responsável pelo design de alto nível da área da equipe. Essa estrutura deve ser bem conhecida pelos desenvolvedores e deve simplificar a comunicação para refatoração. Estou certo de que essa abordagem parece muito formal e atrasada para alguns, mas acho que é preferível que mais de 20 desenvolvedores usem uma abordagem "livre para todos" para refatorar um sistema grande. Algumas refatorações ocorrerão em alto nível (por exemplo, como o módulo X se comunicará com o módulo Y), nesse caso, você precisará de pessoas que possam fazer chamadas no nível apropriado. Nem todo desenvolvedor da equipe deve tomar decisões arquitetônicas; portanto, uma hierarquia é quase imposta em qualquer caso, mesmo que alguém escolha ignorá-la.

Então, basicamente, existem ferramentas para atender aos requisitos básicos que você apresenta, mas nenhuma ferramenta substitui as comunicações adequadas e tem um pequeno número de pessoas dirigindo a arquitetura geral do seu projeto.

Daniel B
fonte
A maioria muda uma vertical; modifica GUI, protocolos de rede, banco de dados, os trabalhos. Precisamos de uma ferramenta para nos ajudar a comunicar refatorações. Tentamos refatorar o código em cada check-in para melhorar a legibilidade e reduzir o custo de manutenção.
Roger CS Wernersson
@ RogerWernersson - eu entendo, não acho que exista uma boa maneira de fazer isso. É por isso que minha resposta recomendou a estruturação de equipes e responsabilidades e a cultura da empresa, para que o passo-a-passo seja minimizado como resultado. Tentar adaptar um checkout simultâneo em cima do git será doloroso e provavelmente terá todas as desvantagens de um sistema de controle de revisão centralizado. Tenho certeza que alguém já fez isso, você deve encontrar algumas implementações específicas, agora que mencionou que está usando o git.
Daniel B
7
  1. Verifique se os desenvolvedores recebem módulos específicos.
  2. Tenha um sistema de rastreamento de tarefas / erros que rastreie todas as alterações de refatoração. Atribua cada problema a apenas um desenvolvedor
  3. Alguns sistemas de controle de versão têm a capacidade de bloquear um arquivo para que apenas um desenvolvedor possa ter direitos de atualização sobre o arquivo. Eu nunca usei esse recurso, mas se os desenvolvedores estão constantemente se esquecendo, isso é algo que você pode querer considerar.
  4. Faça testes de unidade para que, mesmo que os desenvolvedores trabalhem no mesmo arquivo, você saiba que as alterações deles não quebram o aplicativo de forma alguma.
  5. Todas as opções acima ajudariam se sua refatoração estiver contida nos módulos. No entanto, se alguém refatorar uma preocupação transversal, como log ou segurança, isso afetará muitos arquivos por definição. Eles precisam ser manuseados com cuidado, especialmente se você ainda não se aproveitou das abordagens de AOP.
Sriram
fonte
Sou a favor do uso de bloqueios em princípio, mas o que fazer se sua ferramenta (por exemplo, Eclipse) alterar muitos arquivos automaticamente através de uma refatoração. Todos os arquivos alterados devem ser bloqueados automaticamente? O número de arquivos bloqueados pode aumentar muito rapidamente. Os bloqueios devem ser adquiridos de forma incremental? Como lidar com impasses?
Giorgio
Se você alterar uma assinatura de método e ela afetar muitos arquivos, será necessário adquirir um bloqueio em todos os arquivos. Caso alguém tenha um bloqueio, você pode adquiri-lo à força (o svn permite isso) se a sua refatoração for de maior prioridade.
Sriram
Isso pode ser automatizado (armazenando prioridades e resolvendo conflitos de bloqueio automaticamente)? Ou cada desenvolvedor decide se a refatoração tem prioridade mais alta?
Giorgio
Eu acho que se as prioridades estiverem armazenadas no aplicativo mgmt de tarefas com uma API decente, você poderá automatizá-las. Eu nunca tentei, mas não vejo por que isso não deveria ser possível.
Sriram
Não quero criar um bug para cada refatoração. A abordagem é limpar o código que você altera. O preenchimento de um relatório de bug para cada arquivo parece muito trabalhoso.
Roger CS Wernersson
6

Existem / existem sistemas de controle de versão que fazem com que os desenvolvedores façam o checkout do código antes que eles possam editar, mas eles têm um conjunto de problemas próprios. A melhor prática é fazer com que os desenvolvedores se comprometam e atualizem com frequência. Um desenvolvedor pode marcar uma classe como depreciada e confirmar, se o outro desenvolvedor atualizar antes de iniciar o refator, verá a intenção.

Adam Butler
fonte
3
+1: Confirmar e atualizar também significa que as alterações são pequenas e fáceis de gerenciar, facilitando o gerenciamento de conflitos.
precisa saber é o seguinte
Cometer frequentemente ajudaria. Infelizmente, não posso mudar isso. Estou procurando uma ferramenta para nos ajudar a nos comunicar.
Roger CS Wernersson
3

A tecnologia não pode resolver problemas sociais. Você precisa que seus desenvolvedores conversem entre si e coordenem o trabalho deles. Com 20 equipes, alguma estrutura e regras serão essenciais. Você deseja apoiá-los com soluções tecnológicas, mas as pessoas vêm primeiro.

quant_dev
fonte
3
Ele falou de 20 equipes, não de 20.
Ingo
1
O +1 na tecnologia não pode resolver problemas sociais. Mas fazer editar a resposta para dizer "Com 20 equipes, alguma estrutura e regras será essencial"
MarkJ
Algumas pessoas dormem enquanto outras trabalham. Temos equipes em quatro continentes.
Roger CS Wernersson
0

Se você sair notice that someone else is working on the same piece of code and talk to the first one before modifying anything, conforme o que disse, precisará de um sistema de controle de versão (CVS / SVN / GIT). Não tenho certeza, mas se você quiser incluir isso também, precisará de algumas coisas avançadas (algum tipo de mecanismo de acionamento / talvez algo personalizado).

c0da
fonte
Nós temos o Git. Antes disso, tínhamos o ClearCase. VCS não é a solução. Precisamos de algum mecanismo de disparo.
Roger CS Wernersson
0

Os desenvolvedores que bloqueiam arquivos no controle de origem devem resolver seu problema facilmente, mas acho que você pode ter problemas maiores.

4,5 milhões de LOC's são uma grande caixa de areia para se jogar, portanto, em uma solução bem arquitetada e projetada, você raramente deve se deparar com uma situação em que várias equipes de desenvolvedores estão pisando nos dedos uns dos outros. O fato de isso acontecer mais do que coincidentemente está revelando algumas falhas sérias de design em potencial que devem ser analisadas.

maple_shaft
fonte
A maioria das mudanças é vertical; GUI, protocolos de rede, banco de dados. Cada equipe é ágil e focada em oferecer valor ao cliente a cada sprint. Não podemos ter uma equipe no banco de dados, outra na GUI, etc. Seria mais fácil se o código fosse mais limpo. Mas o caminho para limpar o código está escrito "muitas pequenas refatorações".
Roger CS Wernersson
0

Algumas coisas:

  1. Módulos separados para trabalhar
  2. Falando sobre mudanças antes que elas sejam feitas [com todos os desenvolvedores]
  3. Teste de unidade [para verificação e prevenção por quebra de itens relacionados]
  4. Como os outros mencionaram um VCS
monksy
fonte
1. difícil quando cada equipe trabalha verticalmente 2. difícil porque algumas equipes dormem enquanto outras trabalham 3. não soluciona o problema 4. Onde está o Git agora, anteriormente no ClearCase.
Roger CS Wernersson