Como posso tornar a refatoração uma prioridade para minha equipe?

57

A base de código com a qual trabalho diariamente não possui testes automatizados, nomes inconsistentes e muitos comentários como "Por que isso está aqui?", "Não tenho certeza se isso é necessário" ou "Este método não está nomeado corretamente" e o código está cheio de "Changelogs", apesar de usarmos o controle de origem. Basta dizer que nossa base de código pode usar refatoração.

Sempre temos tarefas para corrigir bugs ou adicionar novos recursos; portanto, não é tempo de refatorar o código para ser melhor e mais modular, e isso não parece ser uma alta prioridade.

Como posso demonstrar o valor da refatoração de forma que ela seja adicionada às nossas listas de tarefas? Vale a pena apenas refatorar o caminho, pedindo mais perdão do que permissão?

Joseph Garland
fonte
Instituto de código comentários e que o problema vai cuidar de si mesmo (quase)
dukeofgaming
4
Não trate a refatoração como uma tarefa separada - não é.
Vetle
2
Os changelogs no código me fazem querer chorar ... Sinto muito por sua perda.
Mark Canlas
@ Mark Canlas Eu costumava pensar da mesma maneira até encontrar uma base de código de 20 anos com literalmente centenas de alterações no controle de origem. Boa sorte para descobrir por que (ou mesmo se) um bloco de código específico foi alterado usando apenas o histórico de controle de origem
Michael J.
@ Michael O que tornou as coisas tão difíceis? Em geral, algumas operações de culpar / anotar devem levá-lo direto ao commit relevante, independentemente de quantas alterações foram feitas. (“Centenas” de mudanças ao longo de 20 anos são pequenas, aliás.)
Marnen Laibow-Koser

Respostas:

51

"É melhor pedir perdão do que permissão" é verdade.

Por que se preocupar com isso? Apenas refatorar as partes mais horríveis.

Você já sabe quais são os erros mais caros , certo?

Caso contrário, a etapa 1 é definir positiva e inequivocamente o código do problema mais caro, complexo, repleto de erros e infestado de erros.

Identifique o número de tickets de problemas, horas de depuração e outros custos muito específicos e muito mensuráveis .

Em seguida, corrija algo nessa lista de problemas de alto custo .

Quando você precisa pedir perdão, pode apontar para reduções de custo.


Caso você não saiba, a refatoração exige testes de unidade para provar que os comportamentos de antes e depois são iguais. Idealmente, esse deve ser um teste automatizado e codificado, por exemplo, um teste de unidade.

Isso significa escolher uma coisa. Escreva um teste de unidade. Conserte isso. Você fez duas melhorias. (1) escreveu um teste e (2) corrigiu o código.

Iterar.

S.Lott
fonte
4
Se você fizer isso, obtenha métricas antes de começar e, ao pedir perdão, terá as evidências necessárias para manter seu emprego.
mattnz
15
"Por que se preocupar com isso? Apenas refatorar as partes mais horríveis." Este será um conselho muito perigoso sem testes de unidade. Em combinação com seus outros conselhos para pedir perdão em vez de permissão, o OP pode estar pedindo perdão em grande parte. Aguarde até que um ticket seja aberto devido a uma alteração não intencional do comportamento que pode ser rastreada até a refatoração não autorizada. Há uma boa chance de que ela seja atribuída à prática de refatoração, e não à falta de testes de unidade, e isso servirá como "prova" eterna neste escritório de que "a refatoração é má".
PeterAllenWebb
2
Além disso, raramente vi uma empresa que fazia testes de unidade; então, como você começa a se refatorar em uma situação como essa? Parece ser uma espiral descendente autodestrutiva: você não pode refatorar porque não possui testes, não pode escrever testes porque a base de código é muito grande e / ou não há tempo para escrever novos recursos para voltar e escrever testa o código que foi gravado há anos; portanto, você nunca pode refatorar nada; portanto, o código fica inchado e apodrece até que ocorra.
Wayne Molina
8
Na maioria das vezes, a resposta parece ser "Deixe e encontre pessoas competentes que entendam como ser um profissional de verdade, não um hack". :)
Wayne Molina
4
Em algum momento, um código horrível ou difícil de manter é um bug. Crie itens de lista de pendências e atribua prioridade a eles. Eu trabalho em um ambiente ágil, onde fazemos um curto sprint de estabilização de tempos em tempos, quando o cliente está sendo muito arejado para nos dar detalhes ou está em treinamento. Nós não paramos porque eles não estão disponíveis. E quando o próximo sprint começar, tivemos tempo de nos familiarizarmos com as contribuições uns dos outros e sermos mais precisos em nossas estimativas de esforço. Você só precisa começar em algum lugar, mesmo pequeno, e continuar. Não piore, continuando o estilo enquanto faz isso.
Erik Noren
32

Siga a regra dos escoteiros: deixe o acampamento (código) um pouco melhor do que você o encontrou. Eu nunca ouvi falar de alguém sendo redigido por fazer pequenos aprimoramentos de código "enquanto eles estavam lá".

Karl Bielefeldt
fonte
7
Depende fortemente de quão perto você está de um prazo. Alterar uma biblioteca pode invalidar todos os testes anteriores.
3
Bom ponto, @ Thorbjørn. Algo assim eu provavelmente não classificaria como uma melhoria "pequena" porque tem um amplo escopo de influência.
Karl Bielefeldt
se você passar por uma função que pode ser melhorada um pouco. Você simplesmente não sabe que é colocado em uma biblioteca comum?
@ Thorbjørn Eu diria que você deve ter uma boa idéia de onde a função está sendo usada. Se o arquivo de origem fornecido estiver sendo compilado para algo interno, ou seja, para que você tenha acesso completo a todos os chamadores, não vejo problema em corrigi-lo e atualizar os locais onde é chamado conforme necessário. Se o arquivo de origem estiver sendo compilado como parte de uma biblioteca em que a API não pode ser alterada, você pode pelo menos corrigir os detalhes da implementação.
Maxpm
Eu já vi o tipo de comentários "isso precisa ser refatorado" se aproximando do código que é reutilizado em outros lugares, mas onde não está muito claro quais são. Geralmente, o desenvolvedor não quer gastar tempo para fazer a análise de impacto e coloca o comentário para amenizar sua culpa.
Joeri Sebrechts
23

Vou adotar um ponto de vista talvez excessivamente cínico.

A refatoração é uma pílula tão difícil de engolir. Você assume a responsabilidade e a culpa, e os frutos do seu trabalho muitas vezes vão para alguém que se baseia em sua base de código limpa.

Eu diria que, se essas práticas de engenharia se tornaram a cultura da sua empresa, talvez você precise lutar em um nível superior. Você não está realmente lutando pela refatoração, está lutando pela excelência em engenharia, e esse é o tipo de mudança que só ocorre na gerência quando ela bate na cara dela. Nesse cenário, eles provavelmente procurarão um czar de práticas recomendadas, e todas as suas grandes idéias serão incluídas de qualquer maneira.

Considere ingressar em uma empresa diferente, onde eles levam as práticas de engenharia mais a sério.

Kevin Hsu
fonte
2
Minha experiência é que a excelência em engenharia raramente paga as contas. É um ato de equilíbrio em que apenas alguns programadores são bons. Desde que o OP não busque excelência em excesso de engenharia, seus comentários são válidos.
mattnz
8
Este é quase sempre o melhor conselho da IMO. Se a empresa não entende por que ter código de qualidade é algo que deve ser incentivado e não visto como perda de tempo, é um esforço perdido - eles não são inteligentes o suficiente para entender a programação real.
Wayne Molina
17

Percebo que muitos dos pôsteres aqui parecem convencidos de que o problema na administração - enquanto a pergunta não menciona isso.

Eu iria além disso: na minha opinião, uma péssima base de código quase nunca é diretamente culpa do gerenciamento. Os gerentes não escreveram esse código, os desenvolvedores fizeram (existem algumas exceções na minha empresa em que alguns de nossos gerentes atuais escreveram a base de código inicial). Portanto, o problema da cultura reside nos desenvolvedores - se eles querem que a cultura mude, eles mesmos terão que mudar.

Tento trazer essa percepção e mudança de atitude aos "meus" desenvolvedores também. Sempre que me perguntam "quando teremos tempo para refatorar?", Fico surpreso e respondo "você já deveria estar refatorando o tempo todo!". A única maneira que acredito que você pode manter uma base de código íntegra é três vezes:

  1. Adicione sempre apenas um código íntegro.
  2. Sempre corrija o código não tão íntegro assim que o vir.
  3. Se, por motivos de prazo, você não puder executar 1 ou 2, sempre tenha uma lista de problemas "corrigir imediatamente após o prazo" e não aceite desculpas por não trabalhar nessa lista após o prazo.


Invariavelmente, a próxima observação dos desenvolvedores é "mas como conseguimos tempo para fazer isso - não temos tempo agora?". A única resposta correta (novamente IMHO) é "você não tem tempo para NÃO fazer isso". Se você não mantiver a base de código em funcionamento, o tempo de resposta será cada vez maior, os agendamentos cada vez mais imprevisíveis, os erros cada vez mais desagradáveis ​​e o valor cada vez menor.

A maior mudança de atitude que você precisa realizar na equipe de desenvolvimento é que "qualidade" não é algo que você faz em um momento específico ("quando temos tempo para refatorar") - é algo que você deve fazer o tempo todo.

Finalmente, uma história de aviso. Se pressionado, negarei que isso tenha acontecido. Em uma empresa em que trabalhei, havia um aplicativo de longa data com uma grande base de código herdada originada há mais de 10 anos. Muitos desenvolvedores, inclusive eu, acreditavam que essa base de código herdada era ruim ou pelo menos desatualizada, e não de última geração. Por isso, fizemos lobby para um grande projeto de refatoração com sucesso e iniciamos o projeto de reescrita, após o qual acreditávamos que tudo seria melhor.
Trabalhamos muito e implementamos quase tudo de uma maneira nova e moderna, usando novas bibliotecas, novos recursos de linguagem. Perto do fim, realizamos um grande esforço para reunir tudo para permitir uma nova versão do aplicativo de longa data com a nova e aprimorada base de código.
Como esperado, o novo lançamento teve alguns problemas iniciais, por causa das novas bibliotecas com as quais ainda não estávamos tão familiarizados e de algumas interações em nosso código que não tínhamos previsto. No entanto, finalmente conseguimos obter o lançamento com o mesmo padrão dos lançamentos anteriores e sair do mercado. Soltamos um suspiro de alívio pelo nosso "sucesso". Então, um subgrupo de desenvolvedores voltou ao gerenciamento, solicitando um novo projeto de refatoração, porque nosso novo código não era exatamente a bala de prata que eles esperavam, e eles viram algumas oportunidades para reescrever completamente algumas coisas ...

Moral da história: muitas vezes as coisas não são tão ruins quanto parecem, e "recomeçar" geralmente significa que você trocará um conjunto conhecido de problemas com um conjunto desconhecido de pelo menos cabeludo. Refatorar uma parte de cada vez!

Joris Timmermans
fonte
2
Eu acho que esse é um caso de modularização, como mencionei na minha resposta, o IMO pode resolver alguns dos problemas dividindo as coisas em aplicativos menores, se possível, então você pode reescrever uma parte dele toda semana, se quiser, enquanto sai os módulos estáveis ​​sozinhos
programmx10
Este artigo é muito adequado: blog.objectmentor.com/articles/2009/01/09/…
Garrett Hall
Veja também o que você nunca deve fazer de Joel Spolsky.
Jan Hudec
Sou totalmente a favor do conselho de que "você não tem tempo para NÃO refatorar". Mas afirmar que esse é o problema do desenvolvedor? Você está brincando comigo? Não sei dizer quantas vezes o gerenciamento (não programadores) literalmente me chamou para o escritório para pedir para parar de refatorar, deixar o código na versão mais recente e rapidamente fazer outra coisa. Temos vários desenvolvedores constantemente argumentando que devemos refatorar, mas o gerenciamento literalmente não o valoriza. Isso é comum quando os gerentes são trabalhadores técnicos em algum domínio que não seja software.
Ely
Bem, pela minha experiência, isso sempre é um problema de gerenciamento. A gerência existe para gerenciar as pessoas, para que elas façam seu trabalho corretamente. Se os programadores não fizerem seu trabalho corretamente (e não escrever código de qualidade significa exatamente isso), então teremos um grande problema no gerenciamento!
Kaiserludi
12

