Capa do Ebook gratuito Qualidade de Software com Métricas: Do Bug ao Indicador de Processo

Qualidade de Software com Métricas: Do Bug ao Indicador de Processo

Novo curso

20 páginas

Densidade de defeitos e qualidade do produto em produção

Capítulo 6

Tempo estimado de leitura: 0 minutos

+ Exercício

A densidade de defeitos é uma métrica que relaciona a quantidade de defeitos observados em um produto com o “tamanho” desse produto. Ela é usada para responder a uma pergunta objetiva: dado um volume de software entregue, quantos problemas relevantes aparecem? Em produção, essa métrica ganha valor porque mede a qualidade percebida pelo usuário e a robustez do sistema em condições reais (carga, dados reais, integrações, variações de ambiente).

É importante separar a ideia de “contar bugs” de “medir qualidade”. Contar bugs sem contexto pode levar a interpretações erradas: um sistema grande tende a ter mais ocorrências absolutas; um time que registra tudo com rigor pode parecer pior do que um time que subnotifica. A densidade de defeitos tenta reduzir esse viés ao normalizar por tamanho e ao exigir regras claras sobre o que entra na contagem.

O que é densidade de defeitos

Densidade de defeitos (defect density) é, em termos simples, a razão entre defeitos e tamanho do produto em um período ou versão. A fórmula geral é:

Densidade de defeitos = Número de defeitos / Tamanho do software

O “tamanho” pode ser medido de várias formas, e a escolha afeta a comparabilidade e a utilidade. Em produção, as opções mais comuns são:

  • KLOC (mil linhas de código): tradicional, fácil de obter, mas sensível a linguagem, estilo e geração de código.
  • Pontos de função: mais independente de tecnologia, porém exige método e disciplina para medir.
  • Tamanho por escopo entregue (ex.: número de histórias, pontos de história): útil internamente, mas menos padronizado e sujeito a variações de estimativa.
  • Componentes/serviços (ex.: por microserviço): útil para localizar hotspots, mas não é uma medida “contínua” de tamanho.

Para qualidade do produto em produção, a densidade costuma ser analisada por release, por módulo e por janela de tempo (ex.: defeitos por mês por KLOC). O objetivo não é encontrar um número “perfeito”, e sim criar uma base consistente para comparação ao longo do tempo e entre partes do sistema.

Continue em nosso aplicativo

Você poderá ouvir o audiobook com a tela desligada, ganhar gratuitamente o certificado deste curso e ainda ter acesso a outros 5.000 cursos online gratuitos.

ou continue lendo abaixo...
Download App

Baixar o aplicativo

O que conta como “defeito” em produção

Em produção, “defeito” pode significar coisas diferentes dependendo do contexto. Se a definição for ampla demais, a métrica vira ruído; se for estreita demais, você perde sinais importantes. Uma definição operacional útil costuma considerar:

  • Incidentes confirmados como falha do software (não apenas dúvida do usuário).
  • Regressões (algo que funcionava e parou de funcionar após mudança).
  • Falhas de integração (contratos quebrados, timeouts, incompatibilidades de versão).
  • Erros de dados causados por lógica incorreta (ex.: cálculo, arredondamento, regras de negócio).
  • Vulnerabilidades exploráveis (quando tratadas como defeitos de produto).

Também é comum excluir da contagem:

  • Solicitações de melhoria (feature request) sem falha objetiva.
  • Problemas externos (ex.: indisponibilidade de provedor) quando não há falha do sistema, embora possam ser medidos em outra categoria.
  • Erros de operação (ex.: configuração manual incorreta) quando não há bug, mas vale registrar como oportunidade de automação.

Uma prática que melhora muito a qualidade da métrica é classificar cada ocorrência com tipo (bug, regressão, integração, segurança), severidade (impacto) e origem (onde foi introduzido, quando possível). Assim, você consegue calcular densidades específicas, como “densidade de defeitos críticos” ou “densidade de regressões”.

