Skip to content

Instantly share code, notes, and snippets.

@cassiocardoso
Last active December 14, 2023 21:31
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save cassiocardoso/24df19616ebf1150ac4a to your computer and use it in GitHub Desktop.
Save cassiocardoso/24df19616ebf1150ac4a to your computer and use it in GitHub Desktop.
Resumo - Engenharia de Software

Engenharia de Software

Plano de ensino:

  • Ementa

    • Discute as disciplinas da engenharia de software dando maior ênfase nas áreas do conhecimento mais relevantes para o desenvolvimento de aplicações web, como requisitos não-funcionais, arquitetura, testes e qualidade de software, evolução e entrega contínua.
    • A disciplina apresenta o modelo de referência da ISO 25.000 para a qualidade de software, bem como o uso de modelos ágeis para dar suporte ao dinamismo das aplicações web.
  • Objetivos

    • Entender características do software e de seu ciclo de vida
    • Adquirir conhecimento sobre técnicas para construção de software, englobando modelagem orientada a objetos, definição de arquitetura de software, integração e entrega contínua.

Aula 01: Apresentação da Engenharia de software

O que é a Engenharia de Software?

  • É a ciência/arte/profissão de adquirir e aplicar conhecimentos para o desenvolvimento de softwares.

Por quê utilizar a engenharia de software?

  • Nos últimos anos o hardware deixou de ser o item mais caro na implementação de um sistema, enquanto que o custo relacionado ao software cresceu e se tornou o principal item no orçamento da computação.
  • Isso se deve principalmente pela crescente complexidade dos problemas a serem resolvidos pelos softwares. Sistemas como os de gestão hospitalar e sistemas de PEP chegam a possuir milhões de linhas de código e envolvem vários especialistas para o seu desenvolvimento.
  • Aliado a isso, alguns problemas inerentes ao processo de desenvolvimento de um software começaram a surgir 1 : as estimativas de prazo e de custo freqüentemente são imprecisas, a produtividade das pessoas da área de software não tem acompanhado a demanda por seus serviços e, a qualidade de software às vezes é menos que adequada, ocorrendo muito freqüentemente a insatisfação do usuário.
  • A chave para se vencer esses problemas e dificuldades acima relatados é a larga utilização de uma abordagem de engenharia ao desenvolvimento de software, aliada a uma contínua melhoria das técnicas e ferramentas no intuito também de melhorar a produtividade da equipe.

Características da Engenharia de software

  • Nova, se comparada a Engenharia Civil por exemplo.
  • Está em evolução (vide o livro do Pressman).

SWEBOK v3.0 - Software Engineering Body of Knowledge

  • Áreas do conhecimento
    • Requisitos
    • Design (projeto)
    • Construção
    • Testes
    • Manutenção
    • Gestão de configuração
    • Gestão de engenharia
    • Processos
    • Modelos e métodos
    • Qualidade
    • Prática profissional
    • Economia
    • Fundamentos: computacionais; matemáticos; de engenharia.

ISO 25000

  • Conjunto de normas (modelo de referência) que devem ser seguidas para garantir a qualidade do software.
  • Mostra quais requisitos devem ser cumpridos, porém não mostra como.

Aula 02: Processos de desenvolvimento de software

  • Processo
    • Sucessão sistemática de mudanças numa direção definida.
    • Série de ações sistemáticas visando certo resultado.
    • Série de ações que ocorrem de uma maneira determinada.
  • Framework
    • Armação de uma construção.
  • Desenvolvimento
    • Crescimento ou expansão gradual.
    • Passagem gradual de um estágio inferior a um mais aperfeiçoado.
  • Melhoria é o objetivo. Mudança é o caminho.
  • Processo de desenvolvimento é uma das disciplinas da engenharia de software.

ISO/IEC 12207

  • Software life cycle process.
  • Ajuda a escolher o processo de desenvolvimento.
  • Padrão que define as tarefas necessárias para desenvolver o software.

Por quê se preocupar com isso?

  • Sempre que um software recebe atualizações, novos defeitos são encontrados. Isso faz com que o software se distancie cada vez mais da curva ideal.
  • O custo de correção de defeitos cresce exponencialmente durante o processo de desenvolvimento. Um defeito descoberto na fase de requisitos e resolvido logo em seguida, tem um custo muito menor do que um que foi descoberto na fase de requisitos, mas só foi corrigido na fase de construção do software.

