Engenharia de Software

Conhecimentos de Base Recomendados

Conhecimentos de programação necessários para a escrita de testes unitários.

Métodos de Ensino

Nesta unidade curricular são utilizadas as seguintes metodologias de ensino:

1. Método expositivo: método explicativo onde fundamentos teóricos e conceitos são apresentados pelo docente e discutidos com a turma. Os conceitos e informações serão apresentados aos alunos através, por exemplo, de apresentações em slides ou discussões orais. Será utilizado nas aulas para a estruturação e esquematização da informação.

2. Método demonstrativo: baseia-se na exemplificação pelo docente de uma operação técnica ou prática que se deseja aprendida. Centra-se na forma como se executa uma dada operação, destacando as técnicas, as ferramentas e os equipamentos mais adequados. Será por exemplo utilizado em aulas práticas e laboratoriais.

3. Método interrogativo: processo que se fundamenta em interações verbais, sob a condução do docente, adotando o formato de questões e respostas. Permite obter maior dinâmica na aula e consolidar a aprendizagem. Será utilizado por exemplo para recordar elementos de aulas anteriores, e em revisões do conteúdo lecionado.

4. Métodos ativos: serão utilizadas técnicas pedagógicas em que o aluno é o centro do processo de aprendizagem, sendo um participante ativo e envolvido na sua própria formação. O docente assume o papel de facilitador, estimulando o pensamento crítico, a colaboração, a criatividade e a autonomia dos alunos. Serão aplicados nas aulas para alcançar um ambiente de aprendizagem dinâmico e mais duradouro.

Resultados de Aprendizagem

No final da unidade curricular o estudante ficará habilitado a:

1. Definir Engenharia de Software. Explicar a relação entre software e Engenharia de Software. Justificar a importância da qualidade do software. Demonstrar a necessidade da Engenharia de Software. Identificar os principais desafios na Engenharia de Software. Analisar como a qualidade do software afeta o custo e a satisfação do cliente. Analisar a ética e responsabilidade profissional na Engenharia de Software.

2. Explicar os processos de desenvolvimento de software. Comparar os processos guiados por planos com os ágeis. Sintetizar abordagens como cascata, prototipagem, incremental, espiral, e baseada em componentes. Analisar as implicações das diferentes abordagens de desenvolvimento em projetos reais. Identificar as atividades do processo de desenvolvimento.

3. Discutir os métodos ágeis e sua aplicabilidade. Sumarizar a framework Scrum e as práticas do eXtreme Programming. Comparar diferentes tipos de métodos ágeis. Discutir práticas ágeis num ambiente de desenvolvimento. Usar abordagens ágeis (e.g. Scrum, eXtreme Programming) em projetos específicos. Analisar os resultados obtidos ao aplicar métodos ágeis em projetos específicos.

4. Identificar as caracteristicas da Engenharia de Requisitos. Classificar requisitos como funcionais e não funcionais. Listar os atributos dos requisitos. Analisar a influência de diferentes atributos de requisitos na priorização e no esforço de desenvolvimento. Diferenciar requisitos de alto e baixo nível. Explicar as fases do processo de Engenharia de Requisitos. Indicar métodos de recolha de requisitos. Usar métodos de recolha de requisitos num projeto prático. Avaliar a importância da documentação na Engenharia de Requisitos.

5. Explicar o desenho de software. Comparar análise e desenho de software. Diferenciar desenho funcional e orientado a objetos. Explicar as atividades do desenho de software. Analisar diferentes níveis de abstração na arquitetura de software. Descrever os diferentes padrões de arquitetura. Comparar arquiteturas monolíticas e de microsserviços. Construir desenhos de arquitetura, classes/objetos, base de dados e interação com o utilizador. Analisar a eficácia de diferentes padrões arquiteturais em projetos específicos.

6. Identificar tipos de diagramas UML. Listar software utilizado para criar diagramas UML. Sintetizar características e relações em diagramas de casos de uso, classes, atividades, interação, estados, componentes e distribuição. Construir diagramas UML para representar diferentes aspectos de um sistema. Analisar a utilidade de diferentes tipos de diagramas UML em cenários específicos.

7. Explicar a importância dos testes de software. Diferenciar validação e deteção de defeitos. Comparar inspeções de software e testes de software. Descrever diferentes tipos de testes, incluindo unitários, de performance e funcionais. Relacionar diferentes fases de testes com o ciclo de vida do software. Implementar testes automatizados num projeto prático. Analisar a eficácia de diferentes tipos de testes de carga/stress na garantia da qualidade do software.

8. Definir a qualidade de software. Analisar o custo da qualidade e as abordagens de gestão da qualidade de software. Identificar padrões de software, métricas e revisões. Comparar abordagens simplistas e a abordagem Horch para o custo da qualidade. Construir um plano de qualidade para um projeto de software. Analisar a conformidade de um produto de software com os padrões de qualidade estabelecidos. Descrever as métricas utilizadas na qualidade de software. Identificar as principais caracteristicas das revisões e inspeções.

Programa

1. Introdução. Software. Especificação dos produtos. Qualidade do software. Engenharia de Software. Necessidade da Engenharia de Software. Principais desafios da Engenharia de Software. Custo do software. Ética e responsabilidade profissional.

2. Processos de desenvolvimento de software. Processos guiados por planos vs. Processos ágeis. Abordagem clássica em cascata. Modelo de protótipos. Abordagem incremental ou iterativa (e.g. Scrum, eXtreme Programming, Kanban, Lean). Modelo espiral. Abordagem baseada em componentes. Outras abordagens. As atividades do processo: especificação, design, implementação, teste.

3. Métodos ágeis de desenvolvimento de software. Aplicabilidade. Vantagens e desvantagens. Tipos de métodos ágeis. Scrum: sprints, produt backlog, product owner, scrum master, scrum team, sprint planning meeting, sprint backlog, daily scrum, sprint review meeting, sprint retrospective, burndown chart. eXtreme Programming: principios, práticas, requisitos (user stories), refactoring, testes, pair programming.

4. Engenharia de requisitos. Classificação: funcionais vs não funcionais. Atributos: prioridade (1-10, 1-5, MoSCoW), esforço, risco, duração, custo, perfil do utilizador. Níveis: alto nível, baixo nível. Condições de aceitação. Fases: levantamento, análise e documentação, especificação e documentação, validação e verificação. Software de gestão de requisitos. Métodos de recolha. Qualidade. Documentação: linguagem, casos de uso, user stories, user scenarios, protótipos, rich pictures.

5. Desenho de software. Análise vs. Desenho. Desenho funcional vs desenho orientado a objectos. Atividades de desenho de software. Desenho de arquitetura de software: níveis de abstração, representação da arquitetura, padrões de arquitetura (MVC – Model View Controller, por camadas, repositório, cliente-servidor), arquitetura monolítica vs microsserviços. Desenho de classes/objetos. Desenho de base de dados: MySQL (diagramas E-R), NoSQL (grafos). Desenho de interação com o utilizador: mockups, protótipos.

6. Unified Modeling Language (UML). Tipos de Diagramas. Software utilizado para criar diagramas UML. Diagramas de casos de uso: caracteristicas, relação “extend”, relação “include”, relação de generalização, pacotes. Diagramas de classes: objetos, classes (atributos, operações), relações entre classes, interfaces. Diagramas de actividades: nós, ações, fluxos, barra de sincronização, partições. Diagramas de interação: diagramas de sequência (actores, objetos, mensagens, barra de ativação, ciclos), diagramas de comunicação. Diagramas de estados: estados, eventos, transições, atividades, ações, objetivos. Diagramas de componentes. Diagramas de distribuição.

7. Testes de software. Validação vs deteção de defeitos. Inspeções de software vs testes de software. Testes unitários. Exemplos. Testes de performance. Testes funcionais com utilizadores: alfa, beta, aceitação. Testes baseados em cenários de utilização. Testes funcionais automatizados. Testes de regressão. Testes de carga/stress.

8. Qualidade de software. Custo da qualidade: abordagem simplista, abordagem Horch. Gestão da qualidade de software. Plano de qualidade. Processo de produção e qualidade dos produtos. Standards de software (ISO 9001, ISO/IEC 15504, ISO/IEC 27001, CMMI). Métricas. Revisões e inspeções.

Docente(s) responsável(eis)

Nuno Miguel Gil Fonseca

Métodos de Avaliação

Avaliação Periódica
  • - Trabalho Individual e/ou de Grupo - 60.0%
  • - Exame - 40.0%
Avaliação final
  • - Trabalho Individual e/ou de Grupo - 50.0%
  • - Exame - 50.0%

Estágio(s)

NAO

Bibliografia

Borges, J. L. M., Cunha, J. F., Dias, T. G. (2015). Modelação de dados em UML – uma abordagem por problemas. FCA.

Guerreiro, S. (2015). Introdução à engenharia de software. FCA.

Laboon, B. (2016).  A friendly introduction to software testing (1ª edição). CreateSpace Independent Publishing Platform.

Palhoto, T. (2016). Desenvolvimento ágil de software. FCA.

Sommerville, I. (2011). Engenharia de software  (9a edição). Addison Wesley.