# Qualidade de software

O termo Qualidade possui diferentes definições na literatura. O glossário do IEEE define qualidade como “Grau de conformidade de um sistema, componente ou processo com os respectivos requisitos”, ou, alternativamente, como “Grau de conformidade de um sistema, componente ou processo com as necessidades e expectativas de clientes ou usuários”.
Ambas as definições refletem aspectos importantes da qualidade; diversos autores apresentam outras definições, que geralmente giram em torno dos temas de conformidade com os requisitos e atendimento das expectativas. Naturalmente, pode haver diferenças entre as aplicações dessas definições se os requisitos explícitos não refletirem corretamente as necessidades reais. Como salienta, a qualidade é definida por uma coleção de atributos; funcionalidade, confiabilidade, satisfação do usuário e desempenho são aspectos importantes, mas parciais.
A norma NBR ISO 9000:2005 define qualidade como sendo o grau no qual um conjunto de características inerentes satisfaz aos requisitos. Ou seja, pode-se afirmar que se algum produto ou serviço atende aos requisitos especificados, este mesmo produto ou serviço possui a qualidade desejada.
Outra visão diferente é no contexto de desenvolvimento de software: qualidade pode ser entendida como um conjunto de características a serem satisfeitas em um determinado grau, de modo que o produto de software atenda às necessidades explícitas e implícitas de seus usuários .

## História

O rumo que a Qualidade de Software tomou na história se iniciou a partir da reunião da OTAN em 1968 onde o termo “Engenharia de Software” foi utilizado pela primeira vez por F. L. Bauer.
Naquela reunião foi a primeira vez que o termo “Crise do Software” foi utilizado para dizer sobre os maus tempos que a indústria de software
E a crise foi atribuída à complexidade de desenvolver sistemas cada vez maiores, bem como à falta de gerenciamento no processo de desenvolvimento de software.
A partir daí “engenheiros de software” passaram a imitar a engenharia convencional para resolver problemas de qualidade e falhas em sistemas de informação. O modelo inicial adotado pela engenharia de software foi orientado fortemente à melhoria do produto final de software.
No início da década de 1990, o próprio mercado substituía o Controle pela Garantia da Qualidade com um foco centrado no processo e que utilizava auditorias durante todo o ciclo de vida de desenvolvimento.
A partir daí, foram surgindo normas aplicadas para a área tais como a ISO 9000-3, ISO 15504, ISO 12207, padrões IEEE 1074, IEEE 1298 e Modelos SW-CMM, CMMI e MPS.BR para Qualidade de Software.

## Principais tópicos

Para um melhor entendimento e estudo, o SWEBOK 3.0 divide a qualidade de software em quatro tópicos, sendo os três primeiros tópicos subdivididos em atividades, da seguinte forma:
* Fundamentos de qualidade de software
** Cultura e ética de engenharia de software
** Valores e custos de qualidade
** Modelos e características de qualidade
** Melhoria da qualidade de software
** Segurança de Software (Software Safety)
* Processos de gerência de qualidade de software
** Garantia de qualidade de software
** Verificação e validação
** Revisões e auditorias
* Considerações práticas
** Requisitos de qualidade de software
** Caracterização de defeitos
** Técnicas de gerência de qualidade de software
** Medidas de qualidade de software
* Ferramentas de Qualidade de Software
Ainda segundo o SWEBOK, a qualidade de software é um tema tão importante que é encontrado, de forma ubíqua, em todas as outras áreas de conhecimento envolvidas em um projeto.
É importante notar que o SWEBOK deixa claro que essa área, como nele definida, trata dos aspectos estáticos, ou seja, daqueles que não exigem a execução do software para avaliá-lo, em contraposição à área de conhecimento teste de software, que trata de aspectos dinâmicos.
Muitos autores, porém, consideram testes de software como parte da qualidade de software.

## Questões de Qualidade e Qualidade de Software

Ao longo do tempo a teoria de qualidade de software foi evoluindo, resultando inclusive na criação dos padrões ISO/IEC 9126 e ISO/IEC 25000. Uma importante contribuição foi a divisão do conceito de qualidade em subconceitos, no caso de software, inicialmente proposto por McCall, Richards e Walters.
Uma questão importante é que qualidade é uma relação entre um objeto e um observador. Isso pode ser percebido na primeira definição de Juran que cita o atendimento as necessidades do cliente. Como um software pode ter muitos clientes (ou partes interessadas), fica claro que o que é qualidade para um não necessariamente é qualidade para outro.
Já Garvin apresenta cinco formas de entender qualidade:
* A definição transcedental: onde qualidade é uma "excelência inata, absoluta e que todos podem reconhecer", sendo semelhante ao conceito de "Qualidade sem um nome" proposta por Christopher Alexander.
* A definição baseada em produto: onde qualidade é algo que pode ser medido em um objeto.
* A definição baseada no usuário: onde qualidade é algo ligado ao atendimento das necessidades do usuário.
* A definição baseada na fabricação: onde qualidade está ligado a produção correta de acordo com os requisitos
* A definição baseada em valor: onde "um produto de qualidade é aquele que fornece desempenho a um preço aceitável ou conformidade a um custo aceitável"
A principal característica dos estudos de qualidade é a definição de qualidade de forma hierárquica, sendo que o conceito mais geral de qualidade é subdividido, sucessivamente, em características e subcaracterísticas (ou ainda fatores, atributos ou critérios de qualidade). Assim, características mais gerais, como reusabilidade, correção, eficiência e outras podem ser sucessivamente detalhadas até que se alcance uma característica que pode ser medida no software propriamente dito. Por exemplo, a Eficiência de Desempenho do software é uma característica muito genérica, que é subdividada no modelo ISO 25000 em Comportamento de Tempo, Utilização de Recursos e Capacidade. Mesmo essas características precisam ser subdividadas em critérios mensuráveis (como tempo para executar uma função).
A melhoria da qualidade de software é uma forte vertente da qualidade, sendo seu desenvolvimento basicamente realizados em ciclos inspirados no modelo PDCA, como, por exemplo, o CMMI-IDEAL.
Uma polêmica importante está relacionado ao tópico "Good Enough Software", ou Software Bom o Suficiente, que defende que há um momento em que o software pode ser lançado mesmo tendo problemas, porque os benefícios de lançar o produto são muito maiores que os riscos causados pelos problemas conhecidos.

## Fundamentos de Qualidade de Software

Fundamentos de Qualidade de Software é o primeiro dos 4 tópicos de Qualidade de Software do SWEBOK. Nele são tratados a "discussão e a definição dos aspectos da Qualidade de Software, seus conceitos, características, valores e sua aplicação no software sendo desenvolvido ou em manutenção."

### Custo da Qualidade

Uma forte motivação para o foco em qualidade é que o custo relativo de corrigir erros aumenta drasticamente com a evolução do Ciclo de Vida do Software. Segundo Boehm, citado por Pressman, há corrigir um erro ou defeito na fase de manutenção do software custa 100 vezes mais que corrigi-lo na fase de requisitos.
Pressman indica os seguintes custos relacionados a qualidade de software, podendo eles ocorrerem tanto na prevenção quanto no tratamento dos problemas:
* Custos de Prevenção
** Planejamento da qualidade
** Revisões técnicas formais
** Testes
** Treinamento
* Custos de Falha Interna
** Retrabalho
** Reparo
** Modo de análise de falha
* Custo de Falha Externa
** Resolução das reclamações
** Devolução e substituição
** Suporte
** Atendimento à garantia
Uma lista semelhante pode ser encontrada no SWEBOK.

### Modelos e Características de Qualidade de Software

* Modelos de Processo de Software
** CMMI
** MPS.BR
* Padrões Internacionais de Processo de Software
** ISO 12207
* Padrões Internacionais de Qualidade de Software
** ISO 9126
** ISO 15504
** ISO/IEC 25010 (SQuaRe)
* Padrões de certificação de Qualidade de Software
** SCAMPI para o CMMI
** Fórum de credenciamento e controle -FCC para o MPS.br

#### Norma SQuaRE - ISO/IEC 25000

A Série ISO/IEC 25000, denominada Software product Quality Requirements and Evaluation (SQuaRE), é a mais moderna norma de qualidade de software, sendo organizada da seguinte forma:
* 2500n: Divisão da gestão da qualidade
* 2501n: Divisão de modelo de qualidade
* 2502n: Divisão de medição de qualidade
* 2503n: Divisão de requisitos de qualidade
* 2504n: Divisão de avaliação de qualidadeQualidade em Uso segundo a série ISO/IEC 25000
Ela define 3 perspectivas de qualidade (ou modelos):
* Qualidade Externa, uma visão de caixa preta do software
* Qualidade Interna, uma visão de caixa branca do software
* Qualidade em Uso, uma visão operacional do software
As figuras ao lado listam os atributos de qualidade de sistemas e software segunda as normas ISO/IEC 25000.

## Processos de Gerência de Qualidade de Software

"Um Sistema de Gestão da Qualidade compreende atividades pelas quais uma organização identifica seus objetivos e determina os processos e recursos necessários para alcançar os resultados desejados." Seus princípios são: foco no cliente, liderança, engajamento das pessoas, abordagem de processo, melhoria contínua, tomada de decisão baseada em evidência e gestão dos relacionamentos com as partes interessadas.
Existem quatro subcategorias de Gerência de Qualidade de Software:
* Planejamento da Qualidade de Software
* Garantia da Qualidade de Software
* Controle da Qualidade de Software
* Melhoria da Qualidade de Software.
Um processo de gestão de qualidade "Assegura que produtos, serviços e implementações do ciclo de vida de processo atinja os objetivos de qualidade organizacionais e a satisfação do usuário", tendo as seguintes atividades:
* Gerência da qualidade
* Estabelecer padrões, políticas e procedimentos de gestão de qualidade da organização
* Estabelecer objetivos e metas de gestão e de qualidade da organização baseado na estratégia de negócio para a satisfação do cliente
* Definir autoridade e responsabilidade para a gerência de qualidade
* Monitorar a satisfação do usuário
* Conduzir revisão periódica do planos de qualidade de projeto
* Monitorar a melhoria de qualidade em produtos e serviços
* Ação corretiva de gestão de qualidade
* Tomar ações corretivas adequadas quando os objetivos de gestão de qualidade não são atingidos
* Implementar ações corretivas e comunicar os resultados para a organização
As técnicas utilizadas para a gestão de qualidade podem ser estáticas, como a análise estática do software, inspeções, revisões e o uso de métodos formais, ou dinâmicas, como o uso de testes ou simulações.

### Verificação e Validação

A validação e verificação são atividades de apoio de um processo de garantia de qualidade de software. A motivação principal dessas atividades é prevenir e detectar os defeitos e minimizar os riscos do projeto. As atividades de validação e verificação são baseadas em técnicas de análise estática ou dinâmica dos artefatos (documentos, código fonte, código executável, etc) com o intuito de detectar os defeitos ou revelar falhas na própria fase onde eles foram inseridos ou em fases posteriores.
As atividades de validação e verificação são baseadas em técnicas de análise estática ou dinâmica dos artefatos (documentos, código fonte, código executável, etc) com o intuito de detectar os defeitos ou revelar falhas na própria fase onde eles foram inseridos ou em fases posteriores.
Dentro do contexto de qualidade de software esses termos, conhecidos como V&V, referem-se a métodos para avaliar produtos e processos. Em especial, verificação se refere a ver se o software foi desenvolvido de acordo com as suas especificações, ou seja, que construímos o software de maneira correta, enquanto validação se refere a garantir que o software atende a seus propósitos, isto é, que construímos o software certo.

## Considerações Práticas da Qualidade de Software
### Medidas de Qualidade

A norma ISO/EIC 25020:2009 propõe um modelo de referência para a medição de qualidade de produto de software, decompondo-o em características de qualidade e estas, em sub-características de qualidade, as quais podem ser avaliadas por medidas de qualidade de software; as medidas de qualidade são geradas por funções de medição, que derivam de elementos da medida de qualidade.

### Boas Práticas

Para uma boa qualidade de software existe algumas boas práticas que todos que participam do desenvolvimento devem cumprir.
Existem ferramentas e padrões de boas práticas para auxiliar o desenvolvimento do software e permitir a melhoria da qualidade entre elas estão:
* PSP: Personal Software Process
* TSP Team Software Process
* ITIL
* COBIT

## Ferramentas de Qualidade de Software

Para auxiliar a garantir a qualidade de software existem várias ferramentas, que podem atuar em análises estáticas ou dinâmicas do software.
Entre a grande variedade de ferramentas existentes, é possível caracterizar alguma categorias de análise estática:
* Ferramentas de apoio a revisões e inspeções
* Ferramentas de apoio a análise de riscos de segurança
* Ferramentas de rastreamento de problemas
* Ferramentas de análise de dados capturados em ambientes de Engenharia de Software.

## Qualidade de Software no Brasil

No Brasil existe o Programa Brasileiro da Qualidade e Produtividade em Software, PBQP-Software, cuja principal contribuição é o programa de Melhoria do Processo de Software Brasileiro, MPS.Br. Além disso a ABNT nacionaliza as normas internacionais.