Você está na página 1de 10

23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

Instantly share code, notes, and snippets.

cassiocardoso / resumo-ess.md
Last active 5 months ago

Star

Code Revisions 7 Stars 8 Forks 2

Resumo - Engenharia de Software

resumo-ess.md

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?

https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 1/10
23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

É 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
https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 2/10
23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

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:
https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 3/10
23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

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

https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 4/10
23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

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

https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 5/10
23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

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
https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 6/10
23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

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.

https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 7/10
23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

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.
https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 8/10
23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

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.

https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 9/10
23/05/2023, 08:15 Resumo - Engenharia de Software · GitHub

https://gist.github.com/cassiocardoso/24df19616ebf1150ac4a 10/10

Você também pode gostar