Na minha empresa, trabalhamos com sucesso com práticas ágeis - mas sem usar iterações. O principal motivo é que não conseguimos encontrar uma maneira limpa de ajustar o controle de qualidade em um ciclo de iteração.
Entendemos o controle de qualidade como um pouco extra de verificação para uma determinada versão (candidato a lançamento) antes que essa versão seja implantada no cliente. O objetivo é evitar que um único commit malicioso danifique toda a versão. Como você nunca sabe qual é, o controle de qualidade precisa aguardar até que todos os recursos / confirmações para o lançamento estejam na compilação. (Nenhuma última palavra famosa "Foi apenas uma pequena alteração" permitida.)
Se o controle de qualidade encontrar erros em um candidato a lançamento, os desenvolvedores os corrigem no respectivo ramo de lançamento (e o mesclam no tronco). Quando todos os erros são corrigidos, uma nova compilação é implantada para que o controle de qualidade seja testado novamente. Somente quando nenhum bug é encontrado em um determinado candidato à liberação, ele é oferecido ao cliente para verificação.
Isso geralmente leva de dois a três candidatos, cerca de uma semana, por release. O tempo para escrever as correções geralmente é muito menor do que os esforços de teste. Portanto, para manter os desenvolvedores ocupados, eles trabalham no release N + 1, enquanto o QA trabalha no N.
Sem usar iterações, isso não é problema, pois podemos sobrepor o trabalho das versões N e N + 1. No entanto, pelo que entendi, isso não é compatível com abordagens baseadas em iteração como Scrum ou XP. Eles exigem que uma iteração seja liberável ao final, com todo o esforço de teste a ser incorporado na iteração.
Acho que isso leva necessariamente a um dos seguintes resultados indesejados:
(A) Os desenvolvedores estão ociosos no final de uma iteração porque o controle de qualidade precisa de tempo para verificar um candidato a lançamento e o trabalho de correção de bugs não está mantendo completamente os desenvolvedores ocupados.
(B) O controle de qualidade já começa a funcionar antes que o candidato à primeira liberação esteja pronto. É o que é mais recomendado no Stack Exchange. Mas não é o que minha empresa entende como controle de qualidade, porque não há nenhum candidato a release específico testado. E a "pequena mudança" que quebra tudo ainda pode ser introduzida despercebida.
(C) Os erros são transferidos para a próxima iteração. Isso também é recomendado no Stack Exchange. Não acho que seja uma solução. Basicamente, significa que nunca estamos obtendo uma compilação verificada, porque sempre que são feitas correções de bugs, novas confirmações não verificadas também são adicionadas à mesma ramificação.
Existe alguma maneira de sair desse dilema?