Engenharia de Software I Prof. André Castro Garcia
1. Introdução 1.1 A IMPORTÂNCIA DO SOFTWARE Nas primeiras décadas da era do computador, o principal desafio era desenvolver um hardware que reduzisse o custo de processamento e armazenagem de dados. No entanto, a partir da década de 90, o desafio passou a ser o desenvolvimento de soluções baseadas em computador. Soluções que são implementadas com software. O hardware tinha então um potencial muito grande e necessitava de um mecanismo que possibilitasse dar vazão a esse potencial, o software.
1.1.1 O papel evolutivo do software O contexto em que o software foi desenvolvido está ligado a quase cinco décadas de evolução dos sistemas computadorizados. O melhor desempenho do hardware, menor tamanho e custo mais baixo precipitaram o aparecimento de sistemas baseados em computadores mais sofisticados. Quando se iniciava a década de 1990, Tofler descreveu uma mudança de poder, em que as velhas estruturas de poder se desintegrarão enquanto os computadores e o software levarão a uma democratização do conhecimento.
Evolução do software: Os primeiros anos (1950 1960) Orientação Batch Distribuição limitada Software customizado A segunda era (1960 1970) Multiusuário Tempo real Banco de dados Produto de software A terceira era (1970 1990) Sistemas distribuídos Inteligência embutida Hardware de baixo custo Impacto de consumo A quarta era (1990?) Sistemas de desktops poderosos Tecnologias orientadas a objeto Sistemas especialistas Redes neurais artificiais Computação paralela
Os primeiros anos 1950-1960 O produto software estava em sua infância. A maior parte do software era desenvolvida e, em última análise, usada pela própria pessoa ou organização. Você escrevia-o, colocava-o em funcionamento e, se ele falhasse, era você quem o consertava. Uma vez que a rotatividade de empreso era baixa, os gerentes podiam dormir tranquilos com a certeza de que você estaria lá se defeitos fossem encontrados. Durante os primeiros anos, aprendemos muito sobre a implementação de sistemas baseados em computador, mas relativamente pouco sobre engenharia de sistemas de computador.
A segunda era 1960-1970 A multiprogramação e os sistemas multiusuários introduziram novos conceitos de interação homem-máquina. Sistemas em tempo real podiam coletar, analisar e transformar dados de múltiplas fontes. Os avanços de armazenagem on-line levaram à primeira geração de sistemas de gerenciamento de banco de dados. A segunda era também foi caracterizada pelo uso do produto de software e pelo advento das software houses. Empresários da indústria, governos e universidades puseram-se a desenvolver pacotes de software e a ganhar muito dinheiro. Todos esses programas tinham de ser corrigidos quando eram detectadas falhas, ou quando tinha alteração, ou quando tinha que se adaptar ao novo hardware. Essas atividades foram chamadas de manutenção de software. E ainda pior, a natureza personalizada de muitos programas tornava-os virtualmente impossíveis de sofrer manutenção.
A terceira era 1970-1990 Os sistemas distribuídos, múltiplos computadores, cada um executando funções concorrentemente e comunicando-se um com o outro, aumentaram intensamente a complexidade dos sistemas baseados em computador. As redes globais e locais, as comunicações digitais de largura de banda elevada e a crescente demanda de acesso instantâneo a dados exigem muito dos desenvolvedores de software. A terceira era foi também caracterizada pelo advento e generalizado uso de microprocessadores, computadores pessoais e poderosas estações de trabalho de mesa. O computador pessoal foi o catalisador do crescimento de muitas empresas de software.
A quarta era 1990-? As tecnologias orientadas a objetos estão rapidamente ocupando o lugar das abordagens mais convencionais para o desenvolvimento de software em muitas áreas de aplicação. As técnicas de quarta geração para o desenvolvimento de software já estão mudando a maneira segundo a qual alguns segmentos da comunidade de software constroem programas de computador. O software de inteligência artificial finalmente saiu do laboratório para a aplicação prática em problemas de amplo espectro do mundo real.
1.2 Software Software é: (1) instruções (programas de computador) que, quando executadas, produzem a função e o desempenho desejados; (2) estruturas de dados que possibilitam que os programas manipulem adequadamente a informação; e (3) documentos que descrevem a operação e o uso dos programas.
1.2.1 Características do Software O software é um elemento lógico, e não físico. Portanto, o software tem características que são consideravelmente diferentes das do hardware: 1. O software é desenvolvido ou projetado por engenharia, não manufaturado no sentido clássico. Os custos do software estão concentrados no trabalho de engenharia. Isso significa que os projetos de software não podem ser geridos como se fossem projetos de manufatura.
2. O software não se desgasta. O software não é sensível aos problemas ambientais que fazem com que o hardware se desgaste. Defeitos não descobertos provocarão elevados índices de falha logo no começo da vida de um programa. Quando se desgasta, um componente de hardware é substituído por uma peça de reposição. Não existem peças de reposição para o software. Portanto a manutenção de software envolve consideravelmente mais complexidade do que a manutenção de hardware. 3. A maioria dos softwares é feita sob medida em vez de ser montada a partir de componentes existentes. É possível encomendar software não destinado à publicação, mas somente com uma unidade completa, não como componentes que possam ser montados novamente em novos programas.
1.2.2 Componentes do Software O software de computador é uma informação que existe em duas formas básicas: componentes não executáveis em máquinas e componentes executáveis em máquina. A reusabilidade é uma característica importante de um componente de software de alta qualidade. Ou seja, o componente deve ser projetado e implementado de forma que possa ser reusado em muitos programas diferentes. Os componentes de software são construídos usando uma linguagem de programação que tem um vocabulário limitado, uma gramática explicitamente definida e regras de sintaxe e semântica bem formadas. Esses atributos são essenciais para a tradução por máquina. As formas de linguagem em uso são linguagens de alto nível e linguagens não procedimentais.
Linguagem de máquina é uma representação simbólica do conjunto de instruções da unidade central de processamento (CPU). As linguagens de alto nível permitem que o desenvolvedor do software e o programa sejam independentes da máquina. Quando é usado um tradutor mais sofisticado, o vocabulário, a gramática, a sintaxe e a semântica de uma linguagem de alto nível podem ser muito mais sofisticados do que as linguagens de nível de máquina. As linguagens de máquina, as linguagens montadoras (assembly) e as linguagens de programação de alto nível frequentemente são citadas como as três primeiras gerações das linguagens de computador. As linguagens de quarta geração, ou não procedimentais, em vez de exigir que o desenvolvedor de software especifique detalhes de procedimento ela subentende um programa especificando o resultado desejado ao invés de especificar a ação exigida para se conseguir esse resultado.
1.2.3 Aplicações do Software O software pode ser aplicado a qualquer situação em que um conjunto previamente especificado de passos procedimentais tiver sido definido. O conteúdo de informação e a determinância são fatores importantes na determinação da natureza de um aplicativo. A palavra conteúdo refere-se ao significado e a forma das informações que entram e saem. Determinância de informação refere-se à previsibilidade da ordem e da oportunidade da informação. As seguintes áreas de software indicam a amplitude das aplicações potenciais:
Software Básico: é uma coleção de programas escritos para dar apoio a outros programas. Software de Tempo Real: um software que monitora / analisa / controla eventos do mundo real. Software Comercial: o processamento de informações comerciais é a maior área particular de aplicação de software. Software Científico e de Engenharia: tem sido caracterizado por algoritmos de processamento de números. Software Embutido: reside na memória só de leitura e é usado para controlar produtos e sistemas para os mercador industriais e de consumo. Software de Computador Pessoal: processamentos de textos, planilhas eletrônicas, computação gráfica, diversões, gerenciamento de dados, aplicações financeiras são apenas algumas das centenas de aplicações. Software de Inteligência Artificial: faz uso de algoritmos nãonuméricos para resolver problemas complexos que não sejam favoráveis à computação ou à análise direta.
1.3 Software: uma crise no horizonte Muitos observadores da indústria de software caracterizavam os problemas associados ao desenvolvimento do software como uma crise. Contudo, o que temos realmente pode ser algo bem diferente. Os problemas não se limitam ao software que não funciona adequadamente. Ao contrário, a aflição abrange problemas associados a como desenvolvemos o software, como mantemos um volume crescente de software existente e como podemos esperar acompanhar a crescente demanda por mais software.
1.3.1 Problemas Os problemas que afligem o desenvolvimento de software podem ser caracterizados a partir de uma série de perspectivas diferentes: (1) as estimativas de prazo e de custo frequentemente são imprecisas; (2) a produtividade das pessoas da área de software não tem acompanhado a demanda por seus serviços; e (3) a qualidade de software às vezes é menos adequada. Esses problemas são a manifestação mais visível de outras dificuldades do software: Não dedicamos tempo para coletar dados sobre o processo de desenvolvimento de software. A insatisfação do cliente com o sistema concluído ocorre muito frequentemente.
A qualidade do software frequentemente é suspeita. Só recentemente começamos a entender a importância dos testes de software sistemáticos e tecnicamente completos. O software existente pode ser muito difícil de se manter. A capacidade de manutenção de software não foi enfatizada como um critério importante para a aceitação do software. Uma abordagem de engenharia ao desenvolvimento de software, aliada a uma contínua melhoria de técnicas e ferramentas, oferece a chave para a solução dos problemas citados acima.
1.3.2 Causas Os problemas associados à crise de software foram causados pelo próprio caráter do software e pelas falhas das pessoas que detinham a responsabilidade pelo desenvolvimento do software. A natureza lógica do software constitui um desafio para as pessoas que o desenvolvem. Pela primeira vez aceitamos a tarefa de nos comunicar com uma inteligência alienígena a máquina. Os profissionais da área de software têm recebido pouco treinamento formal em novas técnicas para desenvolvimento de software. Algumas pessoas desenvolvem uma abordagem ordeira e eficiente ao desenvolvimento de software por meios de ensaio e erro, mas muitas outras desenvolvem maus hábitos que resultam em qualidade e manutenibilidade deficientes.