Conhecimentos de Base Recomendados
Os alunos devem possuir e dominar competências avançadas de desenvolvimento de aplicações informáticas.
Recomenda-se a conclusão prévia das seguintes unidades curriculares: (1) Fundamentos de Programação; (2) Estruturas de Dados; (3) Programação; (4) Programação Aplicada; (5) Base de Dados (I e II); (6) Programação para a Internet (I e II); e (7) Engenharia de Software.
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 aluno ficará habilitado a:
1. Desenvolver competências na estruturação e planeamento de aplicações informáticas. Compreender e aplicar metodologia de desenvolvimento de software. Realizar análise e especificação de requisitos de sistemas. Modelar sistemas utilizando UML, C4 Model e GRL. Utilizar ferramentas de planeamento de forma eficaz.
2. Implementar boas práticas de programação e elaboração de documentação técnica. Adotar convenções de codificação consistentes. Documentar código e API utilizando ferramentas. Produzir comentários úteis e manter código legível. Redigir documentação técnica e manuais de utilizador de qualidade.
3. Utilizar sistemas de controlo de versões para gerir projetos de software. Compreender os conceitos fundamentais do Git. Gerir repositórios locais e remotos. Aplicar fluxos de trabalho com o Git. Resolver conflitos e realizar revisão de código de forma eficaz.
4. Analisar e aplicar algoritmos de ordenação e estruturas de dados eficientes. Analisar a complexidade de algoritmos utilizando a notação Big O. Implementar algoritmos de ordenação. Utilizar estruturas de dados eficientes.
5. Implementar e gerir soluções de virtualização, containerização e computação serverless. Compreender os fundamentos de virtualização. Utilizar Docker para containerização de aplicações. Orquestrar containers utilizando Kubernetes.
6. Implementar sistemas de monitorização e processamento de dados em tempo real. Compreender os conceitos de streaming de dados. Utilizar bases de dados de séries temporais. Aplicar técnicas de processamento de dados em tempo real. Utilizar ferramentas de visualização de dados.
7. Desenvolver e integrar código próprio e de terceiros. Compreender os fundamentos do Django. Desenvolver APIs RESTful. Integrar e reutilizar bibliotecas e pacotes de terceiros.
8. Implementar práticas de segurança no desenvolvimento de software. Compreender os princípios de segurança em desenvolvimento de software. Identificar e mitigar vulnerabilidades comuns. Aplicar práticas de programação segura. Utilizar ferramentas de análise de segurança.
9. Assegurar a qualidade do software através de técnicas de teste e métricas de qualidade. Compreender os conceitos de qualidade de software. Aplicar técnicas de teste unitário, funcional, de integração e regressão. Utilizar ferramentas de automação de testes. Medir a qualidade do código recorrendo a métricas.
10. Implementar estratégias de deployment e manutenção de sistemas informáticos. Compreender e aplicar estratégias de deployment. Implementar pipelines de CI/CD. Utilizar ferramentas de deployment. Monitorizar e manter sistemas pós-deployment de forma eficaz.
Programa
1. Planeamento e estruturação de aplicações informáticas. Metodologias de desenvolvimento de software (Agile, Scrum, Kanban). Análise e especificação de requisitos. Modelação de sistemas (UML, C4 Model, GRL). Ferramentas de planeamento (Jira, Trello).
2. Boas práticas de programação e escrita de documentação técnica. Convenções de codificação. Documentação de código e de API. Comentários úteis e manutenção de código legível. Elaboração de documentação técnica e manuais de utilizador.
3. Sistemas de controlo de versões. Conceitos fundamentais do Git. Repositórios locais e remotos (GitHub, GitLab, Bitbucket). Fluxos de trabalho com Git (branching, merging, pull requests). Resolução de conflitos e revisão de código.
4. Complexidade e ordenamento. Análise complexidade de algoritmos (Big O notation). Algoritmos de ordenação (QuickSort, MergeSort, HeapSort). Estruturas de dados eficientes (listas ligadas, árvores, hash tables).
5. Virtualização, containerização e computação serverless. Fundamentos de virtualização (VMware, VirtualBox). Containerização com Docker. Orquestração de containers com Kubernetes. Introdução à computação serverless (AWS Lambda, Google Cloud Functions).
6. Sistemas de monitorização e controlo em tempo real. Conceitos de streaming de dados (Apache Kafka, RabbitMQ). Base de dados de séries temporais (InfluxDB, Prometheus). Técnicas de processamento de dados em tempo real (Kapacitor). Ferramentas de visualização de dados (Grafana, Chronograf).
7. Criação e (re)utilização de código próprio e de terceiros. Fundamentos do Django (models, views, templates). Desenvolvimento de APIs RESTful com Django. Integração e reutilização de bibliotecas e pacotes de terceiros. Testes unitários e de integração em Django.
8. Segurança de software. Princípios de segurança em desenvolvimento de software. Vulnerabilidades comuns (SQL Injection, XSS, CSRF). Práticas de programação segura. Ferramentas de análise de segurança (OWASP ZAP, SonarQube).
9. Qualidade de software. Conceitos de qualidade de software. Técnicas de teste (unitário, funcional, integração, regressão). Automação de testes (Selenium, Jenkins). Métricas de qualidade de código (cobertura de testes, complexidade ciclomática).
10. Deployment de sistemas informáticos. Estratégias de deployment (blue-green, canary). Continuous Integration/Continuous Deployment (CI/CD) pipelines. Ferramentas de deployment (Ansible, Terraform). Monitorização e manutenção pós-deployment.
Docente(s) responsável(eis)
Métodos de Avaliação
- - Trabalhos práticos - 100.0%
- - um trabalho prático - 100.0%
Estágio(s)
NAO
Bibliografia
Brown, S. (2018). The C4 Model for Visualising Software Architecture. Leanpub.
Chacon, S., & Straub, B. (2014). Pro Git (2nd ed.). Apress.
Cohn, M. (2009). Succeeding with Agile: Software Development Using Scrum. Addison-Wesley Professional.
Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to Algorithms (3rd ed.). MIT Press.
Fowler, M. (2004). UML Distilled: A Brief Guide to the Standard Object Modeling Language (3rd ed.). Addison-Wesley Professional.
Greenfeld, D. R., & Roy, A. (2017). Two Scoops of Django 1.11: Best Practices for the Django Web Framework. Two Scoops Press.
Hightower, K., Burns, B., & Beda, J. (2017). Kubernetes: Up and Running: Dive into the Future of Infrastructure. O’Reilly Media.
Holovaty, A., & Kaplan-Moss, J. (2009). The Definitive Guide to Django: Web Development Done Right (2nd ed.). Apress.
Humble, J., & Farley, D. (2010). Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation. Addison-Wesley Professional.
Hut, N. (2017). Ansible: Up and Running: Automating Configuration Management and Deployment the Easy Way. O’Reilly Media.
Hüttermann, M. (2012). Agile ALM: Lightweight Tools and Agile Strategies. Apress.
Kaner, C., Bach, J., & Pettichord, B. (2001). Lessons Learned in Software Testing: A Context-Driven Approach. Wiley.
Kernighan, B. W., & Plauger, P. J. (1978). The Elements of Programming Style (2nd ed.). McGraw-Hill.
Kleppmann, M. (2017). Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems. O’Reilly Media.
Loeliger, J., & McCullough, M. (2012). Version Control with Git (2nd ed.). O’Reilly Media.
Martin, R. C. (2008). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall.
McGraw, G. (2006). Software Security: Building Security In. Addison-Wesley Professional.
Merkel, D. (2014). Docker: Lightweight Linux Containers for Consistent Development and Deployment. Linux Journal, 2014(239), 2.
Myers, G. J., Sandler, C., & Badgett, T. (2011). The Art of Software Testing (3rd ed.). Wiley.
Narkhede, N., Shapira, G., & Palino, T. (2017). Kafka: The Definitive Guide: Real-Time Data and Stream Processing at Scale. O’Reilly Media.
Sbarski, P. (2017). Serverless Architectures on AWS: With Examples Using AWS Lambda. Manning Publications.
Schwaber, K., & Sutherland, J. (2017). The Scrum Guide. Scrum.org.
Sedgewick, R., & Wayne, K. (2011). Algorithms (4th ed.). Addison-Wesley.
Sommerville, I. (2010). Software Engineering (9th ed.). Addison-Wesley.
Turnbull, J. (2018). Monitoring With Prometheus. Turnbull Press.
Wysopal, C., Nelson, L., Dai Zovi, D., & Dustin, E. (2006). The Art of Software Security Testing: Identifying Software Security Flaws. Addison-Wesley Professional.