Gostaria de saber qual é o impacto geral do planejamento de recursos em um projeto de software, onde os requisitos e o design do projeto são conduzidos por testes de aceitação automatizados e testes de unidade, em contraste com uma abordagem mais "tradicional" ao desenvolvimento de software.
Na sua experiência, qual é o efeito geral nos requisitos de recursos para a conclusão de um projeto de software no TDD, em oposição a metodologias de desenvolvimento mais "tradicionais"? Parece-me evidente que a qualidade aumentaria e a quantidade de incerteza diminui porque os testes são feitos anteriormente, mas exigir testes antecipados parece exigir mais horas do desenvolvedor para ser realizado. Quanto o esforço de desenvolvimento aumenta ou diminui de fato devido à eliminação antecipada de bugs?
Quanto mais esforço é necessário do cliente? Eles precisam mudar a maneira como se relacionam com o projeto, especialmente se forem usados para grandes projetos de frente? O número de horas necessárias do cliente em geral aumenta ou diminui realmente?
Eu imagino que as estimativas de tempo seriam muito vagas em um processo iterativo de TDD no início de um projeto de TDD (já que não há Plano de Desenvolvimento de Software). Existe um ponto, digamos, 20% em um projeto, em que a confiança aumenta o suficiente para que uma estimativa de tempo e dinheiro mais ou menos estável possa eventualmente ser fornecida ao cliente?
Nota: Não estou procurando opiniões ou teorias subjetivas aqui, por isso não especule. Estou procurando mais pela experiência do mundo real em TDD.
fonte
Respostas:
A primeira coisa que precisa ser declarada é que o TDD não aumenta necessariamente a qualidade do software (do ponto de vista do usuário). Não é uma bala de prata. Não é uma panacéia. Diminuir o número de bugs não é por isso que fazemos TDD.
O TDD é feito principalmente porque resulta em melhor código. Mais especificamente, o TDD resulta em um código que é mais fácil de alterar .
Se você deseja ou não usar o TDD, depende mais de seus objetivos para o projeto. Será um projeto de consultoria de curto prazo? Você é obrigado a apoiar o projeto após a entrada em operação? É um projeto trivial? A sobrecarga adicionada pode não valer a pena nesses casos.
No entanto, é minha experiência que a proposta de valor para TDD cresce exponencialmente à medida que o tempo e os recursos envolvidos em um projeto aumentam linearmente.
Bons testes de unidade oferecem as seguintes vantagens:
Um efeito colateral do TDD pode ser menos erros, mas, infelizmente, é minha experiência que a maioria dos erros (principalmente os mais desagradáveis) geralmente são causados por requisitos pouco claros ou claros ou não seriam necessariamente cobertos pela primeira rodada de testes de unidade.
Para resumir:
O desenvolvimento na versão 1 pode ser mais lento. O desenvolvimento na versão 2-10 será mais rápido.
fonte
Há um capítulo em Making Software about Test-Driven Development, que cita o artigo discutido aqui .
Se esses resultados são generalizáveis para o seu caso, é claro que algo que os defensores do TDD argumentarão é óbvio e os detratores do TDD argumentam que é falso.
fonte
Eu não tenho nenhum trabalho de pesquisa ou estatística para dar a você, mas relatarei minha experiência de trabalhar em uma equipe / organização que historicamente teve uma cobertura de teste de unidade de baixa a média e nenhum teste de ponta a ponta, e gradualmente movendo a barra para onde estamos agora, com uma abordagem mais ATDD (mas, ironicamente, não TDD tradicional).
Especificamente, é assim que os cronogramas do projeto costumavam se desenvolver (e ainda se desenrolam em outras equipes / produtos na mesma organização):
Isso parece uma sobrecarga ridícula, mas na verdade é muito comum, mas geralmente é mascarada em muitas organizações por um controle de qualidade ausente ou ineficaz. Temos bons testadores e uma cultura de testes intensivos; portanto, esses problemas são detectados precocemente e corrigidos com antecedência (na maioria das vezes), em vez de serem permitidos a execução lenta ao longo de muitos meses / anos. O custo de manutenção de 55% a 65% é menor do que a norma geralmente aceita de 80% do tempo gasto na depuração - o que parece razoável, porque tivemos alguns testes de unidade e equipes multifuncionais (incluindo o controle de qualidade).
Durante o primeiro lançamento de nosso produto mais recente pela nossa equipe, começamos a adaptar os testes de aceitação, mas eles não eram muito bons e ainda tínhamos que confiar em muitos testes manuais. O lançamento foi um pouco menos doloroso do que outros, em parte devido à IMO, devido aos nossos testes de aceitação aleatórios e também devido à nossa cobertura muito alta de testes unitários em relação a outros projetos. Ainda assim, passamos quase duas semanas em regressão / estabilização e duas semanas em questões de pós-produção.
Por outro lado, todos os lançamentos desde o lançamento inicial tiveram critérios de aceitação e testes de aceitação, e nossas iterações atuais são assim:
Em outras palavras, progredimos de 55 a 65% para a manutenção de 20 a 30%. Mesma equipe, mesmo produto, a principal diferença é a melhoria progressiva e a racionalização de nossos testes de aceitação.
O custo de manutenção é de 3 a 5 dias para um analista de controle de qualidade e de 1 a 2 dias para um desenvolvedor. Nossa equipe tem 4 desenvolvedores e 2 analistas de controle de qualidade, então (sem contar UX, gerenciamento de projetos etc.), isso é um máximo de 7 dias / homem em 60, o que aumentarei até uma sobrecarga de implementação de 15% apenas para continuar o lado seguro.
Gastamos 15% de cada período de lançamento desenvolvendo testes de aceitação automatizados e, no processo, podemos cortar 70% de cada lançamento fazendo testes de regressão e corrigindo erros de pré-produção e pós-produção.
Você deve ter notado que a segunda linha do tempo é muito mais precisa e também muito mais curta que a primeira. Isso foi possível graças aos critérios de aceitação iniciais e aos testes de aceitação, porque simplifica enormemente a "definição de concluído" e nos permite estar muito mais confiantes na estabilidade de uma versão. Até agora, nenhuma outra equipe teve êxito com um cronograma de lançamento quinzenal, exceto talvez ao fazer lançamentos de manutenção razoavelmente triviais (somente correção de bugs, etc.).
Outro efeito colateral interessante é que conseguimos adaptar nossa programação de lançamentos às necessidades dos negócios. Uma vez, tivemos que prolongá-lo para cerca de três semanas para coincidir com outro lançamento, e conseguimos fazê-lo enquanto fornecíamos mais funcionalidades, mas sem gastar tempo extra em testes ou estabilização. Em outra ocasião, tivemos que reduzi-lo para cerca de 1 ½ semanas, devido a feriados e conflitos de recursos; tivemos que trabalhar menos com desenvolvedores, mas, como esperado, pudemos gastar correspondentemente menos tempo em testes e estabilização sem introduzir novos defeitos.
Portanto, na minha experiência, os testes de aceitação, especialmente quando realizados muito cedo em um projeto ou sprint, e quando bem mantidos com os critérios de aceitação elaborados pelo Dono do produto, são um dos melhores investimentos que você pode fazer. Diferentemente do TDD tradicional, que outras pessoas apontam corretamente, está mais focado na criação de código testável do que no código sem defeitos - o ATDD realmente ajuda a detectar defeitos muito mais rapidamente; é o equivalente organizacional de ter um exército de testadores fazendo um teste de regressão completo todos os dias, mas muito mais barato.
A ATDD o ajudará em projetos de longo prazo realizados no estilo RUP ou (ugh) Waterfall, projetos com duração de 3 meses ou mais? Eu acho que o júri ainda não participou. Na minha experiência, os riscos maiores e mais feios em projetos de longo prazo são prazos irrealistas e requisitos variáveis. Prazos irreais farão com que as pessoas tomem atalhos, incluindo atalhos de teste, e alterações significativas nos requisitos provavelmente invalidarão um grande número de testes, exigindo que sejam reescritos e potencialmente aumentem a sobrecarga da implementação.
Tenho certeza de que o ATDD tem uma recompensa fantástica para os modelos Agile, ou para equipes que não são oficialmente Agile, mas têm agendas de lançamento muito frequentes. Eu nunca tentei em um projeto de longo prazo, principalmente porque nunca estive em uma organização ou sequer ouvi falar em fazê-lo nesse tipo de projeto; portanto, insira o aviso padrão aqui. YMMV e tudo isso.
PS No nosso caso, não é necessário nenhum esforço extra do "cliente", mas temos um Dono do produto em tempo integral dedicado que realmente escreve os critérios de aceitação. Se você está no ramo de "consultoria", suspeito que pode ser muito mais difícil fazer com que os usuários finais escrevam critérios úteis de aceitação. Um Dono / Gerente de Produto parece ser um elemento essencial para fazer o ATDD e, embora eu possa mais uma vez falar apenas da minha própria experiência, nunca ouvi falar do ATDD ser praticado com sucesso sem que alguém cumpra esse papel.
fonte
Requisitos de Recursos
Na minha experiência, o custo de exigir testes iniciais é imediatamente atenuado, definindo um critério de aceitação claro antecipadamente e depois escrevendo para o teste. Além de mitigar o custo dos testes iniciais, também achei que geralmente acelera o desenvolvimento geral. Embora essas melhorias na velocidade possam ser eliminadas por uma definição deficiente do projeto ou pela alteração de requisitos. No entanto, ainda somos capazes de responder muito bem a esses tipos de mudanças sem impacto grave. O ATDD também reduz significativamente o esforço do desenvolvedor na verificação do comportamento correto do sistema por meio de seu conjunto de testes automatizados nos seguintes casos:
Isso pressupõe uma equipe familiarizada com o processo e as práticas envolvidas.
Envolvimento do cliente
Eles precisam estar muito mais envolvidos de forma contínua. Vi uma enorme redução no investimento antecipado, mas uma demanda muito maior em andamento. Não medi, mas tenho certeza de que é um investimento de tempo maior para o cliente.
No entanto, eu descobri que o relacionamento com o cliente melhora bastante após cinco demonstrações, nas quais eles vêem seu software lentamente tomar forma. O comprometimento de tempo do cliente diminui um pouco ao longo do tempo, à medida que um relacionamento é desenvolvido, todos se acostumam ao processo e às expectativas envolvidas.
Estimativa do Projeto
Descobri que geralmente é uma questão de quão bem definida é a solicitação e se o (s) líder (es) técnico (is) é (s) capaz (s) de cardar (incluindo a estimativa do cartão) o projeto. Supondo que o projeto seja bem elaborado e você tenha uma média de velocidade razoável e desvio padrão, descobrimos que é fácil obter uma estimativa decente. Obviamente, quanto maior o projeto, maior a incerteza, razão pela qual eu geralmente divido um projeto grande em um projeto pequeno, com a promessa de continuar mais tarde. Isso é muito mais fácil quando você estabelece um relacionamento com o cliente.
Por exemplo:
Os "sprints" da minha equipe duram uma semana e temos uma média de rodadas e um padrão. desvio das últimas 14 semanas. Se o projeto é de 120 pontos, temos uma média de 25 e um valor padrão. desvio de 6 e estimar a conclusão de um projeto é:
Nós usamos o 2 Std. Regra geral de desvio para nossa estimativa de confiança de 95%. Na prática, geralmente concluímos o projeto no primeiro padrão. desvio, mas acima da nossa média. Isso geralmente ocorre devido a aprimoramentos, alterações etc.
fonte
Na verdade, isso não é verdade. Se seus desenvolvedores estão escrevendo testes de unidade (e deveriam), o tempo deve ser aproximadamente o mesmo ou melhor. Eu disse melhor, já que seu código será completamente testado e eles terão que escrever apenas o código para atender aos requisitos.
O problema com os desenvolvedores é que eles tendem a implementar coisas que não são necessárias para tornar o software o mais genérico possível.
Isso não deveria importar. Quem faz os requisitos deve fazê-lo da melhor maneira possível.
Se você desenvolve uma maneira ágil de desenvolvimento, isso não significa um grande design antecipadamente. Porém, quanto melhores forem os requisitos, a arquitetura e o design - a qualidade do código aumentará e o tempo para concluir o software diminuirá.
Portanto, se eles gostam de fazer BDUF, deixe-os fazer. Isso tornará sua vida mais fácil como desenvolvedor.
fonte