Embora seja relativamente possível para um desenvolvedor experiente estimar quanto tempo levará para implementar o código quando o padrão e o problema que o código estiver resolvendo for bem compreendido, como você pode fazer uma boa estimativa quando, embora o objetivo final seja bem entendido, o implementação é 95% teórica / solução de problemas e possui quantidades muito pequenas de implementação?
Meu trabalho geralmente consiste em tarefas para atingir objetivos bem definidos, porém tenho que encontrar o caminho para alcançá-lo e, até entender a solução, não fica claro quais barreiras adicionais podem existir. Mais especificamente, muitas vezes estou trabalhando em ferramentas de geração ou manipulação automatizada de código. Uma vez que a solução esteja totalmente resolvida e a ferramenta aperfeiçoada, ele fará diretamente 95% das alterações reais muito rapidamente. Contudo, não tenho como estimar quantos problemas adicionais precisam ser resolvidos para que a ferramenta de geração ou análise lide com casos extremos imprevisíveis.
Para fins de planejamento, minha empresa deseja ter uma idéia melhor de quanto tempo levará, mas como não sei quantos problemas adicionais podem surgir durante o trabalho de solucionar cada etapa da solução. Não tenho certeza de como posso abordar uma estimativa melhor.
fonte
Respostas:
Antes de ir longe demais, deixe-me dizer que a estimativa de software: desmistificando a arte negra é um excelente recurso para as pessoas que olham e pensam em estimativas. Ambas as imagens abaixo são desse livro, assim como o núcleo, se as idéias apresentadas a seguir.
Como você observou, as estimativas são uma parte importante para prever e planejar com precisão o trabalho. Não ter estimativas torna os negócios cegos sobre quanto tempo algo levará. Não é incomum que as empresas tenham uma idéia completamente equivocada de quanto tempo as coisas levarão - o que eles acham fácil leva de seis a oito semanas e o que é considerado difícil é um truque de sexta à tarde.
A primeira coisa é dar uma estimativa. Uma estimativa em si não é um número único - isso é um compromisso. "Quanto tempo o ABC levará" -> "Cerca de 5 dias" significa que são cerca de 5 dias. No entanto, uma boa estimativa é um intervalo em que você tem 90% de confiança de que o terá nesse intervalo. Se você quer dizer "Estou 90% confiante de que levará entre 1 e 5 dias", diga isso. Não trabalhe com "Acho que levará entre 1 e 10 dias, portanto, provavelmente 5 dias é sobre a média" - isso não é uma estimativa e você estará errado 50% do tempo.
Bem, 50% ou mais do tempo, os programadores são subestimadores notórios nos tempos das tarefas.
Considere o cone da incerteza:
Imagem de http://www.construx.com - artigo completo em http://www.construx.com/Thought_Leadership/Books/The_Cone_of_Unertosty/
Perceba que a primeira estimativa nesse intervalo é 16x. É como dizer "acho que vai demorar entre uma tarde e duas semanas" - mas você ainda não sabe. À medida que você avança um pouco no design, o alcance diminui para 4x. Isso não significa que levará uma semana, significa que você estaria dizendo "depois de analisar isso um pouco, levará entre três semanas" - sim, a estimativa subiu, mas também o intervalo da estimativa foi baixa.
Com cada estimativa que você fornecer, você precisa ter 90% de certeza de que a estimativa está dentro desse intervalo. Você pode estar errado - 10% das vezes ele fica fora desse intervalo.
Existem várias maneiras de estimar o tamanho dos projetos. Comparando-o com projetos anteriores, usando um proxy (acho que seriam necessárias 1000 linhas de código que levariam tanto tempo para serem escritas), usando pontos de função (para converter em LOC ...), obtendo estimativas de várias pessoas e depois refinando iterativamente ... alguns trabalhos para alguns projetos, outros trabalhos para outros projetos.
Um capítulo muito importante deste livro que mencionei no topo é o nº 23, que lida com a política de estimativa e com gerentes e executivos.
A chave para uma estimativa é o processo iterativo de refiná-la depois de trabalhar um pouco nela.
Fornecer uma estimativa muito precisa muito cedo no processo pode ser muito propenso a erros. Se você não tiver certeza disso, forneça a estimativa ampla e volte com outra estimativa após algum período de tempo para obter mais informações sobre o problema e, possivelmente, esboçar como você o fará, observando quanto código você o escreveu. o último problema semelhante e outros fatores que impactarão a estimativa.
As estimativas exigem um pouco de reflexão - não exagere nas estimativas do manguito. Eles geralmente têm erros enormes associados a eles em comparação com o que é preciso quando você pensa um pouco sobre isso.
De Como responder quando lhe pedem uma estimativa?
Do capítulo 4 da estimativa de software:
Observe que, nisso, as estimativas após um pouco de revisão são sistematicamente menos selvagens e propensas a erros do que as estimativas fora do manguito. Não faça as estimativas do manguito. Sente-se, pense na tarefa e faça uma estimativa depois de um pouco de reflexão.
fonte
Veja, o problema de estimar quanto tempo levará para resolver um problema é que leva pessoas diferentes por um período de tempo diferente. Se você tem um histórico de solução de problemas semelhantes, é possível estimar com base em quanto tempo você levou antes. Se não, então você não está estimando, está apenas adivinhando.
Além disso, o problema pode nem ter uma solução aceitável. Ou talvez a solução exija mais autorização, o que poderia prejudicar todo o projeto. Ou talvez a solução mude toda a natureza percebida do problema, de forma que a solução se torne totalmente desnecessária.
A moral da história é que, se você não tem informações suficientes para fazer uma estimativa razoável, então não tem . Ainda não. Consiga mais informação. Pesquise mais. Normalmente, é perfeitamente aceitável dizer: "Voltarei em dois dias com alguns números mais sólidos".
Ao projetar uma solução para o cliente, não assinarei um contrato até ter o suficiente do design geral completo para saber como será a solução e quanto tempo levará o projeto. Isso significa que estou correndo o risco de ter feito o trabalho inicial de design pelo qual não sou pago (se o projeto não for aprovado), mas é melhor do que correr o risco de ter um faturamento insuficiente pelo trabalho que está sendo realizado .
fonte
Eu sugiro que você tente algo entre as respostas de tylerl e MichaelT com o seguinte:
A lógica por trás disso é que você sabe, por experiência, que precisa de X dias para analisar uma determinada base de código (provavelmente dependendo do seu tamanho) e ter um conjunto de ferramentas ou scripts básicos em execução (e talvez falhando). Em seguida, o número de erros deve fornecer algumas informações sobre a dificuldade real da tarefa em questão.
Pode não ser exatamente o que a gerência deseja, mas acredito que é sempre melhor apresentar estimativas que você realmente encontrará.
fonte
Como essa pergunta é principalmente sobre tipos de trabalho de pesquisa, pedir aos desenvolvedores de software uma abordagem corajosa, uma métrica comum é que o desenvolvedor de software demore o dobro do tempo que sua estimativa provavelmente seja um bom desenvolvedor. No entanto, dito isso, as tarefas de pesquisa (e design de arquitetura) fazem parte da programação e são frequentemente ignoradas / minimizadas. Eles também são difíceis de estimar.
A primeira pergunta que eu faria a mim mesmo: esse é um problema que pode ser resolvido? Este não é um intelecto ou uma questão de poder do cérebro, mas uma realidade prática. A menos que você esteja no mundo de tiros lua do Google, onde o fracasso é um resultado esperado, a dura realidade é que eu vou ser esperado para entregar este , qualquer que seja este acaba por ser. Uma regra geral parece ser: já sabemos o que 90% da solução precisa ser?
A segunda pergunta que eu faria, o que mais seria útil saber ao pensar sobre a solução? Essa é realmente uma maneira de verificar novamente se realmente sabemos o suficiente para encontrar uma solução que seja aceitável. Isso pode gerar uma série de tarefas de descoberta de fatos que ajudam a definir melhor o que a solução precisa ser, cada uma das quais geralmente é bastante fácil de definir e estimar.
A terceira pergunta é: quem é o mais adequado para a equipe para esse tipo de problema? Quem conseguir essa tarefa dará sabor ao resultado com seu próprio estilo. Dar esse tipo de problema a um programador que tem 10 milhões de perguntas no início de uma tarefa e depois desaparece e fornece algo pela primeira vez (embora lentamente) pode ser uma escolha melhor do que dar ao programador que interrompe a implementação rapidamente , mas quando há um problema, ele é descoberto apenas no final do processo.
Então, a tarefa real seria pensar em possíveis soluções, implementações e abordagens, e ter uma escala de tempo fixa na qual eles precisam se reportar.
Quando eles reportam, você tem a opção de obter um conjunto mais amplo de possíveis soluções, dando o andamento à implementação de uma solução ou refletindo, pois a solução ainda não está definida com clareza suficiente
fonte
Com perguntas de pesquisa em que não está claro que exista uma resposta, muito menos uma idéia clara do que precisa ser feito, costumo propor uma quantidade de tempo x para começar.
"Eu não tenho idéia se isso é possível, mas eu poderia passar dois dias pesquisando. Isso provavelmente não vai nos dar uma solução, mas talvez eu consiga descartar algumas coisas e provavelmente tenha uma idéia quais seriam os próximos passos concretos e que tipo de investimento de tempo eles significariam. Depois, podemos decidir se faz sentido dar outro passo ".
Então, coloque a incerteza na outra direção - a estimativa é muito precisa (passarei dois dias), é apenas muito não especificado o que será alcançado até então.
Timeboxing, basicamente.
fonte