Por que densidade de defeitos se relaciona com qualidade em produção

Qualidade do produto em produção envolve estabilidade, confiabilidade e adequação ao uso. A densidade de defeitos se conecta a esses aspectos porque:

  • Normaliza por tamanho, permitindo comparar releases com escopos diferentes.
  • Ajuda a identificar hotspots: módulos com densidade alta tendem a concentrar risco e custo de manutenção.
  • Permite acompanhar tendências: se a densidade cresce release após release, há sinal de degradação (dívida técnica, testes insuficientes, mudanças arriscadas).
  • Suporta decisões de investimento: refatoração, cobertura de testes, observabilidade e melhorias de arquitetura podem ser priorizadas onde a densidade é maior.

Mesmo assim, densidade de defeitos não é sinônimo de qualidade por si só. Um produto pode ter baixa densidade porque quase ninguém usa uma funcionalidade, ou porque os usuários desistiram de reportar. Por isso, em produção, a densidade funciona melhor quando analisada junto de sinais de uso e impacto (por exemplo, volume de transações, usuários ativos, receita afetada, tempo de indisponibilidade).

Escolhendo o denominador: como medir “tamanho” sem distorcer

O denominador é a parte mais delicada. Algumas orientações práticas:

KLOC: quando faz sentido

KLOC funciona bem para comparações internas dentro do mesmo ecossistema tecnológico (mesmas linguagens e padrões). Para evitar distorções:

  • Padronize se conta linhas lógicas ou linhas físicas.
  • Exclua arquivos gerados automaticamente, quando possível.
  • Meça por repositório/módulo e congele a regra (não mude o método no meio da série histórica).

Por serviço/módulo: quando o objetivo é localizar risco

Se você quer descobrir onde estão os problemas, pode usar densidade por componente:

Densidade por serviço = Defeitos atribuídos ao serviço / Tamanho do serviço (KLOC ou outro)

Isso é especialmente útil em arquiteturas com múltiplos serviços, onde o impacto de um defeito pode ser localizado em um contrato específico.

Por volume de uso: uma alternativa para produção

Em produção, às vezes o melhor denominador não é “tamanho do código”, e sim “exposição”. Exemplos:

  • Defeitos por 10 mil transações
  • Incidentes por 1.000 usuários ativos
  • Erros por milhão de requisições

Essa abordagem mede qualidade percebida sob carga real. Ela não substitui a densidade por tamanho, mas complementa: um módulo pequeno pode ter baixa densidade por KLOC e ainda assim gerar muitos incidentes por ser muito usado.

Severidade: densidade ponderada para refletir impacto

Nem todo defeito tem o mesmo peso. Em produção, um bug cosmético e uma falha que impede faturamento não podem ser tratados como equivalentes. Uma forma prática é calcular uma densidade ponderada por severidade.

Exemplo de pesos (ajuste ao seu contexto):

  • Severidade 1 (crítico): peso 10
  • Severidade 2 (alto): peso 5
  • Severidade 3 (médio): peso 2
  • Severidade 4 (baixo): peso 1
Densidade ponderada = (Σ defeitos * peso) / tamanho

Isso ajuda a evitar que um aumento de “defeitos baixos” masque uma redução de “defeitos críticos”, ou o contrário. Também reduz o incentivo ruim de “quebrar um incidente grande em vários pequenos” apenas para manipular contagem.

Passo a passo prático para medir densidade de defeitos em produção

1) Defina a unidade de análise

Escolha como você quer enxergar a qualidade:

  • Por release: útil para avaliar o efeito de mudanças entregues.
  • Por mês/semana: útil para acompanhar tendência contínua.
  • Por serviço/módulo: útil para priorização técnica.

Uma combinação comum é: por release e por serviço.

2) Defina o que entra na contagem de defeitos

