Escolar Documentos
Profissional Documentos
Cultura Documentos
Objetivo da Unidade:
ʪ Material Teórico
ʪ Material Complementar
ʪ Referências
1 /3
ʪ Material Teórico
Planning Poker
O Planning Poker é uma técnica de estimativa ágil que se tornou muito popular nos últimos anos.
É baseado em uma técnica de estimativa conhecida como Wideband Delphi, que foi criada pela
RAND Corporation na década de 1968.
A técnica foi aprimorada por James Grenning em 2002. Tornou-se muito mais popular quando
foi incluída no livro “Agile Estimating and Planning” de Mike Cohn. Embora os fundamentos da
técnica já existam há muitos anos, os refinamentos de Grenning a tornaram utilizável por
equipes ágeis e eles tiraram o máximo proveito.
Então, quanto tempo uma história de usuário deve levar para se desenvolver, assumindo zero
interrupções.
Além disso, no início de um projeto, há muitos itens pendentes para estimar para que o Planning
Poker seja eficaz.
Nesses casos, a avaliação de massa relativa funciona bem.
Usando essa técnica, a equipe SCRUM primeiro organiza as histórias de usuário em ordem de seu
tamanho relativo, do pequeno ao grande nível de esforço e, em seguida, atribui pontos de
história a cada um usando uma sequência de Fibonacci modificada (aqui entra o Planning
Poker).
O resultado é uma lista de pendências inicial totalmente estimada do produto, que permitirá ao
proprietário do produto criar um plano de lançamento.
Vários membros da equipe são solicitados a estimar uma história de usuário desenhando uma
carta de jogo com uma série de pontos de história e colocando-a voltada para baixo na mesa.
Em seguida, os cartões são virados para cima e, se houver discrepâncias – por exemplo, um
membro da equipe estimou 1 ponto e outros estimaram 4 ou 5, eles podem discutir e chegar a
um consenso.
Creio que seja o momento ideal de você não ter mais dúvidas a este respeito porque, afinal,
estamos desenvolvendo a parte escritural de um projeto.
O moderador apresenta uma história de usuário por vez para a equipe. São as
histórias daquela sprint ou no máximo 2 sprints;
O Product Owner responde a quaisquer perguntas que a equipe possa ter sobre a
história;
Quando todos estão prontos com um “orçamento” (sim, você está estimando,
orçando quando lança uma carta), todos os cartões são apresentados
simultaneamente;
- HARTMAN, 2009, p. 1
Por que esse “jogo” se tornou tão útil:
Cria uma estimativa de consenso em vez de ter uma única pessoa conduzindo a
estimativa;
Aqueles que realmente poderiam fazer o trabalho são os que votam. Muitas vezes, as equipes
ágeis fazem com que todos votem, mesmo que não tenham ideia do trabalho envolvido na
história. Eu particularmente sou extremamente contra isso. Vota quem pode fazer o trabalho de
verdade e sim, tem que ser mais que um, os motivos são óbvios e seguem os princípios dos
times ágeis autogerenciáveis e com experiência. Além disso, há uma velha máxima na área de
tecnologia da informação que diz respeito a: backup, redundância e contingência. Nunca se
esqueça disso, você pode ficar “na mão” de uma hora para outra.
Quando houver empate na votação entre dois tamanhos consecutivos, basta escolher o tamanho
maior e seguir em frente.
Lembre-se de que os tamanhos consecutivos podem ser 5 e 8 se você estiver usando a sequência
de Fibonacci para dimensionamento (1, 2, 3, 5, 8, 13…). Ninguém deve reclamar de usar o
número mais alto, e uma divisão igual geralmente leva muito tempo para ser resolvida.
Geralmente também resulta no número mais alto, pelo menos na minha experiência, então
vamos usar esses fatos a nosso favor e seguir em frente.
Pare as discussões de implementação antes que elas se aprofundem demais; afinal, as equipes
costumam ir até os detalhes técnicos quando estão discutindo uma história de usuário. Isso é
bom até certo ponto, mas deve ser severamente limitado. Não mais do que uma discussão de um
minuto. As pessoas que fazem o dimensionamento devem determinar em sua mente a solução
mais simples possível e escolher um tamanho com base nesse cenário.
Use algum tipo de cronômetro para limitar a discussão, normalmente se limita as discussões a
não mais do que 1 minuto. Trata-se da questão de você criar uma cultura de ser eficaz.
Também é importante limitar o número de rodadas quando não se tem consenso, normalmente
eu limito nos projetos até a terceira rodada, de tal forma que se exceder eu escolho o maior
tamanho e sigo em frente para a próxima história.
Jogo de planejamento não é um amontoado de adultos brincando com cartas, trata-se de uma
técnica mundialmente utilizada para estimativa de desenvolvimento, otimize o tempo da sua
equipe de desenvolvimento, sugiro uma boa prática aqui: faça com que a pessoa que está criando
as histórias de usuário (pode ser o product owner ou outro) se reúna com os líderes de controle
de qualidade e desenvolvimento antes de ir jogar o planning poker com o time scrum. Recomendo
isso para garantir que as histórias de usuário tenham respostas para as perguntas mais óbvias
que a equipe fará durante esse processo.
Por fim, é importante lembrarmos e mantermos a linha de base de uma história de usuário, ela
deve ser e se manter consistente durante e para cada iteração (sprint). Então, o que quer que a
equipe escolha como linha de base precisa ser consistente de sprint para sprint. Se um dia ideal
tiver tamanho 1, todas as sprints precisam usar esse ponto de referência. Se uma determinada
história de usuário for de tamanho 1 ou 3, então isso precisa permanecer consistente nas sprints.
Ao final você deve sair com uma lista de história de usuários mais bem estruturada e com as
observações que o time de desenvolvimento colocar, melhor se traduzir os story points em horas,
veja na tabela a seguir:
Burndown
O Gráfico de Burndown é uma ferramenta de medição visual que mostra o trabalho concluído por
dia em relação à taxa de conclusão projetada para a versão atual do projeto. Seu objetivo é
permitir que o projeto esteja no caminho certo para fornecer a solução esperada dentro do
cronograma desejado.
Nós vimos que a taxa de progresso de uma equipe Scrum é chamada de velocidade. Ele expressa a
quantidade de trabalho ou, dependendo do tipo de equipe que estiver construindo, pontos da
história medidos por iteração.
Uma regra de importação para calcular a velocidade é que apenas as histórias concluídas no final
da iteração são contadas. A contagem do trabalho parcialmente finalizado é estritamente
proibida. Trabalho de software sem teste ou que tem pendência de teste não é aceito para
computar isso, portanto além de proibido no Scrum não deve ser computado, mesmo!
Após algumas Sprints, a velocidade de uma equipe Scrum provavelmente será previsível e
permitiria uma estimativa bastante precisa sobre o tempo necessário até que todas as entradas
no Backlog do produto Scrum sejam concluídas.
“Os gráficos de Burndown são altamente efetivos e têm muitos pontos fortes.
As equipes podem ver onde precisam de concentrar os seus esforços para “se
encontrarem” novamente;
Motivam a equipe;
Mostram à equipe onde esta foi bem sucedida e quanto trabalho ainda
precisam realizar.
Não mostram quão perto uma equipe está de completar o seu trabalho;
A equipe também pode desmoralizar, se sentir que está a ser micro gerida (estão
ingerindo na autonomia) e isso em ágil normalmente é mortal (o time deixa que
está micro gerenciando ou tentando influenciar falando sozinho).
Qualquer informação que não seja contemplada no gráfico de burndown deve ser
abordada numa reunião SCRUM, para a equipe ter uma imagem clara de como o
projeto está avançando.”
- GONÇALVES, 2020, p. 3
Gráficos de Burndown são simples, afinal, é uma única linha correndo para encontrar zero ao
final do tempo (última data) quando o projeto é concluído, não me parece ser difícil de entender
e construir. Qualquer um pode entender, ele é tão intuitivo que quase não merece sequer
explicação. No entanto, pode ocultar informações importantes, por exemplo, os efeitos da
alteração do escopo.
Burnup
Um gráfico de burnup rastreia o trabalho concluído e o trabalho total com duas linhas separadas,
ao contrário de um gráfico de gravação que os combina em uma única linha. A linha de um
gráfico de burnup mostra o trabalho concluído e comunica informações importantes, por
exemplo, se o projeto ainda não está concluído porque o trabalho é lento para ser realizado ou há
muito trabalho novo sendo adicionado. Essas informações podem ser cruciais para diagnosticar
e corrigir problemas em um projeto.
Esse gráfico mostra claramente o trabalho concluído contra o escopo do projeto. O projeto será
concluído quando as linhas se encontrarem. Simples assim!
Podemos ver que a vantagem do Burnup sobre o Burndown é a inclusão da linha de escopo. Ela
rastreia claramente quando o trabalho foi adicionado ou removido do projeto. Também permite
visualizar uma data de conclusão mais realista para o projeto, estendendo uma linha de
tendência do escopo e da linha de conclusão. Onde as duas linhas de tendência se encontram é o
tempo estimado de conclusão.
Melhor caso: considerar que a equipe atuará no futuro com base no maior
Throughput histórica;
Refatoração de Código
A maioria dos clientes deseja que seus aplicativos sejam desenvolvidos de forma rápida,
econômica e confiável. No entanto, na busca por economia de tempo e dinheiro, a qualidade é
muitas vezes deixada de lado e algumas atividades de melhoria de qualidade são colocadas em
um depósito que muitas vezes fica esquecido, portanto, nunca ocorrerá, e isso é péssimo.
Refatoração é algo muito próximo dos sistemas de qualidade de montadoras como a Toyota. Sim,
trata-se de melhoria contínua, porém sem alterar a essência, ou seja, o objetivo da
funcionalidade do software.
O interessante é que a necessidade de refatoração de código pode não ser realmente óbvia para
observadores externos.
Em geral, olhar para trás e organizar o código atual antes de adicionar novas funcionalidades
não apenas melhorará a qualidade do aplicativo em si, mas também tornará mais fácil para
futuros desenvolvedores construir/melhorar o código-fonte.
Não refatorar gerará ao longo do tempo do projeto de software algo que é perigoso e que é
chamado de: dívida técnica.
A falta de refatoração pode resultar no acúmulo dessa dívida técnica, ou seja, os resultados
quando as equipes de desenvolvimento tomam ações para agilizar a entrega de uma
funcionalidade ou projeto que posteriormente precisa ser refatorado.
Em outras palavras, é o resultado de priorizar a entrega rápida sobre o código perfeito, podemos
dizer que isso gera a dívida técnica.
Portanto, quanto mais tempo demoramos para nos importar com os problemas menores ao
longo do caminho, maior a probabilidade de eles se transformarem em grandes complexidades
mais à frente.
As principais consequências em alto nível causadas pela dívida técnica acumulada no sistema
são:
Assim, mais cedo ou mais tarde, a “dívida deverá ser quitada”, para que se prossiga com o
trabalho de desenvolvimento e melhoria.
Reuso de Código
A reutilização de código pode resolver os problemas de crescimento de software associados a
desafios comerciais e técnicos.
Porém quando se consegue desenvolver bibliotecas temos muitas vantagens que valem a pena o
esforço:
Segundo Bellairs (2017), existem quatro características principais de qualidade de software que
afetam a reutilização:
“Segurança: Para ser reutilizado, o código precisa ser seguro. Você pode garantir
Confiabilidade: para ser reutilizado, o código precisa ser confiável. Você pode
garantir um código confiável garantindo disponibilidade, tolerância a falhas e
capacidade de recuperação;
- BELLAIRS, 2017, p. 2
Uma única pessoa raramente é responsável pela codificação de projetos de software de médio ou
grande porte. Hoje, as equipes, tanto locais quanto geograficamente dispersas, fazem a maior
parte do desenvolvimento.
Um forte sistema de controle de versão de código pode fornecer clareza ao revisar o software,
esclarecendo o que foi alterado, por quem e quando. Geralmente, essas soluções funcionam para
fornecer um formato lógico para rastrear o progresso do desenvolvimento, mantendo as
alterações detalhadas, e têm a capacidade de reverter para versões anteriores.
O controle de versão permite que você gerencie as alterações nos arquivos ao longo do tempo.
Você pode usar o controle de versão para código de versão, arquivos binários e ativos digitais. Ele
é um componente do gerenciamento de configuração de software, além disso também é a prática
DevOps de garantir que cada tecnologia em um determinado produto esteja usando uma versão
escolhida e confiável da tecnologia que seja compatível com cada componente dentro do
ecossistema do produto.
Hoje, uma equipe de desenvolvedores é responsável pela maioria das compilações de software. A
importância do controle de versão do código é que ele fornece um veículo de comunicação
constante para a equipe, estejam eles na mesma sala ou ao redor do mundo.
O controle de versão fornece um método lógico que preserva as contribuições individuais dos
membros da equipe sem sobrescrever o trabalho de outro desenvolvedor e, a seguir, mescla e
reconcilia as alterações e atualizações. Também é à prova de falhas para localizar e dar suporte a
problemas que estão em conflito. O registro histórico produzido pode ser usado para rastrear as
origens do problema ou arquivar versões para uso posterior, sendo que isso ajuda muito a
interação entre o time de testes e o de desenvolvimento. Mesmo se um desenvolvedor estiver
trabalhando sozinho, o sistema fornece a manutenção de registros defensivos do progresso e
do processo. A preservação de informações valiosas e trabalhos anteriores é possível somente
através do controle de versão.
Claro que fazemos isso através de softwares como GIT ou BITBUCKET, por exemplo. Sim, existem
outros mais sofisticados e caros, mas como exemplo, esses dois servem muito bem para ilustrar
que, os sistemas de controle de versão de software oferecem suporte a um plano geral de
desenvolvimento Ágil, fornecendo um mecanismo de prova de como o código foi construído,
quando foi alterado e por quem.
Quando esses sistemas são bem gerenciados, eles possuem convenções de numeração de versão
que são facilmente identificáveis por toda a equipe.
Ao escolher um sistema de controle de versão, as primeiras etapas incluem saber de qual acesso
você precisa e como a equipe deve colaborar. O modo como o documento é controlado, editado e
mesclado também é de importância central.
O controle de versão pode ser uma excelente ajuda para correções de emergência, manutenção
de rotina, atualizações e novos recursos com prazos de desenvolvimento potencialmente
sobrepostos.
Quando você precisa solucionar um problema, pode acessar e comparar facilmente o último
arquivo de trabalho com o arquivo com defeito e diminuir o tempo gasto na identificação da
causa de um problema.
Você pode restaurar versões anteriores de um arquivo, ou até mesmo de todo o projeto de forma
eficaz por meio do uso de sistemas de controle de versão, sendo que você pode simplesmente
desfazer tudo que você fez com apenas alguns cliques.
Um sistema de controle de versão distribuído é projetado para atuar nos dois sentidos. Ele
armazena todo o histórico do arquivo em cada máquina localmente. Ele também sincroniza as
alterações locais feitas pelo usuário de volta ao servidor sempre que necessário, para que as
alterações possam ser compartilhadas com outras pessoas, proporcionando um ambiente de
trabalho colaborativo.
Código Coletivo
O conceito de Propriedade Coletiva de Código aponta para o fato de que em um processo ágil de
desenvolvimento de software, nenhum membro de toda a equipe possui uma parte específica do
código-fonte.
Portanto, qualquer membro da equipe pode contribuir com uma nova ideia para o projeto que
visa melhorar o design do software e corrigir quaisquer bugs no projeto.
Uma vez implementados, os testes de unidade possibilitam que qualquer pessoa que trabalhe na
equipe aplique qualquer alteração no código-fonte sem afetar a funcionalidade geral e com a
confiança de que quaisquer novas alterações feitas por outros membros da equipe não afetarão o
código.
Como a equipe trabalha com prazo, a propriedade coletiva dos códigos, por meio de testes
unitários, garante que as versões incompatíveis com os códigos da equipe sejam corrigidas
assim que forem desenvolvidas. Isso se mostra mais eficiente em comparação com a correção
de toda a base de código à medida que o prazo se aproxima.
DAO
O padrão Data Access Object (DAO) é um padrão estrutural que nos permite isolar a camada de
aplicativo/negócio da camada de persistência (geralmente um banco de dados relacional, mas
pode ser qualquer outro mecanismo de persistência) usando uma API abstrata.
Os produtos de software trocam dados e funcionalidades por meio de interfaces legíveis por
máquina chamadas de APIs (interfaces de programação de aplicativos).
Portanto, trata-se de um conjunto de códigos de programação que permite a transmissão de
dados entre um produto de software e outro. Ele também contém os termos dessa troca de dados.
A interface pela qual esses dois aplicativos se comunicam é o que a API especifica.
Dando prosseguimento à explicação, agora que você já sabe o que é uma API, está oculta do
aplicativo toda a complexidade de realizar operações CRUD (acrônimo para: Criar, ler, atualizar e
apagar, ou seja, é a mesma coisa que uma rotina de controle cadastra, onde temos sempre as
rotinas de: inclusão, alteração, consulta e exclusão de dados), no mecanismo de
armazenamento subjacente. Isso permite que ambas as camadas evoluam separadamente sem
saber nada uma da outra (isso impede acessos indevidos a todos os dados que podem ser
roubados. Usando essa técnica, apenas o que é estritamente necessário será utilizado).
DAO – Data Access Objects significa Objeto de Acesso a Dados. É usado para separar a lógica de
persistência de dados (armazenagem de dados) em uma camada separada. Dessa forma, o
serviço permanece completamente no “escuro” sobre como são feitas as operações de baixo
nível para acessar o banco de dados. Isso é conhecido como o princípio da Separação da Lógica.
Leitura
Implementando o Data Access Object no Java EE
Vamos entender mais profundamente o DAO lendo o seguinte artigo
contendo exemplos que você poderá rodar em JAVA para testar.
ACESSE
MVC
O padrão de projeto MVC também é conhecido como Model-View-Controller. É um padrão de
arquitetura comum usado para projetar e criar interfaces e a estrutura de um aplicativo. Esse
padrão divide o aplicativo em três partes que são dependentes e conectadas entre si. Esses
designs são usados para distinguir a apresentação de dados de como os dados são aceitos pelo
usuário para os dados mostrados. Esses padrões de projeto se tornaram comuns no uso de
aplicativos da Web e no desenvolvimento de GUIs – Interfaces Gráficas de Usuário.
Leitura
Padrões de Projeto: o Modelo MVC – Model View Controller
Vamos aprofundar os estudos com o artigo a seguir.
ACESSE
GOF
A vantagem de usar Padrões é que eles foram testados e refinados em vários contextos e,
portanto, são tipicamente soluções robustas para problemas comuns.
O padrão conhecido como GOF – Gang Of Four em tradução livre: gangue dos quatro, porque
foram quatro criadores no início. Trata-se de um grupo de vinte e três Design Patterns
originalmente publicados em um livro seminal intitulado Design Patterns: Elements of Reusable
Object-Oriented Software que em português é algo como: Padrões de Desenvolvimento:
Elementos e Reuso em Orientação a Objetos.
Eles são apresentados da seguinte forma levando em consideração suas três grandes divisões:
Esses padrões de projeto são sobre instanciação de classe. Esse padrão pode ser
dividido em padrões de criação de classes e padrões de criação de objetos.
Enquanto os padrões de criação de classes usam a herança de forma eficaz no
processo de instanciação, os padrões de criação de objetos usam a delegação de
forma eficaz para realizar o trabalho. São eles:
Singleton: Uma classe da qual apenas uma única instância pode existir.
Padrões de Projeto Estrutural
Visitor: define uma nova operação para uma classe sem alteração."
- SOURCEMAKING, 2020, p. 2
GRASP
GRASP – General Responsibility Assignment Software Patterns, ou em português Padrões de
Software de Atribuição de Responsabilidade Geral, é um padrão no desenvolvimento de software
orientado a objetos usado para atribuir responsabilidades a diferentes módulos de código.
É necessária a diferenciação entre GRASP e GOF, muita gente confunde os termos. Para tanto
precisamos definir ou ao menos recordar os Princípios de Desenvolvimento Orientados a
Objetos:
Abstração;
Existe uma outra camada abaixo desta em que a iniciativa do GOF persiste, sendo que nesse caso
há uma proximidade do código, enquanto no GRASP a aproximação é mais filosófica e são,
portanto, abstratos. GRASP são princípios e não estão vinculados a nenhum domínio de
problema específico, portanto, verdadeiro em qualquer cenário.
GRASP ajuda a orientar o design orientado a objetos, delineando claramente quem faz o quê: qual
objeto ou classe é responsável por qual ação ou função. Ele também nos ajuda a definir como as
classes funcionam umas com as outras. O ponto chave é ter um código eficiente, limpo e
compreensível. Dentro do GRASP existem nove princípios:
Creator;
Information expert;
Low coupling;
Controller;
High cohesion;
Indirection;
Polymorphism;
Protected variations;
Pure fabrication.
Leitura
Padrões GRASP — Padrões de Atribuir Responsabilidades
ACESSE
SOLID
SOLID é um padrão de codificação que todos os desenvolvedores devem ter um conceito claro
para desenvolver softwares corretamente para evitar um design ruim. Foi promovido por Robert
C. Martin e é usado em todo o espectro de design orientado a objetos. Quando aplicado
corretamente, torna seu código mais extensível, lógico e mais fácil de ler. De forma geral, SOLID
é um acrônimo que pode ser descrito da seguinte forma, levando em conta os princípios gerais
da orientação a objetos:
ACESSE
Manutenção de Software
A fase de manutenção do software ocorre após o produto estar em pleno funcionamento. A
manutenção do software pode incluir atualizações de software, reparos e correções do software
caso fique disfuncional. Os aplicativos de software geralmente precisam ser atualizados ou
integrados a novos sistemas implantados pelo cliente e, portanto, geram manutenção.
O software está sempre mudando e, enquanto estiver sendo usado, deve ser monitorado e
mantido adequadamente. Isso é em parte para se ajustar às mudanças dentro de uma
organização, mas é ainda mais importante porque a tecnologia continua mudando.
Software precisa de manutenção por vários motivos, para mantê-lo funcionando, aprimorar
recursos, retrabalhar o sistema para alterações no futuro, migrar para a nuvem ou qualquer
outra alteração. Qualquer que seja a motivação para a manutenção de software, ela é vital para o
sucesso do seu negócio. Então você a essa altura já deve ter percebido que a manutenção de
software é mais do que simplesmente encontrar e corrigir bugs. É manter o coração do seu
negócio funcionando!
ʪ Material Complementar
Vídeos
ACESSE
3/3
ʪ Referências
ALBINO, R. Métricas ágeis: Throughput e gráfico de Burnup. iMasters, 12/09/2017. Disponível em:
<https://imasters.com.br/agile/metricas-ageis-throughput-e-grafico-de-burnup>. Acesso
em: 18/09/2022.
BELLAIRS, R. What is code reuse? Code reuse best practices. Perforce, 07/07/2017. Disponível em:
<https://www.perforce.com/blog/qac/what-code-reuse-code-reuse-best-practices>. Acesso
em: 18/09/2022.
GONÇALVES, L. Burndown chart: o guia oficial para qualquer scrum masters. Adapt methodology,
03/09/2020. Disponível em: <https://adaptmethodology.com/pt-pt/burndown-chart/>. Acesso
em: 18/09/2022.