Alguém me disse uma vez que, quando vou a uma entrevista, não devo esquecer que também estou entrevistando a empresa. É um lugar que eu quero trabalhar? Eles fazem revisões de código? Eles têm testes de integração automatizados? Testes unitários? O que eles acham da programação em pares? Pessoalmente, eu encontraria outro emprego e não se esqueça de fazer algumas perguntas também neste momento.

Kevin
fonte
Um bom conselho, mas fazer perguntas nem sempre funciona. Eu entrevistei algumas empresas que mentiram sobre essas coisas - por exemplo, dizendo que usam o controle de versão, mas não está configurado de maneira alguma e ninguém realmente sabe como usá-lo, dizendo que fazem testes, mas não há testes de unidade, dizendo que eles use a tecnologia mais recente e melhor, mas na verdade não está usando nenhum dos recursos da versão mais recente (ou qualquer versão anterior à primeira).
Wayne Molina
5
@Wayne M: Nesse caso, comece a procurar um novo emprego imediatamente. Se eles mentiram para você na entrevista, como eles vão te tratar mais tarde?
David Thornley
1
Concordou, mas infelizmente muitas vezes é mais fácil falar do que fazer.
Wayne Molina
@WayneM Exatamente. Eu experimentei a mesma coisa. Perguntei sobre oportunidades criativas para fazer pesquisa matemática em um emprego, e a empresa basicamente mentiu sobre isso para me fazer aceitar e depois me prendeu a projetos que eu pensava ter eliminado perguntando durante as entrevistas. O conselho "procure um novo emprego" cai bastante - é claro que vou fazer isso, simplesmente não representa nenhum tipo de "solução" para esse problema.
Ely
6

Encontre outra empresa, honestamente. Tais melhorias no processo de desenvolvimento exigem grandes saltos culturais que levarão um tempo significativo até que todos cheguem à mesma página e, a essa altura, você não se importará tanto.

Se você sente que ainda tem alguma briga em você e ainda não caiu, faça um empurrão final. Tente obter o máximo apoio de membros da equipe que pensam da mesma forma, divulgue sua exaustão a superiores que se preocupam com seu bem-estar, evite e distancie qualquer pessoa que possa se opor às suas crenças e tente levar algumas horas obrigatórias de refatoração para planejar novos projetos / recursos.

Se você é apaixonado pelo que faz e se preocupa com a sua empresa, isso seria um esforço louvável do seu lado. Se não for apreciado, respeite-se e saia antes de se tornar um programador vazio.

Filip Dupanović
fonte
5

Se eu tivesse que introduzir uma prática para melhorar as coisas nesse tipo de contexto, seriam revisões de código. Revisões de código são

  • geralmente aceito intuitivamente pelos desenvolvedores como um fator para um melhor código, menos erros, etc.
  • colaborativo e democrático
  • não consome muito tempo se você os timebox corretamente
  • um bom lugar para refatorar se você não tiver tempo para fazê-lo durante o desenvolvimento "normal"
  • um cavalo de Troia bastante eficaz para introduzir gradualmente todos os tipos de práticas recomendadas em termos de design de código, teste de unidade ...

Você não precisa fazer revisões de código sistematicamente, apenas ao confirmar partes de código grandes / complexas primeiro.

Obviamente, se você sente que precisa de aprovação oficial antes de introduzir revisões de código, convém primeiro convencer seu chefe de que a base de código provavelmente entrará em colapso se as coisas continuarem como estão.

guillaume31
fonte
2
Isso pressupõe que os outros conheçam boas práticas de desenvolvimento em primeiro lugar. Tive um emprego uma vez em que os outros membros da equipe nem sabiam por que meu caminho era mais eficaz; meu código bem escrito que seguiu o SOLID e os padrões de design aplicado foi realmente rejeitado em uma "revisão de código" porque era diferente e o desenvolvedor sênior não o entendeu em comparação com o resto do estilo da equipe de usar apenas eventos code-behind e a pasta App_Code /.
Wayne Molina
Muitas vezes, você pode resolver essas dificuldades pedindo às pessoas que tentem do seu jeito e vejam por si mesmas se funciona. Se eles se recusam a fazê-lo ou ainda não vêem os benefícios, devo admitir que provavelmente é hora de desistir.
precisa
1
Me disseram uma vez que meu caminho era "mais sofisticado", mas tive que apresentar a queixa de que era mais difícil de entender. Por outro lado, o FWIW estava copiando um arquivo de 300 linhas, alterando duas linhas e confirmando. A justificativa para copiar / colar nesse caso (e geralmente na minha experiência) é "dessa maneira que você sabe que não quebrou nada".
21711 Kevin
4

Aqui está o que eu faço nessas situações (nos 15 anos da minha carreira como desenvolvedor, encontrei esse código quase todos os dias)

  1. Lidere o exemplo - certifique-se de re-fatorar o código que toquei. Excluo implacavelmente o código antigo comentado e grandes parágrafos de comentários.
  2. Peça re-fatoração toda vez que me for solicitado revisar uma alteração de código, sem a qual não aprovo a revisão.
  3. Lentamente, as pessoas veem a mudança, quando o código se torna mais enxuto, mais legível e, portanto, menos problemático. Leva tempo, mas lentamente toda a equipe aprecia e adota a prática.

A gerência nunca reserva tempo para refazer o código (eles nunca têm recursos suficientes!), Portanto, fazê-lo lenta e firmemente é uma abordagem correta.

Curioso
fonte
Eu não me importo, mesmo que um ou dois bugs apareçam durante a refatoração de código, esse defeito é detectado e corrigido muito mais rápido e facilmente em um código mais limpo / mais enxuto!
Curioso
3

Faça com que a gerência faça alguma pesquisa sobre "dívida técnica". Também os encaminhe à "Teoria da janela quebrada", ambos os efeitos têm impacto direto na eficiência, qualidade e moral.

"Um local de trabalho limpo é um local de trabalho seguro e produtivo", e toda contribuição para uma bagunça compõe a bagunça de maneira exponencial, não linear.

Se a situação não for resolvida, eventualmente você atravessará um ponto sem retorno, onde se torna economicamente inviável, lidando com ela de forma incremental antes que isso aconteça, os benefícios se recuperam, dando a você mais combustível para lidar com o problema à medida que avança.

Marca
fonte
3

Parece que seus problemas são mais gerais.
A questão da refatoração é um sintoma e um alívio potencial de parte do problema.

O líder de software e a equipe alocam o tempo da equipe

Pela minha experiência, acho que você pode estar enfrentando um problema que chamo de "todo mundo é gerente de software". Gerentes de produto, gerentes de projeto e, às vezes, engenheiros e testadores de sistemas podem ser notórios por tentarem gerenciar microdesenvolvedores que provavelmente já possuem um gerente de software experiente. Você pode até ter alguns membros de sua equipe que acreditam que o papel deles é gerenciar.

Se você é o gerente de software, faça atribuições para a refatoração que você deseja, ou melhor ainda, peça à sua equipe que proponha a refatoração para sua aprovação. Para não microgerenciar, você pode ter diretrizes sobre idade / autor / tamanho / contexto do código a ser refatorado que pode ser refatorado livremente versus necessitar de aprovação. Se um membro de sua equipe deseja refatorar massivamente quatro grandes classes de códigos antigos complexos que ele não escreveu e que não fazem parte do recurso, o desvio de duas semanas é o seu problema, então você precisa ter a chance de dizer não.

Você pode se esgueirar, mas acho que é melhor criar suas estimativas cuidadosamente com tempo para análise, design, codificação, várias formas de teste (pelo menos unidade e integração), refatoração e risco, como julgado historicamente e pela falta de experiência ou clareza associadas à tarefa. Se você foi muito aberto sobre o funcionamento de sua equipe (ou possui membros de sua equipe), pode ser aconselhável restringir os canais de comunicação para que eles passem por você e discutam recursos e resultados, não métodos.

Escolhas iniciais do projeto criam um ciclo vicioso para refatoração

A manutenção do software é difícil. É duplamente difícil se outras pessoas na organização estão fazendo escolhas às suas custas. Isso está errado, mas não é novo. Foi abordado por Barry Boehm, um dos nossos grandes escritores de software que apresenta um modelo de gerenciamento que ele descreve como Teoria W.

http://csse.usc.edu/csse/TECHRPTS/1989/usccse89-500/usccse89-500.pdf