Crie regras objetivas e simples:

  • Conte apenas ocorrências confirmadas como falha do produto.
  • Defina se “incidente” e “bug” são a mesma coisa ou se um incidente pode gerar múltiplos bugs (e qual deles entra na métrica).
  • Defina se defeitos de segurança entram e como serão classificados.

Uma regra prática para evitar duplicidade: conte um defeito por causa raiz quando houver vários tickets para o mesmo problema, e registre o volume de ocorrências separadamente.

3) Padronize severidade e critérios de classificação

Crie uma tabela curta de severidade com exemplos. Exemplo:

  • Crítico: indisponibilidade, perda de dados, falha em fluxo principal, impacto financeiro relevante.
  • Alto: degradação significativa, falha em fluxo importante com workaround.
  • Médio: falha em fluxo secundário, impacto limitado.
  • Baixo: cosmético, texto, layout, pequenas inconsistências.

Treine o time de suporte/triagem para aplicar de forma consistente. Inconsistência de severidade é uma das maiores fontes de ruído.

4) Defina o denominador (tamanho) e como coletá-lo

Escolha um denominador principal e um secundário:

  • Principal: KLOC por serviço/release (se aplicável).
  • Secundário: defeitos por volume de uso (transações, requisições, usuários ativos).

Documente o método de medição e automatize sempre que possível (por exemplo, um script que calcula linhas por diretório e exclui pastas geradas).

5) Estabeleça a janela de atribuição do defeito

Em produção, um defeito pode ser descoberto semanas após a entrega. Você precisa decidir como atribuir:

  • Atribuição por data de detecção: bom para monitorar qualidade percebida ao longo do tempo.
  • Atribuição por release que introduziu: bom para avaliar eficácia de testes e mudanças, mas exige análise de causa.

Uma prática viável é manter as duas visões: uma para operação (detecção) e outra para engenharia (introdução), quando houver dados.

6) Calcule e publique a métrica com segmentações úteis

Evite um único número agregado. Publique pelo menos:

  • Densidade total
  • Densidade de defeitos críticos/altos
  • Densidade por serviço/módulo (top 5)
  • Densidade por tipo (regressão, integração, dados, segurança)

Exemplo de tabela (conceitual):

Release 2026.01 - Serviço Pagamentos - 25 KLOC - 6 defeitos (2 críticos, 1 alto, 3 médios)  => 0,24 defeitos/KLOC (críticos: 0,08/KLOC)

7) Use a densidade para orientar ações (sem transformar em meta cega)

O uso mais produtivo é como ferramenta de diagnóstico e priorização. Exemplos de ações guiadas por densidade:

  • Hotspot com densidade alta e uso alto: priorizar refatoração, testes automatizados de regressão e observabilidade (logs, métricas, tracing).
  • Densidade alta concentrada em integrações: revisar contratos, versionamento de APIs, testes de contrato e ambientes de homologação mais fiéis.
  • Densidade alta em regras de negócio: reforçar testes de aceitação, validações de dados e revisão de requisitos com exemplos executáveis.
  • Densidade alta de regressões: revisar estratégia de testes, critérios de pronto, cobertura de cenários críticos e análise de impacto de mudanças.

Evite usar densidade como “meta de performance individual”. Isso incentiva subnotificação, reclassificação indevida e fechamento apressado de tickets.

Exemplos práticos de interpretação em produção

Exemplo 1: aumento de defeitos absolutos, densidade estável

Você entregou uma release grande. Os defeitos em produção subiram de 10 para 18, mas o tamanho entregue (KLOC alterado ou total do módulo) também aumentou proporcionalmente. A densidade ficou praticamente igual. Interpretação provável: o risco cresceu porque o escopo cresceu, mas a “qualidade relativa” não piorou. A decisão pode ser reforçar monitoramento pós-release e focar em reduzir defeitos críticos, em vez de concluir que o time “piorou”.

Exemplo 2: densidade baixa por KLOC, mas alta por transações

