Objetivos de aprendizagem e a sua compatibilidade com o método de ensino (conhecimentos, aptidões e competências a desenvolver pelos estudantes)
OA1. Compreender os conceitos e técnicas da programação concorrente, paralela e distribuída. OA2. Saber como solucionar os aspectos críticos de uma aplicação concorrente. OA3. Desenvolver programas multitarefa e com modelos de programação assíncrona. OA4. Explorar as linguagens modernas para desenvolvimento de programas concorrentes (como Go, Scala, Rust, Java, e Python).
Conteúdos programáticos
CP1. Modelos de paralelismo (bit, instrução, dados, tarefas)
CP2. Programação paralela vs programação concorrente vs programação distribuída
CP3. Programação concorrente
CP3.1. Controlo de permissões
CP3.2. Troca de mensagens
CP3.3. O modelo de atores
CP4. Programação multitarefa
CP4.1. Conceito de thread
CP4.2. Comutação do contexto de execução, partilha de dados e os respetivos problemas
CP4.3. Sincronização no acesso aos dados
CP5. Modelos e mecanismos de programação assíncrona
CP6. Processamento distribuído
CP6.1. Fiabilidade, escalabilidade e manutenção de aplicações
CP6.2. Dados distribuídos: partição e replicação, transações, e consistência
Demonstração da coerência dos conteúdos programáticos com os objetivos de aprendizagem da unidade curricular
O objetivo OA1 é transversal a todos os conteúdos programáticos, visto que todos abordam conceitos e técnicas de programação concorrente, paralela e/ou distribuída. O objetivo OA2 é coberto pelos conteúdos CP2, CP3, CP4, e CP5, já que estes abordam diferentes estratégias de programação concorrente. O objetivo OA3 é coberto pelos conteúdos CP4 e CP5 visto que estes abordam, respetivamente, estratégias de programação multitarefa e assíncrona. Por fim, o objetivo OA4 é coberto pelos conteúdos CP3, CP4, e CP5, já que estes exploram linguagens modernas como Go, Rust ou Python.
Metodologias de ensino e de aprendizagem específicas da unidade curricular articuladas com o modelo pedagógico
As aulas são de cariz teórico-prático, combinando uma exposição teórica dos conceitos para enquadramento com os conteúdos. Os alunos desenvolvem uma aprendizagem baseada em problemas onde exploram a utilização de diferentes modelos de programação e avaliam vantagens e desvantagens de cada modelo em termos de desempenho, escalabilidade, complexidade de implementação e tolerância a falhas.
Avaliação
A avaliação contínua inclui a realização de três trabalhos práticos e uma prova escrita individual, com uma ponderação respetiva de 60% (A2 & A3 & A4) e 40% (A1):
A1 - Teste individual (40%)
A2 - Trabalho de programação concorrente com apresentação (20%)
A3 - Trabalho de programação multitarefa com apresentação (20%)
A4 - Trabalho de modelos de programação assíncrona com apresentação (20%)
Em alternativa, na avaliação contínua existe a possibilidade de substituir os componentes A1, A2, A3 e A4 pela produção de um artigo científico. O artigo deve estar alinhado com os temas da unidade curricular e seguir os padrões de publicação científica, seguindo as etapas:
(1) Proposta para o tema:
Problema de estudo.
Questão de pesquisa.
Abordagem metodológica
(2) Aprovação e Orientação:
O professor analisará as propostas e fornecerá feedback e orientação.
Serão disponibilizados artigos e exemplos para auxiliar na elaboração do artigo.
(3) O artigo deve seguir uma estrutura científica: (i) Título; (ii) Resumo; (iii) Introdução; (iv) Metodologia; (v) Resultados/Análise; (vi) Conclusão; (vii) Referências
(4) Avaliação:
O artigo será avaliado com base na relevância do tema, rigor metodológico, clareza da escrita e contribuição para a área de estudo, bem como potencialidade de publicação
Os alunos em avaliação contínua que não obtenham a nota mínima de 8,5 valores no teste individual e de 10 valores em cada um dos três trabalhos serão remetidos para exame final. O artigo que não obter nos critérios de avaliação uma nota superior ou igual a 9.5 será remetido para avaliação final.
Demonstração da coerência das metodologias de ensino e avaliação com os objetivos de aprendizagem da unidade curricular
Demonstração da coerência das metodologias de ensino e avaliação com os objetivos de aprendizagem da unidade curricular Aulas Teórico-Práticas:
A combinação da exposição teórica com atividades práticas garante que os alunos não apenas compreendam os conceitos (OA1), mas também saibam aplicá-los (OA2, OA3, OA4)
A parte teórica fornece as bases necessárias para compreender os modelos de programação, enquanto a parte prática permite a exploração e experimentação com linguagens e técnicas modernas.
Aprendizagem Baseada em Problemas (PBL):
O PBL permite alcançar os objetivos como a análise e comparação de diferentes modelos de programação (OA1), a resolução de problemas de concorrência (OA2) e o desenvolvimento de soluções robustas (OA3).
Ao explorar as vantagens e desvantagens de cada modelo, os alunos desenvolvem um entendimento profundo das implicações de design e das escolhas de implementação.
Explorar as linguagens modernas para desenvolvimento de programas concorrentes (OA4) é conseguido através da necessidade dos alunos em implementarem soluções para problemas
Consistência com o Modelo Pedagógico:
A metodologia de ensino descrita promove a aprendizagem ativa, onde os alunos são desafiados a aplicar seus conhecimentos em situações práticas
O modelo pedagógico que valoriza a autonomia, a capacidade de resolver problemas e habilidades de pensamento crítico
Coerência entre Avaliação e Objetivos de Aprendizagem:
Teste Individual (A1 - 40%): O teste escrito avalia a compreensão dos conceitos teóricos (OA1), garantindo que os alunos tenham uma base conceptual.
Trabalhos práticos com apresentação (A2, A3, A4 - 60%) permitem: (1) avaliar a capacidade dos alunos em aplicar conhecimentos adquiridos na resolução de problemas (OA2, OA3, OA4) e (2) que os alunos comuniquem as soluções, demonstrando sua capacidade de síntese e análise
Bibliografia de consulta (existência obrigatória)
Butcher, P. (2014). Seven Concurrency Models in Seven Weeks: When Threads Unravel (The Pragmatic Programmers). Pragmatic Bookshelf.
Fowler, M. (2022b). Python Concurrency with Asyncio. Manning.
Kleppmann, M. (2017). Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems. O'Reilly Media.