Muitas vezes, os desenvolvedores de software são martelados na produção sob a abordagem de gerenciamento Theory-X, que diz que os trabalhadores são basicamente preguiçosos e não terão desempenho a menos que sejam submetidos à submissão. Boehm resume e contrasta seu modelo proposto da seguinte maneira:

"Em vez de caracterizar um gerente como um autocrata (Teoria X), um treinador (Teoria Y) ou um facilitador (Teoria Z), a Teoria W caracteriza o papel principal de um gerente como um negociador entre seus vários eleitores e um empacotador de soluções de projetos Além disso, o gerente também é um determinador de objetivos, um monitor do progresso em direção a objetivos e um ativista na busca de conflitos diários de projeto com perda ou perda, enfrentando-os, e transformá-los em situações em que todos ganham. "

Rápido e sujo é frequentemente apenas sujo

Boehm continua apontando a razão pela qual as coisas são tão infelizes para os desenvolvedores da equipe de manutenção.

"Criar um produto rápido e desleixado pode ser uma" vitória "de baixo custo e de curto prazo para o desenvolvedor e o cliente do software, mas será uma 'perda' para o usuário e o mantenedor." Observe que, no modelo da Boehm, o cliente é mais um administrador de contratos, em vez de um usuário final. Na maioria das empresas, pense no gerente de produto como um substituto do cliente, ou talvez a pessoa que compra o produto para sua lista de recursos.

Minha solução seria não liberar a equipe de desenvolvimento original (ou pelo menos o lead original) até que o código seja refatorado para, pelo menos, atender aos padrões de codificação.

Para o cliente, acho razoável considerar o gerente de produto como um substituto do cliente, e o grupo de pessoas recompensadas por fornecer algo rápido e sujo pode certamente ser expandido, de modo que há um grande número de membros para fazer as coisas da maneira errada.

A refatoração não é negociável

Por favor, não desista de sua função como gerente de software. Você deve ter autoridade e discrição para usar o tempo de sua equipe nas melhorias de processos e produtos. Nessa função, pode ser necessário negociar suas escolhas para tornar sua equipe mais profissional. No entanto, no que diz respeito ao processo, não negocie com marketing, porque, na minha experiência, esse é um jogo perdedor. Negocie com o gerenciamento de engenharia. Isso mostra que você tem visão. A formação de uma equipe profissional de software é uma extensão de seu papel e é muito mais provável que seja vista como ganha-ganha.

DeveloperDon
fonte
2

Você sempre pode esperar. Eventualmente, a equipe perderá prazos suficientes e produzirá software com erros suficientes, para que a gerência levante as mãos e diga que, por Deus, algo teve uma mudança melhor!

Ok, isso é uma proposta arriscada. Mas, na verdade, foi o que aconteceu em nossa loja há vários anos (parte da dificuldade foi se comunicar com a gerência sobre prazos, mas isso é outra história), e é o motivo pelo qual agora temos dezenas de milhares de testes automatizados, propriedade de código compartilhado, a liberdade de refatorar, a vontade de excluir código morto e os lançamentos da mais alta qualidade que já tivemos.

Talvez o mais surpreendente seja que ninguém tenha perdido o emprego no processo - algo que eu atribuo ao nosso chefe que vem nos atacar e a um consultor que defendeu a refatoração e a integração contínua em nosso nome. Sempre soa mais convincente quando alguém de fora está dizendo isso.

Joe White
fonte
Concordo, mas no caso do OP realmente parece que ele está trabalhando com um monte de hackers incompetentes, então, quando tudo cai ao seu redor, nunca afunda, é porque eles não refatoraram o código ruim, porque se eles pudessem entender isso o código não seria tão ruim quanto parece. Desenvolvedores reais conhecem os benefícios da refatoração desde o início e tomam as medidas necessárias desde o início.
Wayne Molina
1

Acho que a resposta para encontrar tempo depende de por que você deseja refatorar o código.

Se funcionar, não há necessidade de refatorar especial e você poderá fazê-lo quando tocar nessa parte do código. Portanto, você não precisa de um tempo especial para isso.

Se isso atrasa o desenvolvimento da equipe, você precisa conversar com o líder da equipe sobre isso e criar uma tarefa especial para refatoração, e assim você terá tempo.

O mesmo para velocidade de execução e outros casos, se o refator puder melhorar algo e não apenas "boa aparência de código" ou sua opinião sobre como a aparência do código e fornecer benefícios reais, criar tarefas ou conversar com alguém responsável por isso.

Dainius
fonte
1

Eu ri um pouco da maneira como você descreveu as coisas, pois soa muito semelhante à base de código em que trabalho, então acho que nossas situações são bem parecidas. Felizmente, na minha situação, tenho um gerente de visão de futuro que decidiu que a melhor maneira de melhorar a base de código é através da modularização usando uma estrutura de desenvolvimento da Web moderna, em vez de apenas refatorar toda a base de código. Dessa forma, os pontos problemáticos do aplicativo principal podem ser reescritos como módulos separados e, em seguida, integrados ao aplicativo principal (mas ainda assim essencialmente independentes). Essa pode ser uma abordagem que você deseja apresentar, pois não exigiria a refatoração de toda a base de código (presumivelmente grande?) Com a qual você está trabalhando.

É claro que posso estar um pouco distante do que você está dizendo, pois talvez sua base de código não seja tão ruim quanto a que trabalho, nesse caso, eu diria por que não fazer pequenas otimizações ao longo do processo? Os desenvolvedores da minha equipe não têm problemas para remover comentários estúpidos ou desatualizados e coisas dessa natureza, e eu não acho que isso exija alguma contribuição da gerência, já que geralmente os desenvolvedores recebem algum poder para otimizar as coisas conforme necessário.

Se a base de código é realmente frágil, é preciso ter cuidado e pode ser por isso que eles podem não querer realizar uma refatoração maior, pois isso pode acabar se transformando em um projeto de meses e provavelmente exigiria ramificação de um projeto e colocação de desenvolvedores nesse processo. projeto e retirando-se de outras tarefas de desenvolvimento, como correções imediatas de erros que podem causar perda de clientes etc.

Todas as coisas consideradas, tanto quanto as outras pessoas dizendo que você deve parar, etc, acho que depende de como a gerência vê as coisas, se elas entendem a situação e percebem por que algumas coisas podem demorar mais do que deveriam, então as coisas podem ficar bem. no que diz respeito ao ambiente de trabalho, mas se eles estão constantemente informando sobre um acúmulo de trabalho, isso pode se tornar prejudicial ao longo do tempo. Tenho a sorte de ter um gerenciamento que basicamente percebe que o aplicativo é uma porcaria, mas ele tem muitos clientes e gera dinheiro, por isso ainda é valioso e vale a pena corrigir bugs, mesmo que a curto prazo .

programmx10
fonte
1

Seu principal problema é que os códigos não estão recebendo visibilidade suficiente.

Sugiro usar uma ferramenta de integração contínua como Jenkins e uma ferramenta de análise de código estática integrada a ela que mede a complexidade ciclomática, padrões de nomeação, tamanho do código etc.

Quando um programador faz uma alteração, Jenkins executa os testes de unidade, executa a ferramenta de análise de código estático e gera um relatório na web que todos podem ver, com status de cor semelhante a um semáforo.

Quando a qualidade do código é visível para todos (especialmente o líder da equipe e o chefe) e o controle de versão e os testes de unidade existem para ajudar você, as pessoas se sentem incentivadas a refatorar.

Tulains Córdova
fonte
1

O código ficou assim lentamente ao longo de muitas pequenas alterações. Também precisará ser corrigido dessa maneira.

Você pode fazer isso à medida que avança, antes de tudo - aumente todas as estimativas em 10% para permitir aprimoramento do código e manutenção a longo prazo. Se alguém reclamar, pergunte se é melhor verificar o óleo no motor de um carro toda semana ou esperar até que o motor trave completamente.

Faça uma reunião e determine os padrões de codificação consistentes.

Introduzir regras básicas para usar à medida que avança:

Sempre que um novo código é introduzido em uma classe, é necessário escrever testes automatizados para provar que a classe funciona (não apenas o novo código).

Sempre que um bug é corrigido, testes automáticos precisam ser escritos para provar que a classe funciona (não apenas o código fixo).

