Introdução
Porque Engenharia de Software?
- Ricardo de Almeida Falbo - UFES
- Criar software é, muitas vezes, confundido com programação. Essa confusão se dá principalmente pela iniciação: começa com
o desenvolvimento de habilidades de raciocínio lógico, através de MTP, por exemṕlo, e estruturas de dados
- Nada há de errado nessa estratégia. A idéia é essa mesmo, resolver pequenos problemas que gradativamente vão aumentando de complexidade, exigindo maiores conhecimentos e habilidades
- Com a experiência, normalmente chega-se a um ponto onde, dado o tamanho ou a complexidade do problema, essa abordagem individual, centrada na programação não é mais indicada
- Só é aplicável para resolver pequenos problemas, tais como calcular médias, ordenar conjuntos de dados etc, envolvendo basicamente o projeto de um único algoritmo
- Contudo, é insuficiente para problemas grandes e complexos, tais como:
- Automação bancária
- Informatização de indústrias
- Gestão hospitalar
- Sistemas empresariais, etc.
- Sistemas financeiro
- Universidades
- Bolsa de Valores
- Jurídico
- Comércio Eletrônico
- Pregão Eletrônico
- ??
- Em tais situações, uma abordagem de engenharia é necessária.
- Observando outras áreas, tal como a Engenharia Civil, podemos verificar que situações análogas ocorrem
- Exemplo:
- Para se construir uma casinha de cachorro, não é necessário elaborar um projeto de engenharia civil, com plantas baixa, hidráulica e elétrica, ou mesmo cálculos estruturais. Um bom pedreiro é capaz de resolver o problema a contento
- Talvez não seja dada a melhor solução, mas o produto resultante pode atender aos requisitos pré-estabelecidos
- Essa abordagem, contudo, não é viável para a construção de um edifício.
- Nesse caso, é necessário realizar um estudo aprofundado, incluindo:
- Análises de solo
- Cálculos estruturais
- Análise de sustentabilidade
- Novas tecnologias, etc
- seguido de um planejamento da execução da obra e desenvolvimento de modelos (maquetes e plantas de diversas naturezas), até a realização da obra, que deve ocorrer por etapas, tais como:
- fundação
- alvenaria
- fiação
- hidráulica
- acabamento, etc.
- Ao longo da realização do trabalho, deve-se realizar um acompanhamento para verificar:
- prazos
- custos
- qualidade.
- legalidade
- aquisições
- riscos
- sustentabilidade
- Visando melhorar a qualidade dos produtos de software e aumentar a produtividade no processo de desenvolvimento, surgiu a Engenharia de Software
- Trata de aspectos relacionados ao estabelecimento de:
- processos
- métodos
- técnicas
- ferramentas
- possibilidade de melhorias
- ambientes de suporte ao desenvolvimento de software.
- Assim como em outras áreas, em uma abordagem de engenharia de software, inicialmente o problema a ser tratado deve ser analisado e decomposto em partes menores => abordagem “dividir para conquistar”
- Para cada uma dessas partes, uma solução deve ser elaborada. Solucionados os sub-problemas isoladamente, é necessário integrar as soluções
- Para tal, uma arquitetura deve ser estabelecida
O impacto do software
- Mas, será que softwares atingem todas as áreas da tecnologia?
- Uma questão séria discutida atualmente?
- http://www.youtube.com/watch?v=4iKu9qtCSXg ou
- Youtube => Todo mundo deveria aprender a programar (What most schools don't teach) 01/04/2013
- Gravar bem o que foi dito no tempo de 4:21 min.
Componentes e Tipos de Software
- Um sistema informatizado é formado por dois tipos de componentes:
- Executáveis em máquinas
- Não executáveis em máquinas
- Os componentes do software devem mapear as exigências do cliente em código executável.
- Tipos de software:
- Básico: APIs, sockets, drivers, DLLs, componentes de SO, ...
- Tempo real: monitora, analisa e controla eventos em tempo real
- Comercial: controle de estoque, vendas, etc. Normalmente manipulam algum mecanismo de persistência.
- Científico: intenso processamento de números e cálculos
- Embutido (Embedded): celulares, relógios, microondas, injeção eletrônica
- Pessoal: processador de texto, planilha, jogos, apresentações, etc
- Inteligência artificial: sistemas especialistas, redes neurais, robótica e elearning.
Fato
- Praticamente, todos os países dependem de sistemas simples e complexos baseados em computadores.
- Imagine uma situação onde os negócios não sejam suportados por programas
- A dependência se acentua à medida que a nação é mais desenvolvida.
- É verdade que quanto mais complexa a atividade, maior o grau de automatização?
- Países emergentes anseiam por tornar-se dependentes de tecnologia
- Abeer: Brasil exporta silício bruto a aproximadamente US$ 60 por tonelada e importa, em média, a US$ 600 mil por tonelada em forma de processadores
A Engenharia de Software
- Ramo da engenharia cujo foco é o desenvolvimento de sistemas de software dentro de custos adequados de alta qualidade.
- Não existem limitações físicas no potencial do software
- Pode se tornar extremamente complexo
Conceito de Engenharia de Software
- Surgiu a 40 anos atrás em função da Crise do Software
- A experiência mostrou que o desenvolvimento informal de software não era suficiente
A Crise do Software
- Causas:
- Projetos importantes com anos de atraso
- Os custos superavam as previsões
- Desempenho insatisfatório
- Não era confiável
- Difícil de manter
- Os custos de hardware caíam e os custos de software aumentavam.
Motivação
- Em virtude da importância e participação do software no mundo moderno, é condição essencial que seja fidedigno
- Software fidedigno: quando se pode justificavelmente depender dele
- Um bom software possui:
- Disponibilidade:
- Estar pronto para prestar serviço correto sempre que se necessite do software
- Confiabilidade:
- Habilidade de prestar continuamente serviço correto
- Segurança:
- Habilidade de evitar consequencias catastróficas relativas aos usuários e ao ambiente
- Proteção:
- Habilidade de evitar tentativas de agressão bem sucedidas
- Exemplo: Um banco de dados, simplesmente para de rodar caso alguma alteração seja feita na base de dados sem passar pela instruçaõ correta.
- Privacidade:
- Habilidade de proteger dados e código contra acesso indevido
- Exemplo: O software possui a capacidade de encapsular os dados, garantindo que apenas que é autorizado possa acessar aqueles dados.
- Integridade:
- Ausência de alterações não permitidas (corrupção de elementos)
- Robustez:
- Habilidade de detectar falhas de modo que os danos (as consequencias de erros ou falhas) possam ser mantidas em um patamar aceitável
- Recuperabilidade:
- Habilidade em ser rapidamente reposto em operação fidedigna após a ocorrência de uma falha
- Exemplo: Site pode ser restaurando após a alteração da página inicial
- Manutenibilidade:
- Habilidade de ser modificado (evoluído) ou corrigido sem que novos problemas sejam inseridos
- Exemplo: Recebeu nova versão? Ela rodou direitinho, sem nenhum problema?
- Depurabilidade:
- Habilidade de apoio à diagnose e à eliminação de possíveis falhas a partir de relatos gerados.
- Exemplo: Apuração de quem invadiu determinado site
A realidade
- Equipamentos sem software
- Muito primários?
- Equipamentos e dispositivos com software embutido (embedded systems)
- Apenas de médio e grande porte?
- Software de prateleira (commodities)
- Atendem a todas as necessidades?
- Soluções desenvolvidas (taylor-made)
- É o melhor dos mundos?
- Soluções por desenvolver
- Já não existem aplicações para todas as necessidades?
- Solução open-source?
- Que graça tem isto?
- Como foi discutido, a maioria dos produtos elétricos inclui um computador e um software de controle.
- MP3, ferro elétrico, relógio, geladeira, furadeira, controle remoto, etc
- Manufatura e distribuição 100% automatizadas
- Como organizar uma logistica e armazenamento sem um sistema?
- Sistema financeiro totalmente dependente
- Já experimentou poucos segundos de delay numa transação bancária?
- Área de saúde 100% integrada
- Dá pra confiar em todas as informações de uma diagnóstico?
10 Áreas da Engenharia de Software
- Conforme o SWEBOK. Jorge H. C. Fernandes. 2004
Aquisição, análise, especificação e gestão de requisitos de software
Transformação de requisitos (de software), tipicamente estabelecidos em termos relevantes ao domínio do problema, em uma descrição explicando como solucionar os aspectos do problema relacionados com software
Construção de programas funcionais e coerentes através da codificação, auto-validação, e teste unitário
Verificação dinâmica do comportamento do programa através do uso de um conjunto finito de casos de teste - adequadamente selecionados de um domínio de execuções usualmente infinito - contra o comportamento esperado deste
Atividades de suporte custo-efetivo a um sistema de software, que pode ocorrer antes e após a entrega do software
Após a entrega do software são feitas modificações com o objetivo de corrigir falhas, melhorar seu desempenho ou adapta-lo a um ambiente modificado.
Identifica a configuração do sistema (características documentadas do hardware e software que o compõem) em pontos discretos no tempo
Controlam sistematicamente suas mudanças e manter sua integridade e rastreabilidade durante o ciclo de vida do sistema
Gerencia projetos de desenvolvimento de software
Define, implementa, mede, gerencia, modifica e aperfeiçoa o processo de desenvolvimento de software
Ferramentas de software automatizam o processo de engenharia de software
Métodos impõem estrutura sobre a atividade de desenvolvimento e manutenção de software com o objetivo de torna-la sistemática e mais propensa ao sucesso
Conjunto de atividades relacionadas com garantia de qualidade de software, entre estas as atividades de verificação e validação.












