Recentemente, comecei a trabalhar em um projeto em que um aplicativo monolítico muito antigo está sendo migrado para a arquitetura baseada em microsserviços.
A base de código herdada é muito confusa ('código de espaguete') e geralmente uma função aparentemente simples (por exemplo, denominada "multiplyValueByTen") mais tarde se revela como "milhares de linhas de código de validação envolvendo 10 tabelas em 3 esquemas diferentes".
Agora, meu chefe está (com razão) me pedindo para estimar quanto tempo levaria para escrever o recurso X na nova arquitetura. Mas estou tendo dificuldades em apresentar uma estimativa realista; freqüentemente subestimo imensamente a tarefa devido a razões que afirmei acima e me envergonho porque não consigo terminar a tempo.
A coisa sensata pode parecer realmente entrar no código, anotar todas as ramificações e chamadas para outras funções e depois estimar o custo do tempo. Mas há realmente uma diferença minúscula entre documentar o código antigo e realmente escrever a nova versão.
Como devo abordar um cenário como este?
Embora eu entenda perfeitamente como funciona a refatoração de código legado, minha pergunta não é sobre "como refatorar / reescrever?" mas sobre dar uma resposta realista a "quanto tempo levaria para refatorar / reescrever a parte X?"
fonte
Respostas:
Leia "Clean Coder", de Bob Martin (e "Clean Code", enquanto você faz isso). A seguir, é de memória, mas eu sugiro fortemente que você compre sua própria cópia.
O que você precisa fazer é uma média ponderada de três pontos. Você faz três estimativas para cada trabalho:
Sua estimativa é então (a + b + 2c) / 4
Editar:
Minhas suposições quando eu respondi isso:
A média ponderada de três pontos funciona bem nesse caso. É rápido, compreensível para os não técnicos e, ao longo de várias estimativas, deve ter uma média aproximada da precisão. Especialmente se o OP seguir meus conselhos sobre como manter registros de estimativas e dados reais. Quando você sabe como é o "pior caso" e o "melhor caso" do mundo real, pode alimentar os dados reais em suas estimativas futuras e até mesmo ajustá-las ao gerente de projetos, se o pior caso for pior do que você pensava.
Vamos fazer um exemplo trabalhado:
Não tenha medo de ajustar a fórmula. Talvez metade das tarefas acabe sendo pesadelo e apenas dez por cento sejam fáceis; então você faz o estmate a / 10 + b / 2 + 2c / 5. Aprenda com sua experiência.
Observe que não estou fazendo suposições sobre a qualidade do PM. Um PM ruim fornecerá uma estimativa curta ao conselho do projeto para obter aprovação e, em seguida, intimidará a equipe do projeto para tentar alcançar o prazo irrealista com o qual se comprometeram. A única defesa é manter um registro para que você possa ser visto dando suas estimativas e se aproximando delas.
fonte
Esse pode ser um bom momento para introduzir uma abordagem quase ágil. Se, em vez de estimar em termos de horas / dias, você alocou uma escala do tipo fibonacci e atribuiu a cada tarefa um valor com base no tamanho:
Depois que você estimar várias tarefas como essa, trabalha nelas. Em um ambiente ágil, você desenvolve 'velocidade', que é uma medida de quantos pontos você alcança em, digamos, uma semana. Depois de fazer algumas semanas de teste e aprendizado (você pode vendê-lo ao seu gerente como parte do processo - "Vou precisar de algumas semanas de teste e aprender a entender o processo de estimativa"). mais confiante em quantos pontos você pode passar a cada semana e, portanto, você pode traduzir sua estimativa de pontos mais rapidamente no tempo.
https://pm.stackexchange.com/questions/4251/why-would-teams-use-the-fibonacci-sequence-for-story-points
https://stackoverflow.com/questions/9362286/why-is-the-fibonacci-series-used-in-agile-planning-poker
Isso não é realmente ágil, pois não envolveria as cerimônias, mas eu entendi do OP que ele é ele mesmo. Esperamos que essa abordagem possa fornecer estimativas mais confiáveis.
fonte
A primeira coisa a fazer é começar a coletar dados sobre quanto tempo você leva para fazer qualquer coisa no momento. Quanto mais dados você tiver sobre o desempenho de sua equipe, melhor. Vai estar em toda parte, mas não se preocupe com isso agora. É a verdade e você precisa mostrar a realidade do seu chefe.
Então você vai comprar alguns livros.
O livro de McConnell diz para você começar a coletar dados e depois explicar como usá-los para obter estimativas mais precisas. Sempre dê uma estimativa de 3 pontos! Sempre. Certifique-se de destacar as partes do livro que falam sobre como a baixa qualidade do código afetará suas estimativas. Mostre-os ao seu chefe.
Explique que se estimativas precisas são importantes para a empresa, você precisará começar a aplicar o que está aprendendo com o livro de Feather. Se você deseja avançar de maneira rápida, suave e previsível, precisará refatorar o código e colocá-lo em um equipamento de teste. Eu estive exatamente onde você está. O tempo de desenvolvimento é completamente imprevisível, porque você não tem idéia do que poderia quebrar, certo? ... Sim. Coloque-o em um equipamento de teste. Um servidor de CI para executar esses testes também não poderia prejudicar.
Por fim, explique ao seu chefe que as coisas ainda serão um pouco imprevisíveis por um tempo. Provavelmente daqui a alguns anos, mas esse desenvolvimento se tornará mais fácil diariamente e as estimativas se tornarão mais precisas conforme você tiver mais dados e o código melhorar. Este é um investimento de longo prazo para a empresa. Eu passei por isso recentemente, levou quase 2 anos para se tornar mais previsível.
Sei que falei mais sobre melhorar o código do que estimar, mas a dura verdade é que suas estimativas serão péssimas até que você possa domesticar a base de código herdada. Enquanto isso, use o desempenho histórico para avaliar quanto tempo levará. Com o passar do tempo, convém levar em consideração se você já obteve ou não o código especificado nas suas estimativas.
fonte
Talvez você esteja pensando em enviar uma estimativa. Tenho que trabalhar no código legado e, quando faço uma estimativa mais formal, costumo fazer dois ou três :
Todas as três estimativas levam em consideração o grau de resistência do recurso, qualquer experiência que eu tenha tido com essa base geral de códigos e meu pressentimento sobre a mudança (que eu acho que pode ser bastante precisa)
Depois que essas estimativas são divulgadas, mantenho meu gerente atualizado sobre qual deles parece que estamos lidando. Se estivermos olhando para uma característica abissal, talvez tenhamos que sacrificá-la - aconteceu. Se o seu chefe não pode aceitar a existência de recursos abissais para um determinado pedaço de código legado, desejo-lhes boa sorte, pois eles terão uma vida muito difícil e frustrante.
fonte
Quando enfrentei esse tipo de problema, contei com intervalos nas minhas estimativas. Comecei a dizer aos meus chefes que "é difícil fazer boas estimativas imediatas nessa base de código. Se você pedir uma, será uma estimativa muito ampla". Eu dei "3 dias a 3 anos" como uma estimativa uma vez. Escusado será dizer que não era uma estimativa popular, mas é o que eu dei.
A chave para isso é um acordo que atualizarei minhas estimativas à medida que o trabalho avança. Então, se eu for informado "Implementar XYZ, quanto tempo vai demorar?" minha resposta pode ser "algo entre um dia e quatro meses. No entanto, se você me deixar analisar o código por algumas horas, posso reduzir a incerteza nessa janela". Então eu vou olhar o código e voltar com "2 a 4 semanas". Essa ainda não é uma janela ideal, mas pelo menos é algo que pode ser gerenciado.
Existem algumas chaves para isso:
Se eu tiver um chefe que não se sinta confortável em receber um intervalo atualizado à medida que for, darei a ele um número único e minha metodologia. Minha metodologia é uma combinação de uma regra prática que me disseram como jovem desenvolvedor e a lei de Hofstader .
fonte
Esta é a solução para o seu problema. Você não pode estimar se não possui requisitos. Diga ao seu chefe que você precisará fazer isso antes de começar a codificar. Depois de algumas funções e módulos, você pode descobrir que todos eles foram consistentemente codificados (nesse caso, mal), para ter uma linha de base para determinar estimativas futuras. Apenas certifique-se de ajustar sua estimativa se descobrir que a codificação piora.
Sei que seu chefe quer uma estimativa, mas sem saber como essas informações estão sendo usadas, não sabemos quão exatas são suas estimativas. Converse com ele e descubra. Se ele apenas precisar de um número para fornecer a seu chefe, você pode aumentar um pouco as estimativas e fornecer um número. Para os clientes que esperam pagar pelo seu código até que isso seja feito, verifique se as datas de vencimento da linha direta gerarão uma receita significativa.
fonte
Em uma situação como essa, não acredito que seja possível fornecer boas estimativas. O problema básico é que muitas vezes uma grande parte disso é descobrir exatamente o que precisa ser feito.
Lido com casos como esse, fornecendo uma estimativa com base no que parece implicar, mas com o cavet de que surpresas são prováveis. Embora eu não tenha tido que lidar com muita coisa no código legado, tive algumas surpresas muito desagradáveis ao lidar com informações - já vi algumas horas se transformarem em algumas semanas e uma vez isso é impossível (Depois escavação considerável, eu descobri que não tinha dados suficientes em um determinado caso, de volta à prancheta.) Felizmente, meu chefe entende quando eu dou essas estimativas.
fonte
Bem, estimar é uma habilidade que algumas pessoas nunca aprendem bem. Isso não o torna inútil como desenvolvedor, mesmo que você não consiga obter boas estimativas. Talvez os colegas de equipe ou a gerência preencham as lacunas. Eu sou péssimo nisso, ainda assim a maioria das equipes gostava de trabalhar comigo. Mantenha a calma, junte-se e continue refatorando.
A dívida técnica oferece bons e pequenos desafios, mas lembre-se de que uma empresa / equipe que acabou produzindo dívida continuará produzindo dívida, a menos que haja mudanças no espírito de equipe ou na gerência. O código está apenas refletindo os problemas sociais, portanto, foque nos problemas reais.
Usamos uma heurística para estimar recursos em um projeto brownfield: estimamos quanto tempo levaria para implementar esse recurso em um projeto greenfield sem nada já implementado. Em seguida, multiplicamos essa estimativa por 2 para lidar com a limpeza de detritos que já existiam.
Esse fator depende da quantidade de acoplamento e do tamanho geral do código, mas se você fizer alguns recursos dessa maneira, poderá interpolar esse fator com base em evidências reais.
fonte
Acho que você deveria se sentar com seu chefe, olhá-lo diretamente nos olhos e dizer:
Use uma gesticulação firme e assertiva como apontar e sente-se à frente em sua cadeira.
Como alternativa, você pode inventar alguns números para fazê-lo feliz. Mas vamos ser sinceros, até que você esteja no meio do trabalho, suas estimativas serão bastante imprecisas.
fonte