Ir para conteúdo

Qualidade de software: padrões e práticas reais

Dashboard de métricas para qualidade de software

Qualidade de software não é um atributo que aparece no final do projeto. Ela é construída decisão por decisão, desde a forma como um requisito é escrito até a maneira como um bug é tratado após o deploy. Quando isso fica claro para toda a equipe, o fluxo de entrega muda de figura: menos retrabalho, menos surpresa na integração, menos custo oculto acumulado ao longo dos sprints.

O problema é que, na prática, a qualidade costuma ser tratada como algo que o QA resolve lá na ponta, depois que o código já está escrito. Esse modelo reativo é o principal gerador de dívida técnica nos projetos brasileiros. Mas ele tem solução, e começa por entender o que qualidade de software realmente significa quando sai do papel.

O que é qualidade de software e por que o conceito importa para o gestor

A definição técnica mais sólida do setor vem da norma ISO/IEC 25010, que organiza qualidade em dois eixos: qualidade do produto (as propriedades do código em si) e qualidade em uso (a experiência que o usuário final tem no contexto real de operação).

Do lado do produto, a norma descreve oito características que precisam ser balanceadas em qualquer projeto: adequação funcional, eficiência de desempenho, compatibilidade, usabilidade, confiabilidade, segurança, manutenibilidade e portabilidade. Nenhuma pode ser maximizada isoladamente, porque há conflitos reais entre elas. Aumentar a segurança com camadas adicionais de autenticação, por exemplo, pode impactar o tempo de resposta e a usabilidade. É por isso que toda decisão de arquitetura exige uma análise de trade-off, não uma resposta automática.

Do lado do uso, o foco muda para o impacto gerado no usuário: a tarefa foi concluída? Com eficiência? O sistema foi confiável o suficiente? Essas perguntas parecem simples, mas respondem de forma objetiva se o software entregue teve valor real.

Para o gestor que contrata ou supervisiona desenvolvimento, o que esse modelo resolve é bastante concreto: ele fornece uma linguagem comum para exigir entregas com critérios verificáveis, não com promessas vagas. Um fornecedor que entrega software sem conseguir descrever como mede manutenibilidade, confiabilidade ou segurança provavelmente não tem processo de qualidade nenhum.

O custo real da baixa qualidade: números que justificam o investimento

Dados do setor colocam em perspectiva o que acontece quando qualidade é tratada como opcional. Estima-se que sistemas de baixa qualidade tenham gerado um prejuízo de US$ 2,08 trilhões para organizações apenas em 2020, considerando falhas sistêmicas, projetos malsucedidos, manutenção de sistemas legados e vulnerabilidades de segurança.

O retrabalho é o principal componente desse custo. Em média, ele responde por 30% a 40% do custo total de desenvolvimento. E o que agrava a conta é o efeito cascata: quanto mais tarde um defeito é detectado no ciclo de vida do projeto, mais caro fica corrigi-lo. Um bug identificado na fase de requisitos custa uma fração do que custará se aparecer na fase de testes de integração, ou pior, em produção.

Esse comportamento tem nome na engenharia de software: é o “shift left”, a prática de antecipar atividades de qualidade para o início do ciclo, antes que os problemas se acumulem. Revisões de requisitos, inspeções de design e testes unitários automatizados não são despesas extras. São, na verdade, os investimentos com melhor retorno em um projeto de software.

A contrapartida positiva também é documentada. Ferramentas modernas de assistência ao desenvolvimento, como o GitHub Copilot, aumentam a confiança dos desenvolvedores na qualidade do código em até 85% e tornam revisões 15% mais rápidas, segundo pesquisa publicada pelo próprio GitHub. Isso significa que a adoção de boas práticas com suporte de tecnologia produz ganho real de velocidade, sem sacrificar estabilidade.

Os cinco atributos que definem código com qualidade real

