Estou convencido de que a quantidade de trabalho rotineiro no desenvolvimento de software é - e deve ser - relativamente pequena, se não desprezível, e que esse é o problema fundamental da estimativa de software.
Deixe-me descrever como chego a essa conclusão e me diga se a argumentação tem alguma falha séria:
Tudo o que pode ser estimado com alta precisão é um trabalho de rotina, ou seja, coisas que foram feitas antes. Todos os outros tipos de trabalho que envolvem pesquisa e criatividade não podem realmente ser estimados, pelo menos não com uma precisão de, digamos, +/- 20%.
O desenvolvimento de software visa evitar tarefas repetitivas. Um de seus princípios básicos é SECO (não se repita). Sempre que um programador se vê fazendo coisas repetitivas, é hora de encontrar uma abstração que evita essa repetição. Essas abstrações podem ser coisas simples, como extrair o código repetido em uma função ou colocá-lo em um loop. Eles também podem ser mais complexos, como criar um idioma específico do domínio. De qualquer forma, implementá-las envolverá pesquisa (alguém já fez isso antes?) Ou criatividade.
Destes dois pontos, chego à conclusão acima.
Na verdade, eu me pergunto há bastante tempo por que esse relacionamento não é mencionado em todas as outras discussões, post de blog ou artigo sobre estimativa de software. Isso é teórico demais? Minhas suposições estão erradas? Ou é muito trivial - mas então, por que a maioria dos desenvolvedores que conheço acredita que pode fazer estimativas com uma precisão de +/- 20% ou melhor?
fonte
Respostas:
Em qualquer projeto, isso pode ser verdade. No entanto, se você trabalha em vários projetos semelhantes para empresas diferentes ao longo dos anos, pode se 'resolver' basicamente o mesmo problema muitas vezes com apenas pequenas variações.
Por exemplo, eu escrevi camadas de acesso a dados tantas vezes que agora prefiro fazê-lo 'mão longa' do que usar o ORM popular do mês. É mais rápido e fácil lidar com os 'problemas de rotina' com soluções conhecidas do que encontrar e resolver novas peculiaridades em componentes de terceiros.
Obviamente, eu poderia escrever meu próprio ORM para simplificar o código repetitivo sem adicionar as peculiaridades desconhecidas no sistema de outra pessoa, mas esse código pertenceria à empresa para a qual trabalhava na época e outros desenvolvedores o achariam tão peculiar quanto qualquer outro ORM de terceiros.
Da mesma forma, na minha experiência, a maior parte da programação é a automação de processos de negócios e, embora cada empresa goste de pensar que seus processos são exclusivos para eles; Na realidade eles não são.
Para não dizer que a estimativa é fácil! É mais fácil, mas acho que hoje em dia o problema de estimativa se deve à inadequação dos requisitos e não ao tempo gasto na codificação.
Os requisitos tendem a se dividir em três categorias:
Eles tendem a ser os mais fáceis de estimar, pois quando ocorre um problema inesperado, você pode simplesmente mudar os requisitos para algo funcionalmente equivalente e evitar o problema.
Super rápido de fazer e, novamente, fácil de estimar. Mas! o requisito está sujeito a alterações. "Hmm, não pensando duas vezes, tente este outro vermelho" ou "Espere! Eu quis dizer apenas nessa página!" portanto, o tempo real de "quanto tempo até eu ficar feliz com a cor do cabeçalho" não tem nada a ver com as estimativas de codificação
Aqui a multidão de suposições não declaradas "é claro que você deseja um logotipo diferente", "ele deve ter rolagem infinita", "deve ser escalável para 1 bilhão de usuários!" controlar efetivamente a estimativa. O desenvolvedor pensa em tudo e eleva a estimativa além das expectativas "1 milhão de horas-homem", ou pensa / assume que apenas os recursos básicos são necessários e fornece uma estimativa muito baixa. "ah, uma semana ou duas, presumo que você só queira colocar o facebook em um iframe, certo?"
Com a experiência, a codificação é muito rápida, mas os requisitos de design são (geralmente) os mais difíceis, e isso é cada vez mais repetido nos não codificadores. Com metodologias ágeis, aumentando a velocidade de codificação, movendo essa responsabilidade para 'o negócio', e não para os desenvolvedores.
fonte
Porque estimamos nossa paciência com o problema muito mais do que o problema real.
Se eu vou animar uma bola quicando, poderia passar um dia, uma semana, um mês ou um ano nela e ainda assim ter uma animação de uma bola quicando. Espero que pareça melhor quanto mais tempo passo, mas em um determinado momento estou sendo ridículo.
Quanto esforço eu dedico para fazer a bola quicar é uma função do tempo que é razoável gastar nela. Se meu nível de habilidade não estiver diminuindo, posso acabar com uma bola que fica lá. Mas quando o prazo chegar, devo deixar o prazo passar ou pelo menos colocar uma bola na tela? Waterfall insistiu que a bola saltasse e o cronograma caiu. O Agile diz que é só pegar a bola. Pelo menos, descobriremos o quanto as pessoas se importam com saltos. Então a qualidade caiu.
Eu tento ter certeza de que minhas bolas balançam, mas quando o prazo chegar, é melhor produzir uma bola estática do que nada. Portanto, estimo o tempo com base no que parece uma quantidade razoável de tempo para gastar em um problema antes de falar sobre alternativas. Às vezes a bola não vai saltar. Às vezes tudo bem. Desaparecer por um mês não está OK.
fonte