Nesse artigo vamos apresentar uma visão geral de alguns
métodos ágeis de gestão de projetos de desenvolvimento de software. O leitor
poderá notar que praticamente todos esses métodos usam rodadas (sprints, ciclos,
iterações) de trabalho para criar partes menores de um produto maior e
completo. A escolha e priorização dessas partes menores – criadas em cada
rodada - leva sempre em consideração o que é mais útil, prioritário e gera mais
valor para os clientes.
As abordagens ágeis aqui tratadas e descritas
nesse artigo em suas linhas gerais, parecem provar que existe uma diversidade
de ideias e preferências presentes no campo da engenharia de software e do
gerenciamento de projetos. Mas, como na frase de Bob Marley, essas diferenças não
derrubam o ágil, ao invés disso, ajudam a levantá-lo.
“Seja diferente:
Não derrube.
Ajude a levantar...”
(Bob Marley)
Scrum – Dentro desse método ágil, um
projeto é divido em ciclos chamados de Sprints. Um Sprint representa um Time
Box (período de tempo, tipicamente de 2 a 4 semanas) dentro do qual um conjunto
de atividades deve ser executado. Tudo que vai ser implementado em um projeto é
mantido em uma lista de itens chamada de Product
Backlog. No início de cada Sprint, faz-se uma Sprint
Planning Meeting (reunião de planejamento do Sprint), em que o Product Owner prioriza
os itens do Product
Backlog e a equipe seleciona os itens que serão implementados durante
o Sprint que se inicia.
Os itens alocadas em um Sprint são transferidas do Product Backlog para o Sprint Backlog. Para tratar do que foi feito no dia anterior, identificar gargalos e priorizar o trabalho do dia que se inicia, a equipe realiza uma reunião chamada Daily Scrum Meeting. Ao final de um Sprint é realizada uma reunião de revisão chamada de Sprint Review Meeting, na qual a equipe apresenta os itens implementados e o projeto é avaliado com relação aos seus objetivos. Finalmente, é também realizada uma reunião de retrospectiva, chamada de Sprint Retrospective Meeting, para avaliar o que funcionou bem, o que pode ser melhorado e que ações serão tomadas para melhorar.
Os principais papéis no Scrum são o
Product owner, que define os itens que compõem o Product
Backlog e os prioriza nas Sprint
Planning Meetings, o Scrum Master, que é o responsável por facilitar
o trabalho de toda a equipe, principalmente no que diz respeito à compreensão
dos conceitos do Scrum, e a equipe (Scrum Team) que
trabalha com os itens priorizados do Product
Backlog e se compromete a
entregá-los ao final de um Sprint.
XP (eXtreme Programming) – É um método
ágil no qual o desenvolvimento de software é feito em iterações de curto período
de tempo (1 ou 2 semanas) onde a equipe desenvolve um conjunto de
funcionalidades. No início da iteração os desenvolvedores e clientes se reúnem
para priorizar as funcionalidades. Essa reunião chama-se jogo de planejamento e
nela já devem estar criadas as User Stories (Estórias de Usuário). Se uma
estória for muito grande, deverá ser dividida em tarefas com menor duração. O planejamento é importante para que sempre se faça o que é mais
importante e prioritário. O XP segue um conjunto de práticas que auxiliam no
alcance de um projeto bem sucedido e incluem, por exemplo, o cliente sempre
presente, programação em par, metáforas, TDD, refatoração, código coletivo,
padronização de código, design simples, integração contínua e releases curtos.
No XP também são adotadas reuniões diárias de curta duração, feitas com as
pessoas de pé, para alinhamento do projeto e discussão de problemas, chamadas
de Stand Up Meetings (Reunões de Pé).
Users Stories (Estórias de Usuário) são escritas pelos clientes com “coisas que o software precisa fazer”, substituindo documentos detalhados de requisitos e são usadas para criar estimativas de tempo para a reunião de planejamento além de auxiliar na criação dos critérios de testes de aceitação.
Spike Solutions se refere ao uso do
programa mais simples possível para explorar soluções potenciais. É usado para
determinar quanto trabalho será necessário para resolver ou contornar um
problema de software.
Programação em par – Dois programadores
fazendo o trabalho juntos em um único computador para revisão do código,
redução de falhas e melhoria da qualidade.
Metáforas – São elementos usados no
computador que simulam “coisas” que existem no mundo físico (lixeira, porta,
janela, pasta, etc). As metáforas melhoram a comunicação e o entendimento de partes
do código que executam determinadas funções representadas por elementos do
mundo físico com os quais os desenvolvedores e clientes estão familiarizados.
TDD
(Test Driven Development ou Desenvolvimento Orientado à Testes) – Primeiro se escrevem
os testes, antes de implementar o sistema (conjunto de componentes integrados).
Cada componente é testado individualmente para garantir sua correta operação. Depois
disso, os componentes são integrados para formar o sistema e então testados,
buscando-se encontrar erros que resultem de interações não previstas nos testes
individuais.
Refatoração – Uma técnica usada pelas
equipes para melhorar continuamente a estrutura do código quando uma nova
funcionalidade é introduzida, tornando-o mais claro e fácil de ser compreendido,
mas sem mudar o comportamento das funcionalidades.
Código coletivo – Isso significa que o código
fonte não tem dono e ninguém na equipe de desenvolvedores precisa solicitar
permissão para modificar o mesmo.
Padronização de código – Isso significa
que existe um jeito certo de fazer as coisas no projeto e todos na equipe devem
seguir essas regras definidas para desenvolver o software.
Integração contínua – Isso significa que
não se deve esperar muito tempo (1 semana ou mais) para integrar uma nova funcionalidade
com a versão atual do sistema.
Releases curtos – Isso significa que os
releases são pequenos pedaços do produto que está sendo desenvolvido no
projeto.
DSDM
(Dynamic Systems Development Method) – É uma metodologia ágil de desenvolvimento
de software iterativa e incremental que enfatiza o envolvimento
constante do usuário. Assim sendo, em cada rodada no método, partes do software
(funcionalidades ou componentes funcionais do sistema) vão sendo entregues.
É importante ter a compreensão que para iniciar o ciclo de desenvolvimento iterativo no DSDM o projeto precisa estar construído em uma base sólida, com fundamentos que incluem, por exemplo, um estudo de viabilidade e um plano geral de desenvolvimento.
A estrutura de trabalho do DSDM possui fases
que são descritas a seguir:
Pré-Projeto: Essa fase deve garantir que
os projetos estejam prontos para começar com base no objetivo e nas metas de
negócios.
Antes de iniciar a construção das funcionalidades, o projeto no DSDM considera que deve ser feita uma análise de viabilidade e também deve ser elaborada uma análise do negócio. Como resultado se obtém o relatório de
viabilidade, a lista de requisitos do
sistema e o plano geral de desenvolvimento.
Após a conclusão destas duas fases, o
sistema é desenvolvido iterativamente e incrementalmente, em um modelo
evolucionário que considera o seguinte:
Iteração do modelo funcional: Tem foco
na criação, a partir dos requisitos identificados no estágio anterior, de
protótipos funcionais que determinam as funcionalidades a serem implementadas, que
resultarão desta iteração. Isso feito, a lista de requisitos é atualizada,
removendo-se os itens entregues e refazendo a lista de prioridades dos
requisitos remanescentes.
O sistema é construído exatamente de
acordo com o design e as funções consolidadas e integradas nos protótipos.
Na fase de implantação, ocorre a entrega das funcionalidades (ou componentes
funcionais do sistema) desenvolvidas, devidamente prontas e funcionando para
utilização pelos usuários finais. Inclui também o treinamento dos usuários e a
entrega da documentação do projeto relacionada às funcionalidades que estão
sendo entregues.
Pós-Projeto: Esta fase garante a eficiência
e eficácia do projeto, através de manutenções, melhorias e ajustes.
FDD (Feature Driven-Development) – é um método ágil e iterativo para
desenvolvimento de software que combina gestão de projetos com boas
práticas de engenharia de software. No FDD o projeto é dividido em
“features” (funcionalidades) definidas como pequenas partes de um projeto
completo.
No FDD é feito um mapeamento sobre que partes do software os desenvolvedores serão capazes de criar, dividindo as solicitações maiores e complexas em uma série de conjuntos menores e, em seguida, é elaborado um plano que estabelece como concluir cada um desses conjuntos menores ao longo do tempo.
Os principais papéis do FDD são os seguintes:
Gerente de Projetos (Project Manager) – É
o administrador do projeto, que faz os relatórios de progresso e gerencia o orçamento,
os equipamentos, os recursos, etc.
Arquiteto Chefe (Chief Architect) – É o
responsável pelo design geral do sistema.
Gerente de Desenvolvimento (Development
Manager) – É o membro da equipe que lidera as atividades de desenvolvimento do
dia-a-dia.
Programador Chefe (Chief Programmer) – É
um programador experiente que já passou algumas vezes por todo o ciclo de vida
de desenvolvimento de software.
Proprietários de classe (Class Owners) -
São desenvolvedores que estão trabalhando como membros de pequenas equipes de
desenvolvimento sob a orientação de um Programador Chefe.
Especialistas em Domínio (Domain Experts)
- São usuários, patrocinadores, analistas de negócios, ou todos esses
especialistas combinados, conhecidos por possuir a base de conhecimento na qual
os desenvolvedores dependem e confiam para entregar o sistema correto.
O FDD é multifuncional, iterativo e
altamente colaborativo e possui cinco (5) etapas básicas:
Desenvolver um modelo geral – Com
orientação do Arquiteto Chefe, a equipe desenvolve um modelo geral que serve de
base para a criação da lista de funcionalidades a ser desenvolvida no projeto.
Construindo a lista de funcionalidades -
Usando o modelo da etapa anterior, a equipe ou o Programador Chefe constrói uma
lista de funcionalidades considerando o que será útil para os usuários e poderá
ser concluído ao longo de um cronograma de liberação de funcionalidades.
Planejamento por funcionalidade - Os
planos são colocados na ordem em que as funcionalidades serão implementadas. As
equipes são então selecionadas para desenvolver cada conjunto de funcionalidades.
Design por funcionalidade - Nesse estágio,
o Programador Chefe escolhe as funcionalidades para o desenvolvimento e faz a
alocação destas para as equipes. Geralmente, uma equipe deve contar com as
seguintes funções/papéis: Gerente de Projeto, Arquiteto Chefe, Gerente de Desenvolvimento,
Especialista de Domínio, Proprietário de Classe e Programador Chefe.
Construindo por funcionalidade - As
equipes trabalham para fazer a codificação das funcionalidades, os testes e a
documentação completas de cada funcionalidade. As funcionalidades concluídas
pela equipe e avaliadas pelo cliente são liberadas.
Embora os métodos sejam diferentes, há muitas semelhanças entre
eles.
É perfeitamente possível notar que nos
métodos estudados existe a ideia da rodada de trabalho, em que partes menores vão sendo feitas e incorporadas para formar um todo. Os nomes dessas
rodadas de trabalho (Sprint, ciclo, iteração) podem variar de método para
método, mas a filosofia é nitidamente comum à todos.
A duração dos Sprints, ciclos ou
iterações é de poucas semanas. Além disso, a maior parte dos métodos ágeis foi
idealizada para o trabalho com equipes pequenas.
Há uma etapa de avaliação inicial que
tem como propósito a tarefa de responder as seguintes
perguntas: - O que vamos fazer? Como vamos dividir esse problema grande em
partes menores? As respostas ajudam a criar a lista de funcionalidades do
software que será desenvolvida.
Outro aspecto presente em quase todos os
métodos aqui apresentados é que, ao invés de elaborar um plano completo e que
abranja todo o projeto, o planejamento é feito para cada rodada de trabalho. Se
analisarmos em linhas gerais, será possível notar que no Scrum esse plano é o
planejamento do Sprint (Sprint Planning). No XP existe o chamado jogo de
planejamento que utiliza as estórias de usuário, os critérios dos testes de
aceitação e elabora o plano da iteração. No FDD o planejamento é feito por
funcionalidade, uma vez que os planos são colocados na ordem em que as funcionalidades
serão implementadas.
Outro ponto que merece ser destacado é
que cada método, a sua maneira, permite que seja criado um fluxo contínuo de
desenvolvimento de software.
Espero que você leitor que me acompanha
tenha gostado desse conteúdo. Deixe seu comentário. Bem, é isso aí. Até a
próxima!
Nenhum comentário:
Postar um comentário
Inclua seu comentário: