Métricas objetivas para a qualidade do software [fechado]


12

Existem vários tipos de qualidade que podem ser medidos em produtos de software, por exemplo, adequação à finalidade (por exemplo, uso final), manutenção, eficiência. Alguns deles são subjetivos ou específicos do domínio (por exemplo, bons princípios de design da GUI podem ser diferentes entre culturas ou dependentes do contexto de uso, pense em uso militar versus uso do consumidor).

O que me interessa é uma forma mais profunda de qualidade relacionada à rede (ou gráfico) de tipos e sua inter-relação, ou seja, a quais tipos cada tipo se refere, existem grupos claramente identificáveis ​​de interconectividade relacionados a uma rede adequadamente arquitetura hierárquica ou, inversamente, existe uma grande 'bola' de referências de tipo (código 'monolítico'). Além disso, o tamanho de cada tipo e / ou método (por exemplo, medido em quantidade de código de bytes Java ou .Net IL) deve fornecer algumas indicações de onde grandes algoritmos complexos foram implementados como blocos monolíticos de código, em vez de serem decompostos em mais gerenciáveis ​​/ sustentáveis pedaços.

Uma análise baseada nessas idéias pode ser capaz de calcular métricas que são pelo menos um proxy de qualidade. Os pontos exatos de limiar / decisão entre alta e baixa qualidade eu suspeito que sejam subjetivos, por exemplo, como manutenibilidade queremos dizer manutenibilidade por programadores humanos e, portanto, a decomposição funcional deve ser compatível com o funcionamento da mente humana. Como tal, pergunto-me se pode haver uma definição matematicamente pura da qualidade do software que transcenda todo o software possível em todos os cenários possíveis.

Também me pergunto se isso é uma ideia perigosa, que se proxies objetivos de qualidade se tornarem populares, as pressões dos negócios farão com que os desenvolvedores busquem essas métricas em detrimento da qualidade geral (aqueles aspectos de qualidade não medidos pelos proxies).

Outra maneira de pensar sobre a qualidade é do ponto de vista da entropia. Entropia é a tendência dos sistemas de reverter de estados ordenados para estados desordenados. Qualquer um que já tenha trabalhado no mundo real, em um projeto de software de médio a grande escala, apreciará o grau em que a qualidade da base de código tende a se degradar com o tempo. As pressões dos negócios geralmente resultam em mudanças que se concentram em novas funcionalidades (exceto onde a qualidade em si é o principal ponto de venda, por exemplo, em software aviônico), e na deterioração da qualidade por meio de problemas de regressão e da funcionalidade 'calçar sapatos', onde ela não se encaixa bem. uma perspectiva de qualidade e manutenção. Então, podemos medir a entropia do software? E se sim, como?


Eu concordo com S. Lott. Na vida, freqüentemente há uma diferença entre 'como deve ser' e 'como é'. Rapaz, eu gostaria que mais pessoas neste planeta tivessem superado sua abordagem de 'boas intenções' e olhassem para 'como é'. Além de incentivos errados, haverá uma falsa sensação de segurança perigosa. Combine isso com as pessoas que tentam burlar o sistema (o que é natural, porque SEMPRE tentam melhorar suas condições (monetárias ou outras)), e você fica com uma situação ruim. Não é de surpreender que as quedas de mercado 'uma vez em um milênio' ocorram a cada 2 décadas.
Job

Respostas:


20

Essa é uma ideia perigosa. Proxies "objetivos" de qualidade levam diretamente a recompensas de gerenciamento e os desenvolvedores perseguem essas métricas à custa da qualidade real.

Esta é a lei das consequências não intencionais.

Qualidade - embora importante - é apenas um pequeno aspecto do software. A funcionalidade e o valor criados pelo software são muito, muito mais importantes que a qualidade.

Todas as métricas levam à atividade para otimizar a métrica. Isso, por sua vez, tem consequências que você pode não gostar.

Software é muito complexo. É difícil entender como é realmente complexo.

Mesmo coisas "óbvias" como a cobertura do código do teste de unidade podem perder tempo. Chegar a 100% pode exigir a criação de testes realmente mais complexos que o código trivial que está sendo testado. Obter 100% de cobertura pode envolver um custo inaceitável. [A alternativa para código trivial, pequeno e raramente usado é teste por inspeção. Mas isso não se encaixa no jogo de métricas de 100%.]

Outro exemplo é a complexidade ciclomática. É uma das melhores medidas de qualidade de código. Mas pode ser criado criando muitas funções pequenas que podem ser mais difíceis de ler (e mais difíceis de manter) do que uma função maior. Você termina nas revisões de código em que concorda que pode não ser muito legível, mas atende ao limite de complexidade.


