Como você pode estimar o tempo para tarefas que consistem principalmente em descobrir um problema?

56

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.

AJ Henderson
fonte
Que tipos de estimativas você está dando? Se eu perguntar "Quero um recurso que faça XYZ para o cliente ABC", que tipo de resposta você dá? Note que toda a dar resposta que é fortemente influenciado pelo Software Estimation: Desmistificando a arte negra
Estou especificamente tentando estimar o tempo necessário para concluir a tarefa. Portanto, seria algo como "Remova todo tipo de código específico" ou "Altere todo código que faça algo como XYZ para, em vez disso, se comportar como ABC".
AJ Henderson
Ok ... então se eu pedir para você "Alterar a funcionalidade do XYZ para que ele funcione no ABC" ... que tipo de resposta você dá? Você diz "Talvez uma semana", ou "5 dias", ou "entre 1 e 10 dias, dependendo do que eu encontro quando me aprofundo?"
Normalmente, eu tento fazer uma estimativa entre 4 e 8 dias (o tipo de precisão desejada), embora muitas vezes seja mais realista dizer algo como 4 dias e 3 semanas. Estou tentando descobrir maneiras de diminuir o alcance.
AJ Henderson
11
@gnat Obrigado pela explicação, no entanto, acredito que minha pergunta já está clara, pois outras respostas parecem entender o que está sendo solicitado e, sinceramente, não vejo como a pergunta possa ser deduzida como uma bobagem da pergunta marcada. Portanto, sinto que um comentário é suficiente e outras alterações não beneficiariam a questão.
AJ Henderson

Respostas:

41

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?

O que dizer quando solicitada uma estimativa

Você diz "eu voltarei para você".

Você quase sempre obtém melhores resultados se atrasar o processo e passar algum tempo executando as etapas descritas nesta seção. As estimativas fornecidas na máquina de café voltarão (como o café) para assombrá-lo.

Do capítulo 4 da estimativa de software:

Figura 4-8 Erro médio das estimativas fora do manguito

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.

Glorfindel
fonte
11
Essa resposta é interessante e tem muito mérito, mas provavelmente está respondendo a uma pergunta sobre a estimativa de mais tarefas baseadas em implementação, em vez da questão de como estimar quanto tempo levará para ter uma onda cerebral ...
Michael Shaw
@Ptolemy de qualquer maneira - seja implementação ou conceito, é uma estimativa. Posso estimar quanto tempo levará para que eu tenha 90% de confiança de que o intervalo cobre qual será o resultado final. Pode ser uma faixa muito ampla, mas isso também é uma estimativa - muitas pessoas dão estimativas de "6-8 semanas" e depois perdem essa estimativa porque era muito estreita - elas deram uma confiança de 30% em vez de 90%. Isso lida com a habilidade em estimar, refinamentos iterativos e armadilhas comuns na estimativa de qualquer tarefa, pois essas são as primeiras habilidades necessárias para trabalhar na solução do problema.
15

Chefe : AJ, temos 3 cães, 2 coelhos, uma catapulta e uma freira. Precisamos encontrar uma maneira de colocar todos os 7 (sim, a catapulta também) em um muro de 6 metros e entrar no lago do outro lado sem que os cães comam coelhos e sem afogar a freira. Quanto tempo você leva para encontrar a solução?

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 .

tylerl
fonte
9
Nesse caso, porém, o design parece ser 90% do trabalho. E dizer "Vou fazer uma estimativa depois de concluir 90% do trabalho" raramente deixa alguém feliz.
Moz
11
Que tal "O design representa 90% do trabalho e não saberei quanto tempo levará até que o design seja concluído. Agora, você pode obter um intervalo aproximado, iniciar o design e mantê-lo atualizado sobre as alterações na estimativa. à medida que aprendo mais sobre a solução? "
Rob Baillie
Dizendo que é um problema complexo, estamos trabalhando em algumas idéias para resolvê-lo. Como equipe, revisaremos essas idéias na próxima semana e, como parte dessa revisão, haverá prazos para as diferentes soluções. Você gostaria de estar naquela reunião técnica?
Michael Shaw
4

Eu sugiro que você tente algo entre as respostas de tylerl e MichaelT com o seguinte:

  • divida o trabalho a ser realizado em 3 ou 4 fases. As fases devem ser:
    1. Analise de problemas
    2. Prototipagem de soluções
    3. Solução do mundo real
    4. Avaliação de saída (teste)
  • forneça uma estimativa apenas para a fase 1 (análise) com base em sua experiência ou nas fases 1 + 2 (análise + protótipo) à sua gerência. Em seguida, forneça uma estimativa para as fases 3 + 4 quando as fases 1 e 2 do problema estiverem concluídas (ou pelo menos avançado o suficiente para que você possa ter confiança na sua estimativa).

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á.

sansuiso
fonte
Você pode não saber quanto tempo ainda vai demorar, mas você pode dizer "Dê tempo ao meu X para pensar sobre isso e eu voltarei para você" - uma hora, um dia, uma semana, o que for.
Rory Hunter
1

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

Michael Shaw
fonte
1

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.

RemcoGerlich
fonte