Desenvolvimento Iterativo
A Prática de Desenvolvimento Iterativo caracteriza um ciclo de vida do projeto de software abrangendo diversas iterações. Uma iteração consiste em um conjunto quase seqüencial de tarefas selecionadas de qualquer e de todas as disciplinas de Engenharia de Software.
Descrição Principal

O que É Desenvolvimento Iterativo?

Um projeto que usa o desenvolvimento iterativo tem um ciclo de vida que consiste em várias iterações. Uma iteração incorpora um conjunto quase seqüencial de tarefas em modelagem de negócio, requisitos, análise e design, implementação, teste e implementação, em várias proporções, dependendo do local em que ela está localizada no ciclo de desenvolvimento. As iterações nas fases de iniciação e de elaboração concentram-se nas atividades de gerenciamento, requisitos e design. As iterações na fase de construção concentram-se no design, na implementação e no teste. E as iterações na fase de transição concentram-se no teste e na implementação. As iterações devem ser gerenciadas em um estilo com caixa de hora, ou seja, o planejamento de uma iteração deve ser considerado fixo e o escopo do conteúdo da iteração gerenciado ativamente para atender a esse planejamento.

Por que Desenvolver Iterativamente?

É provável que um design inicial contenha falhas em relação a seus principais requisitos. A descoberta tardia dos defeitos de design resulta em saturações caras e, em alguns casos, até mesmo no cancelamento do projeto.

Todos os projetos têm um conjunto de riscos envolvidos. Quanto mais cedo você puder verificar que evitou um risco no ciclo de vida, mais precisos serão seus planos. Muitos riscos nem são descobertos até que você tente integrar o sistema. É impossível prever todos eles, por mais experiente que seja a equipe de desenvolvimento.

Risco e Gráfico de Tempo do processo de desenvolvimento pelo método em cascata

Em um ciclo de vida em cascata, você não poderá verificar se ficou livre de um risco até o final do ciclo.

Risco e Gráfico de Tempo do processo de desenvolvimento pelo método em cascata mostrados com o método iterativo

Em um ciclo de vida iterativo, a seleção do incremento a ser desenvolvido em uma iteração é feita com base em uma lista dos principais riscos. Como a iteração produz um executável testado, você poderá verificar os riscos diminuíram.

Benefícios de uma Abordagem Iterativa

Geralmente, uma abordagem iterativa é superior a uma abordagem linear ou em cascata, por vários motivos.

  • Os riscos são reduzidos mais cedo, pois os elementos são integrados progressivamente.
  • Os requisitos e as táticas de alteração são acomodados. 
  • A melhoria e o refinamento do produto são facilitados, resultando em um produto mais robusto.
  • As organizações podem aprender a partir dessa abordagem e aprimorar seus processos. 
  • A capacidade de reutilização aumenta.

Um cliente disse uma vez: "Com a abordagem em cascata, tudo parece bem até quase no final do projeto, às vezes até a metade da integração. Aí, tudo desmorona. Com a abordagem iterativa, é muito difícil ocultar a verdade durante muito tempo."

Geralmente, os gerentes de projeto resistem à abordagem iterativa, pois consideram-na um infindável refinamento. No RUP (Rational Unified Process), a abordagem interativa é muito controlada; o número, a duração e o objetivo das iterações são planejados. As tarefas e as responsabilidades dos participantes são definidas. São capturadas medidas de progresso objetivas. Ocorre algum retrabalho de uma iteração para a outra, mas isso também é cuidadosamente controlado.

Riscos Atenuantes

Uma abordagem iterativa permite que você diminua os riscos mais cedo, pois muitos deles são descobertos somente durante a integração. No desdobramento da iteração inicial, você passa por todas  as disciplinas, praticando muitos aspectos do projeto: ferramentas, softwares off-the-shelf, habilidades das pessoas e assim por diante. Pode ser que riscos aparentes demonstrem que não são riscos e riscos novos e inesperados irão aparecer.

