1 Contextualização

1.1 Introdução

No campo da engenharia de software, a análise da qualidade do código é fundamental para assegurar a eficácia e a eficiência dos projetos desenvolvidos. Este estudo foi concebido para explorar a relação entre o número de bugs reportados, a cobertura de código e a qualidade percebida do código, com um foco específico em projetos de software mobile. Dada a crescente importância e complexidade das aplicações móveis, compreender como esses fatores se relacionam é vital para garantir que os aplicativos atendam às rigorosas expectativas de desempenho e usabilidade dos usuários. A análise aprofundada desses elementos pode oferecer insights valiosos para desenvolvedores e gestores de projeto, contribuindo para a melhoria contínua da qualidade e confiabilidade das aplicações móveis.

Neste contexto, dados foram coletados sobre a cobertura de código e o número de bugs reportados em um projeto de desenvolvimento mobile. Avaliar a eficiência dos testes automatizados e entender como a qualidade do código está relacionada com a incidência de bugs são aspectos cruciais deste estudo. A investigação desses parâmetros permitirá uma compreensão mais clara da eficácia dos testes e da relação entre a qualidade do código e a ocorrência de falhas, fornecendo subsídios importantes para aprimorar as práticas de desenvolvimento e assegurar a robustez dos aplicativos móveis.

1.2 Objetivo

O objetivo deste estudo é analisar a relação entre a cobertura de código e o número de bugs reportados em projetos Mobiles. Além disso, buscamos entender como a qualidade do código é percebida em projetos com diferentes níveis de bugs e cobertura de código.

1.3 Metodologia

Coleta de Dados: Os dados foram coletados de diversos projetos de software desenvolvidos em diferentes ambientes (Web, Mobile, Desktop). Para cada projeto, foram registrados o número de bugs reportados, a cobertura de código obtida através de testes automatizados, o tipo de projeto e a avaliação da qualidade do código.

Análise Descritiva: Será realizada uma análise descritiva para entender a distribuição das variáveis e identificar padrões iniciais nos dados.

Análise Inferencial: Serão aplicadas técnicas estatísticas para investigar as relações entre as variáveis quantitativas (bugs reportados e cobertura de código) e qualitativas (tipo de projeto e qualidade do código).

2 Carregamento dos Pacotes

library(ggplot2)
library(dplyr)
library(readr)
library(tidyr)
library(knitr)
library(fdth)
library(kableExtra)
library(moments)

Esses pacotes são essenciais para manipulação de dados (dplyr, readr, tidyr), visualização de dados (ggplot2), geração de tabelas (knitr, kableExtra), cálculos estatísticos (fdth, moments).

3 Carregar Banco de Dados

dados <- read.csv("data-raw/Base_Problema_1.csv")
glimpse(dados)
## Rows: 100
## Columns: 5
## $ ID                      <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,…
## $ Bugs.Reportados         <int> 37, 12, 72, 9, 75, 5, 79, 64, 16, 1, 76, 71, 6…
## $ Cobertura.de.Codigo.... <dbl> 77.03, 88.27, 52.27, 57.00, 89.62, 51.49, 94.1…
## $ Tipo.de.Projeto         <chr> "Web", "Mobile", "Desktop", "Desktop", "Mobile…
## $ Qualidade.do.Codigo     <chr> "Excelente", "Ruim", "Regular", "Excelente", "…

Carrega o conjunto de dados a partir de um arquivo CSV e exibe uma visão geral dos dados para garantir que foram carregados corretamente.

3.1 Filtrar os dados para Projetos Mobile

dados_mobile <- dados %>% filter(Tipo.de.Projeto == "Mobile")
glimpse(dados_mobile)  
## Rows: 27
## Columns: 5
## $ ID                      <int> 2, 5, 6, 14, 20, 21, 25, 27, 29, 36, 41, 47, 5…
## $ Bugs.Reportados         <int> 12, 75, 5, 25, 28, 29, 87, 94, 86, 57, 8, 71, …
## $ Cobertura.de.Codigo.... <dbl> 88.27, 89.62, 51.49, 68.06, 67.70, 88.16, 50.5…
## $ Tipo.de.Projeto         <chr> "Mobile", "Mobile", "Mobile", "Mobile", "Mobil…
## $ Qualidade.do.Codigo     <chr> "Ruim", "Ruim", "Regular", "Ruim", "Regular", …