Sempre que um programador modifica um arquivo, ele precisa corrigir todos os avisos do compilador nesse arquivo e atualizar o código para que ele atenda aos novos padrões de codificação.

Depois de um tempo, o código mais usado estará atualizado e será coberto por testes automatizados. O código mais antigo será atualizado quando for alterado, se nunca for alterado, você nunca precisará se preocupar com isso.

O importante é incorporar esses hábitos nas tarefas de codificação padrão, para que nenhum deles gaste muito tempo longe do trabalho "real", mas todos eles fornecem benefícios reais. Não tente criar um projeto com refatoração de código antigo, pois é uma dor horrível, chata e complicada que parecerá muito tempo desperdiçando para não técnicos!

Stefan
fonte
0

A maneira de obter os recursos (tempo) necessários é concentrar-se no alinhamento da capacidade e do desejo. Seu chefe é orientado por metas (normalmente lucros ou prazos de entrega para novos recursos) e vê a refatoração como engenheiros perdendo tempo e consumindo essas metas. Você precisa encontrar uma maneira de convencê-lo de que os objetivos serão alcançados e excedidos se você passar algum tempo refatorando.

Então, o primeiro passo é descobrir que dor seu chefe está sentindo. Identifique quais são seus maiores problemas. Depois, elabore como o que você deseja fazer se alinha com a solução dos problemas dele e apresente um forte argumento comercial para isso. Use os sistemas de rastreamento de defeitos e planejamento de projetos (excedentes de tempo) para fornecer evidências de onde estão os problemas. Você precisa de fatos, não sentimentos. Sem métricas (contagem de bugs / módulo, custo para corrigi-las), a refatoração é apenas um programador que está jogando às custas de alguém. Seu chefe apenas fornecerá os recursos necessários se você puder mostrar um forte argumento comercial para fazê-lo.

Código de porcaria é mais frequentemente do que não é muito caro para corrigir. Sem testes de regressão automatizados, o custo do teste de código refatorado é extremamente alto.

Na maioria das vezes eu vi códigos ruins precisando de refatoração, houve um grande número de recursos não documentados e complexidade nos requisitos que não podem ser entendidos desde o início. Não é um empreendimento menor e minha experiência é uma ordem de magnitude mais difícil de estimar o custo de um trabalho de refatoração do que adicionar um novo recurso.

Eu me absteria de seguir em frente e fazê-lo pelas costas de seus chefes (se não estava quebrado e você o quebrou, como isso parece) - conserte o código que precisa ser alterado de qualquer maneira, mas se não estiver quebrado, não Não conserte.

mattnz
fonte
2
Quanto à manutenção da sanidade - você precisa entender o que motiva as pessoas na organização. Depois que você entende pequenas coisas, como o chefe não se importa com a aparência do código, fica mais fácil. Se isso não funcionar, troque de emprego ou envolva-se em um projeto de código aberto e refatore tudo o que quiser.
mattnz
3
"Se não está quebrado, não conserte" é a pior das frases em todo o nosso campo e precisa ser removido inteiramente da verborragia. Ela promove o comportamento negligente e incentiva uma cultura de cortar coisas juntos ao invés de fazê-lo direito, e por associação impede que ele está sendo feito certo no futuro. Essa atitude é um câncer.
Wayne Molina
1
Veja o meu comentário acima, é por isso.
Wayne Molina
2
@Wayne M: Eu não acho que mattnz está dizendo "não conserte, nunca", acho que o que ele está dizendo é "não conserte, a menos que seja bom para a organização e você possa obter apoio", o que é muito diferente e bastante razoável, IMO.
PeterAllenWebb
3
@ Wayne M: bem dito! O ditado "se não está quebrado, não conserte" e a palavra "refatoração" simplesmente não se encaixam. A própria essência da refatoração é que o desenvolvimento de software simplesmente não é um mundo em preto e branco onde "quebrado" e "fixo" são absolutos.
Carson63000 #
0

Estranhamente, ninguém menciona isso:

Para tornar as coisas uma prioridade, facilite-as: Obtenha uma boa ferramenta de refatoração.

Existem excelentes ferramentas de refatoração por aí (pelo menos para o .NET afaik). Ah, e não se esqueça de escrever testes de unidade com antecedência (como outros já apontaram).

Boa sorte!

Marcel
fonte