Engenharia de software
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. 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.
Imagem: Secom / UnB · BY · Openverse
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.
Imagem: Problemas_SBSE.png: Fabriciogf derivative work: Fabriciogf (talk) · BY · Openverse
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.
Imagem: Giovanni Prestige · BY-SA · Openverse
Profissionais de engenharia de software e amadores diferem em suas abordagens para resolução de problemas. Os profissionais que são treinados e habilitados em engenharia de software, possuem uma variedade de modelos cognitivos e conhecimento que os habilitam a abordar problemas de maneira sistemática. Isso inclui: Além disso, os profissionais têm uma visão global e perspicaz sobre o desenvolvimento de sistemas, incluindo o entendimento das funcionalidades necessárias para tal, tratamento de exceções e estratégias de tolerância a falhas. Por outro lado, os programadores amadores possuem treinamento e atividades praticas limitadas e podem ser caracterizados por possuírem: De acordo com Richard Mayer, há quatro aspectos de conhecimento necessários para resolver problemas de programação: sintático, semântico, esquemático e estratégico. A pesquisa de Mayer mostrou que há diferenças significativas nas estruturas de conhecimento de especialistas e iniciantes em todas as quatro categorias.
Imagem: Udesc - Universidade do Estado de Santa Catarina · BY-NC · Openverse
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 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.
Imagem: Udesc - Universidade do Estado de Santa Catarina · BY-NC · Openverse
Segundo o SWEBOK (Corpo de Conhecimento da Engenharia de Software), versão 2004, as áreas de conhecimento da Engenharia de Software são:
Imagem: Udesc - Universidade do Estado de Santa Catarina · BY-NC · Openverse
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.
Imagem: Udesc - Universidade do Estado de Santa Catarina · BY-NC · Openverse
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;
Imagem: Udesc - Universidade do Estado de Santa Catarina · BY-NC · Openverse
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: O (MPS.BR), ou Melhoria de Processos do Software Brasileiro, é simultaneamente um movimento para a melhoria e um modelo de qualidade de processo voltada para a realidade do mercado de pequenas e médias empresas de desenvolvimento de software no Brasil. O MPS.BR contempla 7 níveis de maturidade, de A a G, sendo a primeira o mais maduro. Até agosto/2012, no Brasil, há somente 2 empresas neste nível.
Imagem: Udesc - Universidade do Estado de Santa Catarina · BY-NC · Openverse
O termo metodologia é bastante controverso nas ciências em geral e na Engenharia de Software em particular. Muitos autores parecem tratar metodologia e método como sinônimos, porém seria mais adequado dizer que uma metodologia envolve princípios filosóficos que guiam uma gama de métodos que utilizam ferramentas e práticas diferenciadas para realizar algo. Assim teríamos, por exemplo, a Metodologia Estruturada, na qual existem vários métodos, como Análise Estruturada e Projeto Estruturado (muitas vezes denominados SA/SD, e Análise Essencial). Dessa forma, tanto a Análise Estruturada quanto a Análise Essencial utilizam a ferramenta Diagrama de Fluxos de Dados para modelar o funcionamento do sistema. Segue abaixo as principais Metodologias e Métodos correspondentes no desenvolvimento de software:
Imagem: Udesc - Universidade do Estado de Santa Catarina · BY-NC · Openverse
A abstração do sistema de software através de modelos que o descrevem, é um poderoso instrumento para o entendimento e comunicação do produto final que será desenvolvido. A maior dificuldade nesta atividade está no equilíbrio (tradeoff) entre simplicidade (favorecendo a comunicação) e a complexidade (favorecendo a precisão) do modelo. Para a modelagem podemos citar 3 métodos:


