Experiências que correlacionam métricas de código à densidade de erros

16

Eu estou querendo saber se alguém fez alguns experimentos correlacionando métricas de código (SLOC, Complexidade Ciclomática, etc) com a densidade de erros em aplicativos orientados a objetos.

Não estou procurando experimentos que apenas provem ou refutem uma correlação, mas em ambos. Não estou tentando encontrar uma bala de prata, pois acredito que a densidade de erros de um projeto pode se correlacionar com uma ou mais métricas para um determinado projeto ou equipe, e a correlação pode mudar durante a vida útil do projeto / equipe.

Meu objetivo é

  1. Meça todas as métricas interessantes por 2 a 3 meses (já temos algumas do sonar).
  2. Encontre uma métrica que se correlacione com o número de novos bugs.
  3. Faça uma análise de causa raiz para verificar por que isso acontece (por exemplo, nos falta uma certa habilidade de design?).
  4. Melhore a habilidade e meça as alterações em algumas iterações.
  5. Enxágue e repita a partir de 2.

Se você não tem experiência nisso, mas lembre-se de ver um artigo / blog sobre esse assunto, eu apreciaria se você pudesse compartilhá-lo.


Até agora encontrei os seguintes links com algumas informações sobre este assunto

Augusto
fonte
1
Se você quiser evitar o fechamento, repita sua pergunta. Os sites do Stack Exchange não são mecanismos de pesquisa e os usuários não são assistentes pessoais de pesquisa . Em vez de solicitar links para documentos, a ênfase deve estar em perguntar que tipos de métricas foram correlacionadas com defeitos e densidade de defeitos.
Thomas Owens
1
Lamento que a pergunta tenha surgido como um pedido para se tornar meu assistente de pesquisa pessoal , definitivamente não é o que eu queria fazer, mas encontrar esse tipo de papel não é algo muito comum. Mudei o título para que outras pessoas não tenham a mesma impressão.
Augusto

Respostas:

11

Sempre que ouço tentativas de associar algum tipo de métrica baseada em código a defeitos de software, a primeira coisa que penso é na complexidade ciclomática de McCabe . Vários estudos descobriram que existe uma correlação entre alta complexidade ciclomática e número de defeitos. No entanto, outros estudos que analisaram módulos com um tamanho semelhante (em termos de linhas de código) descobriram que pode não haver uma correlação.

Para mim, tanto o número de linhas em um módulo quanto a complexidade ciclomática podem servir como bons indicadores de possíveis defeitos, ou talvez uma maior probabilidade de que os defeitos sejam injetados se forem feitas modificações em um módulo. Um módulo (especialmente no nível de classe ou método) com alta complexidade ciclomática é mais difícil de entender, pois há um grande número de caminhos independentes através do código. Um módulo (novamente, especialmente no nível de classe ou método) com um grande número de linhas também é difícil de entender, pois o aumento de linhas significa que mais coisas estão acontecendo. Existem muitas ferramentas de análise estática que suportam o cálculo das linhas de código-fonte de acordo com as regras especificadas e a complexidade ciclomática; parece que capturá-las seria uma tarefa difícil.

As medidas de complexidade de Halstead também podem ser interessantes. Infelizmente, a validade deles parece ser um pouco debatida, então eu não precisaria confiar neles. Uma das medidas de Halstead é uma estimativa de defeitos com base no esforço ou no volume (uma relação entre a duração do programa em termos de operadores e operandos totais e o vocabulário do programa em termos de operadores e operadores distintos).

Há também um grupo de métricas conhecido como CK Metrics. A primeira definição desse conjunto de métricas parece estar em um artigo intitulado A Metrics Suite for Object Oriented Design, de Chidamber e Kemerer. Eles definem Métodos Ponderados por Classe, Árvore de Profundidade de Herança, Número de Filhos, Acoplamento entre Classes de Objetos, Resposta para uma Classe e Falta de Coesão nos Métodos. O artigo fornece os métodos computacionais, bem como uma descrição de como analisar cada um.

Em termos de literatura acadêmica que analisa essas métricas, você pode estar interessado em Análise Empírica de Métricas CK para Complexidade de Design Orientada a Objetos: Implicações para Defeitos de Software, de autoria de Ramanath Subramanyam e MS Krishna. Eles analisaram três das seis métricas de CK (métodos ponderados por classe, acoplamento entre objetos classificados e profundidade da árvore de herança). Olhando através do artigo, parece que eles descobriram que essas são métricas potencialmente válidas, mas devem ser interpretadas com cautela, pois "melhorar" uma pode levar a outras mudanças que também levam a uma maior probabilidade de defeitos.

A análise empírica das métricas de projeto orientadas a objetos para prever falhas de severidade alta e baixa, de autoria de Yuming Zhou e Hareton Leung, também examina as métricas de CK. Sua abordagem foi determinar se eles podem prever defeitos com base nessas métricas. Eles descobriram que muitas das métricas da CK, exceto a profundidade da árvore de herança e o número de filhos) tinham algum nível de significância estatística na previsão de áreas onde os defeitos poderiam ser localizados.

Se você for membro do IEEE, recomendo procurar nas publicações IEEE Transactions on Software Engineering mais publicações acadêmicas e no IEEE Software mais relatórios do mundo real e aplicados. O ACM também pode ter publicações relevantes em sua biblioteca digital .

