Essa é uma pergunta que eu sempre me pergunto ao trabalhar com desenvolvedores. Eu trabalhei em quatro empresas até agora e fiquei ciente da falta de atenção para manter o código limpo e lidar com as dívidas técnicas que impedem o progresso futuro de um aplicativo de software. Por exemplo, a primeira empresa em que trabalhei tinha escrito um banco de dados do zero, em vez de usar algo como MySQL e isso criou um inferno para a equipe ao refatorar ou estender o aplicativo. Sempre tentei ser honesto e claro com meu gerente quando ele discute projeções, mas a gerência não parece interessada em consertar o que já está lá e é horrível ver o impacto que isso tem no moral da equipe.
Quais são seus pensamentos sobre a melhor maneira de resolver esse problema? O que eu vi são pessoas fazendo as malas e saindo. A empresa então se torna uma porta giratória com os desenvolvedores entrando e saindo e piorando o código. Como você comunica isso à gerência para que eles se interessem em resolver as dívidas técnicas ?
fonte
Respostas:
Quando me encontrei com meu chefe para discutir isso, ele disse que eu deveria incluir a refatoração em todas as minhas estimativas. Ele disse que não é um problema que ele queira pensar. Em vez disso, eu deveria lidar com isso.
Este não é um problema que a gerência em geral queira pensar. Eles não são os engenheiros, você é. Apenas faça disso uma parte tácita de todas as suas estimativas e você descobrirá que a dívida técnica diminui.
Mas nunca será perfeito. A dívida técnica, como a dívida de cartão de crédito, é um investimento para obter clientes mais rapidamente e ganhar participação de mercado mais rapidamente que seus concorrentes. Assim como o crédito, se gerenciado adequadamente, pode torná-lo bem-sucedido.
fonte
É como Gandhi disse quando perguntado se sua tática funcionaria com alguém como Hitler. Ele disse: "Seria difícil". Mas acho que há um argumento justo de que a resposta realmente é "não". Infelizmente, não acho que o que você está tentando fazer possa ser feito. Não é que eu esteja tentando ser pessimista, mas estou tentando ser honesto.
O problema para mim não é que os gerentes precisem ser convincentes. Os melhores já entendem que a dívida pode ser um assassino se não for gerenciada. Mas, entendam ou não, sejam bons ou maus gerentes, todos enfrentam a pressão para entregar, e essa entrega é julgada por seus chefes contra uma data. A qualidade só importa se for extremamente ruim; nesse caso, é culpa dos desenvolvedores ou extremamente boa; nesse caso, é o brilho da gerência que fez isso acontecer. A qualidade só precisa ser "boa o suficiente".
Acho que gosto do que Renesis disse em sua resposta, porque é um dos poucos que entende que a gerência pensa de maneira muito diferente da engenharia. E acho que todos nós vimos a progressão das empresas para se tornarem orientadas por datas e mais gerenciadas por projetos, em vez de focadas no cliente e na qualidade. Com isso, quero dizer empresas típicas, não as realmente robustas que têm a coragem de dizer "Isso será feito quando for feito" (como Apple Computer ou id Software - e sim, eu entendo que às vezes as pessoas não têm liberdade adotar essa abordagem).
Mas eis o seguinte: empresas que adotam a abordagem de qualidade primeiro ... o que você percebe sobre elas? É isso mesmo, eles são administrados por engenheiros, não vendedores, comerciantes, gerentes de projeto ou contadores. Pense na HP, Apple, ID, Google, Microsoft e IBM. Tudo começou e foi bem-sucedido por engenheiros, não por vendedores, embora os vendedores certamente tenham contribuído, e tenho certeza que muitos debateriam ter a Microsoft associada à qualidade :). E desses, os que desceram a montanha se afastaram da liderança impulsionada pela engenharia. No entanto, há uma série de argumentos nessa declaração, pois há muitas empresas técnicas que falharam devido à incapacidade de se adaptar aos novos tempos e gerenciar seu próprio crescimento. Não vejo a liderança baseada em engenharia como a causa dessas falhas, para mim que ' é uma questão de habilidades e perspicácia nos negócios que independem de alguém ser desenvolvedor ou contador. Penso, de modo geral, que há uma dedicação em engenharia aos rigores da responsabilidade e da disciplina que beneficiam as empresas em que a engenharia é um componente.
Sério, olhe em volta. Falta muito a liderança de TI. O foco está sempre no custo e no tempo, e raramente na qualidade, desde que seja bom o suficiente. Os líderes de TI raramente se reportam mais ao CEO, agora é sempre o CFO. A TI está presa ao suporte à produção e é cada vez mais devida aos gerentes de projeto cujo foco está em blocos menores, mais digeríveis e mensuráveis, sem mudanças significativas de valor revolucionário (não que isso seja necessariamente errado; dividir e conquistar é uma coisa boa, mas a visão precisa estar lá para o quadro geral).
Desculpe por demorar tanto neste post, mas, no final, acho que sua pergunta, sobre como fazer com que a gerência se preocupe com a dívida técnica, geralmente é melhor resolvida encontrando o líder certo, em vez de mudar o existente. Explicar a dívida técnica para pensadores comuns significa mudar o foco para dinheiro e custo, como Renesis disse, e acho que isso perde muito em tradução; mesmo se você fosse bem-sucedido, importaria apenas se o principal líder da empresa o comprasse. Convencer o gerente do meio a fazer a coisa certa provavelmente só o despedirá.
fonte
A primeira coisa a fazer é mudar a redação. Chamar isso de "dívida técnica" dá à administração a idéia de que permitir algum tipo de investimento - quando na verdade é mais como um vírus. (Eu sou como o Dave Ramsey da dívida técnica.)
Permitir que ele não seja pago tem um custo enorme que não pode ser visto ou quantificado facilmente.
Liste problemas como os seguintes para gerenciamento:
fonte
Na verdade, minha gerência começou a fazer um esforço sério para lidar com a dívida técnica, que é uma das razões pelas quais gosto de trabalhar lá, mas é um esforço de longo prazo e nunca é demais lembrá-los por que o esforço vale a pena.
Uma maneira de manter a pressão é sempre que me pedem uma estimativa, e o tempo poderia ter sido economizado se eu não precisasse lidar com questões técnicas específicas da dívida, incluo isso na minha estimativa . Por exemplo, " Esse bug levará de dois a três dias para rastrear, mas se já tivéssemos resolvido esses dois outros bugs de 'baixa prioridade' que estavam na fila para sempre, provavelmente levaria menos de um. " a resposta será seguir em frente e consertar os outros enquanto você estiver nisso.
Também concordo com outras respostas sobre considerar as melhorias como parte do seu trabalho e executá-las à medida que avança, se isso não for muito perturbador. Minha tarefa atual envolve fazer acréscimos a algum código muito mal projetado. Em vez de aumentar a bagunça escrevendo meu novo código para corresponder, estou gastando um pouco de tempo consolidando funcionalidades comuns, portanto, o envio de um pacote se torna uma chamada de função de uma linha, em vez de repetir constantemente 15 linhas de cópia-e- ligeiramente modificadas colar clichê.
De fato, sei que isso vai salvar a sanidade de alguns mantenedores mais adiante. Eu sei porque sou o mantenedor hoje. No entanto, também acredito que isso irá acelerar minha própria tarefa atual de obter e depurar esse recurso agora.
Outra técnica que usei no passado e devo fazer novamente é manter uma ramificação DVCS de refatoração em uma árvore de trabalho separada, para que ocorra um tempo de inatividade durante a compilação, a espera de um longo teste ou apenas a necessidade de uma mudança de ritmo. um pouco quando você está cansado de um bug. Contanto que você ocasionalmente se junte à montante, para não divergir muito, poderá demorar o tempo que desejar na refatoração de alterações com muito pouco esforço marginal. 15 minutos aqui e ali por dia podem realmente aumentar com o tempo.
fonte
Você pode tentar a analogia do cartão de crédito. Pergunte a eles "você se sente à vontade para deixar os extratos do seu cartão de crédito sem pagamento por um longo período de tempo?"
Os gerentes entendem os custos e benefícios, mas (geralmente) não os termos técnicos usados por nós desenvolvedores. O termo "dívida técnica" já foi inventado para ajudar a superar essa barreira de comunicação, mas você pode precisar articulá-la com mais clareza. A maioria dos gerentes sabe muito bem (geralmente por experiência própria) que os pagamentos em atraso com cartão de crédito crescem com uma taxa de juros horrível, por isso é difícil deixá-los sem pagamento. Isso pode ajudá-los a obter a seriedade do problema em relação à entropia de software.
Mas se isso não os convencer, tente coletar evidências factuais e faça alguns cálculos. Por exemplo, quanto custa para a empresa - tanto em dinheiro vivo quanto em tempo perdido - substituir um funcionário que está deixando o cargo.
fonte
Ninguém dará dinheiro para substituir algo que funcione por outro que (com alguma sorte) também funcione.
O que você pode fazer é propor a substituição por algo que faça mais, ou seja, agrupar o serviço da dívida tecnológica em uma atualização que traga benefícios comerciais instantâneos e tangíveis.
É claro que você deve ser aberto sobre isso, não estamos falando de "enfiar" um novo projeto aqui.
Acho o outro lado, o dos desenvolvedores mais difícil de lidar. Basicamente, tudo se resume a isso: para alguns desenvolvedores, garantir que seu código seja o melhor possível, é uma questão de orgulho profissional. Para outros, este é apenas mais um trabalho e o objetivo é fazê-lo rapidamente e ir para casa.
Nenhuma quantidade de convencimento mudará essa situação e, se você introduzir um padrão de qualidade de código obrigatório, seus nove a cinco desenvolvedores encontrarão uma maneira de trabalhar com o sistema, enquanto seus desenvolvedores dedicados ficarão inevitavelmente irritados com todo o procedimento (o que não é não visa a eles, mas você não pode dizer que o desenvolvedor X deve obedecer às regras, enquanto Y pode fazer o que quiser).
O que funciona, mas ainda pode ser muito frustrante, é ter seus desenvolvedores mais dedicados e conhecedores supervisionando a base de código, provavelmente uma boa troca entre avançar e arrumar o que já está lá.
fonte
O fato é que, em muitas empresas, principalmente devido à atual situação econômica, cada hora deve ser cobrada de alguém.
Ou eles caem rápido .
A menos que os clientes existentes estejam dispostos a pagar pela refatoração, o que é profundamente improvável, a menos que seja fornecido com desempenho ou recursos significativamente atualizados. Então isso não acontecerá nas bases de código mais antigas. Talvez você possa se infiltrar no orçamento de projetos mais recentes, se os clientes tiverem bolsos profundos, mas, a menos que você não precise alterar as APIs na refatoração, isso será inútil para projetos mais antigos e poderá introduzir um situação em que a empresa está apoiando duas bases de código, o que causa mais dores de cabeça e custos.
Como engenheiro, eu adoraria refatorar o código antigo, que não é mais realmente adequado ao objetivo, toda vez que algo se torna obsoleto ou obsoleto. Mas como meus médicos de todas as empresas em que trabalhei me disseram: "Quem pagará?"
fonte
Eu sempre tento limpar enquanto vou. Não terminei até que o código esteja limpo. O problema da dívida técnica é que a maioria das pessoas não a entende. A melhor maneira de lidar com isso é não acumular nada. Se seus gerentes confiam em seus desenvolvedores para decidir como resolver um problema, você pode tornar a higiene do código parte de todas as tarefas de programação. Se você nunca verificar o código incorreto, não acumula dívidas. Se você também seguir a regra dos escoteiros (sempre deixe o código mais limpo do que o encontrou), sua dívida existente desaparecerá lentamente.
Não vejo a refatoração como uma tarefa separada da implementação de recursos. É parte integrante disso.
fonte
Se você estiver lidando com gerentes não técnicos, ajudaria se você pudesse converter sua discussão em termos que eles entendam. Se você pode criar um argumento realista para um ROI positivo no trabalho gasto para pagar a dívida técnica, poderá chegar a algum lugar. Esse exercício dependerá das suas circunstâncias, mas um exemplo pode ser algo assim:
Analise quanto tempo os desenvolvedores são forçados a gastar ajudando o Suporte com problemas de produção e defenda que a correção de códigos antigos prejudiciais A. reduziria o número de problemas de suporte, B. facilitaria o Suporte a resolver problemas sem passar para o Desenvolvimento e C. reduzir o tempo que o desenvolvimento gasta nos problemas de produção quando eles surgem. Coloque isso em termos de dinheiro economizado por não ter os desenvolvedores envolvidos no trabalho de suporte. Lembre também que toda hora que um desenvolvedor gasta prestando suporte é um "golpe duplo", porque não apenas você está pagando um desenvolvedor para suporte, mas também está queimando o custo de oportunidade do que o desenvolvedor poderia estar fazendo (adicionando novos recursos, etc. .)
Sim, alguns dos números serão vodu / fumaça-e-espelhos ... tudo bem, o segredo sujo da gerência é que eles sabem que a maioria dos números que eles usam são totais BS Contanto que você lhes dê algo aparentemente concreto para trabalhar, para que eles possam entender isso, você tem uma chance de lutar.
fonte
Após esta explicação da dívida técnica, sua gerência deve estar convencida de que deve pagar:
A cozinha é o seu código, a refeição é o seu produto, e comer está vendendo o seu produto.
Se eles podem esperar mais tempo para que uma mudança seja implementada, sem uma rede segura de testes de unidade, então há algo errado na sua empresa.
fonte
Tem que ser um argumento muito convincente, em termos do produto original e do caso de negócios, que eu não poderia usar esse dinheiro agora para fazer algo mais importante para mim. Goste ou não, sua gerência ou seus clientes estão pagando por isso e você precisa vender para convencê-los.
Vamos reformular isso para se posicionar como cliente. Boa e velha dramatização.
Como cliente, qual você compraria?
E o que os engenheiros da Acme Deluxe acham que é a melhor resposta?
fonte
A " dívida técnica " pode ser um assunto complicado para apresentar à administração, pois eles podem não perceber a necessidade. A pergunta pode ser formulada como se existe ou não um campeão na empresa para declarar: "Olha, estamos gastando X% de tempo para trabalhar na dívida técnica aqui. Dê-nos três meses para mostrar que isso funciona bem" ou algo assim semelhante. Existe uma reivindicação de autonomia lá, mas também um período de tempo, pois, caso contrário, a administração pode se perguntar quanto tempo até verem alguns resultados, o que é um território bastante perigoso.
O primeiro ponto, porém, é se eles veem isso como um problema. Se a pessoa com baixa visão não sabe nada sobre óculos e que tipo de mudanças ela pode proporcionar, como deve entender por que um exame oftalmológico pode ser valioso? A mesma idéia aqui, onde o assunto é bastante técnico e não é facilmente quantificado, infelizmente.
fonte
Você deveria parar de reclamar.
Aqui está o porquê:
Então, o melhor caminho a seguir é:
fonte
Suponho que você nunca esteve envolvido em um projeto para reescrever / substituir ou até atualizar o sistema existente.
Estes são alguns dos projetos mais difíceis de concluir com sucesso. Alguns dos problemas que você encontrará são:
Exorto você a evitar qualquer projeto de reescrita / refatoração como a praga, pois essas podem ser algumas das experiências mais desanimadoras da carreira de qualquer profissional.
Há muita sabedoria na frase "Se não está quebrado, não conserte".
fonte
Pela minha vida, não consigo entender por que algumas pessoas têm tanto medo das mudanças - cegam a falta de confiança em suas próprias habilidades.
Eu assisti a um show ontem à noite no Parque Nacional de Yosemite e foi observado que, de 1940 a finais da década de 90, nenhuma árvore sequóia nova brotou. Foi descoberto que a razão disso era que havia uma política estrita contra a queima de incêndios florestais e que as pinhas das sequóias precisavam do calor do fogo para abrir e liberar suas sementes.
Veja bem, um incêndio a cada dez anos mais ou menos era saudável. Limpou toda a madeira morta e amora acumulada para manter saudáveis as árvores (processos) existentes e abrir espaço para novas (características).
Neste momento, estou em um projeto que tem um caso claro de reconstrução: o software legado foi escrito inteiramente usando formulários da web .NET. Quase toda a lógica de negócios é combinada com a lógica de exibição de tags HTML / servidor e não pode ser estendida para outros aplicativos agora que os negócios cresceram.
A gerência está por trás da tarefa, porque eles têm uma confiança adequada em seus desenvolvedores, o que, eu percebo, é um luxo raro.
Sim, pergunte a si mesmo se uma reconstrução é realmente necessária. Faça o possível para reutilizar o código existente que funciona onde você pode. Integre esse código à reconstrução, se necessário. Só não deixe ninguém te convencer de que ter medo de fazer mudanças ousadas é a única maneira de existir como desenvolvedor de software.
Boa sorte!
fonte
Você precisa fornecer à sua administração uma razão financeira para lidar com a dívida técnica e uma estrutura para gerenciar a redução dessa dívida técnica.
Manter um roteiro tecnológico é uma dessas estruturas. Começar com um roteiro ajudará você a não acumular dívidas técnicas e também poderá reduzir a dívida existente.
Muitos projetos bem-sucedidos de longo prazo associaram comitês de direção e roteiros para orientar o desenvolvimento. Isso é especialmente útil quando há várias equipes de desenvolvimento e partes interessadas envolvidas.
Minha sugestão é que você discuta essa estratégia com seus gerentes (e se possível com aqueles que tomam decisões sobre onde o dinheiro é gasto).
A abordagem geral para criar e gerenciar um roteiro é direta, mas requer o apoio de sua equipe de gerenciamento. Primeiro, defina uma meta. Defina os elementos da dívida técnica e desenvolva uma arquitetura de sistema de destino que reduz elementos da sua dívida técnica. Lembre-se de que não precisa ser perfeito, apenas viável e melhor do que você é atualmente. Leve em consideração software, ferramentas de desenvolvimento, plataformas de hardware, os principais novos recursos que podem ser adicionados ao sistema. Faça uma análise de custo. Se você possui a arquitetura desejada, quais são os benefícios tangíveis da execução da refatoração? (Os benefícios incluem tempo de teste reduzido, produtos de software mais confiáveis, ciclos de desenvolvimento mais previsíveis etc.) Se você puder mostrar benefícios suficientes para executar a refatoração, poderá obter suporte de gerenciamento.
Depois de ter um roteiro e suporte de gerenciamento, desenvolva uma série de etapas (também chamadas de plano) que você precisa seguir para chegar ao estado desejado. Pode ser uma boa idéia montar um comitê de direção que mantenha o roteiro, treine e instrua as equipes de desenvolvimento no roteiro e revise periodicamente as alterações para a integridade da arquitetura.
Os roteiros são realmente úteis, e talvez a 13ª pergunta do Joel Test deva ser "Você tem um roteiro?"
Aqui está um vídeo da primeira hora de uma sessão recente do roteiro do Red Hat Linux .
fonte
Já tendo participado de uma grande reescrita (não apenas refatorada), posso concordar que fazer com que os responsáveis financeiros concordem com o projeto foi um dos maiores obstáculos. Superar esse obstáculo exigia que eu escrevesse, apresentasse e defendesse um relatório que apontava uma série de questões que significavam que os negócios da empresa estariam mortos na água a curto e médio prazo.
Fatores-chave para levar o acordo adiante:
O relatório detalhou os problemas, com estimativas de custos contínuos, e ofereceu três opções:
Tendo conseguido a 3ª opção, meu contrato de 3 meses se transformou em 3 anos de trabalho muito duro, desenvolvendo o novo software e hardware, mas com um resultado muito bom.
Para casos com dívidas técnicas menos extremas, costumo adotar o que chamo de refatoração de guerrilha:
Quando há um problema com um módulo específico:
fonte