thumb|A engenharia de software é a área responsável pelo estabelecimento de técnicas e práticas para o desenvolvimento de software cobrindo uma ampla área de aplicações e diferentes tipos de dispositivos.
Engenharia de software é uma área interdisciplinar de conhecimento, que agrega ciências exatas e humanas, por exemplo, engenharia e administração. A área rege o processo produtivo de sistemas baseados em rotinas computacionais, chamado processo de software, que por sua vez inclui especificação, desenvolvimento, manutenção e criação de software.PRESSMAN, Roger S. e MAXIM, Bruce R., Software Engineering – A Practitioner's Approach, Eighth Edition, 2015. Tais atividades podem ser realizadas com a aplicação de tecnologias e práticas de gerência de projetos e outras disciplinas, visando organização, produtividade e qualidade. Atualmente, essas tecnologias e práticas englobam linguagens de programação, banco de dados, ferramentas, plataformas, bibliotecas, padrões de projeto de software, processo de software e qualidade de software.
Os fundamentos científicos para a engenharia de software envolvem o uso de modelos abstratos e precisos que permitem ao engenheiro especificar, projetar, implementar e manter sistemas de software, avaliando e garantindo suas qualidades. A área que estuda e avalia os processos de engenharia de software, propondo a evolução dos processos, ferramentas e métodos de suporte a engenharia de software é a Engenharia de Software Experimental.
Histórico O termo foi criado na década de 1960 e utilizado oficialmente em 1968 na NATO Science Committee. Sua criação surgiu numa tentativa de contornar a crise do software e dar um tratamento de engenharia (mais sistemático, controlado e de qualidade mensurável) ao desenvolvimento de sistemas de software complexos. Um sistema de software complexo se caracteriza por um conjunto de componentes abstratos de software (estruturas de dados e algoritmos) encapsulados na forma de algoritmos, funções, módulos, objetos ou agentes interconectados, compondo a arquitetura do software, que deverão ser executados em sistemas computacionais.
Definição Friedrich Ludwig Bauer definiu-a como: Engenharia de Software é a criação e a utilização de sólidos princípios de engenharia a fim de obter software de maneira econômica, que seja confiável e que trabalhe em máquinas reais". Margaret Hamilton é creditada por ter criado o termo "engenharia de software". O próprio significado de engenharia já traz os conceitos de criação, construção, análise, desenvolvimento e manutenção.
A Engenharia de Software se concentra nos aspectos práticos da produção de um sistema de software, enquanto a ciência da computação estuda os fundamentos teóricos dos aspectos computacionais.
Os fundamentos científicos envolvem o uso de modelos abstratos e precisos que permitem ao engenheiro especificar, projetar, implementar e manter sistemas de software, avaliando e garantindo sua qualidade. Além disto, deve oferecer mecanismos para se planejar e gerenciar o processo de desenvolvimento. Empresas desenvolvedoras de software passaram a empregar esses conceitos sobretudo para orientar suas áreas de desenvolvimento, muitas delas organizadas sob a forma de Fábrica de Software.
A engenharia de sistemas é uma área ampla por tratar de aspectos de sistemas baseados em computadores, incluindo hardware e engenharia de processos para construção de software.
A Universidade Federal de Goiás foi pioneira no Brasil quando criou o curso de graduação em Engenharia de Software, hoje o curso ganha popularidade e já é adotado por outras universidades como Universidade Federal de Mato Grosso do Sul, Universidade de Brasilia, Universidade Tecnológica Federal do Paraná, Universidade Federal do Ceará, Universidade Federal do Amazonas, Universidade Federal do Pampa, Universidade Estadual de Ponta Grossa, PUC-Campinas, PUC-RS, Centro de Ensino Superior de Juiz de Fora, Universidade do Estado de Santa Catarina, Faculdade Damas da Instrução Cristã, entre outras.
Resolução de Problemas em Engenharia de Software
Princípios Os princípios da Engenharia de Software constituem a base dos métodos, tecnologias, metodologias e ferramentas adotadas na prática e que norteiam a prática de desenvolvimento de soluções de software. Os princípios se aplicam ao processo e ao produto de software se tornando em prática de desenvolvimento de software através da adoção de métodos e técnicas. Geralmente, métodos e técnicas constituem uma metodologia, as quais, são apoiadas pela utilização de ferramentas
Os princípios-chave são: Rigor e Formalidade; Separação de Interesses; Modularidade; Alta Coesão; Baixo Acoplamento. Abstração; Antecipação a Mudanças; Generalidade; Incrementação; Requisitos de Software.
Considerando o Rigor e Formalidade, deve-se considerar que a engenharia de software é uma atividade criativa, mas que deve ser realizada de maneira sistemática; o Rigor é um complemento necessário a criatividade que visa aumentar a confiança dos desenvolvimentos de software. A Formalidade é o Rigor no seu nível mais elevado. Exemplos: Análise matemática (formal) da corretude do Programa, Análises sistemáticas de dados de testes, Documentação rigorosa dos passos de desenvolvimento e os passos de gerenciamento bem como a avaliação dos prazos de entrega.
A Separação de Interesses envolve dominar a complexidade, separando os problemas principais e concentrando-se em um de cada vez ( dividir e conquistar ) suporte a paralelização de atividades e separação das responsabilidades. Exemplo: Desenvolvimento por fases de maneira incremental ( como no processo Ágil ) fazendo a separação dos interesses por atividades e respeitando o tempo. Outro exemplo relacionado a um software relaciona-se a manter os requisitos de funcionalidade, performance e interface e usabilidade de usuário em separado.
A Modularidade considera que um sistema complexo pode ser divido em peças mais simples, chamadas de módulos. Um sistema composto pode módulos é chamado de modular. Se faz fundamental que o suporte a separação de interesses seja suportada, quando lidamos com um modulo em específico deve ser possível ignorar os detalhes dos outros módulos da solução. Cada modulo deve ter alto nível de coesão, sendo entendido como uma unidade significativa, os componentes de um modulo são fortemente relacionados entre si. O baixo acoplamento remete a baixa interação de um modulo com outros do sistema possibilitando que eles sejam compreendidos como unidades em separado.
A Abstração é um conceito que visa a identificação de aspectos importantes de um fenômeno, ignorando os seus detalhes. O tipo de abstração a ser aplicado depende do propósito. Por exemplo: Os botões de um relógio são a sua interface com o usuário, eles podem ser usados como uma abstração para o propósito interno de ajustar o horário, equações que descrevem um circuito (por exemplo, um amplificador) permitem a um designer pensar sobre amplificação de sinal. Uma abstração deve tornar possível pensar sobre um sistema através do raciocínio sobre os modelos. A abstração pode ser útil para realizar uma estimativa de custos de um projeto de software através de analise de similaridade com projetos passados.
A Antecipação a Mudanças é diretamente relacionada ao suporte a evolução de um software considerando na arquitetura do software aspectos relacionados ao processo de evolução e compatibilidade com mudanças futuras relacionadas ao domínio de aplicação do software.
A Generalidade é um principio que visa durante a resolução de um problema, descobrir se ele é uma instância de um problema mais geral, no qual a solução pode ser reutilizada em outros casos. O desafio da generalidade está no balanço entre custo e performance.
A Incrementação é relacionada a evolução de um software através de incrementos estruturados. Pode ser realizado através da entrega de subconjuntos de um sistema desde cedo, visando coletar o feedback dos usuários e adicionar funcionalidades de forma incremental. O processo incremental deve focar inicialmente na funcionalidade, para então, pensarmos na performance da solução, naturalmente o protótipo amadurecerá e se tornará um produto.
Áreas de conhecimento Segundo o SWEBOK (Corpo de Conhecimento da Engenharia de Software), versão 2004, as áreas de conhecimento da Engenharia de Software são: Requisitos de software Projeto de software Construção de software Teste de software Manutenção de software Gerência de configuração de software Gerência de engenharia de software Processos de Engenharia de Software Ferramentas e Métodos de Engenharia de Software Qualidade de software
Processo de software
Processo de software é uma expressão utilizada para se referir ao processo produtivo de sistemas baseados em rotinas computacionais. Tal processo engloba insumos, práticas, produtos e os próprios trabalhadores do setor de software. É tarefa da engenharia de software organizar isso tudo para atender tanto às demandas das partes que lhe subsidiam como também às demandas das partes que usam ou operam o software produzido. Isso significa que a referida engenharia pode ser aplicada na mesma organização que pretende usar ou operar o sistema a produzir, e também pode ser aplicada em uma organização distinta daquela que irá usar ou operar o sistema a produzir.
SEE e PSEE são os ambientes voltados ao desenvolvimento e manutenção de processos. O projeto ExPSEE é uma continuação dos estudos de processos, principalmente do ambiente PSEE.
Devido ao uso da palavra projeto em muitos contextos, por questões de clareza, há vezes em que se prefira usar o original em inglês design.
Modelos de processo de software Um modelo de processo de desenvolvimento de software, ou simplesmente modelo de processo, pode ser visto como uma representação, ou abstração dos objetos e atividades envolvidas no processo de software. Além disso, oferece uma forma mais abrangente e fácil de representar o gerenciamento de processo de software e consequentemente o progresso do projeto.
Exemplos de alguns modelos de processo de software;
Modelo de ciclo de vida Sequencial ou Cascata (do inglês waterfall) - com fases distintas de especificação, projeto e desenvolvimento. Desenvolvimento iterativo e incremental - desenvolvimento é iniciado com um subconjunto simples de Requisitos de Software e iterativamente alcança evoluções subsequentes das versões até o sistema todo estar implementado Evolucional ou Prototipação - especificação, projeto e desenvolvimento de protótipos. V-Model - Parecido com o modelo cascata, mas com uma organização melhor, que permite que se compare com outros modelos mais modernos. Principal ponto é que para cada etapa de um lado tem uma verificação do outro, criando um gráfico no formato da letra V com 2 cascatas. Espiral - evolução através de vários ciclos completos de especificação, projeto e desenvolvimento. Componentizado - reúso através de montagem de componentes já existentes. Formal - implementação a partir de modelo matemático formal. Ágil RAD Quarta geração.
Modelos de maturidade Os modelos de maturidade são um metamodelo de processo. Eles surgiram para avaliar a qualidade dos processos de software aplicados em uma organização (empresa ou instituição). O mais conhecido é o Capability Maturity Model Integration (CMMi), do Software Engineering Institute - SEI.
O CMMI pode ser organizado através de duas formas: Contínua e estagiada.
Pelo modelo estagiado, mais tradicional e mantendo compatibilidade com o CMM, uma organização pode ter sua maturidade medida em 5 níveis: Nível 1 - Inicial (Ad hoc): Ambiente instável. O sucesso depende da competência de funcionários e não no uso de processos estruturados; Nível 2 - Gerenciado: Capacidade de repetir sucessos anteriores pelo acompanhamento de custos, cronogramas e funcionalidades;