Um serviço pequeno (pouco código) atende a maioria das transações. Ele tem poucos defeitos por KLOC, mas muitos incidentes por milhão de requisições. Interpretação: o problema pode estar em resiliência, limites de capacidade, dependências externas, timeouts e tratamento de exceções, mais do que em “quantidade de bugs”. A ação pode ser revisar circuit breakers, retries, cache, filas e limites de concorrência.

Exemplo 3: densidade de regressões cresce após mudanças frequentes

Se a densidade total não muda, mas a densidade de regressões aumenta, isso aponta para fragilidade em testes de regressão, falta de testes de contrato, ou mudanças sem análise de impacto. A ação é segmentar por tipo e atacar a causa: ampliar testes automatizados nos fluxos críticos e criar checks específicos para áreas com histórico de regressão.

Armadilhas comuns e como evitar

Subnotificação e viés de canal

Se parte dos defeitos chega por suporte e parte por monitoramento, você pode contar apenas o que vira ticket e ignorar erros silenciosos. Para reduzir viés:

  • Integre alertas de produção ao processo de registro (ex.: incidentes geram tickets automaticamente).
  • Defina um critério para “erro repetido” virar defeito (ex.: acima de X ocorrências em Y minutos).

Duplicidade: um incidente vira muitos tickets

Um mesmo problema pode gerar dezenas de chamados. Se você contar todos como defeitos, a densidade explode artificialmente. Solução:

  • Separar defeito (causa raiz) de ocorrências.
  • Manter dois números: densidade de defeitos (causas) e taxa de ocorrências (volume).

Comparações injustas entre times ou tecnologias

KLOC em linguagens diferentes não é comparável. Mesmo dentro da mesma linguagem, estilos variam. Para evitar:

  • Compare densidade dentro do mesmo domínio/stack.
  • Use também denominadores de exposição (por transações/usuários) para comparações mais justas em produção.

Gaming da métrica

Se a densidade vira meta rígida, surgem comportamentos como reclassificar defeitos como “melhoria” ou reduzir severidade. Para mitigar:

  • Use densidade como indicador de saúde e priorização, não como KPI isolado de bônus.
  • Audite amostras de classificação e severidade.

Como transformar densidade de defeitos em indicador acionável de qualidade

Para que a densidade de defeitos realmente represente qualidade do produto em produção, ela precisa ser:

  • Consistente: mesmas regras de contagem e tamanho ao longo do tempo.
  • Segmentada: por severidade, tipo e componente.
  • Contextualizada: acompanhada de exposição (uso) e impacto (por exemplo, incidentes críticos).
  • Conectada a ações: cada aumento relevante deve disparar investigação e plano de mitigação (testes, refatoração, observabilidade, revisão de contratos).

Uma forma prática de operacionalizar é definir “faixas” internas por módulo (não como padrão universal), por exemplo:

  • Faixa verde: densidade de defeitos críticos abaixo de um limite histórico do próprio módulo.
  • Faixa amarela: acima do histórico, exige análise de causa e ações preventivas.
  • Faixa vermelha: acima de um limiar que justifica congelar mudanças não essenciais e focar em estabilização.

Essas faixas devem ser calibradas com dados do próprio produto e revisadas quando houver mudanças estruturais (migração de arquitetura, grande refatoração, mudança de linguagem), sempre mantendo rastreabilidade do método para não quebrar a série histórica.

Agora responda o exercício sobre o conteúdo:

Ao usar densidade de defeitos para avaliar a qualidade em produção, qual prática torna a métrica mais confiável e acionável?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

A densidade é mais útil quando há consistência nas regras e no tamanho, segmentação (severidade/tipo/componente) e contexto de uso/impacto. Isso reduz vieses como subnotificação e permite priorizar ações onde o risco é maior.

Próximo capitúlo

Escape rate e efetividade das barreiras de prevenção

Arrow Right Icon
Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.