Conhecimentos de Base Recomendados
Recomenda-se domínio de programação estruturada e orientada a objetos, algoritmos, estruturas de dados, bases de dados relacionais, desenvolvimento de aplicações web e princípios de engenharia de software.
Recomenda-se a conclusão prévia das unidades curriculares de Fundamentos de Programação, Estruturas de Dados, Programação, Programação Aplicada, Base de Dados I e II, Programação para a Internet I e II, e Engenharia de Software. Estas recomendações não constituem precedências formais.
São igualmente recomendadas a utilização básica de Git, a familiaridade com ambientes GNU/Linux e a capacidade de leitura de documentação técnica em inglês.
Métodos de Ensino
Nesta unidade curricular são utilizadas as seguintes metodologias de ensino:
- 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 estudantes 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.
- 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.
- 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á utilizada por exemplo para recordar elementos de aulas anteriores, e em revisões do conteúdo lecionado.
- Métodos ativos: serão utilizadas técnicas pedagógicas em que o estudante é 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 estudantes. 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:
- Planear o desenvolvimento de aplicações informáticas. Especificar requisitos, contratos de dados, critérios de aceitação e uma arquitetura modular adequada.
- Desenvolver código Python legível, modular e documentado. Avaliar criticamente soluções produzidas com assistência de inteligência artificial. Efetuar revisão, testes e correção fundamentada.
- Gerir colaborativamente a evolução de software. Utilizar controlo de versões, revisão por pares e rastreabilidade das alterações e decisões técnicas.
- Selecionar algoritmos e estruturas de dados. Justificar a sua adequação através da análise de complexidade e de medições de desempenho reproduzíveis.
- Preparar ambientes de execução reproduzíveis. Disponibilizar aplicações em contentores. Comparar alternativas de virtualização, orquestração e computação serverless.
- Integrar dispositivos e serviços na aquisição e no processamento de dados temporais. Implementar um modelo digital sincronizado com observações, destinado à monitorização e à simulação de cenários.
- Desenvolver aplicações e serviços com Django. Integrar persistência, interfaces de programação de aplicações (API) e componentes próprios e de terceiros.
- Identificar vulnerabilidades. Mitigar vulnerabilidades recorrendo a práticas de programação segura, controlo de acesso, proteção de credenciais e análise de dependências.
- Avaliar a correção, a robustez e a qualidade das soluções. Realizar testes automatizados, métricas e validação experimental de resultados e modelos.
- Automatizar a integração e a disponibilização de aplicações. Demonstrar procedimentos de monitorização e recuperação de versões. Produzir documentação que permita a sua utilização e manutenção por terceiros.
Programa
- Planeamento e estruturação de aplicações informáticas. Análise de problemas e especificação de requisitos funcionais e não funcionais. Contratos de dados e critérios de aceitação. Decomposição modular e separação de responsabilidades. Aplicação de metodologias de desenvolvimento incremental. Representação arquitetural com UML e modelo C4. Planeamento de entregas e registo de decisões técnicas.
- Boas práticas de programação e documentação técnica. Programação modular em Python: organização de pacotes, anotações de tipos, tratamento de exceções e gestão de recursos. Convenções de codificação, refatorização e documentação e código e de API. Programação assistida por inteligência artificial generativa: análise crítica de vibe coding, especificação de tarefas, revisão e validação de resultados, rastreabilidade, autoria e licenciamento.
- Sistemas de controlo de versões. Gestão de repositórios locais e remotos com Git. Ramificação, integração de alterações e resolução de conflitos. Pedidos de integração e revisão de código. Organização de versões. Rastreabilidade entre requisitos, código, testes e entregas. Colaboração e responsabilização individual.
- Complexidade, algoritmos e estruturas de dados. Análise de complexidade temporal e espacial. Seleção e comparação de algoritmos de ordenação e pesquisa. Aplicação de listas, árvores, tabelas de dispersão e filas ao processamento de dados e eventos. Agregação por janelas temporais. Medição de desempenho, identificação de limitações e otimização fundamentada.
- Virtualização, contentorização e computação serverless. Comparação entre máquinas virtuais e contentores. Construção de imagens e execução de serviços com Docker e Docker Compose. Configuração, persistência e gestão de dependências. Disponibilização de aplicações no Raspberry Pi. Introdução aplicada à orquestração com Kubernetes e à execução de funções serverless.
- Sistemas de monitorização e processamento de dados temporais. Integração aplicacional de dispositivos da Internet das Coisas (IoT). Aquisição de dados através de sensores e gateways LoRaWAN, utilizando The Things Stack. Receção de eventos por MQTT. Descodificação, normalização, validação, tratamento, visualização e armazenamento dos dados. Modelos digitais, sombras digitais e gémeos digitais: representação de estado, sincronização com observações, implementação de modelos dinâmicos simples e simulação de cenários. Validação dos resultados, comparação com modelos de referência..
- Criação e reutilização de código próprio e de terceiros. Organização de aplicações Django: modelos de dados, vistas e modelos de apresentação. Persistência, migrações e transações. Desenvolvimento e documentação de API REST. Integração de consumidores de eventos e serviços externos. Seleção, reutilização e atualização controlada de bibliotecas e pacotes.
- Segurança de software. Identificação de ativos e fronteiras de confiança. Autenticação, autorização e princípio do menor privilégio. Validação de entradas e mitigação de vulnerabilidades, incluindo injeção SQL, XSS e CSRF. Proteção de credenciais e informação sensível. Análise de código e de dependências. Revisão de segurança de código gerado por inteligência artificial.
- Qualidade e testes de software. Testes unitários, funcionais, de integração, de regressão e de desempenho. Desenvolvimento orientado por testes. Isolamento de dependências e preparação de dados de teste. Reprodução de eventos e injeção controlada de falhas. Cobertura de testes, complexidade ciclomática e interpretação de métricas. Validação experimental de modelos e comparação de soluções.
- Disponibilização e manutenção de sistemas informáticos. Integração e entrega contínuas. Automatização da construção, dos testes e da disponibilização. Configuração de ambientes de desenvolvimento e execução. Estratégias de atualização e recuperação de versões. Registos estruturados, indicadores operacionais e diagnóstico de falhas. Documentação de instalação, operação e manutenção.
Docente(s) responsável(eis)
José António dos Santos Fernandes MonteiroMétodos de Avaliação
No que diz respeito à avaliação, estrão previsto os seguintes métodos:
1. Avaliação periódica
Classificação Final = testes (10/20) + trabalhos laboratoriais (10/20)
A componente de testes compreende dois testes individuais, com igual ponderação. O primeiro realiza-se durante o período letivo e o segundo na data do exame da época normal.
- a) A aprovação na unidade curricular exige uma classificação mínima de 45%, sem arredondamento, em cada uma das duas componentes agregadas de avaliação, correspondendo a 9 valores numa escala de 0 a 20, e uma classificação final mínima de 10 valores, após arredondamento à unidade.
- b) A realização dos trabalhos laboratoriais envolve a entrega de relatórios técnicos, código e evidências de validação através da plataforma de gestão académica (InforEstudante), com identificação inequívoca da versão do repositório, e a respetiva defesa, com classificação individual.
- c) Os trabalhos laboratoriais, incluindo as verificações práticas individuais, são realizados exclusivamente durante o período de aulas.
- d) A realização dos testes e das defesas dos trabalhos laboratoriais depende da inscrição prévia através da plataforma de gestão académica.
2. Avaliação por exame (época normal, época de recurso e época especial)
Classificação Final = exame (10/20) + trabalhos laboratoriais (10/20)
O exame é individual, abrange o programa da unidade curricular e substitui integralmente a componente de testes.
- a) A aprovação na unidade curricular exige uma classificação mínima de 45%, sem arredondamento, em cada uma das componentes agregadas de avaliação, correspondente a 9 valores numa escala de 0 a 20, uma classificação final mínima de 10 valores, após arredondamento à unidade.
- b) A realização dos trabalhos laboratoriais envolve a entrega de relatórios técnicos, código e evidências de validação através da plataforma de gestão académica (InforEstudante), com identificação inequívoca da versão do repositório, e a respetiva defesa, com classificação individual.
- c) Os trabalhos laboratoriais, incluindo as verificações práticas individuais, são realizados exclusivamente durante o período de aulas. A respetiva classificação mantém-se válida nas épocas de exame do mesmo ano letivo.
- d) A realização do exame e das defesas dos trabalhos laboratoriais depende de inscrição prévia através da plataforma de gestão académica.
Disposições comuns às duas modalidades
A componente de trabalhos laboratoriais integra três entregas, com ponderações 5%, 10% e 15% na classificação final, respetivamente; duas verificações práticas individuais, com ponderação 5% cada; e uma defesa com classificação individual, com ponderação de 10%. Esta componente representa, no total, 50% da classificação final.
Os mínimos de classificação aplicam-se exclusivamente às componentes agregadas (testes ou exame e trabalhos laboratoriais), não sendo exigidos mínimos adicionais em cada teste, entrega, verificação prática ou defesa. A calendarização, os critérios de aceitação e as rubricas de avaliação são divulgados previamente.
Não é permitida assistência de inteligência artificial generativa nos testes, exames, verificações práticas individuais ou defesa. Nos trabalhos laboratoriais, a sua utilização é admitida mediante identificação da ferramenta e da finalidade, registo das contribuições relevantes e apresentação de evidências de revisão e validação. O estudante é responsável pelo código e pela documentação apresentados.
Estágio(s)
NAO
Bibliografia
Chacon, S., & Straub, B. (2014). Pro Git (2nd ed.). Apress.
Cormen, T. H., Leirserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to algorithms (4th ed.). MIT Press.
Denny, P., Prather, J., Brecker, B. A., Finnie-Ansley, J., Hellas, A., Leinonen, J., Luxton-Reilly, A., Reeves, B. N., Santos, E. A., & Sarsa, S. (2024). Computing education in the era of generative AI. Communications of the ACM, 62(2) 56-67. DOI: 10.1145/3624720.
Django Software Foundation. (n.d.). Django documentation (version 5.2). https://docs.djangoproject.com/en/5.2/.
Docker, Inc. (n.d.). Docker documentation. https://docs.docker.com/.
Percival, H. J. W. (2025). Test-driven development with Python (3rd ed.). O’Reilly Media.
Ramalho, L. (2022). Fluent Python (2nd ed.). O’Reilly Media.
Raspberry Pi Ltd. (n.d.). Raspberry Pi documentation. https://www.raspberrypi.com/documentation/.
Semeraro, C., Lezoche, M., Panetto, H., & Dassisti., M. (2021). Digital twin paradigm: A systematic literature review. Computers in Industry, 130, Article 103469. DOI: 10.1016/j.compind.2021.103469.
The Things Industries. (n.d.). The Things Stack documentation. https://www.thethingsindustries.com/docs/.