O debate: Todo o desenvolvimento, incluindo o trabalho de refatoração, deve ser acompanhado por um problema de rastreamento? (no nosso caso, Jira)
O terreno comum: Nosso principal objetivo é a qualidade. Um produto funcional, a cada versão, é mais importante do que qualquer outra coisa. Nossa base de código é antiga e faltam testes automatizados; estamos trabalhando nisso, mas é um projeto de longo prazo, precisamos de processos interinos.
Posição 1: O trabalho de refatoração deve ser rastreado em Jira. Se não estiver obviamente relacionado à alteração que está sendo feita, você deverá levantar outra questão. Caso contrário, o trabalho ignora a revisão e o teste e há um risco em nosso objetivo principal. Argumentou-se que a conformidade com o PCI (uma meta de futuro próximo dos negócios) requer esse nível de rastreamento; Não estou em posição de dizer que é verdadeiro ou falso com qualquer nível de certeza.
Posição 2: a qualidade do código é muito importante. Quanto melhor for (a um ponto; um ponto que não estamos nem perto), maior a probabilidade de continuarmos lançando um produto em funcionamento. Qualquer coisa que coloque uma barreira, por menor que seja, na refatoração é um risco para o nosso objetivo principal. Freqüentemente, o IDE faz o trabalho para você, portanto, não é provável que dê errado de qualquer maneira.
Os seguintes casos foram feitos:
Satisfaria ambas as posições se um desenvolvedor escrever "Refatorar" e os números de revisão relevantes em um cartão? Honestamente, parece que isso vai deixar todo mundo igualmente infeliz. Ele ainda coloca um nível de resistência na refatoração, mas não oferece rastreamento suficiente.
Que tal ter problemas abrangentes do Jira que cobrem o trabalho de refatoração para uma iteração? Sim, isso remove a camada de resistência do desenvolvedor, mas temo que também remova os benefícios de rastreamento de um problema com o Jira. Como o controle de qualidade tem uma idéia clara do que testar? Essa parece ser uma solução política, mantendo todos calmos, adicionando um processo leve, mas, em última análise, inútil.
Parece-me que, dado que ambos os lados do debate querem a mesma coisa, deve haver uma solução que deixe todos genuinamente felizes. Não podemos ter sido as primeiras pessoas a fazer essa pergunta; então, que experiências outras pessoas tiveram em situações semelhantes?
Respostas:
Talvez esteja faltando alguma coisa aqui, mas como a criação de um ticket para o trabalho que você está fazendo que não se enquadra no escopo de seus outros tickets em uma 'camada de resistência'?
Você implementou recentemente usando um sistema de rastreamento de tickets? Nesse caso, sente-se e faça suas regras para usá-lo e informe à equipe que eles devem seguir essas regras. Se isso inclui a criação de tickets de refatoração para este trabalho, que assim seja. Você não pode fazer exceções desde o início ou isso pode atrapalhar todo o processo que sua equipe está tentando configurar.
Se você usa um sistema de rastreamento de tickets há algum tempo, não entendo por que isso seria uma 'camada de resistência'. Sua equipe já deve estar acostumada a abrir o Jira e ver seus ingressos e deve se sentir confortável em fazer ingressos.
Se você deseja manter todos os esforços de refatoração em um só lugar, crie um ticket principal para isso e peça à sua equipe que faça tarefas sob o trabalho que está realizando. Em seguida, são necessários 5 segundos para que um desenvolvedor faça uma nova tarefa para isso e eles possam registrar seu tempo nessa tarefa.
Gerentes de projeto, líderes de equipe e desenvolvedores precisam saber quanto tempo está indo para o esforço de refatoração. Você não quer que se torne um buraco negro do tempo. A posse dos tíquetes mantém os desenvolvedores responsáveis por seu trabalho e, ao mesmo tempo, fornece aos gerentes e lidera um local para acompanhar quantas horas vão para o esforço.
fonte
Idealmente sim.
Qualquer alteração feita na base de código deve ter um motivo. Pode ser uma solicitação do cliente - o item mais comum / provável ou gerado internamente - como no seu exemplo de refatoração.
Isso significa que, além de acompanhar quando uma alteração foi feita, você pode vincular o conjunto de alterações a algo que explique por que a alteração foi feita. Por que não podem ser apenas os comentários do changeset? Existem várias razões pelas quais isso pode não ser adequado.
fonte
A refatoração de código, apesar de altamente desejável para melhorar a qualidade, também é um risco inerente. Isso é especialmente verdadeiro quando se lida com o código "base", em que um único bug faz com que todo o sistema caia e a solução de um único "problema" terá efeitos colaterais (talvez imprevistos) em todo o aplicativo.
Independentemente do tipo de código envolvido, quando uma refatoração não se limita ao código de um problema específico (ticket), o controle de qualidade deve estar envolvido e tomar conhecimento das partes da sua base de códigos afetadas. Eles terão que fazer um teste de regressão completo nessas partes para garantir que nada escapou. E eles terão que fazer isso mesmo, talvez especialmente, se você tiver um conjunto completo de testes de unidade em vigor que o deixem confiante em fazer a refatoração. Os testes de unidade testam muito, mas também perdem muito.
Portanto, se a qualidade do código for importante, sim, deve haver o mínimo de barreiras possível para melhorar o código. Mas não vejo como criar um ticket para isso é uma barreira. Ele simplesmente garante que o controle de qualidade tenha a chance de (im) provar a qualidade do código e deve ser algo desejável, não algo visto como uma obstrução.
fonte
Eu acho que se você não pode descrever a refatoração mais especificamente do que a "refatoração", está fazendo errado. A refatoração deve ter um objetivo e escopo definidos. O rastreamento das tarefas de refatoração separadamente no JIRA não apenas facilita a auditoria, a revisão e os testes, mas também obriga os refatores a concentrarem suas mentes em objetivos concretos ("remover uma dependência circular entre os módulos X e Y", por exemplo) e simplesmente levarão a melhor refatoração.
Por outro lado, se a refatoração for realmente simples, local e apenas um subproduto da execução de uma tarefa diferente, eu não me incomodaria em rastreá-la em um ticket separado e apenas documentá-lo no ticket de entrega original, se puder ter um impacto no trabalho de outras pessoas.
fonte
Sim, idealmente, todas as alterações feitas no código devem ser associadas a um item do JIRA e, portanto, rastreáveis. Como outros observaram, você deve ser capaz de identificar por que uma certa alteração foi feita e com quais outras alterações ela está relacionada.
É bom ter Epics de refatoração de longo prazo em um projeto legado, nós os temos também no nosso. No entanto, você deve se concentrar em focar em alguma área específica do código, com um objetivo específico, caso contrário, é realmente difícil mantê-lo sob controle. Por exemplo, "refatorar os módulos Foo e Bar para eliminar dependências cíclicas", "refatorar a hierarquia de classes A para remover duplicações e limpar a hierarquia de herança".
Ao trabalhar no código legado, com recursos limitados, é preciso priorizar maneiras possíveis de reduzir a dívida técnica, para obter o melhor retorno possível do investimento. Portanto, analisando possíveis refatorações, sua importância, riscos, custos e benefícios devem ser feitos de qualquer maneira antes de iniciar o trabalho. Além disso, é importante acompanhar o progresso de uma refatoração em maior escala e saber quando ele é concluído. Comparado a essas tarefas necessárias, o IMHO faz um esforço mínimo para administrar um item do JIRA.
Se você quer dizer isso , eu posso entender por que o gerenciamento teme mudanças não controladas na base de código, no entanto, o rastreamento de alterações é apenas uma pequena parte da solução. Você precisa de testes completos do sistema e provavelmente análises de código para garantir que nenhum número de cartão de crédito seja vazado do sistema por meio de arquivos de log etc. A refatoração não deve alterar o comportamento do código existente e você deve ter testes de unidade para provar isso de qualquer maneira (não tente acreditar que as ferramentas de refatoração automatizadas não podem quebrar o código - você DEVE fazer testes de unidade para evitar surpresas desagradáveis).
fonte
Em um mundo ideal, a resposta de Chris está certa. Sempre que você fizer uma alteração no código ou em qualquer artefato associado a um projeto de software, deve haver um log disso. Deve ser submetido, aprovado, designado à parte certa, esforço estimado, trabalho realizado, tempo total registrado e uma breve descrição da mudança documentada.
No entanto, isso nem sempre é viável. Por exemplo, meu IDE está configurado para reformatar um arquivo de código com base nas diretrizes de código da organização. Se eu abrir um arquivo e ver que ele não corresponde, é trivial corrigir - CTRL + SHIFT + F no arquivo formata tudo. Talvez um CTRL + SHIFT + O para corrigir importações. Eu faço isso antes ou depois de corrigir o defeito que me foi atribuído.
Nesse caso, você sempre deseja registrar o fato de ter feito e quanto tempo levou, mas não fazer a alteração agora pode ser pior do que passar pelo processo de designar e implementar formalmente a alteração. Em alguns casos, é mais fácil pedir perdão do que pedir permissão. Cabe a você, como engenheiro, justificar onde exatamente essa linha precisa ser desenhada.
fonte
Em geral, a refatoração deve ocorrer como parte normal do seu fluxo de trabalho. A fim de corrigir bug A , você precisa de teste que pouco do método, e por isso você deve extraí-lo como método B . Enquanto você faz isso, percebe que o campo C é muito mal nomeado e renomeia-o.
A minha maneira de pensar, estes normais refatorações se "imputado" o bug originais A . Eles são enviados com a correção, revisados com a correção e emitidos com o bilhete. Eles fazem parte da correção.
Mas existem refatorações maiores e menos focadas que também acontecem. Uma observação geral de que a classe D é muito grande. Seria mais fácil para trabalhar em se eliminou a duplicação na E . E essas refatorações estão entre as mais arriscadas que você assumirá (particularmente em uma base de código sem testes). Por todos os meios, crie tickets para eles; submetê-los a pelo menos seu processo normal de revisão.
fonte