Processos existentes

  • Alguns dos processos de desenvolvimento de softwares existentes no mercado:
  • Waterfall (cascata)
  • Prototipação
  • RUP (Rational Unified Process)
  • XP (Extreme Programming)
  • Scrum
  • Kanban
  • FDD (Feature-driven Development)
  • TDD (Test-driven Development)
  • BDD (Behavior-driven Development)
  • DDD (Domain-driven Development)

Waterfall

System requirements <-> Software requirements <-> Analysis <-> Program design <-> Coding <-> Testing <-> Operations

  • Os processos são seguidos um após o outro.
  • A entrega é feita somente no final do processo de desenvolvimento.

RUP

  • 4 fases: iniciação, elaboração, construção, transição.
  • 9 disciplinas: modelagem de negócio, requisitos, análise e design, implementação, testes, implantação, gestão de configuração, gestão de projeto, ambiente.
  • 5 macro papéis: analistas, desenvolvedores, testadores, gerentes e adicionais.
  • 33 papéis.
  • 75 artefatos.

Modelo V

  • O Modelo V (V Model - em inglês) é a representação gráfica do ciclo de vida de um software. Ele contém os principais passos a serem feitos durante o processo, bem como as entregas esperadas em cada uma das etapas.

      Especificação de requisitos ------------> Teste de aceitação
           Projeto de alto nível --------> Teste de sistema
             Projeto detalhado ----> Teste de aceitação
                  Codificação --> Teste de unidade
    

Lean/Kanban

  • Trello

TDD

  • 1: Escreva um teste que falhe.
  • 2: Faça o código funcionar.
  • 3: Refatore. Elimine redundância.

XP

  • O objetivo do XP (Extreme Programming) é fazer com que as pessoas escrevam código de mais qualidade de uma maneira mais produtiva.
  • O XP possui 12 práticas, que estão agrupadas em 4 áreas:
  • Fine-scale feedback
    • Pair programming
    • Planning game
    • TDD
    • Whole team
  • Continuous process
    • Continuous integration
    • Refactoring or design improvement
    • Small releases
  • Shared understanding
    • Coding standards
    • Collective code ownership
    • Simple design
    • System metaphor
  • Programmer welfare
    • Sustainable pace
    • Coding
      • The customer is always available
      • Code the unit test first
      • Only one pair integrates code at a time
      • Leave optimization until last
      • No overtime
    • Testing
      • All code must have unit tests
      • All code must pass all unit tests before it can be released
      • When a bug is found tests are created before the bug is addressed (a bug is not an error in logic, it is a test that was not written)
      • Acceptance tests are run often and the results are published

Scrum

  • Framework para desenvolvimento ágil.
  • Backlog do produto.
  • Backlog do sprint.
  • Sprints curtos (1 a 4 semanas).
  • Reuniões diárias.
  • Entrega ao final de cada sprint.

Requisitos não-funcionais para aplicações Web

  • Requisito
    • Condição a que se deve satisfazer para que uma coisa fique legal e regular.
    • Exigência imprescindível para a consecução de certo fim.
  • Existe uma disciplina específica apenas para requisitos: Engenharia de Requisitos
  • IEEE 830: Norma para especificação de requisitos de software.
  • Requisitos funcionais: Definem o comportamento e funções específicas (pedidos do cliente).
  • Requisitos não-funcionais: Como o software fará algo, não o que fará (obrigações implícitas).

Principais requisitos não-funcionais para a web

  • Confiabilidade: Fluxo de navegação; completar a transação.
  • Desempenho: Tempo de resposta.
  • Disponibilidade: Estar online sempre, 24x7.
  • Gestão de configuração (time-to-market): Controle de entrega; implantação.
  • Segurança: Manter a integridade de informações e dados. Negar acesso e alterações a pessaos/sistemas não autorizados.
  • Portabilidade
  • Usabilidade: Possuir efetividade e eficiência e ser atrativo para o usuário realizar determinadas ações.

