Laboratório de Programação

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:

  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 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.
  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á utilizada 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 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:

  1. Planear o desenvolvimento de aplicações informáticas. Especificar requisitos, contratos de dados, critérios de aceitação e uma arquitetura modular adequada.
  2. 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.
  3. 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.
  4. 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.
  5. Preparar ambientes de execução reproduzíveis. Disponibilizar aplicações em contentores. Comparar alternativas de virtualização, orquestração e computação serverless.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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..
  7. 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.
  8. 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.
  9. 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.
  10. 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 Monteiro

Mé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/.