Filtra os dados para incluir apenas projetos mobile, permitindo focar na análise específica desses projetos.

4 Vizualização em tabela dos dados

ID Bugs Reportados Cobertura de Código Tipo de Projetos Qualidade do Código
2 12 88.27 Mobile Ruim
5 75 89.62 Mobile Ruim
6 5 51.49 Mobile Regular
14 25 68.06 Mobile Ruim
20 28 67.70 Mobile Regular
21 29 88.16 Mobile Ruim
25 87 50.58 Mobile Boa
27 94 53.69 Mobile Boa
29 86 53.20 Mobile Boa
36 57 88.64 Mobile Excelente
41 8 73.53 Mobile Regular
47 71 53.50 Mobile Regular
57 76 58.61 Mobile Regular
58 26 69.82 Mobile Ruim
59 52 55.37 Mobile Boa
61 41 55.11 Mobile Boa
63 15 61.59 Mobile Excelente
66 25 61.68 Mobile Boa
68 87 78.50 Mobile Ruim
76 27 87.59 Mobile Boa
81 8 96.86 Mobile Ruim
82 32 95.82 Mobile Regular
84 10 80.82 Mobile Regular
87 87 56.49 Mobile Regular
88 25 64.72 Mobile Ruim
90 92 63.73 Mobile Excelente
91 74 53.70 Mobile Boa

Exibindo os 27 registros dos dados referente a projetos mobiles.

5 Analise dos dados Qualitativos

Uma analise entre o tipo de projeto (Mobile) e a Qualidade do Código
Boa Excelente Regular Ruim
Mobile 8 3 8 8

Tabela de frequência cruzada entre o tipo de projeto e a qualidade do código, identificando a distribuição da qualidade do código nos projetos mobile.

5.1 Gráfico de barras para Qualidade do Código em projetos Mobile

6 Analise dos dados Quantitativos

6.1 Bugs Reportados

6.1.1 Medidas

6.1.1.1 Diagrama de Ramo e Folha

  stem(bugs_reportados,
       scale = 2)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##   0 | 588
##   1 | 02
##   1 | 5
##   2 | 
##   2 | 5556789
##   3 | 2
##   3 | 
##   4 | 1
##   4 | 
##   5 | 2
##   5 | 7
##   6 | 
##   6 | 
##   7 | 14
##   7 | 56
##   8 | 
##   8 | 6777
##   9 | 24

Diagrama de ramo e folha para os Bugs Reportados, visualizando a distribuição dos dados.

6.1.1.2 Tabela de Distribuição e Frequência

tdf_bugs <- fdt(bugs_reportados,
                     breaks = 'Sturges')
options(digits = 3)
kable(head(tdf_bugs, length(1)), col.names = c("Limites de Classe", "Freq Absoluta", "Freq Relativa", "Freq Relativa (%)", "Freq Acumulada", "Freq Acumulada (%)"))
Limites de Classe Freq Absoluta Freq Relativa Freq Relativa (%) Freq Acumulada Freq Acumulada (%)
[4.95,19.948) 6 0.222 22.22 6 22.2
[19.948,34.947) 8 0.296 29.63 14 51.9
[34.947,49.945) 1 0.037 3.70 15 55.6
[49.945,64.943) 2 0.074 7.41 17 63.0
[64.943,79.942) 4 0.148 14.81 21 77.8
[79.942,94.94) 6 0.222 22.22 27 100.0

Tabela de distribuição de frequência para os bugs reportados, mostrando a frequência absoluta, relativa e acumulada.

6.1.1.3 Medidas de Tendência Central e Variabilidade

Média, Moda, Mediana

  media_bugs <- mean(bugs_reportados)
  moda_bugs <- as.numeric(names(sort(table(dados_mobile$Bugs.Reportados), decreasing = TRUE)[1]))
  mediana_bugs <- median(bugs_reportados)

Calculo da média, moda e mediana dos bugs reportados, fornecendo uma visão geral das tendências centrais dos dados.

Média = 46.444
Moda = 25
Mediana = 32

Variância, Desvio Padrão, Coeficiente de Variabilidade

  var_bugs <- var(bugs_reportados)
  dp_bugs <- sd(bugs_reportados)
  cv_bugs <- (dp_bugs / media_bugs) * 100

Calcula a variância, desvio padrão e coeficiente de variação, que medem a dispersão dos dados.

Variância = 971.718
Desvio Padrão = 31.172
Coeficiente de Variação =67.118

Tabela Geral com os dados

Media Mediana Moda Min Max Amplitude Var DP CV(%)
46.44 32 25 5 94 89 971.7 31.17 67.12

6.1.1.4 Coeficiente de Assimetria de Pearson

coeficiente_assimetria_bugsReportados <- skewness(bugs_reportados)

Calcula o coeficiente de assimetria, indicando a simetria da distribuição dos bugs reportados. O coeficente de assimetria é igual a *0.2392 o que mostra uma curva assimetrica à direita ou postiva.

6.1.2 Histograma

6.2 Cobertura de Código

6.2.1 Medidas

6.2.1.1 Diagrama de Ramo e Folha

  stem(cobertura_codigos,
     scale = 2)
## 
##   The decimal point is at the |
## 
##   50 | 65
##   52 | 2577
##   54 | 14
##   56 | 5
##   58 | 6
##   60 | 67
##   62 | 7
##   64 | 7
##   66 | 7
##   68 | 18
##   70 | 
##   72 | 5
##   74 | 
##   76 | 
##   78 | 5
##   80 | 8
##   82 | 
##   84 | 
##   86 | 6
##   88 | 2366
##   90 | 
##   92 | 
##   94 | 8
##   96 | 9

Diagrama de ramo e folha para a cobertura de código, visualizando a distribuição dos dados.

6.2.1.2 Tabela de Distribuição e Frequência

  tdf_cobertura <- fdt(cobertura_codigos,
                     breaks = 'Sturges')
options(digits = 3)
kable(head(tdf_cobertura, length(1)), col.names = c("Limites de Classe", "Freq Absoluta", "Freq Relativa", "Freq Relativa (%)", "Freq Acumulada", "Freq Acumulada (%)")) 
Limites de Classe Freq Absoluta Freq Relativa Freq Relativa (%) Freq Acumulada Freq Acumulada (%)
[50.074,58.033) 9 0.333 33.33 9 33.3
[58.033,65.992) 5 0.185 18.52 14 51.9
[65.992,73.951) 4 0.148 14.81 18 66.7
[73.951,81.91) 2 0.074 7.41 20 74.1
[81.91,89.87) 5 0.185 18.52 25 92.6
[89.87,97.829) 2 0.074 7.41 27 100.0

Tabela de distribuição de frequência para a cobertura de código.

6.2.1.3 Medidas de Tendência Central e Variabilidade

Média, Moda, Mediana

  media_cobert <- mean(cobertura_codigos)
  moda_cobert <- as.numeric(names(sort(table(dados_mobile$Cobertura.de.Codigo....), decreasing = TRUE)[1]))
  mediana_cobert <- median(cobertura_codigos)

Calcula a média, moda e mediana da cobertura de código.

Média = 69.143
Moda = 50.58
Mediana = 64.72

Variância, Desvio Padrão, Coeficiente de Variabilidade

  var_cobert <- var(cobertura_codigos)
  dp_cobert <- sd(cobertura_codigos)
  cv_cobert <- (dp_cobert / media_cobert) * 100

Calcula a variância, desvio padrão e coeficiente de variação para a cobertura de código.

Variância = 232.524
Desvio Padrão = 15.249
Coeficiente de Variação =22.054

Tabela Geral com os dados

Média Mediana Moda Min Max Amplitude Var DP CV(%)
69.14 64.72 50.58 50.58 96.86 46.28 232.5 15.25 22.05

6.2.1.4 Coeficiente de Assimetria de Pearson

coeficiente_assimetria_coberturaCodigo <- skewness(cobertura_codigos)

Calcula o coeficiente de assimetria, indicando a simetria da distribuição dos bugs reportados. O coeficente de assimetria é igual a 0.4655 o que mostra uma curva assimetrica à direita ou postiva.

6.2.2 Histograma

7 Análise da relação entre Cobertura de Código e Bugs Reportados em projetos Mobile

7.1 Correlação entre Cobertura de Código e Bugs Reportados

correlacao_mobile <- cor(dados_mobile$Cobertura.de.Codigo...., dados_mobile$Bugs.Reportados, use = "complete.obs")

Calcula a correlação entre a cobertura de código e os bugs reportados, indicando a força e direção da relação entre essas variáveis. A correlação é igual a -0.4016.

Interpretação do Valor da Correlação

A correlação obtida foi igual a r correlacao_mobile. Isso pode ser interpretado da seguinte maneira:

  • Correlação Positiva: Se o valor for positivo, indica que à medida que a cobertura de código aumenta, o número de bugs reportados também tende a aumentar.
  • Correlação Negativa: Se o valor for negativo, indica que à medida que a cobertura de código aumenta, o número de bugs reportados tende a diminuir.
  • Correlação Fraca ou Nula: Se o valor estiver próximo de zero, indica pouca ou nenhuma relação linear entre as duas variáveis.

Pela correlação ter um resultado negativo, fica entendido que à medida que a cobertura de código aumenta, o número de bugs reportados tende a diminuir.

7.2 Visualização da correlação

Gráfico de dispersão com uma linha de tendência para visualizar a correlação entre a cobertura de código e os bugs reportados.

Interpretação do Gráfico

Pontos de Dispersão: Os pontos representam pares de valores de cobertura de código e bugs reportados para diferentes projetos mobile.

Linha de Tendência: A linha de tendência, ajustada pelo método de regressão linear (lm), mostra a tendência geral dos dados.

  • Inclinação Positiva: Uma inclinação positiva indicaria que, geralmente, projetos com maior cobertura de código têm mais bugs reportados.
  • Inclinação Negativa: Uma inclinação negativa indicaria que, geralmente, projetos com maior cobertura de código têm menos bugs reportados.

Por ter uma inclinação negativa é possivel perceber que à medida que a cobertura de código aumenta, o número de bugs reportados tende a diminuir.

8 Análise da relação entre Qualidade do Código e Bugs Reportados em projetos Mobile

8.1 Tabela de frequência cruzada entre Qualidade do Código e Bugs Reportados

tabela_qualidade_bugs <- table(dados_mobile$Qualidade.do.Codigo, dados_mobile$Bugs.Reportados)
kable(tabela_qualidade_bugs) %>% kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
5 8 10 12 15 25 26 27 28 29 32 41 52 57 71 74 75 76 86 87 92 94
Boa 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1
Excelente 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0
Regular 1 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0 0
Ruim 0 1 0 1 0 2 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0

Uma tabela de frequência cruzada foi criada para mostrar a distribuição conjunta da qualidade do código e do número de bugs reportados. Isso ajuda a visualizar como a qualidade do código se distribui em relação ao número de bugs reportados.

8.2 Visualização da relação

Um gráfico de boxplot foi criado para visualizar a relação entre a qualidade do código e o número de bugs reportados. Isso permite observar a distribuição dos bugs reportados para diferentes níveis de qualidade do código.

Interpretação do Gráfico de Boxplot

  • Distribuição de Bugs Reportados: Mostra a distribuição dos bugs reportados para cada nível de qualidade do código.
  • Médias e Medianas: A linha central em cada boxplot representa a mediana do número de bugs reportados. As bordas da caixa representam o primeiro e terceiro quartis, e os pontos fora da caixa podem indicar outliers.
  • Comparação entre Níveis de Qualidade: Permite comparar visualmente como o número de bugs reportados varia com a qualidade do código.

Observações da Tabela e do Boxplot

  • Qualidade Alta: Se a qualidade do código classificada como “Excelente” ou “Boa” apresenta menor número de bugs, isso sugere que uma maior qualidade do código está associada a uma redução de bugs.
  • Qualidade Baixa: Se a qualidade do código classificada como “Regular” ou “Ruim” apresenta maior número de bugs, isso sugere que uma menor qualidade do código está associada a um aumento de bugs.
  • Consistência: A consistência dessas observações através da tabela e do gráfico pode fortalecer a confiança nas conclusões.