3
"Todas as métricas levam à atividade para otimizar a métrica". Eu acho que isso muitas vezes é verdade. No entanto, não deveria ser. Como mencionei em meus últimos parágrafos, as métricas devem orientar o gerenciamento. Muitas vezes, porém, as decisões são tomadas exclusivamente porque e para os números, sem uma compreensão do significado dos números e dos riscos e trade-offs associados à decisão.
Thomas Owens

3
"No entanto, não deveria ser." Explique de que maneira as pessoas podem ser instruídas a não otimizar suas recompensas. Encontre um único exemplo de comportamento humano em que as recompensas culturais (baseadas em todos os tipos de estruturas sociais malucas) não são primárias, primordiais e a coisa mais importante que as pessoas buscarão. Qualquer coisa que envolva "deveria" ou "não deveria" deve ser comparada com o que as pessoas realmente fazem. Eles realmente otimizam suas recompensas. Se as métricas fizerem parte das recompensas, as pessoas otimizam as métricas. Por favor, não use "should" para descrever o comportamento das pessoas.
31511 S.Lott

2
@ Thomas Owens: "Você simplesmente não tem recompensas para otimizar com base em métricas". Isso é engraçado. Como você os manterá tão secretos? Depois que descobrir que seu código foi aceito mais cedo que o meu, vou querer saber como o gerenciamento decidiu que seu módulo estava pronto e o meu não. Quando encontrar a métrica que "guia" essa decisão, jogarei totalmente as métricas a serem executadas tão cedo quanto você. Se não houver uma métrica que eu possa jogar, verei que a decisão foi arbitrária, a gerência gosta mais de você do que eu e desistirei porque não há um padrão de desempenho que eu possa perceber.
S.Lott 29/07

2
@ Thomas Owens: "Eu nunca vi métricas levarem a recompensas". Existem incentivos culturais em todas as situações em que duas ou mais pessoas trabalham juntas. "Os indivíduos são reconhecidos por seu desempenho". Uma métrica para a complexidade ciclomática se torna um objetivo. Se você atingir sua meta de complexidade ciclomática mais rapidamente do que eu, há recompensas culturais: você é mais "produtivo" do que eu. Preciso usar minha métrica de complexidade para parecer tão "produtiva" quanto você.
31511 S.Lott

2
@ Thomas Owens: "É uma questão de orgulho pessoal". Esse é um ótimo exemplo de sistema de recompensa cultural. As métricas podem distorcer isso devido às conseqüências não intencionais de poder criar uma métrica de boa aparência que não corresponde ao bom código. Você forneceu um excelente exemplo de recompensa cultural que pode ser distorcida por métricas.
31511 S.Lott

4

Também me pergunto se isso é uma ideia perigosa, que se proxies objetivos de qualidade se tornarem populares, as pressões dos negócios farão com que os desenvolvedores busquem essas métricas em detrimento da qualidade geral (aqueles aspectos de qualidade não medidos pelos proxies).

Bingo, e não "se" sobre isso. Isso é chamado de "Disfunção de Medição" e foi observado e escrito muitas vezes Joel escreveu um artigo sobre ele em 2002, referindo um livro de um professor de Harvard.

Isso não significa que essas métricas sejam inúteis, apenas que nunca se deve basear incentivos ou políticas explicitamente nessas medições de proxy. Se você deseja melhorar a qualidade, uma métrica de proxy com um valor muito ruim é provavelmente um bom ponto de partida. Mas você não pode concluir que a qualidade é boa apenas porque todas as suas métricas têm grandes valores.


3

O que me interessa é uma forma mais profunda de qualidade relacionada à rede (ou gráfico) de tipos e sua inter-relação, ou seja, a quais tipos cada tipo se refere, existem grupos claramente identificáveis ​​de interconectividade relacionados a uma rede adequadamente arquitetura hierárquica ou, inversamente, existe uma grande 'bola' de referências de tipo (código 'monolítico').

Parece fan-in e fan-out. Fan-in conta o número de módulos que chamam um determinado módulo e fan-out conta o número de módulos chamados por um determinado módulo. Um sinal de aviso a ser usado seria o módulo que possui uma grande entrada e saída de ventiladores, pois isso pode indicar um design inadequado e um alvo importante para refatoração ou reprojeto.

Além disso, o tamanho de cada tipo e / ou método (por exemplo, medido em quantidade de código de bytes Java ou .Net IL) deve fornecer algumas indicações de onde grandes algoritmos complexos foram implementados como blocos monolíticos de código, em vez de serem decompostos em mais gerenciáveis ​​/ sustentáveis pedaços.

Uma medida simples seria linhas de código. Você pode decompô-lo em linhas totais de código em todo o projeto e em linhas de código por módulo (talvez usando módulos de tamanhos diferentes). Você pode usar isso como um indicador de aviso, indicando que você deve revisar módulos específicos. Um livro sobre medições e métricas de qualidade de software discute alguns trabalhos que indicam que a relação entre taxas de defeitos e tamanho do módulo é curvilínea, onde o defeito médio por KSLOC vem com módulos com um tamanho entre 175 e 350 SLOC.

Algo um pouco mais complexo seria a complexidade ciclomática, projetada para indicar a testabilidade, a compreensibilidade e a manutenção de um sistema. A complexidade ciclomática conta o número de caminhos independentes através de um aplicativo ou módulo. O número de testes e, portanto, o esforço necessário para produzir e executar os testes, está fortemente relacionado à complexidade ciclomática.

Os pontos exatos de limiar / decisão entre alta e baixa qualidade eu suspeito que sejam subjetivos, por exemplo, como manutenibilidade queremos dizer manutenibilidade por programadores humanos e, portanto, a decomposição funcional deve ser compatível com o funcionamento da mente humana.

Não tenho certeza de que é esse o caso.

Por exemplo, houve pesquisas que sugerem que a memória de trabalho de um ser humano pode conter apenas 7 objetos mais / menos 2 . Provavelmente, isso é interessante para medir a entrada e saída de fãs - se eu estiver trabalhando em um módulo e estiver conectado a mais de 7 outros módulos, provavelmente não conseguirá acompanhar exatamente o que esses outros módulos estão na minha cabeça.

Também houve trabalho sobre a relação de defeitos com métricas, como complexidade ciclomática. Como você deseja minimizar defeitos em seu sistema, é possível identificar pontos que precisam de mais testes ou refatoração, conforme identificado pela alta complexidade ciclomática.

Também me pergunto se isso é uma ideia perigosa, que se proxies objetivos de qualidade se tornarem populares, as pressões dos negócios farão com que os desenvolvedores busquem essas métricas em detrimento da qualidade geral (aqueles aspectos de qualidade não medidos pelos proxies).

É o caso de quaisquer medidas ou métricas. Eles precisam ser usados ​​para entender o sistema e tomar decisões informadas. A frase "você não pode gerenciar o que não pode medir" vem à mente. Se você deseja um software de alta qualidade, precisa de algumas medidas e métricas para avaliar essa qualidade. No entanto, há um outro lado disso. Você não pode gerenciar exclusivamente pelos números. Você pode usar os números para tomar decisões informadas, mas não pode tomar uma decisão apenas porque os números dizem isso.


O que ocorre com fan-in / out é que ele fornece dois números por módulo / classe (ou o que seja) e, portanto, ignora parte da estrutura organizacional mais profunda de como os módulos são conectados. Por exemplo, você poderia ter um pequeno cluster de módulos altamente conectados relacionados a uma camada lógica e esperaria que as conexões entre as camadas fossem mínimas (em comparação), representando uma interface / contrato bem definido entre as camadas. Acho que estamos felizes por alguns módulos estarem fortemente conectados (por exemplo, métodos / classes auxiliares comumente usados), mas dependendo da 'estrutura' da conectividade (essa é minha hipótese).
redcalx

@locster Você provavelmente deseja expandir e anotar, por exemplo, em quais pacotes as classes às quais você está conectado. Não basta olhar para os números brutos, mas dividi-los em coisas como classes X dentro do meu pacote, Y classes fora do meu pacote ou classes Z neste pacote específico. Se você observar uma dispersão entre os módulos no modelo de dados e os módulos na interface do usuário, isso pode ser um indicador de um problema. Você precisa cavar um pouco mais fundo do que apenas os números brutos.
Thomas Owens

3

Existem métricas ou proxies para muitas das qualidades das quais você está interessado:

  1. Linhas de código
  2. Fan in, fan out
  3. Taxa de erro por 1000 linhas de código
  4. Complexidade ciclomática
  5. Cobertura de código
  6. Cobertura do ponto de decisão
  7. Proporção de erros corrigidos / introduzidos pelas atividades de manutenção
  8. Análise de ponto de função

Existem alguns problemas com todos esses itens:

  1. Trabalho sendo realizado para otimizar a métrica - uma tendência universal; exacerbado maciçamente se alguma das métricas for usada como base para avaliação ou recompensa para equipes ou indivíduos.
  2. Não conheço nenhuma métrica livre de contexto. Isso implica que nenhuma comparação é possível entre lojas - apenas dentro das lojas, ao longo do tempo. As métricas resultantes dessas comparações ainda são valiosas - "estamos produzindo código mais corretamente agora do que um ano atrás".

O efeito total dessas questões é que métricas como essas provavelmente só serão valiosas em uma cultura mais ampla - como TQM, garantia de qualidade (não controle), melhoria contínua, kaizan etc. É necessário definir elementos da cultura. e como ele precisa mudar. Se você defini-las, métricas como essas se tornam ferramentas essenciais para ajudar a melhorar a qualidade do código, práticas de trabalho, produtividade etc. Sem esse contexto mais amplo, as métricas gerarão trabalho para otimizar a métrica; se tornará a ferramenta do contador de grãos para aumentar a produtividade e diminuir os custos; e se tornará um obstáculo a ser jogado pela equipe de desenvolvimento.


