sábado, 28 de abril de 2012

Engenharia de Software Para Concursos - Parte 3 - Métodos Formais, Iterativos e Incrementais


Modelos de Ciclo de Vida - Continuação
A primeira parte sobre modelos de ciclo de vida de desenvolvimento de software, modelo em cascata e prototipagem, ficou no poste anterior, na parte 2. Quem quiser pode clicar aqui para ler.

Quem acompanha o blog já sabe. Esses são os meus resumos, usem a vontade, mas não me culpem por alguma erro.

Métodos Formais
São modelos baseados em técnicas matemáticas para especificar, desenvolver e verificar o software. São usados em sistemas críticos, onde uma falha pode colocar pessoas em risco. Softwares de avião, de hospitais, usinas nucleares e etc.

O software é especificado usando técnicas formais (matemáticas). Existem várias especificações que são realizadas em sequência e após todas elas, uma prova matemática é gerada. O código só é implementado quando as especificações passam no teste matemático. (Sommerville classifica esses métodos como uma evolução do cascata, porque as fazes são sequênciais.)

- O processo de desenvolvimento garante que o programa faz o que foi especificado.
- É possível gerar programas corretos e completos por construção.

A especificação do software é feita através de matemática e existe uma linguagem de programação específica para implementação. Não existe a análise subjetiva de especialistas que utilizam a experiência para especificar os requisitos. O código é matematicamente correto.

Desvantagens:
O processo é MUITO CARO, demanda mão de obra extremamente especializada e muito bem treinada, com forte base matemática.

É praticamente impossível mostrar a especificação do sistema para um cliente normal e receber um OK da especificação.

Métodos Iterativos
Os requisitos do sistema sempre evoluem durante o projeto. Sempre existem mudanças. Os modelos iterativos surgiram para tratar os riscos causados pelas mudanças dos requisitos.

Iteração é uma passagem pelas disciplinas de desenvolvimento. Sendo assim, a cada passagem (iteração) pelas disciplinass você entrega um parte do software e aumenta a compreensão do que está sendo feito. É uma técnica de dividir para conquistar.

Um grande projeto é dividido em pequenos projetos. A cada iteração você seleciona um conjunto de requisitos menor do que o todo, passa por todas as disciplinas e depois seleciona mais requisitos para implementar e assim vai.

A grande vantagem desse modelo é o gerenciamento de riscos. Como existe entrega do produto a cada iteração, existe feedback do cliente e a equipe de desenvolvimento tem condição de fazer os ajustes logo em estapas iniciais do projeto. O risco diminui conforme o projeto avança no tempo.


Existem duas abordagens:
Desenvolvimento Incremental e Desenvolvimento Espiral

Desenvolvimento Incremental
Este modelo é muito usado nos dias de hoje. RUP, XP, Scrum e métodos ágeis em geral.
Desenvolve-se e entrega-se o software em incrementos, com cada iteração entregando parte das funcionalidades requeridas.

Os requisitos são definidos antes do desenvolvimento da iteração e os mais críticos possuem prioridade. Você define com precisão APENAS os requisitos daquela iteração e não do sistema todo. A cada iteração os analistas e desenvolvedores adiquirem mais conhecimento do negócio, o que facilita a próxima passagem.

Frase de efeito: "Jogue fora um pouco do trabalho durante o caminho para não precisar jogar fora todo o trabalho ao final".

Existem erros em cada fase, mas como o trabalho foi pequeno, é fácil refazer. Perde-se pouca coias a cada iteração. Com o aprendizado da equipe a cada entrega, menos erros acontecem nas próximas passagens.

No RUP, um mini projeto em cascata é executado em cada iteração, progredindo até a entrega final do produto.


Diferença entre o processo Iterativo e o Incremental
A diferença abaixo é conceitual e só deve ser levada em consideração caso a pergunta da prova seja EXPLÍCITA, de outra forma, os processos costumam ser iterativos e incrementais ao mesmo tempo.

Incremental : São adicionados pedaços completos. São adicionados incrementos a cada iteração. Um pedaço implantável e funcionando.

Iterativo: esboços ou pedaços incompletos do produto são melhorados a cada iteração. Pense na pintura de uma parede. Cada demão é uma iteração.

Veja a figura abaixo para ficar mais fácil de entender:


Vantagens: 

O cliente pode receber e avaliar as entregas do produto mais cedo, desde a primeira iteração.
Os desvios são identificados e é possível replanejar as próximas iterações.
O risco de fracasso do projeto diminui.

Desenvolvimento em Espiral
Também é um modelo iterativo e o processo é representado como uma espiral em vez de uma sequência de atividades. Cada volta na espiral representa uma etapa no processo de desenvolvimento.

Não existem fases fixas, como Especificação, Projeto e etc. Os loops são escolhidos de acordo com a necessidade. O Desenvolvimento em Espiral foi o primeiro a acrescentar aspectos gerenciais ao desenvolvimento de software.

Cita Análise de Riscos explicitamente. Os outros modelo não previam essa análise, por mais que isso fosse feito na prática. Para concursos, a diferença deste modelo para o outro é essa.

A prototipagem é uma técnica muito utilizada durante a Análise de Riscos do modelo em espiral, mas existe um problema: essa análise acrescenta complexidade ao projeto e requer experiência das pessoas envolvidas para avaliação dos riscos.

Abaixo a representação do Desenvolvimento em Espiral do Boehm, que é a ideia original e mais cobrada nos concursos.

No Planejamento é feito um plano, são geradas estimativas e coisas do tipo. Depois, é feita uma Análise de Riscos onde você se pergunta se o projeto é tecnica e economicamente viável. Depois disso decide-se se o projeto continua ou não. Se for necessário aborta-se o projeto neste ponto.

Dentro do quadrante de engenharia é onde acontecem as atividades técnicas do desenvolvimento de software, as fases dos modelos de processo que vimos até agora. No final existe o quadrande de feedback do seu cliente.

A espiral começa de dentro para fora, com loops pequenos e vai crescendo.

Aqui, temos um problema. Existem autores que enxergam 4 fazes diferentes do modelo de Boehm e isso pode ser cobrado, já vi algumas questões sobre isso:

  • Definição de objetivos - São definidos os objetivos para a fase do projeto.

  • Avaliação e redução de risco - é realizada uma análise detalhada para cada risco identificado e são tomadas providencias para reduzir esses riscos.

  • Desenvolvimento e validação - é escolhido o modelo de desenvolvimento do sistema, e o sistema é então desenvolvido e validado.

  • Planejamento - O projeto é revisto e é tomada uma decisão sobre continuar com o próximo loop, e se for o caso é traçado o planejamento para a próxima fase.


Desenvolvimento em Espiral do Pressman
É muito parecido com modelo original, apenas com algumas diferenças. Existe a comunicação (requisitos) antes do planejamento e existe a fase de construção e release, que foi separada da parte de engenharia. No final das contas, a ideia é a mesma do modelo anterior.
O loop inicial e mais escuro seria uma fase de conceito do seu produto.  Depois, no segundo loop, um pouco menos cinza, entra a fase de desenvolvimento do produto. Na sequência, melhoria do produto e por último, uma fase de manutenção. Então, cada loop pode ser considerado uma FASE DO PROCESSO DE DESENVOLVIMENTO.