Implicações Práticas

  • Para Desenvolvedores: Melhorar a qualidade do código pode ser uma estratégia eficaz para reduzir o número de bugs reportados, resultando em um software mais robusto e confiável.
  • Para Gestores de Projetos: Focar em práticas que melhoram a qualidade do código, como revisões de código e testes rigorosos, pode ser crucial para reduzir o tempo e os custos associados à correção de bugs.

9 Conclusões

Através da Análise Exploratória de dados (Diagrama de ramo e folhas, tabela de distruição de frequência, histograma), de Medidas de Tendência Central (média, moda e mediana), Medidas de Variabilidade (variância, desvio padrão, coeficiente de variação)e análise de Assimetria, foi possível realizar a mensuração da qualidade dos códigos e a incidência de bugs em um projeto de desenvolvimento Mobile. Essa mensuração, por sua vez, possibilitou conhecermos o nível de confiabilidade, eficiência e segurança dos códigos.

Em relação a cobertura de código e o número de bugs reportados há uma correlação negativa, indicando que testes automatizados são eficazes na detecção precoce de problemas por sua alta cobertura de código assegurar que mais partes do código serem verificadas, o que reduz a probabilidade de bugs passarem despercebidos.

Em relação a Análise da Relação entre Qualidade do Código e Bugs Reportados, foi observado que projetos com código de alta qualidade (classificados como “Excelente” ou “Boa”) têm menos bugs reportados em comparação com projetos com código de qualidade inferior (classificados como “Regular” ou “Ruim”). Isso sugere que a qualidade do código está diretamente relacionada à estabilidade e confiabilidade do software. Código de alta qualidade é mais fácil de manter e menos propenso a erros, o que resulta em menos bugs.

10 Recomendações

Para aumentar a cobertura de testes automatizados, é essencial implementar testes unitários, de integração e de sistema para cobrir mais partes do código, além de utilizar ferramentas de análise de cobertura de código para monitorar e aumentar a cobertura. Revisar e atualizar testes regularmente para cobrir novas funcionalidades e corrigir partes do código que podem não estar suficientemente testadas também é fundamental.

A qualidade do código pode ser aprimorada através de revisões de código sistemáticas para assegurar que os padrões de qualidade estão sendo seguidos. Práticas de revisão de código como pares e pull requests são eficazes para identificar e corrigir problemas de qualidade. Fornecer treinamento contínuo para desenvolvedores sobre práticas de codificação limpa e melhores práticas de desenvolvimento, bem como incentivar a adoção de padrões de codificação consistentes, ajuda a manter a qualidade do código. Utilizar ferramentas de análise estática para detectar problemas de qualidade do código antes que eles se tornem bugs e integrá-las no processo de desenvolvimento contínuo para monitoramento constante é altamente recomendável.

Para a eficiência dos testes automatizados, implementar testes de regressão automatizados para assegurar que novas mudanças no código não introduzam novos bugs é essencial. Ferramentas de integração contínua (CI) são úteis para executar testes automaticamente com cada nova alteração de código. Estabelecer ciclos de feedback rápido para que os desenvolvedores recebam feedback imediato sobre a qualidade do código e cobertura de testes, além de utilizar dashboards de qualidade para monitorar e visualizar métricas de qualidade em tempo real, são práticas recomendadas.

Para projetos futuros, recomenda-se uma análise de uma correlação entre o tamanho do projeto (medido em linhas de código ou número de funcionalidades), visto que projetos maiores podem apresentar desafios únicos em termos de manutenção da qualidade do código. Entender essa relação ajuda a identificar estratégias para gerenciar projetos grandes de forma eficaz. Por fim, se diferentes arquiteturas de software (por exemplo, MVC, MVVM, Clean Architecture) afetam a qualidade do código e a incidência de bugs em projetos Mobile influenciando sua modularidade, testabilidade e manutenibilidade do código e consequentemente impactando na qualidade do software.