Aula 03: Projeto (design) de software

  • Conceitos
    • Design: Concepção de um projeto ou modelo; planejamento.
    • Projeto: Plano para a relaização de um ato.
  • Comunicar as informações de design para as partes interessadas (stakeholders).
  • IEEE 1016-2009 - SDD - Software Design Descriptions
  • Padrões de projeto (design patterns)
    • Solução geral
    • Reutilizável
    • Resolve um problema que ocorre com frequência
    • Contexto determinado
    • Exemplos:
      • MVC - Model-View-Controller
      • ORM - Object Relational Mapping
      • Page Controller
      • Singleton
      • Facade
  • Zachman Framework
    • What: O que será feito (etapas).
    • Where: Onde será feito (local).
    • Who: Por quem será feito (responsabilidade).
    • When: Quando será feito (tempo).
    • Why: Por que será feito (justificativa).
    • How: Como será feito (método).
    • How much: Quanto custará fazer (custo).
  • WAAF - Web Application Architecture Framework
  • UML - Unified Modeling Language
    • Linguagem de comunicação entre as partes interessadas
    • Ferramenta de modelagem de aplicações
    • Diagramas mais comuns:
      • Classe
      • Sequência
      • Atividades
      • Estado
      • Deployment

Aula 04: Teste de software

  • Conceitos:
    • Erro: engano, erro humano.
    • Defeito: produto do erro, bug.
    • Falha: resultado do defeito, bug em produção.
    • Verificação: atendimento aos requisitos.
    • Validação: cumprimento da finalidade.
  • Métodos:
    • Estático: revisão, inspeção (verificação).
    • Dinâmico: casos de teste executados (validação).
    • Caixa branca: testes internos (desenvolvedor).
    • Caixa cinza: testes externos com conhecimentos internos (cálculos, estrutura de dados, algoritmos, etc).
    • Caixa preta: testes externos (usuários).
  • Níveis de teste:
    • Unitário: menor unidade testável do software.
    • Integração: funcionamento das unidades em conjunto.
    • Interface: troca de informações entre módulos.
    • Sistema: teste de aceitação, visão usuário-requisito.
  • Tipos de teste:
    • Regressão
    • Aceitação
    • Usabilidade
    • Concorrência
    • Alpha, Beta
  • Processo de teste:
    • Waterfall
      • Célula de testadores
      • No fim do processo
      • Antes de entregar para o cliente
    • Agile ou XP
      • Suporte via TDD
      • Integração contínua
  • Artefatos de teste:
    • Plano de testes
    • Matriz de rastreabilidade (requisito vs caso de teste)
    • Suite de testes
    • Caso de teste
    • Script de teste
    • Dados de teste
  • Ferramentas: Selenium, Simpletest, JUnit, QUnit, Testlink, JMeter.
  • Integração contínua: É o termo utilizado para designar um conceito surgido com o desenvolvimento ágil onde o desenvolvedor integra o código alterado ao projeto principal com uma grande frequência. Por isso, atualmente, esse processo pode ocorrer diversas vezes ao dia, ao invés de uma única vez.

Aula 05: Qualidade de software e ISO 25.000

  • O modelo de qualidade de software determina quais características serão levadas em consideração durante a avaliação do produto final.
  • A qualidade de um sistema é o grau em que o sistema satisfaz as necessidades explícitas e implícitas de seus diversos públicos, e, portanto, fornece valor.

Principais métricas (ISO 25.010)

  • Adequação funcional
    • Completude; exatidão; apropriada.
  • Eficiência do desempenho
    • Comportamento de tempo; Uso de recursos; Capacidade.
  • Compatibilidade
    • Co-existência; Interoperabilidade.
  • Usabilidade
    • Habilidade apropriada de reconhecimento; Aprendizado; Operação.
    • Proteção contra erros de usuário.
    • Estética de interface de usuário.
    • Acessiblidade.
  • Confiabilidade
    • Maturidade; Disponibilidade; Tolerância a falhas; Recuperabilidade.
  • Manutenibilidade
    • Modularidade; Reusabilidade; Analisabilidade; Modificabilidade; Testabilidade.
  • Portabilidade
    • Adaptabilidade, Instabilidade, substituível.

Aula 06: Integração de sistemas


Aula 07: DevOps - Development & Operations

  • Termo cunhado em 2008/2009.
  • Também conhecido como entrega contínua (continuous delivery).
  • Integração entre o desenvolvimento e infraestrutura de TI.
  • Busca suavizar as transições entre os ambientes de desenvolvimento, homologação e produção.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment