Objetivo da aula
- Entender o conceito de Engenharia de Software focando nas seguintes questões:
- Pode-se resolver qualquer problema (grande e/ou complexo) começando pela análise e projeto
- Uma forma fácil de verificar a viabilidade é implementando o protótipo
- Para se construir um software dependemos inicialmente dos requisitos
- Se um problema for grande, basta efetuar uma decomposição
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
- Para se construir essa pequena casinha, de madeira, no meio do mato, talvez seja factível 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 será 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.
- Divide et Impera
- 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
- “Dividir para conquistar”
- 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

- 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
- Games: Educacional, Games Sociais, Comercial, Aventura, Estratégia, LOL, Tabuleiro Eletrônico, MMO, Simulação, Esportes, Cartas,

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.
Questões
- Rodrigo Cordon Isaac:
- 01. Sempre que temos um problema para automatizar é interessante que já comecemos codificando o sistema?
Para problemas grandes e mais complexos, o foco na codificação nem sempre é o suficiente. A engenharia de software pode ser vista como uma tecnologia em camadas. Para a realização do projeto de engenharia de software, deve-se realizar um processo que dentre as atividades realiza-se uma comunicação, onde se faz o levantamento de requisitos, um planejamento para o trabalho, uma modelagem e só então uma construção, atividade que envolve a codificação.
- 02. Qual a melhor maneira de começar a encarar um problema grande e complexo?
A melhor maneira de encarar um problema grande e complexo é realizando a divisão de atividades, procurando métodos e soluções para cada uma de tais, posteriormente integrando as soluções. Para tanto utiliza-se a engenharia de software, com foco na qualidade, utilizando-se um dado processo, método e ferramentas.
- 03. No site foi dado um exemplo de passos para um estudo aprofundado de uma casa. E para um software, quais seria estes?
Para elaborar um software, é necessário percorrer um roteiro que auxilia a obter um resultado de alta qualidade em um intervalo de tempo viável. Esse roteiro é um processo de software. De fato, o processo de software depende do software em questão, todavia, um arcabouço de processo seria levantar os requisitos, fazer um planejamento, criar modelos e então implementar. Também se analisa os métodos, ferramentas e técnicas utilizadas.
- 04. Exemplifique uma área utilizada no mundo atual onde não é interessante ou não é necessária a utilização de um software, direta ou indiretamente?
É inimaginável uma área de atividades no mundo onde não se possa ser beneficiada pela utilização de um software.
- Gabriel Marçal de Carvalho:
- 05. Dê alguns exemplos de componentes não executáveis em máquinas.
- Bibliotecas externas: DLL, API. => O que é DLL, API?
- 06. Cite alguma sugestão de software ou alguma situação real que mostre que não existe limitação física para o software.
- Pode-se citar como exemplo um software que monitora o nível de óleo dos transformadores de torres de distribuição de energia. Essas torres (postes) podem estar localizadas em quaisquer lugares, inclusive em lugares de difícil acesso. Se esse trabalho de monitoramento fosse manual, seria necessário muito mais tempo e custo. => Onde está uma possível limitação?
- 07. O que foi a Crise do Software?
- Crise do software: Ocorreu na década de 1970 quando a engenharia de software era praticamente inexistente e não acompanhava a demanda por softwares mais modernos, já que problemas cada vez mais complexos surgiam.A crise se manifesta de varias formas:
- - Projetos estourando o orçamento;
- - Projetos estourando o prazo;
- - Software de baixa qualidade;
- - Software muitas vezes não atingindo os requisitos;
- - Projetos ingerenciáveis e o código difícil de manter.
- Soluções para a crise de software:
- - Análise Econômica de Sistemas de Informação;
- - O uso de melhores técnicas, métodos e ferramentas;
- - Interesse do governo em treinamentos e educação;
- - A mudança de paradigma sobre o que é desenvolver software e como deveria ser feito.
- 08. Atualmente os custos de software continuam aumentando e os de hardware caindo?
- Atualmente, de fato, o preço dos hardwares vem caindo devido ao seu caráter de commodity, ou seja, o comprador tem diversas opções de máquinas em uma prateleira. O software, por outro lado, tem custo mais elevado devido todo o processo de engenharia que o envolve. Softwares demandam mais tempo e cuidado para serem criados, pois poderão ser usados por milhões de pessoas por um longo período de tempo.
- 05. Dê alguns exemplos de componentes não executáveis em máquinas.

