Engenharia de Software #01 – Introdução à Engenharia de Software
Olá! Este é o primeiro de uma série de resumos baseados no livro Engenharia de Software de Ian Sommerville. Meu objetivo com essa série é reforçar meus estudos e compartilhar com a comunidade de tecnologia os principais conceitos da área, com uma linguagem acessível.
Espero que este conteúdo possa ser útil para quem está começando ou revisando fundamentos. Feedbacks são sempre bem-vindos!
____________________________________________________________________________________________________________________________________________
Introdução
Com a evolução da tecnologia cresce cada vez mais a nossa dependência de dispositivos e ferramentas que nos auxiliam nas mais diversas atividades, e, uma coisa é certa - o mundo moderno não funciona sem software. Os governos, indústrias, sistemas financeiros e plataformas de entretenimento utilizam software de forma intensa.
Softwares não possuem limitações físicas ou materiais; eles são abstratos e intangíveis, isso quer dizer que são limitados apenas pelas suas complexidades e custo de produção, softwares complexos consequentemente são mais caros e difíceis de modificar. Além disso não existe “a maneira definitiva de fazer um software”, cada software tem características próprias, sendo necessária uma abordagem especifica ao seu propósito – um sistema médico tem necessidades diferentes de um jogo.
Ainda que a engenharia de software seja vista muitas vezes como atrasada ou inadequada para o mercado atual onde o imediatismo reina, muitos projetos falham pela crescente complexidade dos sistemas – conforme a tecnologia evolui, ela facilita a produção de software e com isso os sistemas ficam mais complexos. Além disso, a falta de um processo de gerenciamento que se preocupa com todas as etapas de produção de software, desde sua concepção até a entrega e manutenção, faz com que o software se torne menos confiável, o custo de produção aumente, a modificação e manutenção fique mais difícil. E é aí que a engenharia de software entra com o objetivo de gerir todo o ciclo de desenvolvimento de software.
Software
Vale lembrar que ao falarmos de software em engenharia de software, não estamos nos referindo apenas ao programa em si, mas também a sua documentação, manual e todo material necessário para que ele seja útil. Esses softwares são concebidos como produtos, podendo ser chamados também de produtos de software e podem ser divididos em duas grandes categorias:
- Produto de software genérico: São softwares para o público geral, o desenvolvedor é quem especifica o produto e suas funcionalidades. Exemplos: Aplicativos de edição de imagem e vídeos, aplicações de gerenciamento de rotinas.
- Produto de software personalizado: São desenvolvidos para atender as necessidades de um cliente especifico, o cliente é quem determina a sua especificação e funcionalidades. Exemplos: Sistema de computador de bordo, sistemas de negócios específicos.
A respeito da qualidade é importante analisar todos os atributos do software e não apenas a sua funcionalidade (o que ele faz). A qualidade envolve todos os aspectos de como ele se comporta em execução, segurança, desempenho, estrutura e documentação associada. Aqui novamente, não existe um modelo ideal geral, cada software vai possuir uma característica crítica, um sistema bancário precisa de confiabilidade e segurança da informação, enquanto aplicações interativas e de entretenimento precisam de responsividade.
Embora não exista um modelo ideal, bons softwares compartilham de 4 características fundamentais:
- Aceitabilidade: software precisa ser projetado para que o usuário consiga utilizá-lo, isso significa que precisa ser inteligível, útil, e se necessário, compatível com outros sistemas.
- Dependabilidade e segurança: A dependabilidade inclui segurança da informação (security), segurança (safety) e confiabilidade. Idealmente o software não deve falhar, mas em caso de falha, isso quer dizer que o software não deve causar danos físicos ou econômicos ao usuário. Além disso deve ser protegido contra usuários maliciosos, não permitir acesso ou danos no sistema.
- Eficiência: Não desperdiçar recursos como memória e ciclos do processador. Eficiência afeta a responsividade, tempo de processamento e utilização de recursos.
- Manutenibilidade: O software deve ser escrito visando a sua evolução e escalabilidade.
Engenharia de Software
Como mencionado anteriormente, a engenharia de software se preocupa com todo os aspectos da produção de software, desde os estágios iniciais até manutenção após a entrega. Os engenheiros são responsáveis por solucionar problemas através de teorias, ferramentas e metodologias, e quando estas não estiverem disponíveis, deve propor outras soluções, sempre respeitando os limites financeiros e organizacionais.
A engenharia de software utiliza uma abordagem sistemática, uma sequência de atividades que resulta na produção de um software. Essa abordagem é chamada de processo de software e possui quatro atividades fundamentais:
- Especificação: Definir o que será produzido, bem como suas restrições.
- Desenvolvimento: Elaboração do projeto e programação.
- Validação: Série de análises para garantir a utilidade do software.
- Evolução: Atualizações para refletir mudanças nos requisitos do cliente e do mercado.
Ainda que, existam diversos softwares e eles sejam desenvolvidos de maneiras diferentes, boa parte deles são afetados por algumas questões relacionadas:
- Heterogeneidade: Crescente necessidade de sistemas capazes de atuar de forma distribuída em rede, incluindo diferentes dispositivos.
- Mudanças de negócios e sociedade: Acompanhando a evolução tecnológica e economias emergentes, as empresas e a sociedade estão em constante mudança.
- Segurança da informação: A sociedade moderna é altamente dependente de softwares, se faz necessário que possamos confiar neles.
- Escala: software deve ser pensado considerando diferentes escalas, desde um dispositivo pessoal como um relógio, até sistemas globais baseados em nuvem.
Além dos desafios técnicos e socias, a engenharia de software precisa ser flexível as diferentes aplicações, conforme abordaremos a seguir.
Diversidade da Engenharia de Software
A engenharia de software é uma abordagem sistemática para conceber um software, e alguns fatores importantes devem ser levados em conta: custo prático, cronograma, questões de dependabilidade, necessidade do cliente e desenvolvedores. O principal fator para determinar qual o método e técnica adequado para a produção do software é o tipo de aplicação que será desenvolvida. Existem diversos tipos de aplicações:
- Aplicações stand-alone: São aplicações executadas em um computador pessoal ou dispositivo móvel. Exemplo: Programas de desenho CAD.
- Aplicações interativas baseadas em transações: São aplicações executadas remotamente através de computadores, celulares e tablets. Exemplo: E-mails.
- Sistema de controle embarcado: Sistemas de controle de software que controlam e gerenciam hardware. Exemplo: Software de controle de freio ABS.
- Sistema de processamento em lotes (batch): Sistemas para o processamento de dados em grandes lotes. Exemplo: Sistema de folhas de pagamento.
- Sistemas de entretenimento: Sistemas para uso pessoal com objetivo de entreter o usuário. Exemplo Jogos de videogame.
- Sistemas para modelagem e simulação: Sistemas para modelar processos e simulações que incluem muitos objetos e que interagem. Exemplos sistemas de cálculos de engenharia.
- Sistemas de coleta de dados e análise: Sistemas que coletam dados e enviam para outros sistemas processarem. Exemplo: Sistemas meteorológicos.
- Sistemas de sistemas: Sistemas constituídos por vários outros sistemas. Exemplo: Sistemas ERP.
Além da grande diversidade já existente de aplicações, a constante evolução tecnológica faz com que novas aplicações surjam e que novas maneiras de projetar sejam necessárias, um grande marco nesse sentido foram as aplicações web que revolucionaram o mercado de software, no próximo tópico discutiremos com mais detalhes.
Engenharia de Software na Internet
A partir do desenvolvimento dos navegadores capazes de realizar processamento local e executar programas, uma revolução nos softwares corporativos e organizacionais se iniciou. Isso permitiu escrever um software para ser implementado diretamente em servidores web, sem a necessidade de uma instalação local. Essa revolução mudou completamente o cenário de software, agora as aplicações são altamente distribuídas, muitas vezes em escala global. Teve ainda, um impacto significativo na engenharia de software, alguns exemplos são:
- O reuso de software se tornou a principal abordagem através de componentes e dos sistemas já existentes.
- Se tornou um consenso que, especificar todos requisitos antes da produção é impraticável, tornando o processo de produção de sistemas web incremental.
- Implementação através de engenharia de software orientada a serviços, onde os componentes de um sistema web são desenvolvidos como serviços.
- Tecnologias como AJAX e HTML5 evoluíram para possibilitar interfaces dinâmicas através de navegadores web.
Ética na engenharia de Software
O engenheiro de software deve estar ciente que seu trabalho não está limitado a aplicação de habilidades técnicas. Um profissional de engenharia de software, assim como nas demais profissões também deve se comportar de forma ética e moral. Além dos padrões habituais como honestidade, integridade, alguns padrões não são delimitados por leis e o engenheiro de software profissional deve se atentar em alguns aspectos:
- Confidenciabilidade: a confidenciabilidade dos seus clientes ou empregadores deve ser respeitada.
- Competência: Não se deve aceitar trabalhos que estejam fora de sua competência.
- Direitos de propriedade intelectual: O profissional deve se manter atualizado com a legislação vigente e assegurar os direitos da propriedade intelectual dos seus empregadores ou clientes.
- Uso indevido do computador: por mais trivial que seja, não se deve tirar proveito dos conhecimentos técnicos para utilizar indevidamente os computadores de outras pessoas.
Questões de ética e moral muitas vezes nos levam a discussões filosóficas, que eu vou evitar entrar nessa publicação, porém, uma abordagem muito mais prática e focada está disponível no código de ética e prática profissional da engenharia de software, desenvolvido pela Association for Computing Machinery (ACM), Institute of Electrical and Electronic Engineers (IEEE) e British Computer Society (BCS).
Caso queira se aprofundar mais, o código de ética e prática profissional da engenharia de software está disponível em:
https://www.acm.org/code-of-ethics/software-engineering-code
Conclusão:
Em resumo esse capitulo aborda fundamentos da engenharia de software, a importância dos processos e qualidade no desenvolvimento. Ele dá embasamento para os próximos capítulos que veremos.
Todo conteúdo foi baseado no capítulo 1 do livro Engenharia de Software de Ian Sommerville.