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?



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.




  • Confiabilidade:
    • Habilidade de prestar continuamente serviço correto
      • Ex: Sistema de contagem de dinheiro num caixa eletrônico.




  • 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.




  • 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.




  • 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.




  • 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 sem software
    • Muito primários?


  • Equipamentos e dispositivos com software embutido (embedded systems)
    • Como funciona isso? Que tipo de software:



  • 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?



  • A maioria dos produtos elétricos ou eletrônicos inclui um sistema de computação (hardware + software)


  • 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.