Objetivo da aula
- Entender o conceito de Engenharia de Software focando nas seguintes questões:
- Pode-se resolver qualquer problema começando pela análise e projeto
- A construção de um software envolve vários aspectos
- Se um problema for grande, basta efetuar uma decomposição
- Existem softwares para atender um amplo conjunto de problemas
- Um software considerado bom atende a uma série de requisitos.
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 pequena, de madeira, no meio do mato, talvez se consiga construir sem elaborar um projeto de engenharia civil, com plantas baixa, hidráulica e elétrica, ou mesmo cálculos estruturais. Um bom pedreiro ou um cara muito esforçado seja 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 uma casa maior, de um edifício, de um galpão ou outra construção mais relevante.
- 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
Software é a mesma coisa, exige requisitos detalhados, projeto apurado, acompanhamento contínuo e a percepção de que será usado por muito tempo e por muita gente de forma automática.
- 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)
- Detalhe no tempo de 4:21 min.
- https://www.kickstarter.com/projects/thoughtstem/codespells-express-yourself-with-magic
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
- Saúde: Monitores cardíacos, Medidores de pressão arterial, tomografia, etc
- 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: que expressa ou representa a realidade de algo, que não é fraudado ou simulado, autêntico.
- Um bom software possui:
- Disponibilidade:
- Estar pronto para prestar serviço correto sempre que se necessite do software
- Ex: Sistema de Atendimento 190 numa situação de emergência.
- Estar pronto para prestar serviço correto sempre que se necessite do software
- Confiabilidade:
- Habilidade de prestar continuamente serviço correto
- Ex: Sistema de contagem de dinheiro num caixa eletrônico.
- Habilidade de prestar continuamente serviço correto
- Segurança:
- Habilidade de evitar consequências catastróficas relativas aos usuários e ao ambiente
- Ex: Software de movimentação de um traje biônico que ajuda um deficiente físico.
- Habilidade de evitar consequências catastróficas relativas aos usuários e ao ambiente
- Proteção:
- Habilidade de evitar tentativas de agressão bem sucedidas
- Ex: Um banco de dados de uma empresa não pode permitir em hipótese alguma alteração de dado manualmente.
- Privacidade:
- Habilidade de proteger dados e código contra acesso indevido
- Ex: O software possui a capacidade de encapsular os dados, garantindo que apenas quem é autorizado possa acessar aqueles dados.
- Integridade:
- Ausência de alterações não permitidas (corrupção de elementos)
- Ex: O disco do Banco Financeiro onde sua informação de saldo está guardada, crashou? Ainda assim seu dado tem que estar correto.
- Ausência de alterações não permitidas (corrupção de elementos)
- Robustez:
- Habilidade de detectar falhas de modo que os danos (as consequências de erros ou falhas) possam ser mantidas em um patamar aceitável
- Ex.: Se um servidor sair do ar ainda assim a operação do sistema não pode ser afetada.
- Habilidade de detectar falhas de modo que os danos (as consequências 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 restaurado imediatamente após uma alteração da página inicia de um sitel, por exemplo.
- Manutenibilidade:
- Habilidade de ser modificado (evoluído) ou corrigido sem que novos problemas sejam inseridos
- Exemplo: Baixa uma nova versão do aplicativo e ele roda direitinho da mesma forma que antes.
- Depurabilidade:
- Habilidade de apoio à diagnose e à eliminação de possíveis falhas a partir de relatos gerados.
- Exemplo: Um sistema com milhões de linhas de programação deve ter formas de visualizar e filtrar os pontos mais críticos.
A realidade
- Equipamentos e dispositivos com software embutido (embedded systems)
- Como funciona isso? Que tipo de software:
- Software de prateleira (commodities)
- Significa que atendem a todas as necessidades dos usuários?
- Soluções desenvolvidas (taylor-made)
- É melhor que software de prateleira?
- Soluções por desenvolver
- Com tanto software no mundo ainda existe alguma coisa inédita para desenvolver?
- Solução open-source?
- É de graça mas funciona?
- A maioria dos produtos elétricos ou eletrônicos inclui um sistema de computação (hardware + software)
- MP3, ferro elétrico, relógio, geladeira, furadeira, controle remoto, etc
- Os negócios que envolvem manufatura e distribuição (logística) são praticamente 100% automatizados
- Sem um sistema, a empresa consegue atender suas demandas?
- Sistema financeiro é totalmente dependente da tecnologia
- Porque gera insatisfação poucos segundos de atraso numa transação bancária?
- Área de saúde deveria ter 100% de integração (Paciente, Hospital, Médico, Plano de Saúde, Laboratórios, etc)
- Ver países com excelência no sistema de saúde.
10 Áreas da Engenharia de Software
- Conforme o SWEBOK. Jorge H. C. Fernandes. 2004
- 01. Requisitos de software
- Aquisição
- Análise
- Especificação
- Gestão de requisitos de software
- 02. Design de software
- Transformação de requisitos (de software), coletados no domínio do problema, em uma descrição explicando como solucionar os aspectos do problema relacionados com software
- Modelagem
- Diagramação
- Projeto
- 03. Construção de Software
- Construção de programas funcionais e coerentes através da codificação
- Programação
- Auto-validação
- Teste unitário
- 04. Teste de Software
- Verificação dinâmica do comportamento do programa através do uso de um conjunto finito de casos de teste
- Aplicação de técnicas para avaliar se o programa é eficiente
- 05. Manutenção de Software
- Atividades de suporte a um sistema, 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.
- 06. Gerência de Configuração de Software
- Características documentadas do hardware e software que fazem parte do sistema
- Controlam sistematicamente suas mudanças e manter sua integridade e rastreabilidade durante o ciclo de vida do sistema
- 07. Gerência de Engenharia de Software
- Gerencia projetos de desenvolvimento de software
- 08. Processo de Engenharia de Software
- Define
- Implementa
- Mede
- Gerencia
- Modifica
- Aperfeiçoa o processo de desenvolvimento de software
- 09. Ferramentas e Métodos
- Ferramentas que automatizam os processos
- Métodos que procuram levar mais qualidade ao software
- 10. Qualidade de Software
- Conjunto de atividades que tentam garantir de qualidade de software
- Verificação dos requsitos
- Validação.













