Engenharia de Software

Introdução Histórica

A Engenharia de Software surgiu como resposta à chamada "Crise do Software" em 1968, quando a NATO organizou a primeira conferência sobre o tema. A incapacidade de gerenciar a crescente complexidade dos sistemas levou à necessidade de abordagens mais sistemáticas.

Evolução da Disciplina

  • Década de 1950-60: Programação artesanal, sem metodologias formais
  • 1968: Conferência da NATO marca o nascimento da Engenharia de Software
  • 1970-80: Surgimento de metodologias estruturadas
  • 1990: Popularização da orientação a objetos
  • 2000: Movimento ágil e metodologias leves
  • 2010-presente: DevOps, microsserviços e engenharia de IA

Conceitos Fundamentais

Engenharia de Software é a aplicação de uma abordagem sistemática, disciplinada e quantificável ao desenvolvimento, operação e manutenção de software.

Engenharia de Software vs Ciência da Computação

Enquanto a Ciência da Computação foca em teoria e algoritmos, a Engenharia de Software aplica esses conhecimentos para construir sistemas úteis de forma eficiente e confiável.

Tipos de Produtos de Software

  • Genéricos: Desenvolvidos para mercado amplo (Windows, Photoshop)
  • Personalizados: Desenvolvidos para cliente específico (sistemas bancários)

Atributos do Bom Software

  • Manutenibilidade
  • Confiabilidade
  • Eficiência
  • Usabilidade
  • Escalabilidade

Processos de Software

Modelos Tradicionais

Modelo Características Quando Usar
Cascata Fases sequenciais rígidas, documentação extensa Requisitos bem definidos e estáveis
Incremental Entrega por incrementos funcionais Quando se pode priorizar funcionalidades
Espiral Riscos avaliados em ciclos iterativos Projetos complexos com alto risco
RUP Processo Unificado com 4 fases (iniciação, elaboração, construção, transição) Projetos grandes e complexos

Atividades Fundamentais

Especificação

Definição dos requisitos e funcionalidades do sistema

Desenvolvimento

Projeto e implementação do software

Validação

Testes para garantir que atende aos requisitos

Evolução

Manutenção e adaptação a novas necessidades

Engenharia de Requisitos

Tipos de Requisitos

Funcionais

O que o sistema deve fazer (cadastrar usuário, gerar relatório)

Não-Funcionais

Restrições e qualidades do sistema (performance, segurança, usabilidade)

Técnicas de Elicitação

  • Entrevistas: Diretas com stakeholders
  • Workshops: Reuniões colaborativas (ex: JAD)
  • Prototipação: Versões preliminares para feedback
  • Casos de Uso: Cenários de interação com o sistema
  • Observação: Análise do ambiente de trabalho dos usuários
  • Questionários: Para coletar informações de muitos usuários

Documentação de Requisitos

O documento de requisitos (SRS) deve incluir:

  • Propósito e escopo do sistema
  • Descrição geral (perspectiva do produto, funções, classes de usuários)
  • Requisitos específicos (funcionais, interfaces, performance, etc.)
  • Restrições e dependências

Modelagem de Sistemas

Diagramas UML

Casos de Uso

Interações entre atores e sistema

Classes

Estrutura estática do sistema

Sequência

Interações temporais entre objetos

Atividades

Fluxos de trabalho e processos

Arquitetura 4+1 Visões

  • Lógica: Componentes e relacionamentos (diagramas de classes)
  • Processo: Fluxo de execução e concorrência
  • Desenvolvimento: Organização de módulos no ambiente de desenvolvimento
  • Física: Mapeamento para hardware e infraestrutura
  • Cenários: Casos de uso que ilustram as outras visões

Projeto de Arquitetura

Padrões Arquiteturais

MVC (Model-View-Controller)

Separação entre dados, interface e lógica

Camadas

Hierarquia de responsabilidades (apresentação, negócio, dados)

Cliente-Servidor

Separação entre provedor e consumidor de serviços

Microsserviços

Sistema como serviços independentes e especializados

Decisões Arquiteturais

Baseadas em requisitos não-funcionais:

  • Desempenho: Cache, balanceamento de carga
  • Segurança: Camadas de autenticação, criptografia
  • Disponibilidade: Redundância, failover
  • Manutenibilidade: Baixo acoplamento, alta coesão
  • Escalabilidade: Horizontal vs vertical

Tendências Modernas

  • Arquitetura Limpa: Separação clara de responsabilidades
  • Domain-Driven Design: Foco no domínio do negócio
  • Event Sourcing: Armazenamento de eventos como fonte da verdade
  • CQRS: Separação de comandos e consultas
  • Serverless: Foco em funções sem gerenciamento de infraestrutura

Métricas e Qualidade

Métricas de Software

  • Tamanho: Linhas de código, pontos de função
  • Complexidade: Ciclomática, acoplamento/coesão
  • Qualidade: Defeitos por KLOC, cobertura de testes
  • Produtividade: Linhas/ponto de função por hora

Garantia de Qualidade

  • Revisões: Inspeções, walkthroughs
  • Testes: Unitários, integração, sistema, aceitação
  • Padrões: ISO 9001, CMMI, MPS.BR
  • Automação: CI/CD, análise estática