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.
 
 
- É a ciência/arte/profissão de adquirir e aplicar conhecimentos para o desenvolvimento de softwares.
 
- 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.
 
- Nova, se comparada a Engenharia Civil por exemplo.
 - Está em evolução (vide o livro do Pressman).
 
- Á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.
 
 
- 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.
 
- 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.
 
- Software life cycle process.
 - Ajuda a escolher o processo de desenvolvimento.
 - Padrão que define as tarefas necessárias para desenvolver o software.
 
- 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.
 
- 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)
 
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.
 
- 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.
 
- 
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 
- Trello
 
- 1: Escreva um teste que falhe.
 - 2: Faça o código funcionar.
 - 3: Refatore. Elimine redundância.
 
- 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
 
 
 
- 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.
 
- 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).
 
- 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.
 
- 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
 
 
 
- 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
 
 
 - Waterfall
 - 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.
 
- 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.
 
- 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.
 
 
- 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.