Quando um desenvolvedor entrega código, a qualidade pode ser avaliada com base em cinco dimensões objetivas, consolidadas pela rubrica do GitHub:

Legibilidade é a primeira e mais imediata. Código legível usa nomes que descrevem o que fazem, sem depender de comentários para explicar a intenção. Se uma variável precisa de um comentário do lado para ser compreendida, o nome está errado. O princípio aqui é que código bem escrito conta uma história por si mesmo.

Reusabilidade diz respeito à capacidade de um componente ser aproveitado em outros contextos sem modificação ou com modificação mínima. Isso facilita a colaboração, reduz duplicação e encurta o caminho para novas features.

Concisão é a aplicação prática do princípio DRY (Don’t Repeat Yourself). Toda lógica duplicada é uma bomba de manutenção: se a regra mudar, ela precisará ser atualizada em todos os lugares onde foi copiada. Funções e módulos devem existir uma única vez e ser chamados de onde forem necessários.

Manutenibilidade é o critério que mais impacta o custo de longo prazo de um sistema. Código manutenível tem responsabilidades claras, poucas dependências externas e pode ser modificado em um ponto sem quebrar comportamentos em outro. No modelo ISO/IEC 25010, isso se desdobra em modularidade, analisabilidade, modificabilidade e testabilidade.

Resiliência é a capacidade do código de lidar com cenários inesperados: inputs inválidos, falhas de rede, serviços externos fora do ar. Código resiliente valida entradas no lado do servidor, trata erros de forma explícita e registra logs suficientes para que uma falha seja diagnosticada sem precisar reproduzir o ambiente original.

Esses cinco atributos formam a base de qualquer checklist de revisão de código (code review) eficaz. Se o PR não passa por todos eles, o time está aceitando dívida técnica conhecida.

Código limpo e revisão sistemática: a cultura que sustenta a qualidade

A maior parte do tempo de um desenvolvedor não é gasta escrevendo código novo. É gasta lendo código existente, numa proporção estimada de 10 para 1. Isso significa que clareza não é um capricho estético: é uma estratégia econômica. Código difícil de ler é código caro de manter.

O Princípio da Responsabilidade Única (SRP) é a regra mais prática aqui: funções e classes devem fazer uma coisa, e fazê-la bem. Quando uma função começa a acumular responsabilidades, ela se torna o tipo de código que ninguém quer mexer por medo de quebrar outra coisa.

A revisão sistemática de código é o mecanismo que mantém esses princípios vivos no dia a dia. A prática recomendada é que todo trecho de código seja revisado por pelo menos dois outros desenvolvedores antes de ser integrado ao branch principal. Isso padroniza formatação, corrige inconsistências de nomenclatura, incentiva a quebra de rotinas longas em métodos menores e funciona como um hub de aprendizado contínuo. Desenvolvedores menos experientes absorvem padrões e decisões de arquitetura ao revisar código de colegas seniores, sem necessidade de treinamento formal separado.

Um checklist de PR bem estruturado, com critérios de contrato de API, exemplos de uso, validação de formatos e logs para auditoria, já muda de forma gritante a qualidade das entregas integradas. Não precisa ser extenso: precisa ser objetivo.

QA vs. Quality Engineering: a diferença que muda o resultado do projeto

A maioria dos times que diz “ter QA” pratica, na verdade, uma versão reativa de qualidade: alguém testa o que foi construído depois que o código está pronto, antes do deploy. Esse modelo tem valor, mas é limitado porque não previne defeitos, apenas os detecta.

Quality Engineering (QE) é a abordagem que muda esse posicionamento. Em vez de agir no final do ciclo, o QE integra qualidade em todas as fases do desenvolvimento: na escrita dos requisitos, no design de arquitetura, na implementação e no deploy. O objetivo não é encontrar bugs depois, mas criar condições para que eles não apareçam.

Na prática, isso significa testes automatizados no nível certo para cada camada da aplicação. Testes unitários validam funções em isolamento com ferramentas como Jest. Testes funcionais de API verificam contratos com Rest Assured. Testes de ponta a ponta simulam a jornada real do usuário com Cypress. A pirâmide de testes funciona quando cada nível cobre o que o nível anterior não alcança, sem duplicação de esforço.

O CI/CD é a infraestrutura que torna isso operacional. Cada commit aciona automaticamente o build da aplicação seguido pela execução da suíte de testes. Se algo quebra, o pipeline para e a equipe é notificada antes que o problema chegue ao ambiente de produção. Isso não elimina bugs, mas drasticamente reduz o tempo entre a introdução de um defeito e sua detecção.

A separação de ambientes é o requisito básico para esse modelo funcionar com confiança. Desenvolvimento, homologação e produção precisam ser lógica e fisicamente distintos, alinhados ao que a ISO/IEC 27001 recomenda. Testar diretamente em produção, ou poluir o ambiente de entrega com dados de teste, compromete a confiabilidade dos dados e expõe o sistema a riscos desnecessários.

Quality Gates: como impedir que código ruim chegue à produção

Um quality gate é um conjunto de critérios que o código precisa atender antes de avançar no pipeline. Se os critérios não forem cumpridos, o pipeline falha e o código não avança. Simples assim.

Na prática, isso é implementado com ferramentas como o SonarQube integrado ao CI/CD. Os critérios típicos incluem cobertura mínima de testes (geralmente 80%), ausência de vulnerabilidades de segurança críticas, nível tolerável de duplicação de código e compliance com padrões de nomenclatura definidos pelo time.

O benefício é duplo. Do ponto de vista técnico, impede que código instável ou inseguro chegue à produção por esquecimento ou pressão de prazo. Do ponto de vista cultural, torna os critérios de qualidade explícitos e impessoais: o pipeline não aprova, não porque alguém “não gostou”, mas porque um critério objetivo não foi atendido.

Isso também resolve um problema comum em revisões de código: a tendência de aprovação por pressão social ou por exaustão. Quando o quality gate está configurado, o time pode focar a revisão humana no que importa, como decisões de design e cobertura de casos de borda, sem precisar verificar manualmente o que a automação já verifica.

DORA Metrics: como medir a velocidade e a estabilidade das entregas

Velocidade de entrega sem estabilidade não é qualidade, é risco. E estabilidade sem velocidade não é qualidade, é estagnação. As DORA Metrics, desenvolvidas pelo programa DevOps Research and Assessment do Google Cloud, oferecem o framework científico para medir os dois lados ao mesmo tempo.

São cinco métricas centrais:

Deployment Frequency mede com que frequência a equipe faz deploy em produção com sucesso. Times de elite entregam múltiplas vezes por dia sob demanda. Times iniciantes entregam mensalmente ou com menos frequência.

Lead Time for Changes mede o tempo entre o commit do desenvolvedor e o código em execução em produção. Times de elite completam esse ciclo em menos de uma hora.

Change Failure Rate mede a porcentagem de deploys que resultam em incidentes que precisam ser corrigidos. É o indicador mais direto de estabilidade.

Failed Deployment Recovery Time mede o tempo médio para restaurar o serviço quando um deploy malsucedido causa incidente. Aqui, o que importa não é apenas a frequência de falhas, mas a capacidade de resposta.

Deployment Rework Rate é a métrica mais recente, que avalia o volume de esforço consumido em reprocessar alterações que geraram falhas no processo produtivo.

Essas métricas devem ser acompanhadas em dashboards com janelas deslizantes de 30 a 90 dias para revelar tendências, não pontos isolados. E um aviso importante: DORA não é ferramenta de gestão de pessoas. Usá-las para avaliar desenvolvedores individualmente cria pressão que destrói a psicologia de segurança do time e piora as métricas no longo prazo. O foco deve ser a melhoria do processo, não a cobrança individual.

Segurança como critério de qualidade, não como camada opcional

Qualidade de software sem segurança é um conceito incompleto. A OWASP, referência global em segurança de aplicações, define um conjunto de práticas que devem estar presentes desde o design, não adicionadas ao final como camada separada.

Os critérios essenciais incluem validação de entrada no lado do servidor (nunca confiar em dados enviados pelo cliente), encoding de saída para cada sistema de destino como SQL e XML, gerenciamento centralizado de autenticação e sessões com hashes criptográficos fortes e salgados, e uso de TLS para todas as conexões que exijam autenticação.

No contexto de contratação de desenvolvimento, essa lista vira um instrumento de avaliação. Um fornecedor que não consegue responder como trata validação de entrada ou como gerencia sessões provavelmente não tem segurança integrada ao processo. Isso aparece como vulnerabilidade em produção, não como falha de funcionalidade, e costuma ser descoberto no pior momento possível.

Para sites e aplicações que processam dados de usuários brasileiros, a LGPD adiciona uma camada regulatória a esses critérios. Auditabilidade de dados, rastreabilidade de acessos e capacidade de exclusão de registros precisam estar previstos na arquitetura desde o início, não implementados como remendo depois de uma notificação.

Como isso se aplica a projetos web: Core Web Vitals como critérios de aceitação contratual

Para projetos web, a qualidade de desempenho tem parâmetros técnicos bem definidos pelo Google através dos Core Web Vitals. Esses parâmetros podem e devem ser inseridos em contrato como critérios de aceitação da entrega.

O LCP (Largest Contentful Paint) mede o tempo de carregamento do maior elemento visível na tela. O valor aceitável é abaixo de 2,5 segundos. O INP (Interaction to Next Paint) mede a latência de todas as interações do usuário com a página. O valor aceitável é abaixo de 200 milissegundos. O CLS (Cumulative Layout Shift) mede a estabilidade visual da página durante o carregamento. O valor aceitável é abaixo de 0,1.

Essas métricas devem ser atingidas no percentil 75 dos acessos reais para serem consideradas satisfatórias. Isso significa que não basta o site performar bem em condições ideais de laboratório: precisa performar bem para a grande maioria dos usuários reais, em dispositivos e conexões variados.

Incluir esses parâmetros no contrato transforma métricas abstratas em critérios verificáveis de entrega. E há ferramentas gratuitas para isso: o PageSpeed Insights mede os três indicadores de forma acessível, sem necessidade de infraestrutura adicional.

O papel dos dashboards de qualidade na tomada de decisão

Métricas de qualidade só têm valor se forem acompanhadas e usadas para tomar decisões. Um dashboard bem configurado reduz o tempo de identificação de gargalos de dias para horas e torna as decisões de refatoração objetivas, não intuitivas.

Os indicadores mais úteis para acompanhar de forma contínua são: taxa de sucesso de integrações, cobertura de testes por módulo, tempo médio entre commit e deploy, taxa de falha de deployments e tempo de recuperação após incidentes. Juntos, eles revelam onde o processo está saudável e onde está acumulando fragilidade silenciosa.

A cadência de revisão desses dados também importa. Uma reunião técnica mensal para revisar tendências das DORA Metrics, atualizar o guia de critérios de aceitação e documentar aprendizados de incidentes transforma qualidade em cultura, não em evento isolado. Times que fazem isso de forma consistente conseguem reduzir o tempo de tomada de decisões de arquitetura de dias para horas, com ganho real de confiança.

O que um desenvolvedor sênior entrega que um processo sem qualidade não consegue

É possível aprender todos esses conceitos e ainda assim aplicá-los de forma inconsistente se não houver experiência acumulada para reconhecer os padrões que antecipam problemas. Um desenvolvedor sênior não entrega apenas código: entrega decisões de design que evitam retrabalho futuro, identifica riscos de integração antes que se tornem bugs, e estrutura o código de forma que a próxima pessoa que trabalhar no projeto não precise decifrar intenções.

Essa capacidade de antecipar problemas é exatamente o que a norma ISO/IEC 25010 chama de manutenibilidade: modularidade, analisabilidade e modificabilidade. São atributos que se constroem ao longo de projetos reais, com erros cometidos e corrigidos, e não podem ser substituídos por ferramentas ou processos sem a experiência que os usa bem.

Se você quer entender como esse tipo de entrega se aplica ao seu contexto, os artigos como contratar um desenvolvedor sênior e como validar um desenvolvedor sênior freelancer detalham os critérios práticos para avaliar competência técnica real antes de contratar.

Para aprofundar: aula completa sobre ISO/IEC 25010

Se você quer entender o modelo de qualidade da ISO/IEC 25010 em profundidade, com a explicação de como os atributos de produto e de uso se relacionam e como os trade-offs são resolvidos na prática, a aula do professor Crescencio Lima é um recurso direto e bem estruturado: ISO 25010: Modelos e Atributos da Qualidade de Software. São cerca de 30 minutos que respondem perguntas que a maioria dos artigos apenas menciona.

Conclusão

Qualidade de software é um investimento com retorno mensurável. Retrabalho evitado, bugs que não chegam à produção, integrações que não quebram e sistemas que se mantêm estáveis ao longo do tempo têm valor financeiro real, mesmo quando não aparecem diretamente no ROI de um projeto.

O caminho começa com critérios objetivos de aceitação, passa por automação de testes e quality gates, e se sustenta com métricas acompanhadas de forma contínua. Não é um processo que se implementa de uma vez: é uma cultura que se constrói entrega a entrega.

Se você tem um projeto de software em andamento ou está planejando uma contratação, posso ajudar a estruturar isso com desenvolvimento de Apps ou como desenvolvedor freelancer com foco em qualidade, arquitetura e entrega sustentável. O primeiro passo é entender o que o seu contexto realmente precisa, sem vender mais do que o necessário.


Referências

DORA Metrics. Tebaldi, Pedro. “DORA Metrics: o que são, as 5 métricas e como implementar”. OpServices, março de 2026.

Quality Engineering vs. Quality Assurance. Nardon, Felipe. “Quality Engineering (QE) vs. Quality Assurance (QA): entendendo as diferenças no mundo do software”. Blog da Sofist, maio de 2026.

Quality Gates e SonarQube. SonarSource. “Integrating Quality Gates into Your CI/CD Pipeline: SonarQube Setup Guide”. Sonar Library, 2025.

Código Limpo. Lima, Laura Sousa; Araujo, Paulo Henrique Rodrigues (Orientador). “Adoção do Código Limpo: Estudo de Caso”. Instituto Federal Goiano, 2025.

Automação e Pipelines de Testes. Alexandre, Claudio Henrique Velozo; Santos, Davi Viana dos (Orientador). “Implementando Testes de Software em uma Aplicação Web”. UFMA, 2025.

ISO/IEC 25010. Silva, Allan Patrick; Lanna, João Gabriel; Pinto, Rafael Lucas Machado (Orientador). “Aplicação da ISO/IEC 25010 para Medição e Avaliação de Qualidade de Software”. UFOP, 2024.

OWASP Foundation. “Secure Coding Practices Quick Reference Guide”. Disponível em: https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/

GitHub Blog. “Research: Quantifying GitHub Copilot’s impact on code quality”. Disponível em: https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-code-quality/

web.dev. “Web Vitals”. Google. Disponível em: https://web.dev/articles/vitals

Lima, Crescencio. “ISO 25010: Modelos e Atributos da Qualidade de Software | Aula 5”. YouTube. Disponível em: https://youtu.be/BlN8D7ZvpW8?si=hrTVgf0YHQ869FQZ

Leia também

Artigos Relacionados