Parece que, na minha experiência, levar os engenheiros a estimar e determinar com precisão as tarefas a serem concluídas é como puxar os dentes. Em vez de apenas fornecer uma estimativa de ganhos de 2 a 3 semanas ou 3 a 6 meses ... qual é a maneira mais simples de definir programações de software para que elas não sejam tão difíceis de definir? Por exemplo, o cliente A deseja um recurso até 01/01/2011. Como você programa o tempo para implementar esse recurso, sabendo que outras correções podem ser necessárias ao longo do caminho e ocupam um tempo adicional de engenharia?
software-schedules
Brian
fonte
fonte
Respostas:
Se você está desenvolvendo um projeto quase idêntico a outros projetos que você já fez, usando ferramentas familiares e uma equipe familiar e recebe requisitos firmes e escritos, deve ser possível fazer uma boa estimativa.
Essas são as condições que os pintores, instaladores de carpetes, paisagistas etc. experimentam regularmente. Mas não é uma boa opção para muitos (ou muitos) projetos de software.
Muitas vezes nos pedem para estimar projetos que usam novas ferramentas, tecnologias, onde os requisitos estão mudando, etc. Isso é mais extrapolação para o desconhecido do que interpolação em nossas experiências passadas. Portanto, é natural que a estimativa seja mais difícil.
fonte
De acordo com minha experiência pessoal, é exatamente o oposto do que Pemdas disse : com a prática, acabei de entender que é totalmente impossível estimar quanto tempo uma tarefa exigirá. No início de minha carreira em desenvolvimento de software, muitas vezes forneci estimativas como "45 dias", "cinco semanas" etc., e depois tentei com muito esforço terminar com o tempo. Alguns anos depois, comecei a fornecer estimativas menos precisas, como "aproximadamente um mês", "cinco a sete semanas" etc. Na verdade, tento não fornecer nenhuma estimativa ou pedir ao cliente que faça sua própria estimativa. ou prazo ou faço uma estimativa o mais aproximada possível.
Por que é tão difícil ter uma estimativa? Porque é quase impossível saber como todo o código-fonte será escrito antes de realmente escrevê-lo, e porque seu trabalho depende de coisas aleatórias à medida que outras pessoas trabalham, sua motivação etc. Aqui está uma lista mais detalhada dos possíveis motivos:
Não é fácil saber exatamente o que é necessário para fazer um produto, e especialmente como fazê-lo . Muitas vezes iniciei algumas partes de um aplicativo que, após dias de trabalho, entendiam que minha primeira abordagem estava errada e que havia uma maneira melhor e mais inteligente de fazer as coisas.
Alguns problemas podem surgir . Por exemplo, se, para começar seu trabalho, você deve instalar em sua máquina um servidor SQL sofisticado e a instalação falhar e o suporte não existir, você pode passar semanas resolvendo esse problema.
Os requisitos geralmente não são claros o suficiente , mas depois de lê-los no início, você pensa que são. Às vezes, você pode entender que a média 'A' e, depois de começar a implementá-las, você perceberá que elas talvez signifiquem 'B'.
Os clientes gostam de alterar seus requisitos exatamente quando você termina a parte em questão , e eles realmente não entendem por que você está solicitando mais duas semanas e US $ 2000 para fazer uma pequena alteração, porque não vêem que essa pequena alteração requer mudar outras coisas, que exigem mudar outras, etc.
Você não pode estimar sua motivação . Há dias em que você pode trabalhar por horas e ter sucesso. Há semanas em que, depois de escrever dez linhas de código, você alterna para o Programmers StackExchange e passa horas lendo e respondendo a perguntas.
As coisas ficam muito ruins quando sua estimativa depende de outras pessoas . Por exemplo, em um projeto de 2 meses, tive que esperar que um designer fizesse o trabalho dele para terminar o meu. Esse designer levou três meses para entregar um pedaço de lixo inutilizável. Claro que o projeto estava atrasado.
Sua estimativa também depende do seu cliente . Eu tive clientes que passam semanas antes de responderem seus e-mails. Isso pode realmente afetar sua agenda quando você deve esperar pela resposta (por exemplo, se você estiver solicitando que eles precisem de um requisito).
O que você pode fazer?
Dê uma agenda maior . Se você acha que pode fazer o trabalho em duas semanas, diga que o entregará em um mês.
Seja claro . Se você conta com um designer, outro desenvolvedor etc., diga. Em vez de dizer "Entregarei o produto em três meses", diga "Entregarei o produto em dois meses depois que o designer me fornecer arquivos PSD".
Explique que se os requisitos mudarem todos os dias, o projeto dificilmente será entregue a tempo.
Fatie sua programação . Entregar partes de um grande projeto no prazo é mais fácil.
Nunca faça uma estimativa quando você usa um produto que não conhece bem ou, especialmente, quando trabalha com o código-fonte de outra pessoa: nunca é possível prever o quão ruim o código-fonte pode ser e quanto tempo você gastará entender e copiar e colar no The Daily WTF.
fonte
Uma pergunta muito semelhante é "Quanto tempo levará para resolver este jogo de palavras cruzadas?"
Você não pode responder até que você tenha visto isso para ver várias coisas como:
Como geralmente existem várias coisas novas em um projeto (caso contrário, não seria um projeto), você não pode dizer quanto tempo elas levarão para serem resolvidas até que você as tenha observado com muito cuidado. Talvez até resolva mais ou menos, ou então, e você ainda não tem certeza de que não há uma surpresa ou duas em que não pensou nelas.
Também há uma forte pressão para fazê-lo o mais barato possível, portanto, o mais rápido possível e a culpa por uma estimativa muito baixa não recai sobre o pressurizador do gerente do projeto, mas com o desenvolvedor fazendo a estimativa. Não é preciso muitas iterações para o desenvolvedor entender isso e aprender a ficar MUITO cansado de fornecer números absolutos.
fonte
Claro que você pode estimar quanto tempo + -2 minutos levará de sua casa para o trabalho. Você sabe dirigir, pode avaliar o tráfego e alguns outros fatores externos.
Diga-me quanto tempo levará para você dirigir de Londres a Barcelona. Sem nenhuma ferramenta avançada de planejamento de GPS, é claro. Usando o bom e velho método, como ainda fazemos na estimativa de software. Estimativas empíricas e previsões .
No software, é pior:
É por isso que é impossível dizer ao seu cliente o que você poderá enviar para o 02/01/2011 com boa precisão e esquecer o 01/03/2011.
Para resolver todos esses problemas, recomendo técnicas avançadas de estimativa, como o Planning Poker (aviso: este é um dos meus sites) e o desenvolvimento iterativo com cálculo de velocidade .
fonte
O desenvolvimento de software é - por definição - um ato de descoberta e invenção. Sempre deve envolver algo desconhecido.
O único momento em que tudo relacionado ao desenvolvimento de software é conhecido é quando o software está completo.
O único momento em que não há tecnologia ou recurso comercial desconhecido é quando é uma solução completa e empacotada pronta para download.
A razão pela qual escrevemos um novo software é porque temos um novo recurso ou nova tecnologia ou ambos. Novo significa novo - desconhecido - imprevisível.
Como o desenvolvimento de software deve envolver novidade, o esforço de desenvolvimento não pode ser previsto.
fonte
Honestamente, acho que é preciso praticar. Se você escrever código suficiente eventualmente, deve ser "razoavelmente" preciso. Meu primeiro chefe acreditou que essa habilidade era importante o suficiente para que ele solicitasse que eu praticasse isso informalmente em todos os recursos / projetos que implementei. Após cada projeto, revisamos as estimativas e tentamos descobrir onde errei. Eventualmente, você pega o jeito.
fonte
Isso nunca é fácil. Você apenas tenta melhorar.
Uma vantagem de dividir seu código de entrega em pedaços menores é que os clientes entendam o que esperar e quando esperar. Agora você tem algum tipo de linha de base para usar como referência.
Se eles tiverem uma definição estrita de um recurso que precisam em um horário definido, precisam saber que recursos adicionais devem ser alocados a essa solicitação. Eles estão arriscando a gravidade dos erros que ocorrem e quanto tempo eles podem durar sem que eles sejam corrigidos. Quando algo importante surge, você volta ao cliente e o força a tomar uma decisão. Corrijo o bug ou faço o prazo para o novo recurso? Dê a eles informações suficientes para tomar uma decisão informada.
Espero que você tenha histórico suficiente de trabalho em conjunto e tenha se estabelecido o suficiente para ser confiável. Você não pode esperar que eles entendam completamente o processo de desenvolvimento, mas você pode fazê-los sentir que estão fazendo um esforço honesto e não tirando proveito da falta de conhecimento deles.
fonte
Porque fazemos a programação muito cedo. Veja o artigo da Construx sobre como fazer uma preliminar preliminar e depois uma melhor. Além disso, se você não acompanhar como se saiu nas estimativas anteriores, é difícil melhorar. O FogBugz faz isso [um cliente gratuito, nenhum outro conflito de interesses].
fonte
Eu aprendi muito com este livro:
Estimativa de software: desmistificando a arte negra
Em suma, para obter melhores resultados de estimativa, fazemos o seguinte:
Depois que a tarefa de trabalho é concluída e nossa estimativa está errada, tentamos encontrar os motivos. E incorporamos esse conhecimento no próximo processo de estimativa. Até agora, esse é o melhor processo que usei para estimar tarefas maiores. Quando digo tarefa, quero dizer trabalhos que levam de 50 a 500 horas.
fonte
Nota: isso realmente se aplica apenas a projetos nos quais você fatura por hora versus uma taxa fixa / fixa.
Normalmente, tento planejar minha agenda para que ela consista essencialmente em um monte de SCRUM Sprints (usando ou não SCRUM). Na hora de fazer o cronograma, determino qual será o comprimento de cada sprint e quais serão os recursos do projeto. Normalmente, existem alguns recursos que precisam ser executados primeiro, então tento fornecer uma melhor estimativa (não confundir com otimista) para aqueles e quaisquer recursos que estejam no final do projeto terão estimativas generalizadas. Depois de mapear os recursos para os sprints, tento adicionar 1 a 2 sprints no final do projeto para explicar os recursos que deslizam para a direita e os que foram ignorados na reunião de requisitos original.
A chave para isso é que eu faço tudo isso transparente para o cliente antecipadamente, para que eles entendam por que os dois últimos sprints estão vazios ou pouco preenchidos. Pelo menos até este ponto, os clientes com quem trabalhei gostaram disso, pois sabem que há alguma margem na programação / finanças, pois a maioria deles sabe que as estimativas de SW tendem a ser menos concretas. Eles também sabem que, se não precisarmos do último sprint, mais ou menos, essas são horas que não faturamos. Com a transparência na forma como o cronograma é construído e o feedback regular sobre o andamento da execução do projeto, todos os clientes com quem eu fiz isso ficaram extremamente satisfeitos.
fonte
Além de todas as coisas mencionadas, vejo essas duas coisas como alguns dos maiores problemas. Primeiro, você estima a data final com base em todos os devloper disponíveis durante as 8 horas diárias 5 dias por semana. Isso está incorreto e praticamente 100% garante que a data de término seja perdida em qualquer projeto que não seja trivial. As pessoas tiram uma folga, participam de reuniões da empresa (ou não baseadas em projetos), brigam com o RH por reivindicações de seguro de saúde, fazem pausas etc. Nunca assuma mais do que uma disponibilidade de 6 horas por desenvolvedor por dia.
Os próximos desenvolvedores esquecem-se notoriamente de estimar todas as tarefas de não desenvolvimento, como reuniões e emails sobre o projeto, implantação, suporte ao controle de qualidade, suporte ao UAT, testes de unidade de escrita, pesquisa, documentação etc. as estimativas ficaram muito melhores.
fonte
Quando se trata de estimativa de tempo para tarefas que podem demorar mais do que algumas horas, tento o meu melhor para usar estas regras:
Provavelmente há mais regras do que isso, mas na verdade não tenho um pôster com essas regras na minha parede. Acabei de formulá-los agora, mas eles vêm da minha experiência (por isso pode não funcionar para você).
A única maneira confiável de agendar o desenvolvimento de software em que posso pensar (mas ainda não o experimentei) é o Agendamento Baseado em Evidências, que é basicamente o método de Monte Carlo usado para calcular a probabilidade de uma data de envio com base em registros históricos das tarefas que você ' já fizemos antes. É bom porque não tenta usar nenhuma métrica além do tempo estimado e real. No entanto, requer muita experiência para dividir grandes tarefas em tarefas menores de antemão e você precisa ter um grande conjunto de dados históricos para fazê-lo funcionar com precisão suficiente.
fonte
Existem "incógnitas conhecidas" e "incógnitas desconhecidas". :-)
As estimativas geralmente se tornam prazos.
Os requisitos mudam (geralmente racionalmente) e o programador não pode vetá-lo.
O programador / pode não ter controle sobre fatores como
fonte