Eu trabalho com uma base de código com mais de 500 mil linhas de código. É uma necessidade séria de refatoração. Foram identificados esforços de refatoração que levarão mais tempo do que o sprint normal de duas semanas. Eles não podem ser divididos em tarefas menores, como já vi sugerido em outras respostas neste site. O produto precisa funcionar no final da iteração, e a refatoração parcial deixará o sistema em um estado inutilizável, pois a dependência entre os itens é horrível. Então, qual seria a melhor maneira de abordar esse obstáculo? Mais uma vez menciono, dividi-lo em pedaços menores não é uma opção, isso já foi feito.
Atualização: as pessoas parecem precisar de uma explicação de por que isso não pode se encaixar em um sprint de duas semanas. Há mais envolvimento em um sprint do que apenas escrever código. Temos uma política de nenhum código sem testes. Essa política nem sempre existia e uma grande parte da base de código não a possui. Além disso, alguns de nossos testes de integração ainda são manuais. A questão não é que a refatoração em si seja tão grande. É com o fato de que pequenas mudanças afetam muitas partes do sistema e precisamos garantir que essas partes ainda funcionem corretamente.
Não podemos adiar ou estender um sprint porque temos hotfixes mensais. Portanto, essa alteração que se estende além de um sprint não pode impedir que o outro trabalho seja adicionado ao hotfix.
Refatoração versus reprojeto: Só porque nosso processo de desenvolvimento não é eficaz o suficiente para lidar com essa refatoração em um ciclo de duas semanas não garante a renomeação para um reprojeto. Gostaria de acreditar que, no futuro, poderemos realizar exatamente a mesma tarefa dentro de um ciclo de duas semanas, à medida que nosso processo melhorar. O código em questão aqui não teve que mudar há muito tempo e é bastante estável. Agora, conforme a direção da empresa está se tornando mais adaptável à mudança, queremos que essa parte da base de código seja tão adaptável quanto o resto. O que requer refatoração. Com base nas respostas aqui, está se tornando aparente a falta de andaimes necessários para fazer essa refatoração funcionar no período de sprints normais.
Responda:
Vou fazer a abordagem de ramificação e mesclagem sugerida pela Corbin March pela primeira vez, para que possamos aprender mais sobre essas áreas problemáticas e como identificar os testes ausentes. Penso que, seguindo em frente, devemos adotar a abordagem sugerida por Buhb para identificar as áreas que estão faltando nos testes e implementá-las primeiro, depois refatorar. Isso nos permitirá manter nosso ciclo de sprint normal de duas semanas, assim como muitos aqui dizem que sempre deve ser o caso da refatoração.
fonte
Respostas:
Se você tiver o luxo de adiar a refatoração, sugiro focar as próximas iterações na adição de testes de unidade e testes de integração automatizados ao ponto em que você pode refatorar confortavelmente a base de código e refatorar em um único sprint.
fonte
Minha sugestão:
Não há como evitar o fato de que provavelmente ficará feio. Eu não te invejo. Na minha experiência, quando você muda drasticamente um projeto, é mais fácil mesclar o desenvolvimento contínuo ao novo paradigma do que, de alguma forma, mesclar o novo paradigma em um tronco agora alterado depois que tudo estiver concluído. Ainda assim, vai doer.
fonte
Nem todas as tarefas podem ser realizadas em um sprint de 2 semanas (artificial), por isso é necessário bom senso. Se não puder mais ser decomposto e for necessário, basta seguir em frente e fazê-lo. O processo não é mais importante que o resultado final e deve ser visto como uma diretriz e não como uma lei que nunca será violada.
fonte
Basta fazer um sprint de 3, 4 ou 5 semanas. Quem se importa? Você está obviamente convencido de que nada pode ser feito em um prazo menor, então pare de lutar contra isso.
Só não conte aos seus colegas da Royal Society of Blind Agile Adherance.
fonte
Eu recomendo começar com o livro Working efetivamente with Legacy Code , de Michael Feathers. Ele cobre uma variedade de técnicas para reduzir o escopo das mudanças no estilo da refatoração.
fonte
Em nossa loja, quando temos grandes tarefas de refatoração ou reescrita que não podem ser concluídas em uma janela de release, deixamos a funcionalidade como está no sistema. Mas, começamos com as novas funções de bloco lego refatoradas conforme o tempo permitir. Eventualmente, chegamos a um estado em que temos blocos de lego suficientes, que um sprint fornece tempo suficiente para conectar os blocos de lego ao aplicativo e ativá-lo para os usuários.
Mais concisamente, dividimos ou retrabalhamos grandes funções usando novos nomes. Então, no final, usamos nosso trabalho renomeado e refatorado em vez do código antigo desagradável.
fonte
Dedique um sprint para descobrir como manter o código funcionando corretamente no meio da refatoração. Isso pode assumir a forma de métodos e classes descontinuados, wrappers, adaptadores e similares. Sua refatoração pode tornar o código mais sujo por um curto período de tempo para ficar mais limpo a longo prazo; isso está ok. No momento, você está dizendo que isso não pode ser feito. Eu não acho isso certo - pense em como seria o seu processo, se pudesse ser feito, pense em quais etapas você pode tomar para fazê-lo. Então mergulhe.
fonte
+1 na resposta de Corbin March, é exatamente o que eu estava pensando. Parece que sua base de código é um pouco feia e vai demorar mais de um único ciclo de sprint para limpá-la.
Então, assim como Corbin disse,
Tenho certeza de que você não terá nenhum problema em vender isso para o gerente de desenvolvimento, se o seu gerente estiver tendo dificuldades para vê-lo, explique a eles que Roma não foi construída em um dia e limpou todo o lixo jogado no escritório de Roma ruas não vai ser feito em um dia também. A refatoração levará um tempo, mas no final valerá a pena em termos de manutenção mais fácil, lançamentos de aprimoramentos mais rápidos, menos tickets de produção e um SLA mais cumprido.
fonte
Embora o redesenho que você realmente deseja fazer seja uma tarefa grande, seria possível refatorar partes menores para quebrar / desacoplar dependências individuais? Você sabe - em caso de dúvida, adicione indiretamente. Cada uma dessas dissociações deve ser uma tarefa menor que a gigantesca que você não pode concluir.
Depois que as dependências forem removidas, você poderá dividir as tarefas de refatoração restantes para serem obtidas nos sprints.
fonte
No projeto em que estou trabalhando no momento, estamos usando sprints de 4 semanas. E, às vezes, não podemos terminar uma história de usuário e apenas a reiniciamos durante o sprint a seguir.
No entanto, IMHO deve ser possível dividir uma refatoração em histórias menores que se encaixam em um sprint de 4 semanas. Se você não conseguir colocar o código em um estado consistente dentro de quatro semanas, sinto que você está reescrevendo seu aplicativo em vez de refatorá-lo.
fonte
Eu recomendo que, quando determinadas tarefas levarem mais tempo que o ciclo de sprint de duas semanas, a tarefa seja programada por outro tempo. Sua equipe identificou a necessidade de refatoração e isso é importante. Às vezes, não há outra opção ... e, sim, isso é péssimo.
Quando chegar a hora de começar a refatoração, você simplesmente suspenderá os sprints normais. Você não tem escolha. Use o controle de versão inteligente - ramificar, refatorar, testar, mesclar. Sempre há um momento em que a refatoração de alguns grandes projetos tem prioridade sobre os recursos. Se possível, eu também tentaria separar as preocupações para melhorar a flexibilidade.
fonte
Tendo recentemente enfrentado o mesmo problema com uma parte de nossa base de código (que também é um pouco maior), espero poder compartilhar algumas idéias com você. Na minha situação, a base de código havia sido desenvolvida por outra equipe; portanto, ninguém dos desenvolvedores originais estava envolvido nessa refatoração. Minha experiência com a base de código foi de aproximadamente 1 ano, e outro desenvolvedor encarregou-a de 2 anos.
Permitam-me duas pequenas notas sobre as outras respostas aqui:
Ficar aparentemente "fora da reserva" por duas semanas ou mais não passará despercebido. Você precisa garantir o apoio do gerenciamento de projetos e, ainda mais importante, da equipe. Se a equipe não estiver comprometida com essa refatoração (e isso significa, faça isso agora, não em um futuro distante), você terá problemas.
Não faça isso sozinho, use programação em pares. Isso não significa estritamente que você precisa ficar sentado na frente do mesmo teclado o tempo todo, mas pode lidar com tarefas pequenas e estreitas (por exemplo, testes de gravação que capturam o comportamento dessa classe) individualmente.
Faça uma refatoração de arranhões e trate-a como tal. (Uma espécie de refatoração de protótipo "descartável", o bit "descartável" é importante!) Honestamente, é improvável que você saiba todas as implicações que sua refatoração terá. Uma refatoração de rascunho o ajudará em alguns aspectos:
Quando você fizer sua refatoração de arranhões, espero que você descubra que não pode simplesmente mudar tudo. Você vai se sentir mal, é apenas uma grande bagunça e você não pode simplesmente apertar um botão e fazê-lo funcionar. Foi o que aconteceu comigo, pode ser diferente na sua situação.
No entanto, meu parceiro e eu entendemos muito melhor nosso sistema. Agora, conseguimos identificar refatorações / redesignes menores e menores (embora ainda grandes). Capturamos nossa visão do sistema em um diagrama e a compartilhamos com a equipe, juntamente com os itens de lista de pendências que criamos para implementar essa visão. Fortalecidos por um consenso comum, decidimos quais itens implementaríamos ao longo da próxima iteração.
Uma última coisa que nos ajudou foi usar um grande quadro branco. Há muitas coisas para manter em sua cabeça. É extremamente importante que você faça anotações. Escreva para si mesmo uma nota de resumo no final do dia, capturando o que você fez hoje e deseja fazer amanhã. Isso ajuda a relaxar os grandes momentos, e você precisa de um tempo descontraído para acompanhar a tarefa. Boa sorte!
fonte
Inicie uma janela de manutenção durante a qual nenhum desenvolvimento adicional é realizado. Execute o redesenho e depois retome os sprints de desenvolvimento.
fonte
Temos dois tipos de trabalhos em mãos:
A refatoração geralmente consiste no primeiro tipo de trabalho, já que muitos métodos já são conhecidos por desenvolvedores como DRY , SRP , OCP , DI etc. Assim, quando um projeto leva dois meses para ser refatorado, leva apenas dois meses , existe de jeito nenhum. Assim, minha sugestão seria não refatorar o projeto original e deixá-lo trabalhar em sua situação atual. Pare de receber novas solicitações e requisitos das partes interessadas e do proprietário do produto . Em seguida, deixe a equipe trabalhar no projeto até que ele seja refatorado e pronto para começar.
fonte
Uma sugestão que pode ajudar: Se você tiver um código não testado, de modo que não tenha tempo suficiente para refatorá-lo e testá-lo novamente dentro do sprint de duas semanas, considere primeiro fazer outras pequenas alterações não relacionadas ao código, para que você possa se concentrar em escrever testes para o primeiro sprint ou dois. Talvez você possa identificar vários clientes não testados do código que deseja refatorar; escolha um cliente e faça outras alterações de alguma utilidade para os negócios que forçarão você a escrever testes para esse cliente. Quando você estiver mais familiarizado com o código, trabalhando com ele, e tiver mais testes, e possivelmente tiver realizado algumas refatorações menores, estará em uma posição muito melhor para realizar a refatoração e o (agora mais fácil ) testando ambos em uma iteração.
Outra abordagem é fazer uma cópia do código incorreto, refatorá-lo e mover os clientes um de cada vez para o novo código. Este trabalho pode ser dividido em iterações.
E não desista: não aceite apenas que uma refatoração grande não pode ser dividida em etapas menores. A abordagem mais fácil / rápida / melhor pode levar mais tempo que uma iteração. Mas isso não significa que não há como executar blocos do tamanho de iteração.
fonte