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.
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: 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
- 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 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?
- 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
- Sem um sistema, a empresa consegue atender suas demandas?
- Sistema financeiro totalmente dependente
- Porque gera insatisfação poucos segundos de delay numa transação bancária?
- Área de saúde 100% integrada
- Dá pra confiar em todas as informações de um 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
- 03. Construção de Software
Construção de programas funcionais e coerentes através da codificação, auto-validação, e 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 - adequadamente selecionados de um domínio de execuções usualmente infinito - contra o comportamento esperado deste
- 05. Manutenção de Software
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.
- 06. Gerência de Configuração de Software
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
- 07. Gerência de Engenharia de Software
Gerencia projetos de desenvolvimento de software
- 08. Processo de Engenharia de Software
Define, implementa, mede, gerencia, modifica e aperfeiçoa o processo de desenvolvimento de software
- 09. Ferramentas e Métodos
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
- 10. Qualidade de Software
Conjunto de atividades relacionadas com garantia de qualidade de software, entre estas as atividades de verificação e validação.