2

Você pode estar obcecado com métricas ou com as melhores pessoas, ferramentas, práticas de engenharia e controle de qualidade que você pode pagar. Eu ficaria muito mais feliz com vários gênios de controle de qualidade paranóicos que leram 'Fooled by Randomness' e que gostam de automatizar do que um monte de relatórios bem formatados com números.


+1 para a referência do livro de Nassim Taleb. Raciocínio / epistemologia defeituosos estando na cadeia de causalidade por baixa qualidade.
Redcalx #

@locster, seu comentário me fez pensar no operador de pipeline F # :). Você começa com 'referência de livro de Nassim Taleb', mas termina com 'cadeia de causalidade de baixa qualidade' (em vez de 'cadeia de causalidade de baixa qualidade'). Assim como em inglês, às vezes gostamos de ter duas maneiras de dizer as coisas, podemos preferir isso também em uma linguagem de programação.
Job

1

Há esse problema fundamental com as métricas.

Praticamente todas as métricas propostas foram mostradas, no mundo real, em código real, fortemente ou muito fortemente correlacionadas com o SLOC bruto (linhas de código-fonte).

Foi isso que matou as métricas de Halstead, na década de 1970. (Por acidente, um dia, por volta de 1978, participei de uma palestra de um novo PhD sobre as métricas de Halstead, na qual ele apontou isso.)

Mais recentemente, a complexidade ciclomática de McCabe demonstrou estar fortemente correlacionada com o SLOC bruto, a tal ponto que o cara que fez o estudo se perguntou em voz alta se a métrica de McCabe nos dizia algo útil.

Sabemos há décadas que grandes programas eram mais propensos a ter problemas do que os pequenos. Sabemos há décadas que grandes sub-rotinas eram mais propensas a ter bugs do que pequenas. Por que precisamos de métricas misteriosas para nos dizer isso, quando olhar para quatro páginas de impressoras espalhadas sobre uma mesa deve ser suficientemente convincente?


Para ser sustentável, precisamos que o código esteja em partes humanas, portanto, uma métrica SLOC parece muito boa dessa perspectiva. No entanto, para um determinado tamanho, você pode ter um número variável de caminhos únicos (conforme a complexidade ciclomática) e eu argumentaria que mais caminhos são um proxy para menos facilmente compreensível. Por isso, eu argumentaria que o CC provavelmente adiciona / algum / valor adicional ao SLOC, desde que você permita alguma flexibilidade, exceções à regra, etc. Ou seja, não imponha rigorosamente o CC.limits / goals.
redcalx

1
@locster: Dados dois módulos SLOC de 100, um com um CC de 47 provavelmente terá mais problemas do que um com um CC de 3. NO ENTANTO, para código do mundo real, em grande quantidade, verifica-se que os módulos curtos tendem a ter baixo CC e módulos longos tendem a ter CC alto, a ponto de conhecer o SLOC lhe dá uma boa estimativa do CC e vice-versa. Isto é o que se entende por "muito fortemente correlacionado". Como tal, no código real, qualquer benefício que você começa de perceber CC = 47 é mais facilmente obtido a partir de perceber SLOC = 1500. (Números puxados de forma aleatória, o princípio é o mesmo.)
John R. Strohm

Sim, eu concordo que eles tenderão a ser fortemente correlacionados, embora o relacionamento seja geralmente não linear. por exemplo, uma pontuação CC é aproximadamente LOC aumentada para alguma potência. Portanto, do ponto de vista psicológico, o escore do CC pode ser muito grande, muito rápido, enquanto o escore associado do SLOC parece "apenas um pouco mais alto". Sim, eu sei que estou agarrando em palhas aqui :)
redcalx

@locster: Faço isso há mais de 30 anos. Hoje em dia, vejo rotineiramente rotinas de fluxo de consciência, que se prolongam por algumas centenas de SLOC, sem motivo. Em todos esses anos, vi exatamente uma (1) rotina que realmente precisava ser mais de uma página de código da impressora (cerca de 60 linhas). Todo o resto poderia ter sido calculado com lucro, e a legibilidade e a confiabilidade aumentaram significativamente. (Isso não conta grandes máquinas de estado Eles podem ser um problema nesta área, mas eles são raros..)
John R. Strohm

-2

Dadas todas as outras respostas aqui, me sinto meio boba com essa pequena. Dê uma olhada no Crap4j , que tenta classificar os métodos em java pelo quanto eles fedem. (O projeto parece abandonado.)

Ele usa uma combinação de complexidade ciclomática e cobertura de teste. Como qualquer outra métrica, é possível jogar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.