Como já é sabido, o mercado consumidor,
de maneira geral, está cada vez mais exigente, sempre desejando
alta qualidade a baixo custo. Historicamente, os produtos/serviços
de software não acompanhavam a evolução dessa
demanda por serem muitas vezes caros ou fora de escopo. E foi
assim, com esse perfil de demanda, que chegamos, no mundo do desenvolvimento
de sistemas, à era das fábricas de software, à
era da escala produtiva normatizada de softwares.
Entretanto, um dos fatores críticos para
que as empresas de software pudessem oferecer produtos ou serviços
a um menor custo e com maior qualidade era a premente necessidade
de trazer consistência e confiabilidade aos seus processos
produtivos, reduzindo retrabalhos e margens de erro.
De acordo com a Pesquisa Nacional de Qualidade
e Produtividade no Setor de Software Brasileiro do MCT (Ministério
de Ciência e Tecnologia), 72,8% da força de trabalho
efetiva do setor de software no Brasil estão concentradas
nas micro e pequenas empresas.
A pesquisa também aponta que, aproximadamente,
89% dessas empresas não utilizam processos de desenvolvimento
de software estruturados. Portanto, podemos inferir que cerca
de 64% dos softwares produzidos no Brasil por micro e pequenas
empresas não possuem um processo de desenvolvimento que
garanta sua qualidade e conformidade com os padrões exigidos
pelo mercado.
Portanto, o objetivo deste artigo é apresentar
alguns modelos de ciclo de vida que possam ser utilizados no desenvolvimento
de software.
O modelo de ciclo de vida é um dos elementos
essenciais do processo de desenvolvimento de tecnologia e a escolha
de um modelo acaba por ter grande influência sobre o sucesso
de produção de um projeto, pois ajuda a melhorar
o seu andamento e a garantir que os objetivos finais de cada passo
sejam alcançados. Ainda, dependendo da escolha, é
possível aumentar a velocidade de desenvolvimento, melhorar
a qualidade, localizar e controlar pontos de melhoria, minimizar
overhead e exposições a riscos e até mesmo
melhorar as relações com os clientes.
A seguir apresentaremos os modelos de ciclo de
vida mais aplicados no desenvolvimento de software:
Code-and-fix: É um modelo raramente
recomendado, porém bastante comum. Esse uso comum se dá
pelo fato de ser um modelo muito simples e não por ser
eficiente. Quando se usa o modelo code-and-fix, inicia-se com
uma idéia geral daquilo que se quer construir. A partir
daí, usa-se qualquer combinação informal
de projeto e codificação até que se tenha
um produto pronto para ser entregue. De uma forma geral, podemos
dizer que a ênfase do modelo code-and-fix é a produção
de código.
Vantagens:
. Baixo
overhead: Não se gasta tempo em planejamento, documentação,
garantia da qualidade e outras atividades – o enfoque único
é na codificação;
. Não
exige muita experiência dos desenvolvedores.
Desvantagens:
. Apresenta
altos riscos: Não faz uso de metodologias de projeto nem
documentação, focando no imediatismo e no improviso,
entre outros;
. Dificuldade
de manutenção do produto final gerado;
. Não
há visibilidade do andamento do projeto, em razão
de dificuldades em se ter uma gerência sistemática
e em gerenciar riscos e a qualidade do produto;
. Dificuldade
de replicabilidade das soluções, uma vez que são
"quase" artesanais;
. Dependência
essencial da qualidade individual, e não do processo +
time, o que, via de regra, significa muitos riscos ao projeto.
Cascata ou Waterfall: É um dos modelos
de ciclo de vida mais simples e mais conhecidos das organizações
de desenvolvimento de software. Nele, as fases do projeto são
executadas em uma seqüência linear e uma próxima
fase só tem início quando a fase anterior está
completamente pronta. Ao final de cada fase, é feita uma
revisão para avaliar se realmente pode-se avançar
para a próxima. Caso a revisão aponte que o projeto
não está apto a entrar na fase seguinte, ele permanece
na fase corrente até que ele seja aprovado.
Vantagens:
. Fácil
de gerenciar: Etapas bem definidas e sem sobreposição;
. Eficiente
em casos nos quais o domínio de aplicação
é bem entendido;
. Eficiente
no desenvolvimento de projetos em quais vários sistemas
similares foram construídos anteriormente.
Desvantagens:
. Em
função da dificuldade de se obter todos os requisitos
do sistema no início do projeto, geralmente esse processo
resulta em um atraso para o início da fase de projeto,
cumulativa ao prazo final;
. Raramente
as fases de execução seguem um fluxo tão
seqüencial e sem interações, portanto o planejamento
não é de qualidade total;
. Obtenção
do produto final apenas no final do projeto, deixando margens
de correção menores.
Prototipação evolutiva: Neste
modelo, os desenvolvedores iniciam o projeto e a implementação
das partes essenciais do sistema em um protótipo e refinam
o mesmo, adicionando novas funcionalidades e melhorias até
ele se tornar o produto de software final que eventualmente se
tornará o produto a ser entregue. A diferença desse
modelo de ciclo de vida com o anterior é que, naquele,
fazia-se primeiramente um protótipo apenas para auxiliar
na elaboração dos requisitos finais do sistema,
o qual depois era descartado. Na prototipação evolutiva,
o próprio protótipo será o produto entregue
ao cliente.
Vantagens:
. Apropriado
para sistemas nos quais os requisitos mudam rapidamente;
. Provê
um feedback constante do cliente a respeito do produto;
. Apropriado
para sistemas nos quais o cliente está apressado para que
você entregue um conjunto de requisitos;
. Aumenta
a visibilidade do produto que está sendo desenvolvido;
. Apropriado
para sistemas nos quais nem você nem seu cliente conhecem
bem o domínio da aplicação;
. Facilita
o trabalho em equipe, a disseminação de conhecimentos
e a complementaridade de competências.
Desvantagens:
. Dificuldade
em se prever o tempo que será necessário para produzir
um produto aceitável;
. Projeto
pobre: Tendência a se desenvolver no modo code-and-fix,
de esquecimento das fases de análise, projeto e testes;
. Manutenibilidade
pobre em razão do projeto idem;
. Maior
complexidade de gerenciar o projeto, os riscos e a qualidade do
produto final.
Modelo Iterativo Incremental: Tenta combinar
os benefícios do modelo cascata e da prototipação.
A idéia básica é que um software deveria
ser desenvolvido em partes, cada qual adicionando alguma capacidade
funcional ao mesmo até que o software completo esteja implementado.
A cada incremento, podem ser feitas extensões e modificações
do projeto. Para o controle dessas alterações, o
modelo faz uso de uma lista de controle, que contém, em
ordem, todas as tarefas que devem ser executadas até a
implementação final do produto. Cada passo consiste
em remover a próxima tarefa selecionada, codificar e testar
a implementação, fazer uma análise do produto
obtido após a execução dessa fase e atualizar
a lista com o resultado da análise realizada.
Vantagens:
. Disponibilidade
de partes prontas do sistema mais cedo;
. Facilidade
nos testes: Geralmente, testar cada incremento é mais fácil
do que testar o software pronto e tudo de uma vez só;
. Feedback
do cliente a cada incremento feito;
. A
aprendizagem do desenvolvedor numa linguagem é favorecida:
Pode se optar em resolver as partes mais fáceis antes,
enquanto ele aprende a linguagem, e deixar as partes mais complexas
do sistema para depois.
Desvantagens:
. A
possibilidade de o sistema ser dividido em partes como pré-requisito,
já que nem sempre um sistema pode ser dividido;
. Dificuldade
na integração das partes desenvolvidas;
. Negociação
com o cliente a respeito do pagamento do produto de software final
pode ser problemática, uma vez que o desenvolvimento em
passos incrementais costuma induzir o cliente a acrescentar requisitos
e funcionalidades que não estavam previstas no escopo inicial
do projeto, o que resulta no encarecimento do desenvolvimento
do produto final.
Espiral: É um modelo de ciclo de
vida orientado a riscos, que reparte o projeto em mini-projetos.
O conceito de risco pode referenciar desde uma compreensão
pobre dos requisitos ou da arquitetura até problemas de
performance ou no conhecimento da tecnologia a ser aplicada, dentre
outros. Após a resolução dos riscos maiores,
o modelo espiral pode ser terminado com um outro modelo de ciclo
de vida qualquer.
Cada ciclo da espiral envolve alguns passos para
que o mesmo seja concluído, dentre os quais:
. Determinar
objetivos, alternativas e incertezas;
. Identificar
e resolver riscos;
. Avaliar
as alternativas;
. Desenvolver
os produtos de entrega para aquela interação e verificar
seu grau de correção;
. Planejar
a próxima interação.
Vantagens:
. Possibilidade
de combinar o modelo espiral com outros modelos de ciclo de vida;
. Ajuda
a aumentar a qualidade pelo planejamento e análise dos
riscos em cada fase;
. Maior
visibilidade para a gerência, sobretudo na gerência
de riscos.
Desvantagens:
. Gerência
de processo mais complexa;
. Necessidade
de maior experiência da equipe de desenvolvimento, sobretudo
dos responsáveis pela gerência;
. Maior
experiência da equipe e maior esforço para o desenvolvimento
podem aumentar consideravelmente os custos.
Além dos modelos de ciclo de vida descritos,
encontramos na literatura muitos outros modelos e cada um deles
geralmente enfoca um determinado tipo de projeto específico.
Podemos perceber que todos os modelos de ciclo
de vida possuem particularidades próprias e apresentam
vantagens e desvantagens. Assim, a escolha de um modelo depende
do contexto do projeto onde ele será aplicado.
Nenhum modelo de ciclo de vida é tido como
ideal, pois aquele que é mais rápido e eficiente
em certos projetos pode ser mais lento ou complexo quando o domínio
do problema é trocado.
O mais importante é que as empresas de desenvolvimento
de software tenham algum modelo de ciclo de vida, ou melhor, um
"catálogo" de modelos personalizado de acordo
com a sua estrutura organizacional e projetos (demandas e expectativas
dos clientes) para que consigam níveis de excelência
em seus produtos e serviços. Vale ainda lembrar que esse
é um dos pré-requisitos fundamentais para que elas
almejem uma certificação do tipo CMM.
Douglas Braz Tokuno é consultor de Tecnologia
da E-Consulting Corp.