Engenharia de software - Apostila
Julio Cesar | comentários
Arquivado no curso de Ciência da Computação na UNISANTA
última actualização em: 5-nov-96
Dos Princípios da Engenharia de Software e do seu Impacto na Qualidade: Conceitos, Técnicas e Recomendações para a Codificação
Gonçalo Pereira INESC
Este documento propõe um enquadramento de referência, sob a forma de um conjunto de princípios, que permite justificar a adopção de certas técnicas e ferramentas. Esse conjunto resulta de uma reflexão sobre boas práticas de Engenharia de Software. A forma como esses princípios contribuem para a Qualidade do software é descrita.
Baseado no enquadramento referido é apresentado um conjunto de recomendações para a codificação que permitem definir estratégias de reificação dos princípios. A abordagem é, tanto quanto possível, independente de linguagens de programação, ambientes de desenvolvimento ou de plataformas computacionais.
1. Introdução2 1.1 Princípios de Engenharia de Software2 1.2 Caracterização da Qualidade do Software3 2. Princípio da Modularização5 2.1 Introdução5 2.2 Influência na Qualidade do Software5 2.3 Heurísticas e Recomendações5 2.4 Automatização do processo de construção de versões executáveis6 3. Princípio da Abstracção8 3.1 Introdução8 3.2 Influência na Qualidade do Software9 3.3 Heurísticas e Recomendações9 4. Princípio da Ocultação11 4.1 Introdução11 4.2 Influência na Qualidade do Software11 4.3 Heurísticas e Recomendações11 5. Princípio da Coesão12 5.1 Introdução12 5.2 Influência na Qualidade do Software13 5.3 Heurísticas e Recomendações13 6. Princípio da Independência14 6.1 Introdução14 6.2 Influência na Qualidade do Software15 6.3 Heurísticas e Recomendações15 7. Princípio da Uniformização16 7.1 Introdução16 7.2 Influência na Qualidade do Software16 7.3 Heurísticas e Recomendações17 8. Princípio da Reutilização22 8.1 Introdução22 8.2 Influência na Qualidade do Software22 8.3 Heurísticas e Recomendações22 9. Princípio da Rastreabilidade25 9.1 Introdução25 9.2 Influência na Qualidade do Software26 9.3 Heurísticas e Recomendações26
Glossário 27 Bibliografia 28
Funcionalidade Fiabilidade Facilidade de utilização Eficiência Facilidade demanutenção
Modularização Abstracção Ocultação Coesão
IndependênciaUniformização Reutilização Rastreabilidade
A Engenharia de Software é a ciência que condensa o conhecimento adquirido sobre as práticas cuja adopção conduz à produção (e evolução) de sistemas de software de acordo com requisitos especificados, sem falhas e dentro do calendário e orçamento previsto. Esse conhecimento, relativo às soluções apropriadas para os problemas mais comuns que essa produção e manutenção envolve, é em geral apresentado de uma forma dispersa ou estanque e quase sempre guiada por técnicas ou ferramentas (de análise, desenho, codificação, teste, gestão de configurações, etc). Julgamos por isso haver um déficit ao nível da razão de ser da adopção dessas técnicas ou ferramentas, ou seja, no tocante à formalização filosófica do conhecimento de que trata a Engenharia de Software.
Propõe-se em seguida um conjunto de princípios que, no entender dos autores, enquadra esse conhecimento e fornece uma estrutura conceptual propícia à racionalização sobre a adopção de técnicas e ferramentas. Esses princípios são:
• Princípio da Modularização - divida-se para conquistar; • Princípio da Abstracção - adicione-se detalhe incrementalmente;
• Princípio da Ocultação - esconda-se o que não é necessário perceber;
• Princípio da Coesão - concentre-se o que respeita ao mesmo problema parcelar;
• Princípio da Independência - minimize-se as ligações entre os componentes;
• Princípio da Uniformização - convencione-se e use-se a mesma simbologia;
• Princípio da Reutilização - incorpore-se componentes já existentes e provados;
• Princípio da Rastreabilidade - conheça-se as transformações e as dependências.
Na próxima secção será revisto um modelo que define a Qualidade do software através da explicitação de um conjunto de características. Cada uma das secções que se lhe seguem abordará um dos princípios em particular e discutirá a sua influência nessas características da qualidade do software. Se bem que com problemas essenciais e específicos [Brooks87], a Engenharia de Software tem muito em comum com outros ramos da Engenharia. Para ilustrar tais semelhanças, sempre que possível e apropriado, será efectuado um paralelo com a reificação do mesmo princípio em outro(s) ramo(s) da Engenharia. Ainda para cada princípio serão propostas heurísticas e recomendações práticas.
A Engenharia de Software tem em comum com as outras engenharias, entre outras coisas, o desiderato da concepção de produtos de qualidade. A identificação dos atributos caracterizadores da qualidade do software e a sua importância relativa tem várias nuances consoante o domínio de aplicação, o ponto de vista do observador e mesmo o horizonte temporal. Com efeito em software de tempo real a eficiência é uma preocupação dominante. Se os sistemas forem críticos (por exemplo se envolverem risco de vida) então tem de ser dada grande relevância à fiabilidade. Para os utilizadores de sistemas interactivos a funcionalidade e a facilidade de utilização são geralmente os factores dominantes, enquanto do ponto de vista estrito das equipas de desenvolvimento o que é mais relevante é a facilidade de manutenção. A médio e longo prazo, porém, a portabilidade pode ser decisiva. Para um gestor de projectos de desenvolvimento de software, que tem de avaliar as melhorias de qualidade em conjunto com outros factores tais como prazos e orçamentos, interessa combinar (e pesar) as diversas características.
Não admira portanto que vários autores [Meyer88, Pressman92, Quintin93, Sommerville92, Stalhane92] apresentem interpretações não completamente coincidentes sobre quais as características fundamentais da qualidade
Pág. 3 dos produtos de software. Resolvemos assim adoptar um enquadramento resultante de um grande esforço de consenso a nível internacional, consubstanciado na norma ISO/IEC 9126. Esta norma propõe um conjunto de características que foram escolhidas com a preocupação de serem tão independentes entre si quanto o possível, isto é, sem sobreposição. Essas características são, por sua vez, desdobradas em atributos tal como representado na figura seguinte.
Atributos Adequação Exactidão
Concordância Segurança Maturidade
Tolerância a falhas Facil. Recuperação Facil. Compreensão Facil.Aprendizagem Facil. de Operação Comp. face ao tempo Comp. face recursos Facilidade Análise Facilid. Alteração Estabilidade Facilidade de Teste Facilid. Adaptação Facilidade Instalação
Conformidade Facilid. Substituição
Funcionalidade Fiabilidade Facilidade Utilização Eficiência Facilidade Manutenção Portabilidade
Figura 1 - Qualidade dos produtos de software segundo a norma ISO/IEC 9126
Segue-se uma descrição sucinta de cada uma das características e correspondentes atributos. O termo programa será utilizado com o sentido de unidade executável.
Funcionalidade (functionality) - Conjunto de atributos que dependem da existência de funcionalidades e respectivas propriedades que tornam um produto capaz de satisfazer os requisitos explícitos ou implícitos1 dos utilizadores. Esses atributos são:
• adequação (suitability) - atributo que traduz a presença de um conjunto de funcionalidades apropriadas para desempenhar determinadas tarefas; • exactidão ou rigor (accuracy) - atributo que se refere à obtenção de resultados ou efeitos julgados correctos;
• interoperabilidade (interoperability) - atributo que se refere à possibilidade de o produto interagir com outros sistemas especificados; • concordância (compliance) - atributo que se refere à aderência do produto a normas, convenções ou regulamentos internacionais; • segurança (security) - atributo que se refere à capacidade de impedir o acesso não autorizado, acidental ou deliberado, a programas e dados.
Fiabilidade (reliability) - Conjunto de atributos que expressam a capacidade de um produto manter o seu nível de desempenho em condições de funcionamento especificadas por um período de tempo determinado. Esses atributos são:
1 - os autores não subscrevem a definição contendo este segundo tipo de requisitos dada a sua natureza inteiramente subjectiva.
• maturidade (maturity) - atributo que se refere à frequência com que ocorrem falhas do produto devidas a erros embutidos no software; • tolerância a falhas (fault tolerance) - atributo que traduz a capacidade de manutenção de um nível de desempenho especificado aquando da ocorrência de falhas do software; • facilidade de recuperação ou recuperabilidade (recoverability) - atributo que traduz a capacidade (em termos de tempo e esforço) de reposição do nível de desempenho e a recuperação dos dados directamente afectados por falhas no software.
Facilidade de utilização (usability) - Conjunto de atributos que se relacionam com o esforço necessário para utilizar um produto e com a avaliação individual de tal utilização feita por um determinado conjunto de utilizadores. Esses atributos são:
• facilidade de compreensão (understandability) - atributo que traduz o esforço dos utilizadores para reconhecerem os conceitos lógicos subjacentes ao produto e à sua aplicabilidade; • facilidade de aprendizagem (learnability) - atributo que traduz o esforço necessário para aprender a utilizar as potencialidades oferecidas pelo produto; • facilidade de operação (operability) - atributo que traduz o esforço necessário para operar com o produto, isto é para com ele obter resultados.
Eficiência (efficiency) - Conjunto de atributos que dependem da relação entre o nível de desempenho do produto e a quantidade de recursos utilizados, em condições especificadas. Os atributos considerados são:
• comportamento face ao tempo (time behavior) - atributo que traduz os tempos de resposta e de processamento e o volume de dados processado por unidade de tempo; • comportamento face aos recursos (resource behavior) - atributo que depende da quantidade e duração dos recursos (memória, tempo de processador, canais de entrada/saída, etc) utilizados para desempenhar determinadas funções.
Facilidade de manutenção (maintainability) - Conjunto de atributos que dependem do esforço necessário para efectuar modificações especificadas. Esses atributos são: