Logo Passei Direto
Buscar
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

DOCUMENTAÇÃO
DE PROJETO DE SOFTWARE
SocialManager
Versão 1.1
Arthur Sampaio
Antunes Dantas
Lucas Silva
Valter Lucena
Wesley Santos
Universidade Federal de Campina Grande
Professor: Rohit Gheyi
1
Sumário
1 Introdução 5
1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Visão da Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Descrição do Documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 Planejamento 7
2.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 Escolha da Rede Social . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Gerência de Tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.1 Estimativa de tempo com UCP . . . . . . . . . . . . . . . . . . . . 8
2.2.1.1 Cálculo de UUCP . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1.1.1 Cálculo do UUCW: . . . . . . . . . . . . . . . . . 9
2.2.1.1.2 Cálculo do UAW: . . . . . . . . . . . . . . . . . . 9
2.2.1.2 Cálculo de TCF . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.1.3 Cálculo de ECF . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1.4 Estimativa de horas . . . . . . . . . . . . . . . . . . . . . 11
2.2.2 Primeira Entrega . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.2.1 Cronograma da primeira entrega . . . . . . . . . . . . . . 12
2.2.2.2 Lições aprendidas com a primeira entrega . . . . . . . . . 12
2.2.3 Segunda entrega . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.3.1 Definição da estratégia de estimativa de tempo de User
Stories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.3.2 Sprint 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.3.3 Cronograma da Segunda Entrega . . . . . . . . . . . . . . 16
2.2.3.4 Acompanhamento da segunda entrega . . . . . . . . . . . 17
2.2.3.5 Lições aprendidas com a segunda entrega . . . . . . . . . . 18
2.3 Gerência de Custo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4 Gerência de Riscos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5 Gerência de Recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3 Processos de Software 24
4 Requisitos 26
4.1 Entrevista com stakeholders . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2 Requisitos Não Funcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.2.1 Requisitos de Processo . . . . . . . . . . . . . . . . . . . . . . . . . 27
2
4.2.2 Requisitos de Produto . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2.2.1 Integridade e Segurança . . . . . . . . . . . . . . . . . . . 28
4.2.2.2 Eficiência . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2.3 Requisitos Externos . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2.3.1 Legais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2.3.2 Éticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.3 Requisitos Funcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.3.1 RF-01 - Vincular rede social . . . . . . . . . . . . . . . . . . . . . . 31
4.3.2 RF-02 - Desvincular rede social . . . . . . . . . . . . . . . . . . . . 32
4.3.3 RF-03 - Visualizar resumo do perfil . . . . . . . . . . . . . . . . . . 33
4.3.4 RF-04 - Visualizar conexões . . . . . . . . . . . . . . . . . . . . . . 33
4.3.5 RF-05 - Desfazer amizade / deixar de seguir usuário . . . . . . . . . 34
4.3.6 RF-06 - Fazer amizade / seguir usuário . . . . . . . . . . . . . . . . 35
4.3.7 RF-07 - Filtrar conexões . . . . . . . . . . . . . . . . . . . . . . . . 35
4.3.7.1 Filtros de conexões . . . . . . . . . . . . . . . . . . . . . . 36
4.4 Diagrama de Casos de Uso . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.5 Protótipos de Telas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5 Projeto Arquitetural 38
6 Modelagem 39
6.1 Análise dos Casos de Uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.2 Diagramas de Sequência . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.2.1 Diagrama de Sequência - Caso de Uso: Vincular Rede Social . . . . 39
6.2.2 Diagrama de Sequência - Caso de Uso: Desvincular Rede Social . . 40
6.2.3 Diagrama de Sequência - Caso de Uso: Deixar de Seguir um Perfil . 41
6.2.4 Diagrama de Sequência - Caso de Uso: Visualizar resumo do perfil . 42
6.2.5 Diagrama de Sequência - Caso de Uso: Começar a Seguir um perfil 43
6.3 Contratos de Operação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7 Especificação Formal 45
8 Implementação 46
9 Testes 47
9.1 Plano de testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
9.2 Testes de unidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
9.3 Testes funcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
9.3.1 RF-01 - Vincular rede social (Instagram) . . . . . . . . . . . . . . . 48
9.3.2 RF-02 - Desvincular rede social . . . . . . . . . . . . . . . . . . . . 50
9.3.3 RF-03 - Ver resumo do perfil . . . . . . . . . . . . . . . . . . . . . . 51
9.3.4 RF-04 - Visualizar conexões . . . . . . . . . . . . . . . . . . . . . . 51
9.3.5 RF-05 - Desfazer amizade / deixar de seguir usuário . . . . . . . . . 52
3
9.3.6 RF-06 - Fazer amizade / seguir usuário . . . . . . . . . . . . . . . . 53
9.3.7 RF-07 - Filtrar conexões . . . . . . . . . . . . . . . . . . . . . . . . 53
9.4 Testes não-funcionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
10 Projeto Real 54
10.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
10.1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
10.1.2 Seleção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
10.1.3 JInstagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
10.2 Análise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
10.2.1 Metrics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
10.2.1.1 Análise dos resultados . . . . . . . . . . . . . . . . . . . . 55
10.2.2 Findbugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
10.2.2.1 Más Práticas . . . . . . . . . . . . . . . . . . . . . . . . . 58
10.2.2.2 Corretude . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
10.2.2.3 Internacionalização . . . . . . . . . . . . . . . . . . . . . . 59
10.2.2.4 Performance . . . . . . . . . . . . . . . . . . . . . . . . . 60
10.2.2.5 Código espertalhão . . . . . . . . . . . . . . . . . . . . . . 60
10.2.3 Análise de qualidade: iPlasma . . . . . . . . . . . . . . . . . . . . . 61
10.3 Análise de Custo e Esforço . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
10.4 Testes (Randoop) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
10.5 Evolução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
10.5.1 Refatorando o sistema . . . . . . . . . . . . . . . . . . . . . . . . . 65
10.5.2 Pirâmide do iPlasma após os refatoramentos. . . . . . . . . . . . . . 67
4
1 Introdução
1.1 Motivação
As mı́dias sociais acompanham a evolução da relação entre as pessoas há alguns
anos. Cada vez dedicamos uma fatia maior do nosso tempo a estas e isto é consequência
dos investimentos massivos de empresas desse meio para atrair e engajar novos usuários.
Novas empresas como Instagram, SnapChat, Spotify, entre outras, digladiam-se para con-
quistar novos consumidores no mercado que promete movimentar $36 bilhões de dólares
no ano de 2017 [5].
As grandes plataformas de mı́dias sociais funcionam a base de um modelo rel-
ativamente simples: informações fazem usuários interagirem entre si para criar novas
informações e assim retroalimentar esse sistema. Porém, este modelo a longo prazo pos-
sui problemas. Os gostos, opiniõese amizades pessoais mudam ao decorrer do tempo e
consequentemente o ciclo social que é desenvolvido nessas plataformas também.
Como parte das poĺıticas de engajamento, essas plataformas não possuem features
adequadas para administrar e gerenciar os v́ınculos que o usuário possui. Isso faz com
o que as informações passadas na tela não satisfaçam mais o gosto do mesmo, ocasion-
ando em um menor engajamento e/ou na perca de tempo do mesmo para gerenciar estes
v́ınculos.
Diante da problemática exposta acima e pensando nesses usuários, decidimos criar
um aplicativo h́ıbrido Android que permite que usuários das mais diversas redes sociais
possam gerenciar seus amigos, páginas e seguidores de maneira simples e intuitiva com o
propósito de maximizar a experiência do usuário em suas redes sociais.
É notório que nosso sistema vem com o intuito de ajudar não só o usuário que
quer gerenciar suas redes e manter sua timeline a seu modo, mas também as próprias
plataformas uma vez que o engajamento com o usuário será incrementado com o nosso
sistema.
1.2 Visão da Solução
Gerenciar suas redes sociais em apenas um único lugar.
5
1.3 Descrição do Documento
Para ajudar a leitura deste documento o mesmo foi organizado em seções dispostas
da seguinte forma:
• Seção 1: Apresentação do problema e motivação para a construção do sistema.
• Seção 2: Planejamento para o desenvolvimento e as atividades de gerência são descrita
aqui.
• Seção 3: Definição do processo utilizado para o desenvolvimento do sistema
• Seção 4: Descrição dos requisitos e outras formas de elicitações.
• Seção 5: Projeto arquitetural da solução.
• Seção 6: Modelagem dos dados e casos de uso do sistema.
• Seção 7: Especificação Formal do sistema.
• Seção 8: Resultados da implementação da solução.
• Seção 9: Descrição e resultados de testes do software
6
2 Planejamento
2.1 Introdução
Planejamento é o alicerce de qualquer atividade de engenharia, e isto não é diferente
no mundo do software. A atividade de planejamento permite conhecer as fragilidades do
projeto antes mesmo de implementá-lo. Ou seja, os desenvolvedores pensam antecipada-
mente no que vão trabalhar e preveem caso a caso com o intuito de criar maneiras de
atingir os objetivos com o menor custo e risco posśıvel mantendo o grau de qualidade
satisfatório.
Há inúmeros fatores que impactam diretamente o sistema, como: adição de novos
requisitos, relacionamento interpessoal entre os membros do time, habilidades dos mem-
bros em Ionic, a necessidade de tirar notas boas nas disciplinas, a aceitação do público alvo
pelo aplicativo, dentre outros. Realizar um projeto que encapsule todas essas variáveis
sem um planejamento bem feito tem altas chances de dar errado.
Nesta seção, os processos de planejamento são descritos com o intuito de diminuir
ao máximo o tempo gasto, o custo e os riscos. Aqui também estará exposto a rotina de
trabalho de cada membro da equipe além dos requisitos de software e estratégias utilizadas
para solucionar os mesmos.
2.1.1 Escolha da Rede Social
O objetivo da nosso app é ser um gerenciador de redes sociais. Porém, para o escopo
deste projeto não é posśıvel conectar todas as redes por questões tais como tempo, custo
de produção e poĺıticas de privacidade. Neste momento, escolhemos construir o Social-
Manager para administrar apenas uma rede social porém, com a arquitetura necessária
para integrar no futuro demais redes sociais. Nosso objetivo é que o usuário use nosso
app com frequência para assim o mesmo aumentar seu valor agregado com o passar do
tempo. Contudo, a questão que fica é: Qual rede social primeiro conectar?
Na figura acima é posśıvel notar que o Facebook é a rede que tem o maior engaja-
mento no mundo. Nossa primeira escolha foi o Facebook, mas o mesmo não permite que
se faça algumas operações essenciais sejam feitas via API pública. Assim, estudamos as
API’s das redes sociais (entre as mostradas na figura) com intuito de encontrar a melhor
documentada e de fácil compreensão.
Diante do exposto acima, escolhemos como rede social inicial o Instagram.
7
Figure 2.1: Engajamento de usuários por Rede Social. Fonte: SmarthInsights [4], 2017
2.2 Gerência de Tempo
2.2.1 Estimativa de tempo com UCP
Para estimar o tempo necessário para conclusão do projeto de forma que ele atenda
os requisitos, a equipe utilizou a estimação de pontos por caso de uso. De forma geral, o
tempo para completar o projeto é afetado pelos seguintes fatores:
• Número de passos para completar o caso de uso
• Número e complexidade dos atores
• Requisitos técnicos do caso de uso como concorrência, segurança e performance
• Fatores ambiental como a experiência e o conhecimento do time
O método de pontos por caso de uso provê a habilidade de estimar a quantidade de
horas que um projeto requer para ser conclúıdo através dos seus casos de uso. O método
UCP transforma os fatores que afetam o desenvolvimento do projeto em uma equação
composta por três variáveis [2]:
• Pontos de caso de uso não ajustados (UUCP)
• Fator de complexidade técnica (TCF)
• Fator de complexidade ambiental (ECF)
Sendo assim, tem-se a equação de UCP:
UCP = UUCP * TCF * ECF
8
2.2.1.1 Cálculo de UUCP
O valor UUCP é definido pela seguinte fórmula:
UUCP = UUCW + UAW
É necessário classificar os casos de uso e os atores, de forma a obter os valores para
UUCW e UAW.
2.2.1.1.1 Cálculo do UUCW: Os casos de uso são classificados de acordo com ńıvel de
complexidade, que podem assumir os rótulos simples, médio e alto, com pesos 5, 10 e 15,
respectivamente. Então, soma-se todos os pesos obtidos para obter o valor do UUCW.
Sendo assim, tem-se as seguintes classificações para os casos de uso:
Table 2.1: Classificação dos casos de uso para cálculo de UUCP
Código Caso de uso Nı́vel de complexidade Peso
RF-01 Vincular rede social Médio 10
RF-02 Desvincular rede social Baixo 5
RF-03 Visualizar resumo do perfil Baixo 5
RF-04 Visualizar conexões Médio 10
RF-05 Desfazer amizade / deixar de seguir usuário Baixo 5
RF-06 Fazer amizade / seguir usuário Baixo 5
RF-07 Filtrar conexões Médio 10
TOTAL 50
2.2.1.1.2 Cálculo do UAW: Os casos de uso são classificados de acordo com ńıvel de
complexidade, que podem assumir os rótulos simples, médio e alto, com pesos 1, 2 e 3,
respectivamente. Então, soma-se todos os pesos obtidos para obter o valor do UAW.
Sendo assim, tem-se a seguinte classificação para os atores:
Table 2.2: Classificação dos atores para cálculo de UUCP
Ator Nı́vel de complexidade Peso
Usuário Alto 3
TOTAL 3
9
Com base nos resultados obtidos, calcula-se o valor do UUCP:
UUCP = 50 + 3 = 53
2.2.1.2 Cálculo de TCF
Para calcular o TCF, os fatores técnicos são tabelados e lhes são atribúıdos notas
de 0 a 5. Logo após, faz-se o somatório das notas multiplicadas pelo peso, para cada fator
técnico, de forma a obter o fator técnico total.
Então, obtém-se o valor do TCF a partir da seguinte fórmula:
TCF = 0.6 + (0.01 * Fator técnico total)
Sendo assim, tem-se a seguinte classificação para os fatores técnicos:
Table 2.3: Classificação dos fatores técnicos para cálculo do TCF
Fator Técnico Descrição Peso Nota Peso x Nota
T1 Sistema Distribúıdo 2 0 0
T2 Performance 1 2 2
T3 Eficiência para o Usuário Final 1 3 3
T4 Complexidade do Processo Interno 1 3 3
T5 Reusabilidade 1 3 3
T6 Fácil de Instalar 0.5 2 1
T7 Fácil de Usar 0.5 3 1.5
T8 Portabilidade 2 2 4
T9 Fácil de Alterar 1 2 2
T10 Necessidades Especiais de Segurança 1 3 3
T11 Concorrência 1 1 1
T12 Prover Acesso Direto para Terceiros 1 0 0
T13 Treinamento Especial Para Usuários é Requerido 1 0 0
TOTAL 23.5
Com base nos resultados obtidos, calcula-se o valor final do TCF:
TCF = 0.6 + (0.01 * 23.5)
TCF = 0.6 + 0.235
TCF = 0.835
10
2.2.1.3 Cálculo de ECF
Para calcular o ECF, os fatores ambiental são tabelados elhes são atribúıdos notas
de 0 a 5. Logo após, faz-se o somatório das notas multiplicadas pelo peso, para cada fator
ambiental, de forma a obter o fator ambiental total.
Então, obtém-se o valor do ECF a partir da seguinte fórmula:
ECF = 1.4 + (-0.03 * Fator ambiental total)
Sendo assim, tem-se a seguinte classificação para os fatores ambientais:
Table 2.4: Classificação dos fatores ambientais para cálculo do ECF
Fator Ambiental Descrição Peso Nota Peso x Nota
E1 Familiaridade com UML 1.5 3 4.5
E2 Trabalhadores em tempo parcial -1 4 -4
E3 Capacidade do analista ĺıder 0.5 4 2
E4 Experiência com aplicações 0.5 1 0.5
E5 Experiência com orientação a objetos 1 4 4
E6 Motivação da equipe 1 3 3
E7 Complexidade das linguagens de programação -1 2 -2
E8 Requisitos estáveis 2 4 8
TOTAL 16
Com base nos resultados obtidos, calcula-se o valor final do ECF:
ECF = 1.4 + (-0.03 * 16)
ECF = 1.4 - 0.48
ECF = 0.92
Por fim, em posse dos valores das variáveis UUCP, TCF e ECF, calcula-se o valor
do UCP:
UCP = 53 * 0.835 * 0.92
UCP = 40.71
2.2.1.4 Estimativa de horas
Uma vez calculado o UCP, é posśıvel estimar a quantidade de horas para concluir
o projeto pela seguinte fórmula:
ET = UCP * PF
11
O valor PF representa as horas-homem necessárias para concluir um caso de uso e
é calculado a partir da divisão do número total de horas de um projeto pelo seu UCP.
Nesse caso, utiliza-se estat́ısticas de projetos já conclúıdos para calcular uma média para
o valor PF. Caso nenhuma estat́ıstica tenha sido coletada, recomenda-se usar um valor
para PF entre 15 e 30. Se for o primeiro projeto da equipe, um bom valor é 20.
Dessa forma, tem-se o seguinte resultado para a estimativa total:
ET = 40.71 * 20
ET = 814.292 ≈ 814h
É evidente que esse valor pode variar consideravelmente de acordo com o ritmo da
equipe, mas é necessário estimá-lo em um primeiro momento para que sirvam como base
para o cliente.
2.2.2 Primeira Entrega
A primeira entrega do projeto, marcada para o final de junho, foi composta por
quatro semanas. Foi realizada uma reunião para definição das tarefas iniciais do projeto,
uma vez que o processo de desenvolvimento ainda não estava definido por completo.
2.2.2.1 Cronograma da primeira entrega
Para a primeira entrega, foram estabelecidas as seguintes atividades:
2.2.2.2 Lições aprendidas com a primeira entrega
A primeira experiência com o projeto foi positiva, mas revelou algumas falhas que
poderiam ter sido evitadas, tais como falha na comunicação e acompanhamento mais
atencioso do cronograma por parte dos membros em geral.
A falta de definição detalhada de um processo ou metodologia para auxiliar o de-
senrolar do projeto foi, de fato, o que mais impactou nesse primeiro momento ocasionando
os erros descritos acima. Houve atraso em algumas atividades, o que causou um efeito
cascata assim ocorrendo a não entrega da atividade de modelagem do Bando de Dados.
2.2.3 Segunda entrega
Uma vez definido o processo de desenvolvimento (baseado em Scrum), foi necessário
adaptar a forma na qual as atividades estavam sendo alocadas e desenvolvidas para que
as estimativas de tempo se tornassem posśıveis e atendessem os prinćıpios da metodologia
ágil adotada.
Em Scrum, o product backlog é uma lista de todas as features, contendo breves
descrições das funcionalidades desejadas no produto final. Diante desse artefato, nos
reunimos e escolhemos quais as features principais que deveriam ser desenvolvidas nesta
primeira Sprint, assim, foi definido nosso primeiro Sprint Backlog.
12
2.2.3.1 Definição da estratégia de estimativa de tempo de User Stories
Depois de definidas as estórias de usuário, a equipe utilizou uma prática conhecida
para classificar o ńıvel de dificuldade das estórias, o Planning Poker [3].
A ideia é que cada membro da equipe use uma escala não linear de pontos, no nosso
caso foi a sequência de Fibonacci, para atribuir pesos para cada Estória de Usuário e
assim obter a moda dos pesos escolhidos entre os membros. Para cada estória houve duas
iterações: na primeira os membros da equipe definiam suas notas e no final os membros
13
14
que atribúıram os menores e maiores debatiam o porquê da escolha e em seguida era
realizada mais uma vez a votação. Se ainda houvesse divergência, o peso final seria a
moda entre todos os pesos atribúıdos.
A equipe decidiu, em reunião realizada para discutir sobre o processo, que, como
não há experiência prévia considerável com desenvolvimento para servir como base de
estimativa de tempo, seria necessário criar uma tabela com a quantidade de horas e
número de pessoas alocadas de cada estória.
Peso Horas Pessoas
1 2h 1
2 8h 1
3 12h 2
5 30h 2
8 48h 2
13 65h 3
21 80h 3
2.2.3.2 Sprint 1
US T́ıtulo Pontos de esforço Tempo
1 Como usuário, quero poder fazer login com
minha conta do Instagram
13 65h
2 Como usuário, quero poder desconectar da
minha conta do Instagram
5 30h
3 Como usuário, quero poder ver um resumo da
minha conta do Instagram
8 48h
4 Como usuário, quero poder ver as pessoas que
eu sigo e que me seguem no Instagram
13 65h
5 Como usuário, quero visualizar os usuários que
eu sigo em forma de card e poder deixar de
segui-los
21 80h
6 Como usuário, Como usuário, quero poder vi-
sualizar um menu com as principais opções do
aplicativo
13 65h
TOTAL 60 288h
Portanto, ficou definido que 288 horas de desenvolvimento seriam necessárias para
conclusão da Sprint 1. Essa estimativa poderá ser usada como base para as estimativas
de tempo das sprints futuras, estando sujeita a ajustes para que se adapte ao ritmo da
equipe, observado nessa sprint.
15
2.2.3.3 Cronograma da Segunda Entrega
Após definir quais atividades seriam desempenhadas durante esta iteração foi atribúıdo
as atividades aos membros do grupo.
16
2.2.3.4 Acompanhamento da segunda entrega
Para realizar o acompanhamento diário da sprint utilizamos uma das mais poderosas
ferramentas que a metodologia ágil SCRUM pode nos oferecer: o Burndown Chart.
Ele representa o trabalho restante sobre o tempo, em suma, permite visualizar o
progresso do trabalho executado pela equipe e comparar com o progresso ideal (ou plane-
jado) da equipe traçando assim a quantidade de tempo que ainda falta para completar a
sprint.
Lendo o gráfico é posśıvel notar que os primeiros dez dias o desenvolvimento es-
tavam indo muito bem, acima do esperado. Todavia, após este peŕıodo o desenvolvimento
começou a ficar prejudicado, pois o tempo começou a ficar escasso para os membros e al-
gumas atividades foram postergadas
Ao perceber uma grande diferença entre o desenvolvimento real e ideal, por volta
17
Figure 2.2: Burndown Chart da Segunda Entrega
do vigésimo dia, a equipe se reuniu para avaliar a sprint e ver se retiraria alguma tarefa
para poder fechar a sprint. Chegou-se a conclusão que retirar qualquer tarefa da sprint
poderia por em check a mesma.
Mesmo não sendo posśıvel concluir totalmente a sprint1, como pode ser observado
no gráfico, o burndown chart foi um importante instrumento para evitar que esta situação
piorasse nos auxiliando nas tomadas de decisões no decorrer do projeto.
2.2.3.5 Lições aprendidas com a segunda entrega
Definitivamente seguir os passos de uma metodologia ágil como o SCRUM facilitou
muito o processo de desenvolvimento de software. Isso permitiu fazer estimativas de
custo de maneira mais refinada e próxima da realidade o que ocasionou numa melhora da
gerência do tempo.
Erros que aconteceram na primeira entrega relacionados a comunicação foram mit-
igados através das estratégias descritas ao longo deste texto.
1Ver gerência de risco
18
2.3 Gerência de Custo
Para a equipe de Gerência de Custo, foi atribúıda a atividade de calcular os custos
financeiros do projeto. Os custos foram calculados com base em pesquisa de mercado e
experiência prévia dos integrantes do projeto.
Gasto Valor (Total em 4 meses)
Recursos Humanos R$24.000,00
Aluguel de Escritório R$ 2.000,00
Energia Elétrica R$ 900,00
Internet e Telefone R$ 580,00
Computadores R$ 13.090,00
Mob́ılia R$ 800,00
Total R$ 41.370,00
Além dos custos fixos mostrados na tabela acima, acrescenta-se um lucro de 75%.
Assim, o custo final para o cliente seria de R$ 72.398,00.
2.4 Gerência de Riscos
Uma boa Gerência de Risco é extremamente importante para o sucesso de um
projeto de software. O não gerenciamento e controle dos riscos através da vida útil do
projeto é uma das mais frequentes causas que fazem um projeto falhar [1].
Assim, os riscos do projeto foram discutidos em grupo e estão documentos na tabela
a seguir que lista sua descrição e estratégias de mitigação.
19
ID Categoria Impacto e Descrição de
Risco
Estratégia de Diminuição
PE-1 Pessoal Integrantes indispońıveis
para realização de alguma
atividade designada aos
mesmos.
Realização de reuniões
diárias de curta duração
para acompanhamento
geral
JU-1 Juŕıdico Não aceitação do produto
ao submeter ao review do
Instagram
Atender a todos os tópicos
das poĺıticas de privaci-
dade da API do Instagram
PR-1 Produto e Processo Falta de tempo para de-
sempenhar atividades do
projeto
Realizar uma distribuição
de atividades que en-
volvam adaptação aos
horários do desenvolvedor
PE-2 Pessoal Pouca experiência com
desenvolvimento de
aplicações para disposi-
tivos móveis
Realização de um curso
sobre as ferramentas uti-
lizadas no projeto, assim
como seções de pair pro-
gramming e seção de tirar
dúvidas durante as re-
uniões diárias.
PR-2 Produto e Processo Falha na implementação
dos requisitos
Uso de testes de validação
TEC-1 Tecnológica Complexidade do frame-
work
Utilização de um frame-
work bem conhecido no
mercado para facilitar
a busca de soluções em
fóruns
PR-3 Produto e Processo Tempo de desenvolvi-
mento apertado
Uso e acompanhamento
diário do cronograma com
uma pessoa responsável
por isto.
PR-4 Produto e Processo Não conformidade entre
layouts de telas distintas
Realizar prototipagem de
telas para adequar a um
mesmo padrão
PE-3 Pessoal Falha na Comunicação Uso de ferramentas de
comunicação profissional,
como o Slack, que permite
a criação de canais para fil-
trar os assuntos de cada
conversa e separar as dis-
cussões
TEC-2 Tecnológica Mudança de Tecnologia no
meio do desenvolvimento
Escolher tecnologias con-
solidadas e que atendam
aos requisitos impostos na
disciplina, como a possibil-
idade de realizar diferentes
testes.
20
Caso algum risco não previsto apareça durante o decorrer do desenvolvimento ele
será adicionado a nossa lista e começará a ser acompanhado semanalmente.
Através do monitoramento semanal dos riscos calculamos empiricamente a probabil-
idade dos erros acontecerem naquela semana levando em consideração os fatores pessoais,
técnicos e inesperados (como doenças, etc). Estas probabilidades eram calculadas no
começo de cada semana com base na semana anterior. Após todas as semanas decorridas
temos o seguinte gráfico que explica como foi o comportamento dos riscos.
Figure 2.3: Gerência dos Riscos para a Primeira Entrega. Fonte Própria
21
Da visualização pode-se retirar algumas informações. Por exemplo, na primeira
semana o risco PR-4 tinha uma probabilidade de apenas 0.4 de acontecer, já na segunda
semana esse percentual subiu para 0.8, isso se deu ao fato que integrantes do time encon-
traram divergência em como seria a aplicação e o fluxo de telas, diante disso foi realizado
uma reunião onde conseguiu mitigar o erro. Outras informações podem ser retiradas com
observação semelhante.
Como pode ser visto apartir da quarta semana houve um crescimento referente
à riscos envolvendo as categorias de pessoal e de produto que felizmente algumas foram
controladas e corrigidas a tempo, contudo outras não2 e são nessas dificuldades de gerência
que vamos nos debruçar nas próximas linhas.
Observando o subplot referente a categoria de produto temos que o risco PR-3 não
foi devidamente controlado. Este erro diz respeito ao tempo de desenvolvimento apertado
onde infelizmente a estratégia de diminuição escolhida não foi adequada, uma vez que, os
membros estavam ocupados com atividades acadêmicas e de trabalho.
Outro caso da gerência de risco que deve ser discutido é o do risco de id PR-2,
que diz respeito a falha na implementação dos requisitos. A estratégia de mitigação para
este risco era a criação e a utilização de testes de unidade e regressão, contudo isso não
foi devidamente realizado. Estamos utilizando a API do Instagram que é privada e para
utilizá-la é necessário ter um review aceito pela empresa. Para a criação de aplicativos
que envolvam a rede social eles disponibilizam uma versão de acesso ao sandbox. Contudo,
o que não sab́ıamos é que operações relacionadas a relacionamentos entre usuários não
são permitidas pela API neste modo lançando o erro de Bad Request (erro 400).
Assim, essa abordagem para a gerência de risco possui sua fragilidade: a atribuição
da probabilidade semanal do risco é feita apenas no feeling e está sujeita a erros. En-
tretanto, é uma boa maneira de compreender os riscos que aconteceram além de nortear
previsões dos riscos para as semanas subsequentes.
2.5 Gerência de Recursos
Está listado abaixo os recursos utilizados no desenvolvimento da aplicação:
Recursos Humanos:
• Cinco integrantes do projeto.
Hardware:
• Cinco computadores pessoais (um por desenvolvedor)
• Três smartphones com o sistema operacional Android para teste.
Software:
2Definimos que houve uma má gerência naqueles que tiveram uma probabilidade final maior do que a
inicial
22
• AndroidStudio - IDE para desenvolvimento de código Android
• Visual Code Studio - Editor de texto para código web
• Slack - Ferramenta de comunicação
• IntelliJ - IDE para código Java
• Microsoft Project - Planejamento
• Overleaf - IDE para escrita da documentação
• GitHub - Controle de versão
• Ionic 2 - Framework para desenvolvimento da aplicação
• Angular 2 - Framework web para Javascript
• Karma - Framework para execução de testes em Javascript
• Jasmine - Framework para testes em javascript
23
3 Processos de Software
Processo de Software é um conjunto de atividade relacionadas que lidam com a
produção de um produto de software. Essas atividades incluem definir as regras que
regem o produto, as responsabilidades de cada pessoa da equipe dentro do projeto além
das atividades de especificação, design e implementação, validação e evolução.
Dado a baixa complexidade, o tamanho do nosso projeto e o tamanho da equipe
de desenvolvimento escolheu-se o uso de uma metodologia ágil ao invés de um processo
tradicional, dado que a primeira permite o foco maior no desenvolvimento do software de
qualidade sem o rigor excessivo na produção de artefatos. Assim, escolheu-se o framework
SCRUM com algumas modificações para se adequar ao escopo deste projeto. Adotamos
as seguintes cerimônias com suas quantidade de horas requeridas.
Table 3.1: Cerimônias e seus respectivos timeboxed
Cerimônia Tempo alocado
Reunião de Planejamento da Sprint 1 hora e 30 minutos
Reunião Diária 10 minutos
Reunião de Revisão da Sprint 1 hora
Reunião de Retrospectiva da Sprint 40 minutos
Duração de uma Sprint 1 mês
As reuniões diárias acontecem todas as noites, às 20h, via Slack com todos os
membros reportando as atividades desenvolvidas naquele dia. Todas as demais reuniões
são realizadas presencialmente, salvo raras exceções.
Como este é um projeto que surgiu a partir do interesse de todos os integrantes
escolhemos não utilizar o papel do Product Owner dado que no nosso entendimento,
achamos que, todos possúımos a mesma visão do produto incluindo o product backlog.
Além disto, escolhemos o como o Scrum Master o integrante Lucas Henrique dado seu
conhecimento prévio com a tecnologia e com a metodologiade desenvolvimento escolhida.
escolheu-se o modelo de Desenvolvimento Incremental ( Incremental development),
uma vez que, suas desvantagens relacionadas ao ponto de vista gerencial são mitigadas
com o acompanhamento próximo das entregas para mensurar o progresso.
A ideia básica deste modelo é que as atividades de especificação, desenvolvimento
e validação ocorra de maneira entrelaçada possibilitando rápidas tomadas de decisões no
24
progresso do projeto. Isto resulta em entregas rápidas e utilizáveis que é o foco desta
disciplina.
Com o objetivo de extrair o máximo de conhecimento que a disciplina de Engenharia
de Software I pode oferecer, os membros da equipe irão desempenhar todas as funções
com exceção da gerência do projeto.
25
4 Requisitos
Um dos mais importantes passos no desenvolvimento de um produto de software
é a elicitação de requisitos. Para isto utilizamos uma simples metodologia que pode ser
explicada em alguns passos:
• Definição dos principais stakeholders. No primeiro momento usuários de redes soci-
ais;
• Lançamos uma entrevista com o nosso principal stakeholder, a fim de recolher mais
informações para a elicitação dos requisitos;
• Levantamos os requisitos iniciais com base nas entrevistas e em seguida realizamos
uma prototipagem de telas para ajudar a refletir e refinar as funcionalidades do
sistema. Além de ajudar a guiar a implementação do software;
4.1 Entrevista com stakeholders
A entrevista foi dirigida e lançada nas redes sociais – onde se concentra nosso
público – por meio de formulários usando o Google Forms. Foi entrevistado um total
de 192 pessoas e a seguir estão as perguntas, suas respectivas respostas e uma análise
estat́ıstica em cima da amostra coletada.
• Quais das redes sociais abaixo você utiliza?
• Você sente dificuldade em gerenciar as pessoas de quem você é amigo ou segue nessas
redes?
• O quanto você se preocupa com o ńıvel de interação dos seus contatos com você em
suas redes sociais?
• Você gostaria de saber quem são as pessoas que menos interagem com você em suas
redes sociais?
• Você gostaria de saber se há perfis fantasmas (inativos) entre os contatos de suas
redes sociais?
• Caso tenha respondido ”Sim” a alguma das duas últimas perguntas, utilizaria algum
aplicativo para facilitar a remoção desses amigos das suas redes sociais?1
26
–
Figure 4.1: Resposta da primeira questão.
• Para alguém ser seu amigo ou ser seguido por você em uma rede social, é necessário:2
• Qual o sistema operacional do seu smartphone, caso possua?
A partir das respostas dos entrevistados, chegamos a conclusão que um aplicativo
deste gênero pode ser bem recebido pelo público alvo. A seguir elencamos as funcionali-
dades que consideramos úteis para o nosso escopo.
4.2 Requisitos Não Funcionais
Alguns requisitos não-funcionais (NFRs) foram identificados para o projeto Social
Manager. Abaixo, são apresentadas as descrições para os três tipos de NFR (de processo,
de produto e externos).
4.2.1 Requisitos de Processo
Identificador Descrição
RNF/PROC-01 O aplicativo deve ser desenvolvido com o framework Ionic 2, que
permite que o mesmo seja executado em dispositivos Android e iOS.
RNF/PROC-02 O aplicativo deve utilizar o banco de dados IndexedDB, através da
biblioteca Dexie.js, para que as consultas aos dados sejam mais efi-
cientes.
RNF/PROC-03 Deverá ser feita uma documentação do sistema desenvolvido com o
uso da ferramenta Compodoc.
RNF/PROC-04 Deverão ser utilizadas ferramentas CASE, e é imprescind́ıvel a criação
da modelagem usando a linguagem UML.
1189 respostas para esta pergunta
2190 respostas
27
–
Figure 4.2: Resposta da segunda questão.
4.2.2 Requisitos de Produto
4.2.2.1 Integridade e Segurança
Identificador Descrição
RNF/SEG-01 Apenas o usuário autenticado terá acesso aos tokens gerados durante
o processo de autenticação nas redes sociais.
RNF/SEG-02 As informações dos usuários devem ser armazenadas apenas localmente
e não devem ser fornecidas a terceiros.
RNF/SEG-03 Todas as requisições de informações referentes ao usuário autenticado
devem ser feitas diretamente para o servidor da rede social que ele
esteja administrando no momento.
4.2.2.2 Eficiência
Identificador Descrição
RNF/PER-01 O tempo de resposta para análise de dados dos usuários não deve
exceder 30 segundos. Para qualquer outra operação do sistema, esse
não deve exceder 5 segundos.
RNF/PER-02 O espaço dispońıvel em disco para informações deve ser suficiente para
armazenar todos os dados/atualizações que forem carregados dos servi-
dores das redes sociais.
28
–
Figure 4.3: Resposta da terceira questão.
–
Figure 4.4: Resposta da quarta questão.
–
Figure 4.5: Resposta da quinta questão.
29
–
Figure 4.6: Resposta da sexta questão.
4.2.3 Requisitos Externos
4.2.3.1 Legais
Identificador Descrição
RNF/LEG-01 O aplicativo deve respeitar os termos de uso das APIs das redes sociais
que fazem parte dele.
RNF/LEG-02 Não replicar a experiência de uso dos aplicativos oficiais das redes
sociais.
4.2.3.2 Éticos
Identificador Descrição
RNF/ETI-01 Não compartilhar dados dos usuários com terceiros.
RNF/ETI-02 Não utilizar as informações e mı́dias dos usuários para quaisquer fins que
não estejam diretamente relacionados com o funcionamento do aplica-
tivo.
RNF/ETI-03 Manter os dados dos usuários armazenados apenas pelo peŕıodo
necessário para prover os serviços do aplicativo.
4.3 Requisitos Funcionais
O quadro abaixo apresenta os requisitos funcionais do sistema acompanhados de
seus identificadores e prioridades atribúıdas durante o desenvolvimento.
30
–
Figure 4.7: Resposta da sétima questão.
Identificador Nome Prioridade
RF-01 Vincular rede social Essencial
RF-02 Desvincular rede social Essencial
RF-03 Visualizar resumo do perfil Essencial
RF-04 Visualizar conexões Essencial
RF-05 Desfazer amizade / deixar de seguir usuário Essencial
RF-06 Fazer amizade / seguir usuário Importante
RF-07 Filtrar conexões Importante
4.3.1 RF-01 - Vincular rede social
Descrição: O aplicativo deve permitir que o usuário se conecte através de uma
rede social.
Atores: Usuário
Prioridade: Essencial
Requisitos não funcionais associados: RNF/SEG
Entradas e pré-condições:
• O usuário não deve estar autenticado na rede social em questão.
Sáıdas e pós-condições:
• O usuário estará autenticado.
• Dados principais do usuário estarão salvos localmente.
31
–
Figure 4.8: Resposta da oitava questão.
Fluxo principal de eventos:
I. Ao abrir o aplicativo, a tela de login é exibida e o usuário escolhe a qual rede social
quer se conectar.
II. É aberta uma janela para que o usuário se autentique diretamente com o servidor
da rede social, que retornará um token.
III. O sistema recebe os dados de autenticação do usuário os salva localmente.
IV. O sistema carrega os dados básicos do usuário e carrega a tela principal.
Fluxos secundários:
• No fluxo principal II, se o usuário não conseguir se autenticar, o sistema exibe uma
mensagem de erro e o fluxo volta ao passo I.
4.3.2 RF-02 - Desvincular rede social
Descrição: O aplicativo deve permitir que o usuário se desconecte de uma rede
social.
Atores: Usuário
Prioridade: Essencial
Requisitos não funcionais associados: RNF/SEG
Entradas e pré-condições:
• O usuário deve estar autenticado na rede social que deseja se desconectar.
32
Sáıdas e pós-condições:
• O usuário não estará autenticado na rede social em questão.
Fluxo principal de eventos:
I. O usuário escolhe a opção de sair de determinada conta no menu do aplicativo.
II. O sistema deleta todos os dados locais referentes à rede social em questão.
III. A tela de login é exibida.
4.3.3 RF-03 - Visualizar resumo do perfil
Descrição: O aplicativo deve permitir que o usuário veja o resumo do perfil de
uma rede social.
Atores: Usuário
Prioridade: Essencial
Requisitosnão funcionais associados: RNF/SEG
Entradas e pré-condições:
• O usuário deve estar autenticado na rede social que deseja visualizar seu perfil.
Sáıdas e pós-condições:
• O usuário visualizará o resumo do seu perfil incluindo dados de conexões com outros
usuários.
Fluxo principal de eventos:
I. O usuário seleciona a opção de ver o seu perfil no menu do aplicativo.
II. O aplicativo mostra os dados do usuário.
4.3.4 RF-04 - Visualizar conexões
Descrição: O aplicativo deve permitir que o usuário veja suas conexões, aplicando
um filtro se desejar.
Atores: Usuário
Prioridade: Essencial
Requisitos não funcionais associados: RNF/SEG, RNF/PER-01, RNF/PER-
02
Entradas e pré-condições:
33
• O usuário deve estar autenticado na rede social que deseja visualizar seu perfil.
Sáıdas e pós-condições:
• O usuário visualizará o resumo do seu perfil incluindo dados de conexões com outros
usuários.
Fluxo principal de eventos:
I. O usuário seleciona a opção de ver conexões no menu do aplicativo.
II. O aplicativo mostra as conexões do usuário.
4.3.5 RF-05 - Desfazer amizade / deixar de seguir usuário
Descrição: O aplicativo deve permitir que o usuário desfaça uma amizade ou deixe
de seguir algum usuário.
Atores: Usuário
Prioridade: Essencial
Requisitos funcionais associados: RF-04
Requisitos não funcionais associados: RNF/SEG, RNF/PER-01
Entradas e pré-condições:
• O usuário deve estar autenticado na rede social em questão.
• O usuário autenticado deve ter uma conexão com o usuário em questão.
Sáıdas e pós-condições:
• O usuário não será amigo ou não estará seguindo o usuário em questão.
Fluxo principal de eventos:
I. O usuário autenticado escolhe um usuário dentre seus amigos ou seguidores.
II. O usuário clica no botão de remover amizade/deixar de seguir.
III. O sistema faz a requisição para a rede social informando que o usuário quer desfazer
a conexão com o usuário.
IV. O usuário é informado sobre o sucesso da operação.
Fluxos secundários:
• No fluxo principal, caso aconteça algum erro, a operação é cancelada e o aplicativo
mostra uma mensagem de erro.
34
4.3.6 RF-06 - Fazer amizade / seguir usuário
Descrição: O aplicativo deve permitir que o usuário solicite amizade ou siga algum
usuário.
Atores: Usuário
Prioridade: Importante
Requisitos funcionais associados: RF-04
Requisitos não funcionais associados: RNF/SEG, RNF/PER-01
Entradas e pré-condições:
• O usuário deve estar autenticado na rede social em questão.
• O usuário autenticado não deve ter uma conexão com o usuário em questão.
Sáıdas e pós-condições:
• O usuário autenticado terá solicitado amizade ou terá seguido o usuário em questão.
Fluxo principal de eventos:
I. O usuário autenticado escolhe um usuário dentre seus amigos ou seguidores.
II. O usuário e clica no botão de solicitar amizade/seguir.
III. O sistema faz a requisição para a rede social informando que o usuário autentico
1ado quer ser amigo/seguir o usuário.
IV. O usuário autenticado é informado sobre o sucesso da operação.
Fluxos secundários:
• No fluxo principal, caso aconteça algum erro, a operação é cancelada e o aplicativo
mostra uma mensagem de erro.
4.3.7 RF-07 - Filtrar conexões
Descrição: O aplicativo deve permitir que o usuário filtre suas conexões para
gerenciá-las melhor.
Atores: Usuário
Prioridade: Importante
Anexos: RF-07.1
Requisitos funcionais associados: RF-04
Requisitos não funcionais associados: RNF/SEG, RNF/PER-01
Entradas e pré-condições:
• O usuário deve estar autenticado na rede social em questão.
35
• O usuário autenticado deve estar visualizando suas conexões.
Sáıdas e pós-condições:
• O usuário autenticado verá suas conexões filtradas de acordo com o filtro escolhido.
Fluxo principal de eventos:
I. O usuário escolhe um filtro de conexões.
II. O sistema faz a requisição de dados adicionais caso seja necessário.
III. O sistema filtra os dados.
IV. O usuário visualiza suas conexões filtradas.
Fluxos secundários:
• No fluxo principal, caso aconteça algum erro, a operação é cancelada e o aplicativo
mostra uma mensagem de erro.
4.3.7.1 Filtros de conexões
Os usuários devem poder escolher entre os seguintes filtros para filtrar os usuários:
a. Usuários com pouca interação
b. Usuários inativos
c. Usuários que o usuário logado segue, mas não o seguem de volta
d. Usuários que seguem o usuário logado, mas não são seguidos por ele
e. Novos amigos / seguidores
f. Usuários que desfizeram amizade / deixaram de seguir
4.4 Diagrama de Casos de Uso
O diagrama de casos de uso, expresso em UML (Unified Modeling Language), ex-
pressa os requisitos não funcionais do sistema na forma de casos de uso. Foi decidido que,
para cada requisito funcional, ter-se-á um caso de uso. Utilizando-se do diagrama de ca-
sos de uso do Social Manager, poder-se-á então construir o diagrama de classes do sistema.
36
4.5 Protótipos de Telas
A prototipação das telas foi realizada utilizando o software Marvel App, que permite
confeccionar protótipos de aplicativos
37
5 Projeto Arquitetural
O software utiliza o Ionic 2 e Angular 4 como frameworks. A arquitetura do Ionic
2 é baseada em camadas bem definidas, com separação de regras de negócios, templates
e serviços, através do Angular 4, que utiliza uma padronização de componentes reusáveis
e tem arquitetura inspirada em MVC (Model-View-Controller), porém flex́ıvel quando ao
controller. Para os templates de visualização, são utilizadas as linguagem de marcação
HTML5 e CSS, este com aux́ılio da biblioteca SASS, que proporciona maior reuso e
produtividade. Já para a lógica de negócios e controle da visualização do aplicativo,
tem-se páginas, serviços e componentes (controllers) implementados em TypeScript.
Como não há servidor intermediário entre a aplicação e as redes sociais, não há
nenhuma persistência de dados em quaisquer locais que não sejam o dispositivo do usuário.
Todos os dados são providos pelas redes sociais que o aplicativo gerencia.
38
6 Modelagem
6.1 Análise dos Casos de Uso
Para aumentar o ńıvel da especificação e reduzir a possibilidade de erros, será feito o
diagrama de sequência dos cinco principais casos de uso do sistema, bem como os contratos
de operação dos mesmos. Os casos de uso são: Visualizar Resumo do Perfil, Desvincular
Rede Social, Vincular Rede Social, Desfazer Amizade e Visualizar Conexões.
6.2 Diagramas de Sequência
A seguir, serão mostrados alguns diagramas de sequência referentes aos casos de
uso apresentados neste documento, focando na interação entre os serviços promovidos
por cada classe da aplicação.
6.2.1 Diagrama de Sequência - Caso de Uso: Vincular Rede Social
Figure 6.1: Diagrama de sequência do caso de uso Vincular Rede Social
39
6.2.2 Diagrama de Sequência - Caso de Uso: Desvincular Rede
Social
Figure 6.2: Diagrama de sequência do caso de uso Desvincular Rede Social
40
6.2.3 Diagrama de Sequência - Caso de Uso: Deixar de Seguir um
Perfil
Figure 6.3: Diagrama de sequência do caso de uso Deixar de Seguir um Perfil
41
6.2.4 Diagrama de Sequência - Caso de Uso: Visualizar resumo do
perfil
Figure 6.4: Diagrama de sequência do caso de uso Deixar de Seguir um Perfil
42
6.2.5 Diagrama de Sequência - Caso de Uso: Começar a Seguir um
perfil
Figure 6.5: Diagrama de sequência do caso de uso Começar a Seguir um Perfil
6.3 Contratos de Operação
Para especificar de maneira mais clara quais são os requisitos de cada caso de uso,
foram feitas algumas tabelas especificando o comportamento esperado do sistema para
cada caso de uso aqui detalhado.
Table 6.1
Contrato Vincular Rede Social
Operação login()
Pré-Condição O usuário não esteja conectado na rede social.
Pós-Condição O usuário estará logado e seus dados básicos estarão devidamente carregados e salvos no aplicativo.43
Table 6.2
Contrato Desvincular Rede Social
Operação logout()
Pré-Condição A rede social a qual o usuário deseja-se desconectar deve ter sido vinculada anteriormente.
Pós-Condição Os dados da conta do usuário devem ter sido exclúıdos do sistema.
Table 6.3
Contrato Deixar de Seguir um Usuário
Operação unfollow(userID: string)
Pré-Condição O usuário estar logado na rede social e seguir o perfil que será usado na operação.
Pós-Condição O perfil passado não estará mais na lista de seguidores do usuário.
Table 6.4
Contrato Começar a Seguir um Usuário
Operação follow(userID: string)
Pré-Condição O usuário estar logado na rede social e não seguir o perfil que será usado na operação.
Pós-Condição O perfil passado agora estará na lista de seguidores do usuário.
44
7 Especificação Formal
Semelhante o que ocorre em outras engenharias, para aumentar a confiabilidade e
a consistência do desenvolvimento deste produto optou-se por realizar uma especificação
baseada em formalismos matemáticos.
Contudo, dado o alto ńıvel técnico requerido para realizar esse tipo de atividade
constrúımos a especificação em Alloy, considerados por muitos um método formal leve,
com o intuito de estudar o comportamento do sistema precavendo situações inesperadas
nos mais distintos cenários. Todo o código utilizado para gerar o seguintes cenários podem
ser encontrados no nosso repositório do github.
Figure 7.1: Um único usuário. Figure 7.2: Dois Usuários com suas respecti-
vas mı́dias.
Aqui é posśıvel observar as relações básicas entre usuário, mı́dias e comentários.
Uma mı́dia pertence há um único usuário exclusivamente, e o mesmo acontece entre
mı́dia e comentário.
Neste segundo cenário, podemos observar o comportamento descrito no cenário
acima. Além disto, foi definido a relação entre followers e following, onde um usuário
A que segue o usuário B tem B na lista de following, e B possui o usuário A na lista de
followers.
45
8 Implementação
Depois de definido o que seria a aplicação, o grupo reuniu-se para decidir qual tec-
nologia usar. Como seria uma aplicação móvel que não usa muitos recursos espećıficos
do sistema operacional, optamos por utilizar um framework que usa tecnologias web para
criar aplicativos h́ıbridos, semelhantes aos desenvolvidos nativamente. O framework uti-
lizado chama-se Ionic. Ele usa Angular 4, SCSS e HTML, além do Cordova, para criar
aplicações móveis. Estas aplicações podem ser portadas para diferentes sistemas opera-
cionais, o que estimulou mais ainda a adoção do Ionic, pois seria posśıvel alcançar mais
usuários com menos esforço. Além disso, os membros da equipe tinham mais experiência
com o desenvolvimento de aplicações web. Depois de decidido a tecnologia, a equipe de de-
senvolvimento passou por um peŕıodo de estudos para aprender os detalhes da framework
utilizada. Além disso, para facilitar o acesso aos recursos do Instagram, utilizou-se uma
biblioteca chamada Instajam, que facilita as requisições. Um dos primeiros problemas
no desenvolvimento foi a tecnologia. Dos quatro integrantes do time de desenvolvimento,
apenas um tinha familiaridade com Ionic e Angular 4. Isso foi contornado com um treina-
mento antes do ińıcio do desenvolvimento da aplicação. Porém, o que mostrou-se ser o
maior empecilho foi a própria API do Instagram. Por motivos de segurança, a empresa
restringe o acesso inicial para um ńıvel onde é posśıvel apenas fazer um número baixo de
requisições por hora, além de não poder alterar o relacionamento entre os usuários (como
deixar de seguir alguém). Isso impactou muito o desenvolvimento pois a equipe ficou di-
versos momentos impedida de testar a aplicação e perdeu muitas horas de trabalho. Além
disso, algumas funcionalidades, como parar de seguir um usuário, ainda não puderam ser
testadas pois o ńıvel de acesso atual não permite. Para tentar minimizar os problemas,
foi diminúıdo a quantidade de requisições feitas, otimizando alguns métodos e reduzindo
a quantidade de testes feitas entre a implementação de uma funcionalidade e outra. In-
felizmente, a alteração de relacionamento dos usuários não pode ser testada. Foi enviado
para o Instagram uma requisição de acesso total a API dela, porém tal autorização não
saiu a tempo da entrega do projeto.
46
9 Testes
9.1 Plano de testes
Durante processo de validação e verificação, foi necessária a criação de um plano de
testes. As funcionalidades do sistema devem ser testadas para que haja maior confiança de
que o software realmente funciona como planejado. Como o software não estava totalmente
pronto quando esta documentação foi escrita, os testes realmente implementados ficaram
limitados ao escopo das funcionalidades até então implementadas.
Para testes de unidade, escolheu-se as ferramentas Karma e Jasmine, dada sua
ampla adoção entre os projetos em Javascript.
A equipe definiu que seriam realizados testes de caixa branca e caixa preta. Ferra-
mentas de análise estática, como TSLint, também deveriam ser utilizadas para detectar
bad smells.
Para testes não funcionais, escolheu-se a ferramenta Monkey, que faz testes aleatórios
e sequenciais a fim de encontrar bugs em aplicativos.
9.2 Testes de unidade
Os testes de unidade tem, nesse projeto, o objetivo de verificar se as entidades estão
sendo devidamente criadas e se são funcionais. Além disso, os provedores da aplicação
também devem ser testados para garantir que os dados estão sendo corretamente carrega-
dos das redes sociais e se as falhas na execução dessas tarefas estão sendo devidamente
detectados e tratados. Nossa estratégia foi utilizar caixa branca no desenvolvimento dos
testes. No entanto, por limitação da API, essa etapa precisou ser colocada em segundo
plano, pois atrasaria bastante o desenvolvimento das funcionalidades básicas iniciais do
aplicativo.
9.3 Testes funcionais
Para testar os requisitos funcionais, foi utilizado o emulador de um dispositivo An-
droid. Realizou-se os testes de caixa preta, baseados nos fluxos descritos na especificação,
com escopo limitado aos casos de uso implementados até então.
47
9.3.1 RF-01 - Vincular rede social (Instagram)
I. Ao abrir o aplicativo, a tela de login é exibida e o usuário escolhe a qual rede
social quer se conectar.
Figure 9.1: Tela de login do aplicativo
II. É aberta uma janela para que o usuário se autentique diretamente com o servidor
da rede social, que retornará um token.
Figure 9.2: Tela de login da rede social
48
III. O sistema recebe os dados de autenticação do usuário os salva localmente.
IV. O sistema carrega os dados básicos do usuário e carrega a tela principal.
Figure 9.3: Tela principal do SocialManager
Fluxo secundário:
No fluxo principal II, se o usuário não conseguir se autenticar, o sistema exibe uma
mensagem de erro e o fluxo volta ao passo I.
Figure 9.4: Mensagem de erro
49
9.3.2 RF-02 - Desvincular rede social
I. O usuário escolhe a opção de sair de determinada conta no menu do aplicativo.
Figure 9.5: Menu do aplicativo
II. O sistema deleta todos os dados locais referentes à rede social em questão.
III. A tela de login é exibida.
50
Figure 9.6: Tela de login do aplicativo
9.3.3 RF-03 - Ver resumo do perfil
Este requisito não foi totalmente implementado e, por ora, faz parte do menu do
aplicativo, como mostrado no RF-02.
9.3.4 RF-04 - Visualizar conexões
Este requisito possui filtros de conexão. Por ora, esses filtros estão implementados
como opções no menu do aplicativo. Abaixo segue o fluxo principal para o filtro de
seguidores mútuos.
I. O usuário seleciona a opção de ver conexões no menu do aplicativo.
51
Figure 9.7: Menu do aplicativo
II. O aplicativo mostra as conexões do usuário.
Figure 9.8: Conexões mútuas
9.3.5 RF-05 - Desfazer amizade / deixar de seguir usuário
Este requisito está parcialmente implementado.Como é posśıvel observar no screen-
shot abaixo, para cada usuário seguido pelo usuário autenticado, há a opção de unfollow.
52
Figure 9.9: Opção de unfollow na lista de usuários
9.3.6 RF-06 - Fazer amizade / seguir usuário
Este requisito não foi implementado porque não fez parte de nenhuma sprint até
então.
9.3.7 RF-07 - Filtrar conexões
Este requisito não foi implementado porque não fez parte de nenhuma sprint até
então. No entando, como foi citado no RF-04, é posśıvel fazer tal filtragem a partir do
menu do aplicativo.
9.4 Testes não-funcionais
53
10 Projeto Real
10.1 Introdução
10.1.1 Motivação
Analisar um projeto real é essencial para um maior aproveitamento da disciplina, já
que podemos identificar caracteŕısticas, teorias e práticas (positivas e/ou negativas) que
estão sendo discutidas em sala de aula, possibilitando a construção de uma visão mais
abrangente do que é desenvolver software no mundo profissional.
10.1.2 Seleção
Os critérios utilizados para seleção do projeto foram:
• Linguagem: O projeto precisava ser escrito em Java.
• Número de linhas de código: O projeto precisava ter no mı́nimo 10 mil linhas de
código.
• Boas práticas de Software: Para a equipe, era essencial que o projeto fosse bem
estruturado, escrito de forma simples e bem documentado.
10.1.3 JInstagram
O JInstagram é uma biblioteca não oficial para a API do Instagram. Alguns projetos
que usaram o JInstagram:
• Digital Foot Prints - http://digitalfootprints.dk/
• Tweet Wall Pro - http://www.tweetwallpro.com/
• REnsta: Instagram Repost Add for Android - https://play.google.com/stor/apps/details?id=com.sembozdemir.renstagram
• OpSocial - http://www.opsocial.com.br/
54
10.2 Análise
10.2.1 Metrics
Resultado obtido ao rodarmos a ferramenta Metrics no projeto JInstagram:
Figure 10.1: Resultados do Metrics
10.2.1.1 Análise dos resultados
Total Lines of Code: Essa métrica se refere a quantidade de linhas de código que
o projeto possui. No caso do JInstagram, 11095.
McCabe Cyclomatic Complexity: Essa métrica quantifica a complexidade do pro-
grama através da medida de caminhos linearmente independentes que ele possui. Quanto
maior a medida, mais complexo o código é. O McCabe Cyclomatic também indica a
quantidade de testes que deverão ser escritos para executar todos os fluxos do programa.
O máximo de complexidade ciclomática encontrada no JInstagram é 12.
Number of Parameters: Métrica que indica a quantidade de parâmetros que existe
nos métodos do código. Métodos com quantidade grande de parâmetros são dif́ıceis de
entender e consequentemente de modificar e reusar. No JInstagram, essa medida é 6.
/* (non-Javadoc)
55
* @see
org.jinstagram.InstagramClient#getRecentMediaFeed(java.lang.String,
int, java.lang.String, java.lang.String, java.util.Date,
java.util.Date)
*/
@Override
public MediaFeed getRecentMediaFeed(String userId, int count, String
minId, String maxId, Date maxTimeStamp,
Date minTimeStamp) throws InstagramException {
Preconditions.checkEmptyString(userId,
USER_ID_CANNOT_BE_NULL_OR_EMPTY);
Map<String, String> params = new HashMap<String, String>();
Number of Attributes: Métrica que mostra a quantidade de atributos por classe.
Classes com muitos atributos podem indicar problemas de coesão por coincidência, gerando
problemas na execução do problema. Tais classes devem ser refatoradas. No JInstagram,
há classes com 16 atributos, número considerável aceitável.
Number of Static Attributes: Métrica que demonstra a quantidade de atributos
estáticos no código. O JInstagram possui 122 no total, sendo este um número razoável
para a quantidade de linhas de código que o projeto possui.
Number of Methods: Métrica que conta a quantidade média de operações por classe,
sendo desejável que essa média varie entre 3 e 7 métodos, pois um valor acima dessa faixa
pode indicar que a classe é pouco coesa e possui um grau de complexidade maior que o
desejável, enquanto que um valor abaixo dessa faixa indica que a classe não é necessária e
que esta poderia ser decomposta em uma construção de dados. No JInstagram, a média
de métodos por classe é de aproximadamente 7.5, sendo esta, uma medida razoável. No
entanto, no projeto, há classe com 67 métodos, indicando uma alta complexidade.
Number of Static Methods: Métrica responsável por explicitar a quantidade de
métodos estáticos por classe. Apenas 11 métodos estáticos são encontrados no JInstagram.
Number of Overridden Methods: Métrica que analisa a quantidade de métodos so-
brescritos por outras classes. O projeto possui apenas 1 método sobrescrito, o que é uma
medida baixa, dado o número de linhas de código.
Lack of Cohesion of Methods: Coesão é um conceito muito importante em pro-
gramação OO. Ela indica se a classe representa uma ou várias abstrações. A ideia é que
se a classe apresenta mais de uma abstração, ela deve ser refatorada em mais de uma
classe. O Metrics apresentou resultado médio de 0,235 para o JInstagram, dando a en-
tender que as classes do projeto são relativamente coesas.
56
/* (non-Javadoc)
* @see
org.jinstagram.InstagramClient#searchFoursquareVenue(java.lang.String)
*/
@Override
public LocationSearchFeed searchFoursquareVenue(String foursquareId)
throws InstagramException {
Map<String, String> params = new HashMap<String, String>();
params.put(QueryParam.FOURSQUARE_V2_ID, foursquareId);
return createInstagramObject(Verbs.GET, LocationSearchFeed.class,
Methods.LOCATIONS_SEARCH, params);
}
Figure 10.2: Método que ilustra a baixa quantidade de linhas de código por método.
Nested Block Depth: Métrica que se refere a profundidade dos blocos aninhados nos
métodos das classes, ou seja, através dela é posśıvel se ter uma ideia do tamanho e da
complexidade dos métodos do projeto. O Metrics apresentou valor um valor 0.942, que
é um valor baixo, significando que os métodos aparentemente não precisam ser divididos
em outros menores.
Methods Lines of Code: Métrica que mostra a quantidade de linhas de código por
método. O JInstagram apresenta uma média aproximada de 5 linhas de código por
método, o que acarreta em um código coeso, fácil de ler e de modificar.
Instability: Essa métrica mede o esforço necessário para alterar um pacote sem a neces-
sidade de alterar outros como consequência. A instabilidade (I) é um valor que varia entre
0.0 (mı́nima instabilidade) e 1.0 (máxima instabilidade) e que determina quão instável é
um pacote. Esse valor pode ser calculado pela seguinte equação: I = Ae Aa + Ae
Onde Ae são os acoplamentos eferentes e Aa são os acoplamentos aferentes. A
medida média dessa métrica para o JInstagram é 0.674, o que não é uma medida boa,
indicando que os pacotes do projeto são, em média, instáveis.
Abstractness: Essa métrica mede o quão abstrato um pacote é. Seu cálculo se dá
através da razão entre a soma das quantidades de classes abstratas (Ca) e interfaces (I)
pela quantidade de classes não-abstratas (Cn): A = (Ca + I)/Cn
O valor da métrica varia entre 0.0 (pacote concreto) e 1.0 (pacote abstrato). O
Metrics apresentou valor médio 0,035 para os pacotes do JInstagram, dando a entender
que os pacotes possuem poucas classes abstratas e interfaces se comparado com o número
de classes não-abstratas em seus pacotes.
Weighted methods per Class: A métrica WMC é a soma da complexidade de todos
57
os métodos por classe, sendo um indicador da quantidade de esforço que é demandada
para desenvolver e manter uma determinada classe. O valor médio dessa métrica para o
JInstagram foi de 8.88, que é um valor considerado bom, pois está dentro do limite (1 até
50).
10.2.2 Findbugs
A análise de bugs, realizada com a ferramenta Findbugs, identificou um total de
321 ocorrências de bugs em todo o projeto. A prinćıpio, a ferramenta qualifica os eventos
detectados, e os divide em categorias. As categorias identificadasno JInstagram foram:
Bad practice (más práticas), Correctness (corretude), Internationalization (internacional-
ização), Performance (performance) e Dodgy code (código espertalhão).
Figure 10.3: Categorias de bugs identificados pelo Findbugs
10.2.2.1 Más Práticas
Esta categoria agrupa todas as ocorrências identificadas de bugs que são causados
pelo uso de más práticas de programação.
Figure 10.4: Bugs da categoria Bad Pratice identificados no projeto.
As 3 ocorrências desta categoria no projeto são do tipo Format string problem
(problemas de formatação de string), e todas elas ocorrem pelo mesmo motivo, que é a
utilização de “
n” para realizar uma quebra de linha. Na formatação de strings, é prefeŕıvel utilizar “%n”,
que produzirá o caractere de quebra de linha espećıfico da plataforma onde o programa
está sendo executado, ou usar o método getLineSeparator() da classe System, que possui
a mesma finalidade.
10.2.2.2 Corretude
Nesta categoria são indicadas as ocorrências onde o código escrito realiza algo não
previsto pelo desenvolvedor.
58
private static final String EXCEPTION_PATTERN = "Error in method {0}."
+ "\n\tException name: {1}.\n\t"
+ "Stack trace: {2}.\n\tTime spent in the method: {3}
milliseconds.";
Figure 10.5: Exemplo de ”Format string problem”.
Figure 10.6: Bugs da categoria Correctness identificados no projeto.”
Duas das 3 ocorrências de bugs desta categoria no projeto são do tipo Null pointer
dereference (desreferencia de um ponteiro nulo), onde valores nulos são passados como
parâmetros de métodos que não devem ser nulos, e a outra é do tipo Format string prob-
lem, onde a formatação informada para a string é do tipo MessageFormat, quando a mais
indicada seria a utilizada no “printf”. Em tempo de execução, todos os argumentos de
formatação serão ignorados e a string retornada será exatamente como provida, sem nen-
huma formatação.
10.2.2.3 Internacionalização
Todas as ocorrências desta categoria são do tipo Dubious method used (uso duvidoso
de método), e acontecem pelo mesmo motivo: o código chama um método que executará
uma conversão byte-string (ou vice-versa) assumindo que a codificação da plataforma é a
adequada, fazendo com que o comportamento do programa varie entre plataformas.
59
String sig = EnforceSignedRequestUtils.signature(rawMethodName,
sigParams, accessToken != null ?
accessToken.getSecret() : null);
Add Comment
Figure 10.7: Exemplo de “Null pointer dereference”
Figure 10.8: Exemplo de ”Format string problem”.
10.2.2.4 Performance
Esta categoria agrupa as ocorrências de trechos de códigos no projeto que não
estão necessariamente errados, mas que podem ser melhorados a fim de obter um melhor
desempenho.
O bug do tipo Questionable boxing of primitive value (encaixotamento questionável
de um valor primitivo) ocorre ao utilizar o método valueOf(), criando um encaixotamento
a partir de uma string apenas para extrair o valor primitivo, quando seria mais eficiente
utilizar o método estático parseXXX, onde XXX é o tipo primitivo desejado. A ocorrência
do tipo Unread field (campo não lido) se dá ao utilizar um campo que nunca é lido e
poderia, portanto, ser removido da classe.
10.2.2.5 Código espertalhão
Nesta categoria são agrupadas as ocorrências de bugs relacionados à trechos de
códigos desnecessários ou até mesmo fluxos que nunca serão executados.
Esta é a categoria com maior número de ocorrências de bugs do projeto. Das 307
identificadas pela ferramenta, 306 são do tipo Useless code (código inútil), e acontecem
quando o trecho de código não realiza nenhum trabalho útil, ou quando um objeto é criado
e modificado, mas não produz nenhum efeito colateral nem é utilizado fora do método
onde foi criado. A outra ocorrência é do tipo Dead local store (armazenamento local
morto), e se dá quando o trecho de código associa um valor à uma variável local, mas a
variável não é lida ou utilizada em nenhuma instrução subsequente.
byte[] content = "Dummy Payload".getBytes();
Figure 10.9: Exemplo de “Dubious method used”
60
Figure 10.10: Bugs da categoria Performance identificados no projeto.
try {
value = Integer.valueOf(intValueStr);
} catch (NumberFormatException e) {
logger.error("Invalid Integer value for key: " + key + ", value :"
+ intValueStr);
}
Figure 10.11: Exemplo de “Questionable boxing of primitive value”
10.2.3 Análise de qualidade: iPlasma
Para complementar a análise da qualidade do projeto em questão, utilizamos a
ferramenta iPlasma a fim de gerar a seguinte pirâmide de qualidade:
Algumas observações a partir do resultado gerado pela ferramenta:
• O número de subclasses de uma classe é médio, o que indica um bom potencial de
reuso.
• O número de métodos por classe é alto, o que acarreta em classes menos coesas e
mais dif́ıceis de reusar e modificar.
• A quantidade de caminhos de execução independentes é baixa, o que culmina em
um código menos complexo.
• O resultado para a profundidade que as classes do projeto se encontram na árvore
de herança é médio, o que pode gerar classes mais complexas por herdarem o com-
portamento de todas as suas classes precursoras.
Métrica Referência Baixo Referência Médio Referência Alto Valor Obtido Resultado
NDD 0.25 0.41 0.57 0.03 Baixo
HIT 0.09 0.21 0.32 0.10 Médio
NOC 6 17 26 7.22 Médio
NOM 4 7 10 7.99 Médio
LOC 7 10 13 7.70 Médio
CYCLO 0.16 0.20 0.24 0.13 Baixo
CALL 2.01 2.62 3.20 4.09 Alto
FOUT 0.56 0.62 0.68 0.35 Baixo
61
Figure 10.12: Bugs da categoria Dodgy Code identificados no projeto.”
Figure 10.13: Exemplo de “Dead local store”.
Tanto os resultados obtidos através da ferramenta iPlasma, quanto os obtidos pela
ferramenta Metrics, nos fornecem uma visão geral a respeito da qualidade do código do
projeto real em questão. É interessante perceber que existem métricas que obtiveram
valores similares nas duas ferramentas, como a complexidade ciclomática (ambas apre-
sentaram valor baixo). Em contraste, a métrica número de métodos por classe, que foi
avaliada como baixa pelo Metrics, recebeu valor considerado médio, pelo iPlasma. Dessa
forma, o uso de mais de uma ferramenta é essencial para que, em caso de ocorrência desse
tipo de divergência, seja posśıvel uma investigação mais profunda a fim de decidir qual
dos resultados é o mais consistente.
10.3 Análise de Custo e Esforço
Para realizar a análise de custo, esforço e tempo foi utilizado o software SLOCCount.
Os resultados da análise feita pelo software se encontram na tabela a seguir:
SLOC Directory SLOC by Language
11103 jInstagram-master java=11103
Totals grouped by language (dominant language first):
java: 11103 (100.00%)
Total Physical Source Lines of Code (SLOC) = 11,103
Development Effort Estimate, Person-Years (Person-Months) = 2.50 (30.06)
(Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months) = 0.76 (9.11) (Basic COCOMO model,
Months = 2.5 * (person-month)
Estimated Average Number of Developers (Effort/Schedule) = 3.30
Total Estimated Cost to Develop = $ 338,340 (average salary = $56,286/year,
overhead = 2.40).
62
Figure 10.14: Pirâmide de Qualidade
10.4 Testes (Randoop)
O Randoop é um gerador de testes unitários em formato JUnit para Java. No JIn-
stagram, executamos os testes gerados durante 60 segundos para cada conjunto de classes
contidos nos pacotes do projeto. Os testes existentes antes da utilização do Randoop,
cobriam 53,7% do código das classes da pasta fonte do projeto.
Figure 10.15: Cobertura dos testes existentes no projeto.
Com os testes gerados pelo Randoop, a cobertura subiu para 58,8%, aumentando
em pouco mais de 5 pontos percentuais.
63
Figure 10.16: Cobertura dos testes gerados pelo Randoop.
Apesar da diferença entre os valores de cobertura ter sido pequena, ela foi suficiente
para identificar falhas e erros não detectados anteriormente pelos testes existentes no
projeto. Dos27528 casos de testes gerados pelo Randoop, 580 mostraram erros e outros
388 apontaram algum tipo de falha. Para os testes anteriores, nenhum dos 530 casos de
testes indicavam alguma falha ou erro.
Figure 10.17: Cobertura dos testes antigos em um trecho de código.
64
Figure 10.18: Cobertura dos testes gerados pelo Randoop em um trecho de código.
10.5 Evolução
10.5.1 Refatorando o sistema
O sistema foi refatorado utilizando as informações geradas pela ferramenta Metrics,
buscando sempre melhorar as métricas mais problemáticas.
O Metrics indicou alguns métodos com um alto numero de linhas de código. Sele-
cionamos a classe Instagram para realizar um refatoramento, pois a mesma possúıa uma
média de 6,167.
Figure 10.19: Número de linhas por método da classe Instagram antes do refatoramento.
Aplicando três extract method no método request, esse valor caiu para 5,133, dimin-
uindo o valor máximo de linhas de código por método da classe de 43 para 17.
Figure 10.20: Número de linhas por método da classe Instagram após o refatoramento.
Como pode-se observar, houve um decréscimo de pouco mais de 1 ponto na média.
Neste refatoramento, foram realizadas 32 remoções e 44 adições.
Seguindo a mesma métrica, foram realizados mais extract methods na classe In-
stagramBase, que possúıa uma média de 5,319 linhas de código por método, e um valor
máximo de 28 linhas. Após os refatoramentos, a média baixou para 5,04 e o valor máximo
baixou para 19. Neste refatoramento, foram realizadas 64 remoções e 95 adições.
65
Figure 10.21: Diff de um dos extract methods realizados na classe InstagramBase.
A classe InstagramSubscription também foi refatorada seguindo a mesma métrica.
Antes do refatoramento, sua média de linhas de código por método era de 7,2, com um
valor máximo de 23. Após a realização de um extract method, a média cai para 6,9. Neste
refatoramento, foram realizadas 5 remoções e 9 adições. Mesmo que as mudanças tenham
sido pequenas, foram suficientes para baixar a média de linhas de código por método da
classe.
Figure 10.22: Diff do refatoramento realizado na classe InstagramSubscription.
O Metrics identificou, ainda, que a classe OEmbedInformation possúıa um alto valor
de complexidade ciclomática. Antes do refatoramento, a média era de 1,355, e o valor
máximo de complexidade era 12.
Figure 10.23: Complexidade ciclomática da classe antes do refatoramento.
Ficou claro que a alta complexidade devia-se às várias condições ternárias existentes
no método toString da classe. Após a criação de um método auxiliar que pôde ser reusado
em todas as verificações, a média baixou para 1,031, e o valor máximo para 2.
Figure 10.24: Complexidade ciclomática da classe depois do refatoramento.
66
Neste refatoramento, ocorreram 35 remoções e 42 adições, como mostra o diff a
seguir.
Figure 10.25: Diff do refatoramento feito na classe OEmbedInformation.
No geral, mesmo antes dos refatoramentos, a maioria das métricas identificadas
estavam na faixa dos valores considerados aceitáveis. Algumas métricas, como a com-
plexidade cliclomática e número de linhas por métodos, que não estavam nessa faixa
anteriormente, passaram a estar após os refatoramentos.
10.5.2 Pirâmide do iPlasma após os refatoramentos.
Após realizados os refatoramentos, a ferramenta iPlasma foi novamente executada
em cima do projeto. A pirâmide resultante está representada logo abaixo.
Figure 10.26: Pirâmide do iPlasma após os refatoramentos.
Utilizando uma tabela para visualizar a diferença entres os valores antes e após os
refatoramentos, temos:
67
Métricas Valor antes do refatora-
mento
Valor após refatora-
mento
NDD 0.03 0.03
HIT 0.10 0.10
NOC 7.22 7.22
NOM 8.04 8,04
LOC 7.67 7.67
CYCLO 0.13 0.13
CALL 4.08 4.08
FOUT 0.35 0.35
Podemos observar que, após os refatoramentos, os valores das métricas continuaram
os mesmos. Uma das razões para isso, é que o projeto sempre apresentou métricas con-
sideradas normais, mesmo antes do refatoramento, com poucas ocorrências de métricas
problemáticas. Por serem poucas, dado a quantidade de linhas de código, o refatoramento
guiado por essas métricas não acarretaram numa mudança significativa desses valores.
68
Bibliography
[1] Narciso Cerpa and June M. Verner. Why did your project fail? Commun. ACM,
52(12):130–134, December 2009.
[2] Roy K. Clemmons. Project estimation with use case points. 2006.
[3] Luiz Duarte. Planning poker: como estimar tempo de desenvolvimento de soft-
ware, 2016. http://www.luiztools.com.br/post/planning-poker-como-estimar-tempo-
de-desenvolvimento-de-software/ - acessado em 27 de junho de 2017.
[4] Smart Insights. New global social media research, 2017.
http://www.smartinsights.com/social-media-marketing/social-media-strategy/new-
global-social-media-research/ - acessado em 26 de maio de 2017.
[5] Social Media Today. How much time do people spend on social me-
dia, 2017. http://www.socialmediatoday.com/marketing/how-much-time-do-people-
spend-social-media-infographic - acessado em 26-Maio-2017.
69
	Introdução
	Motivação
	Visão da Solução
	Descrição do Documento
	Planejamento
	Introdução
	Escolha da Rede Social
	Gerência de Tempo
	Estimativa de tempo com UCP
	Cálculo de UUCP
	Cálculo do UUCW:
	Cálculo do UAW:
	Cálculo de TCF
	Cálculo de ECF
	Estimativa de horas
	Primeira Entrega
	Cronograma da primeira entrega
	Lições aprendidas com a primeira entrega
	Segunda entrega
	Definição da estratégia de estimativa de tempo de User Stories
	Sprint 1
	Cronograma da Segunda Entrega
	Acompanhamento da segunda entrega
	Lições aprendidas com a segunda entrega
	Gerência de Custo
	Gerência de Riscos
	Gerência de Recursos
	Processos de Software
	Requisitos
	Entrevista com stakeholders
	Requisitos Não Funcionais
	Requisitos de Processo
	Requisitos de Produto
	Integridade e Segurança
	Eficiência
	Requisitos Externos
	Legais
	Éticos
	Requisitos Funcionais
	RF-01 - Vincular rede social
	RF-02 - Desvincular rede social
	RF-03 - Visualizar resumo do perfil
	RF-04 - Visualizar conexões
	RF-05 - Desfazer amizade / deixar de seguir usuário
	RF-06 - Fazer amizade / seguir usuário
	RF-07 - Filtrar conexões
	Filtros de conexões
	Diagrama de Casos de Uso
	Protótipos de Telas
	Projeto Arquitetural
	Modelagem
	Análise dos Casos de Uso
	Diagramas de Sequência
	Diagrama de Sequência - Caso de Uso: Vincular Rede Social
	Diagrama de Sequência - Caso de Uso: Desvincular Rede Social
	Diagrama de Sequência - Caso de Uso: Deixar de Seguir um Perfil
	Diagrama de Sequência - Caso de Uso: Visualizar resumo do perfil
	Diagrama de Sequência - Caso de Uso: Começar a Seguir um perfil
	Contratos de Operação
	Especificação Formal
	Implementação
	Testes
	Plano de testes
	Testes de unidade
	Testes funcionais
	RF-01 - Vincular rede social (Instagram)
	RF-02 - Desvincular rede social
	RF-03 - Ver resumo do perfil
	RF-04 - Visualizar conexões
	RF-05 - Desfazer amizade / deixar de seguir usuário
	RF-06 - Fazer amizade / seguir usuário
	RF-07 - Filtrar conexões
	Testes não-funcionais
	Projeto Real
	Introdução
	Motivação
	Seleção
	JInstagram
	Análise
	Metrics
	Análise dos resultados
	Findbugs
	Más Práticas
	Corretude
	Internacionalização
	Performance
	Código espertalhão
	Análise de qualidade: iPlasma
	Análise de Custo e Esforço
	Testes (Randoop)
	Evolução
	Refatorando o sistema
	Pirâmide do iPlasma após os refatoramentos.