A integração não é uma "grande explosão" no final. Os elementos são incorporados progressivamente. Na realidade, a abordagem iterativa é uma integração quase contínua. O que costumava ser um período longo, incerto e difícil, que levava até 40% do esforço total no final de um projeto e que dificultava a precisão do planejamento, é dividido em seis a nove integrações menores que iniciam com um número muito menor de elementos a serem integrados.

Acomodando Alterações

A abordagem iterativa permite considerar os requisitos de alteração, uma vez que eles normalmente serão alterados durante o processo.

As mudanças nos requisitos e a "ascensão lenta" dos requisitos têm sido sempre  as principais origens de problemas para um projeto, levando à entrega demorada, planejamentos atrasados, clientes insatisfeitos e desenvolvedores frustrados. Vinte e cinco anos atrás, Fred Brooks escreveu: "Planeje para jogar um fora, você fará isso de qualquer maneira." Os usuários mudarão de idéia com o tempo. Essa é a natureza humana. Forçar os usuários a aceitarem o sistema como o imaginaram originalmente está errado. Eles mudam de idéia porque o contexto é variável; eles aprendem mais sobre o ambiente e a tecnologia e vêem a demonstração intermediária do produto durante o seu desenvolvimento.

Um ciclo de vida iterativo fornece o gerenciamento com um modo de fazer mudanças táticas no produto. Por exemplo, para competir com os produtos existentes, você poderá decidir lançar um produto com funcionalidade reduzida mais cedo como reação a uma movimentação de um concorrente ou poderá adotar um outro fornecedor de uma determinada tecnologia.

A iteração também permite mudanças tecnológicas durante o processo. Se alguma tecnologia é alterada ou se torna um padrão conforme aparece uma nova, o projeto poderá aproveitá-la. Particularmente, esse é o caso de mudanças de plataforma e de infra-estrutura de nível inferior.

Alcançando Qualidade Superior

Uma abordagem iterativa resulta em uma arquitetura mais robusta, pois os erros são corrigidos após várias iterações. As falhas iniciais são detectadas conforme o produto amadurece, durante as iterações iniciais. Os gargalos de desempenho são descobertos e podem ser reduzidos, em vez de aparecerem na véspera da liberação.

Desenvolver iterativamente, ao contrário de executar testes uma vez ao final do projeto, resulta em um produto totalmente testado. Houve muitas oportunidades para testar as funções críticas após várias iterações, e os próprios testes, além dos softwares de teste, tiveram tempo para amadurecer.

Aprendendo e Aprimorando

Os desenvolvedores podem aprender durante o processo, e as várias capacidades e especialidades são empregadas mais completamente durante todo o ciclo de vida.

Em vez de esperar muito tempo simplesmente fazendo planos e aprimorando suas habilidades, os testadores começam a testar cedo, a escrita técnica começa cedo e assim por diante. A necessidade de treinamento adicional ou de ajuda externa pode ser detectada nas revisões de avaliação das iterações iniciais.

O próprio processo pode ser melhorado e refinado durante o seu desenvolvimento. A avaliação ao final de uma iteração não considera apenas o status do projeto de uma perspectiva de programação do produto, mas também analisa o que precisa ser alterado na organização e no processo para melhorar o desempenho na próxima iteração.

Aumentando a Reutilização

Um ciclo de vida iterativo facilita a reutilização. Identificar as partes comuns quando estão parcialmente projetadas ou implementadas é mais fácil que identificar todas as semelhanças no início.

É difícil identificar e desenvolver partes reutilizáveis. As revisões de design nas iterações iniciais possibilitam que os arquitetos de software identifiquem reutilizações inesperadas e potenciais, e as iterações subseqüentes permitem que eles desenvolvam e amadureçam posteriormente esse código comum.

O uso de uma abordagem iterativa facilita o aproveitamento dos produtos desenvolvidos internamente e adquiridos prontos para serem usados. Você terá várias iterações para selecioná-los, integrá-los e confirmar que eles são adequados à arquitetura.