Thomas Owens
fonte
Todas as métricas de Halstead demonstraram estar fortemente correlacionadas com o SLOC bruto (número de linhas de código-fonte). Nesse ponto, qualquer coisa que esteja correlacionada com qualquer métrica Halstead ficou conhecida por estar correlacionada com SLOC bruto, e é mais fácil medir o SLOC do que qualquer uma das métricas Halstead.
John R. Strohm
@ JohnR.Strohm Não concordo que seja mais fácil contar SLOC do que calcular as métricas de Halstead, quando você estiver usando ferramentas para fazer o cálculo. Supondo que as métricas da Halstead sejam válidas (o que é realmente debatido, mas nada importa para uma métrica inválida), saber a quantidade de tempo necessária para desenvolver o código ou o número projetado de defeitos no sistema é um valor mais útil do que saber a quantidade de linhas. Posso criar agendas com dados de tempo, planos de qualidade com dados de defeitos ou alocar tempo suficiente para uma revisão de código com dificuldade. É mais difícil usar SLOC bruto para essas coisas.
Thomas Owens
@ JohnR.Strohm Tenho certeza de que um programa de computação métrica Halstead demora um pouco mais para ser executado do que um programa de contagem SLOC. Mas, supondo que uma saída válida se torne uma entrada válida na tomada de decisões, prefiro dados significativos de tempo, esforço e defeito do que uma contagem bruta de SLOC. O valor agregado da métrica mais complexa geralmente vale o tempo de cálculo adicional, assumindo novamente entradas e saídas válidas de cálculo.
Thomas Owens
@ThomasOwens, a questão de saber se o esforço de software e, portanto, o custo e o cronograma, podem ser estimados diretamente a partir de estimativas de SLOC bruto até a morte. Após uma pesquisa considerável em dados reais do projeto, a questão foi resolvida, afirmativamente. Veja "Economia de Engenharia de Software", de Barry Boehm, 1981.
John R. Strohm
@ThomasOwens: Além disso, é preciso reconhecer que as métricas de Halstead são inerentemente retrospectivas. Você não pode medir as métricas de software da Halstead que ainda não criou. Por outro lado, é possível estimar o SLOC bruto para uma determinada tarefa e, dadas as especificações detalhadas o suficiente e um pouco de experiência, é relativamente fácil chegar bem perto da estimativa. Além disso, é MUITO fácil comparar estimativas com valores reais, ajustar as heurísticas de estimativa e calibrar o estimador de custos. A General Dynamics / Fort Worth trabalhou muito nisso no início dos anos 80.
John R. Strohm
7

Eu discuti possíveis correlações em uma das postagens do meu blog :

Correlação entre a complexidade ciclomática e a densidade de bugs: esse é o problema real?

A resposta é não. Mantendo o tamanho constante, os estudos não mostram correlação entre CC e densidade de defeitos. No entanto, existem outras duas correlações interessantes para estudar:

O primeiro é: O CC está fortemente correlacionado com a duração da detecção e correção de defeitos? Em outras palavras, se o CC for menor, gastaríamos menos tempo depurando e corrigindo defeitos?

O segundo é: O CC se correlaciona fortemente com a Taxa de realimentação de falhas (FFR, número médio de defeitos que resulta da aplicação de uma alteração ou correção de um defeito)?

Precisa de mais investigação para ver se alguém já estudou essa correlação empiricamente. Mas, meu pressentimento e o feedback que recebo das equipes com as quais trabalho é que existe uma forte correlação positiva entre a complexidade ciclomática de um lado e a duração da detecção e correção de um defeito ou o impacto da mudança no outro lado.

Este é um bom experimento para fazer. Mantenha-se alerta para os resultados!

Amr Noaman
fonte
Não é digno de um voto negativo, mas deve ser "alguns estudos não mostram correlação", porque outros estudos mostram uma correlação.
David Hammen
3

No livro Code Complete, p.457, Steve McConnell diz que "a complexidade do fluxo de controle é importante porque foi correlacionada com baixa confiabilidade e erros freqüentes". Ele então menciona algumas referências que apóiam essa correlação, incluindo o próprio McCabe (que é creditado por ter desenvolvido a métrica da complexidade ciclomática). A maioria delas é anterior ao uso generalizado de linguagens orientadas a objetos, mas como essa métrica se aplica a métodos nessas linguagens, as referências podem ser o que você está procurando.

Essas referências são:

  • McCabe, Tom. 1976. "Uma medida de complexidade". Transações IEEE em Engenharia de Software, SE-2, no. 4 (dezembro): 308-20
  • Shen, Vincent Y., et al. 1985. "Identificando Software Propenso a Erros - Um Estudo Empírico". Transações IEEE sobre Engenharia de Software SE-11, no.4 (abril): 317-24.
  • Ward, William T. 1989. "Prevenção de defeitos de software usando a métrica da complexidade de McCabe". Hewlett-Packard Journal, abril de 64-68.

De acordo com minha própria experiência, a métrica de McCabe, como pode ser calculada por um programa em muitas seções de código, é útil para encontrar métodos e funções complicados demais e com alta probabilidade de conter erros. Embora eu não tenha calculado, a distribuição de erros nas funções de alta complexidade ciclomática versus funções de baixa complexidade ciclomática, investigar essas funções me permitiu descobrir erros de programação negligenciados.

QuantumOmega
fonte