CapÃtulo 1 : Engenharia de software
No domínio do desenvolvimento de software, a engenharia de software refere-se a uma abordagem baseada em engenharia. No processo de desenvolvimento de software, um profissional conhecido como engenheiro de software leva o processo de projeto de engenharia em prática.
Apesar do fato de que as expressões "programador" e "codificador" são sinônimo de "engenheiro de software", elas se referem apenas ao componente de construção do trabalho normal de um engenheiro de software.
Um engenheiro de software é responsável pela aplicação de um processo de desenvolvimento de software, que inclui definir, implementar, testar, gerenciar e manter sistemas de software, bem como criar e atualizar o processo de desenvolvimento através da aplicação do processo.
Foi somente na década de 1960 que a engenharia de software foi reconhecida como um subcampo distinto da engenharia.
Acreditava-se que o desenvolvimento da engenharia de software seria um processo difícil. Os problemas incluíam software que não estava concluído ou estava acima do orçamento, ultrapassava prazos, exigia depuração e manutenção substanciais e não atendia aos requisitos dos clientes. Às vezes, o software nunca foi sequer terminado.
Em 1968, a Organização do Tratado do Atlântico Norte (OTAN) sediou a primeira conferência de engenharia de software, quando foram discutidos temas relacionados a software. A fim de facilitar a criação de software, foram elaboradas orientações e métodos mais eficazes.
Várias fontes diferentes foram citadas como as origens do termo "engenharia de software". "Computadores e Automação" publicou uma lista de serviços prestados por corporações na edição de junho de 1965 da publicação. A palavra foi usada de forma mais oficial na edição de agosto de 1966 da Communications of the Association for Computing Machinery (Volume 9, número 8) no artigo "President's Letter to the ACM Membership" escrito por Anthony A. Oettinger. Além disso, está ligado ao nome de uma conferência da OTAN que foi realizada em 1968 e foi liderada pelo Professor Friedrich L. Bauer. Enquanto as missões Apollo estavam em andamento, Margaret Hamilton forneceu uma descrição do campo da "engenharia de software", a fim de dar credibilidade às atividades que foram realizadas. O termo "crise de software" era comumente usado para descrever a situação na época. Frederick Brooks e Margaret Hamilton proferirão as palestras principais nas Sessões Plenárias da 40ª Conferência Internacional de Engenharia de Software (ICSE 2018), que está sendo realizada para comemorar meio século do campo "Engenharia de Software".
O Instituto de Engenharia de Software (SEI) foi criado em 1984 como uma instalação de pesquisa e desenvolvimento apoiada pelo governo federal. Sua sede está localizada no campus da Carnegie Mellon University em Pittsburgh, Pensilvânia, nos Estados Unidos da América.
O Programa de Processo de Software SEI foi estabelecido por Watts Humphrey com a intenção de obter uma compreensão e gerenciamento eficaz do processo de engenharia de software. O Capability Maturity Model Integration for Development (CMMI-DEV) foi desenvolvido como resultado dos Níveis de Maturidade do Processo que foram inicialmente introduzidos. Este modelo delineou a forma como o Governo dos Estados Unidos analisa as capacidades das suas equipas de desenvolvimento de software.
O Software Engineering Body of Knowledge (SWEBOK) é uma compilação das melhores práticas contemporâneas para engenharia de software que foram compiladas pelo subcomitê ISO/IEC JTC 1/SC 7 e publicadas. Estas boas práticas são universalmente reconhecidas. É consensual que a engenharia de software é uma das categorias mais importantes de computadores.
As definições significativas de engenharia de software incluem o seguinte:
Ainda menos oficialmente, a frase também tem sido usada da seguinte forma:
A expressão "engenharia de software" foi popularizada por Margaret Hamilton enquanto trabalhava no programa Apollo. O trabalho deve ser considerado tão seriamente quanto outras contribuições para o crescimento da tecnologia, e o termo "engenharia" foi escolhido para reconhecer que esse deveria ser o caso. Hamilton fornece o seguinte uso do termo:
Foi a primeira vez que alguém ouviu falar do termo, pelo menos não no nosso mundo, quando o criei inicialmente. Tinha sido uma piada por um tempo considerável. Eles gostavam de tirar sarro de mim por ter noções tão extremas. O dia em que um dos mais respeitados especialistas em hardware partilhou com todos, numa reunião, que concordou comigo que o processo de construção de software também deve ser considerado uma disciplina de engenharia, tal como o processo de construção de hardware, foi um dia que viverá muito tempo na memória. Tínhamos ganho a aceitação dele e dos outros na sala como estando em um campo de engenharia por direito próprio, e isso não foi porque ele aceitou o novo "termo" em si mesmo; pelo contrário, foi porque tínhamos merecido a sua aceitação.
Há uma quantidade significativa de desacordo entre os críticos sobre a definição de engenharia de software ou a legitimidade da engenharia de software como um assunto dentro da engenharia. David Parnas afirmou que a engenharia de software é, na realidade, um tipo de engenharia ou engenharia em geral. Não é o caso, de acordo com Steve McConnell, mas ele acredita que deveria ser. A afirmação de que a programação é ao mesmo tempo uma arte e uma ciência foi feita por Donald Knuth. No que diz respeito aos Estados Unidos da América, Edsger W. Dijkstra afirmou que os termos engenharia de software e engenheiro de software têm sido utilizados excessivamente.
O processo de elicitar, analisar, especificar e validar requisitos de software é o que é conhecido como engenharia de requisitos. Existem três opções para os requisitos de software: domínio, não funcional e funcional.
Os comportamentos pretendidos, muitas vezes conhecidos como saídas, são descritos pelos requisitos funcionais. Preocupações como portabilidade, segurança, manutenabilidade, confiabilidade, escalabilidade, desempenho, reutilização e flexibilidade são exemplos dos tipos de coisas que são especificadas por requisitos não funcionais. Essas restrições podem ser divididas nas seguintes categorias: restrições de interface, restrições de desempenho (incluindo coisas como velocidade de reação, segurança e espaço de armazenamento), restrições operacionais, restrições de ciclo de vida (incluindo coisas como portabilidade e manutenção) e restrições econômicas. É necessário ter uma compreensão do funcionamento do sistema ou programa, a fim de expressar as necessidades não funcionais adequadamente. No contexto de projetos, os requisitos de domínio referem-se às características associadas a uma determinada categoria ou domínio.
O processo de desenvolvimento de plantas de alto nível para software é referido como um exemplo de design de software. Há momentos em que o design é dividido em níveis:
Programação, também conhecida como codificação, teste de unidade, teste de integração e depuração são as etapas típicas envolvidas na construção de software. Essas etapas são necessárias para colocar o projeto em ação: "O teste de software está relacionado, mas distinto do teste de software de computador", solução de problemas.
Na maioria dos casos, o programador é o responsável pelos testes durante esta fase. O objetivo desse teste é garantir que o código funcione de acordo com seu design e determinar quando o código está pronto para passar para o nível subsequente de teste.
O objetivo do teste de software é fornecer às partes interessadas informações sobre a qualidade do software que está sendo testado. Isto é conseguido através de uma investigação empírica e técnica realizada.
Quando o teste é especificado de uma maneira que é distinta da construção, muitas vezes é realizado por engenheiros de teste ou técnicos de garantia de qualidade, em vez dos programadores que foram responsáveis por escrevê-lo. Além de ser realizado ao nível do sistema, é considerado como um componente da qualidade do programa.
O processo de estudar programas de computador em relação a um elemento específico, como desempenho, robustez ou segurança, é referido como análise de programas.
A manutenção de software é o processo de fornecer suporte para o software após o seu lançamento. Pode incluir, mas não está limitado a, aspetos como correção de erros, otimização, a remoção de recursos que não estão sendo utilizados ou estão sendo descartados e a melhoria de recursos que já estão lá.
Na maioria dos casos, a manutenção representa entre quarenta por cento e oitenta por cento do custo total do projeto.
Ter um conhecimento prático de programação de computadores é necessário para seguir uma carreira como engenheiro de software. Em 2004, a IEEE Computer Society produziu o SWEBOK, que agora foi publicado como ISO/IEC Technical Report 1979:2005. Este documento descreve o corpo de conhecimento que a organização recomenda um engenheiro de software graduado com quatro anos de experiência para ser capaz de compreender.
Um número significativo de engenheiros de software entra no campo primeiro obtendo um diploma de uma universidade credenciada ou recebendo treinamento em uma escola profissional. Durante o ano de 2014, a Força-Tarefa Conjunta sobre Currículos de Computação da Association for Computing Machinery e da IEEE Computer Society criou um currículo internacional padrão para cursos de graduação em...