Base Knowledge
Proficiency in structured and object-oriented programming, algorithms, data structures, relational databases, web application development and software engineering principles is recommended.
Prior completion of the following course units is recommended: Programming Fundamentals; Data Structures; Programming; Applied Programming; Databases I and II; Internet Programming I and II; and Software Engineering. These recommendations do not constitute formal prerequisites.
Basic use of Git, familiarity with GNU/Linux environments and the ability to read technical documentation in English are also recommended.
Teaching Methodologies
The following teaching methods are used in this course unit:
- Expository method: an explanatory approach in which theoretical foundations and concepts are presented by the lecturer and discussed with the class. Concepts and information will be presented to students through, for example, slide presentations or oral discussions. This method will be used in classes to structure information and present it in outline form.
- Demonstration method: based on the lecturer demonstrating a technical or practical procedure that students are expected to learn. It focuses on how a particular procedure is performed, highlighting the most appropriate techniques, tools and equipment. It will be used, for example, in practical classes and laboratory sessions.
- Question-and-answer method: a process based on verbal interactions led by the lecturer and structured around questions and answers. It encourages more dynamic classroom interaction and consolidates learning. It will be used, for example, to recall material from previous classes and to review content already taught.
- Active learning methods: teaching techniques will be used that place students at the centre of the learning process, enabling them to participate actively and engage in their own learning. The lecturer acts as a facilitator, fostering students’ critical thinking, collaboration, creativity and autonomy. These methods will be applied in classes to create a dynamic learning environment and promote longer-lasting learning.
Learning Results
By the end of the course unit, students will be able to:
- Plan the development of software applications. Specify requirements, data contracts, acceptance criteria and an appropriate modular architecture.
- Develop readable, modular and documented Python code. Critically evaluate solutions produced with the assistance of artificial intelligence. Review and test code, and make well-founded corrections.
- Manage software evolution collaboratively. Use version control and peer review, and ensure the traceability of changes and technical decisions.
- Select algorithms and data structures. Justify their suitability through complexity analysis and reproducible performance measurements.
- Set up reproducible runtime environments. Deploy applications in containers. Compare alternatives for virtualisation, orchestration and serverless computing.
- Integrate devices and services for the acquisition and processing of temporal data. Implement a digital model synchronised with observations for monitoring and scenario simulation.
- Develop applications and services using Django. Integrate data persistence, application programming interfaces (APIs) and custom and third-party components.
- Identify vulnerabilities. Mitigate vulnerability through secure coding practices, access control, credential protection and dependency analysis.
- Assess the correctness, robustness and quality of solutions. Perform automated testing, apply metrics and conduct experimental validation of results and models.
- Automate the integration and deployment of applications. Demonstrate monitoring and version rollback procedures. Produce documentation that enables third parties to use and maintain the applications.
Program
- Planning and structuring software applications. Problem analysis and specification of functional and non-functional requirements. Data contracts and acceptance criteria. Modular decomposition and separation of concerns. Application of incremental development methodologies. Architectural representation using UML and C4 model. Delivery planning and recording of technical decisions.
- Good programming practices and technical documentation. Modular programming in Python: package organisation, type annotations, exception handling and resource management. Coding conventions, refactoring, and code and API documentation. Generative AI-assisted programming: critical analysis of vibe coding, task specification, review and validation of outputs, traceability, authorship and licensing.
- Version control systems. Management of local and remote repositories using Git. Branching, merging and conflict resolution. Pull requests and code review. Release management. Traceability between requirements, code, tests and deliverables. Collaboration and individual accountability.
- Complexity, algorithms and data structures. Time and space complexity analysis. Selection and comparison of sorting and searching algorithms. Use of lists, trees, hash tables and queues for data and event processing. Time-window aggregation. Performance measurement, identification of limitations and justified optimisation.
- Virtualisation, containerisation and serverless computing. Comparison of virtual machines and containers. Building images and running services with Docker and Docker Compose. Configuration, persistence and dependency management. Deployment of applications on the Raspberry Pi. Practical introduction to orchestration using Kubernetes and the execution of serverless functions.
- Monitoring and temporal data processing systems. Application-level integration of Internet of Things (IoT) devices. Data acquisition through LoRaWAN sensors and gateways using The Things Stack. Event reception via MQTT. Data decoding, normalisation, validation, processing, visualisation and storage. Digital models, digital shadows and digital twins: state representation, synchronisation with observations, implementation of simple dynamic models and scenario simulation. Validation of results and comparison with reference models.
- Development and reuse of custom and third-party code. Organisation of Django applications: data models, views and templates. Persistence, migrations and transactions. Development and documentation of REST APIs. Integration of event consumers and external services. Selection, reuse and controlled updating of libraries and packages.
- Software security. Identification of assets and trust boundaries. Authentication, authorisation and the principle of least privilege. Input validation and mitigation of vulnerabilities, including SQL injection, XSS and CSRF. Protection of credentials and sensitive information. Code and dependency analysis. Security review of AI-generated code.
- Software quality and testing. Unit, functional, integration, regression and performance testing. Test-driven development. Dependency isolation and preparation of test data. Event replay and controlled fault injection. Test coverage, cyclomatic complexity and interpretation of metrics. Experimental validation of models and comparison of solutions.
- Deployment and maintenance of IT systems. Continuous integration and delivery. Automation of builds, testing and deployment processes. Configuration of development and runtime environments. Update and version rollback strategies. Structured logging, operational indicators and fault diagnosis. Installation, operation and maintenance documentation.
Curricular Unit Teachers
José António dos Santos Fernandes MonteiroGrading Methods
The following assessment methods will apply:
1. Periodic assessment
Final mark = tests (10/20) + laboratory assignments (10/20)
The test component comprises two equally weighted individual tests. The first takes place during the teaching period and the second on the date scheduled for the examination in the main examination period.
- a) Passing the module requires a minimum mark of 45%, without rounding, in each of the two aggregate assessment components, equivalent to 9 on a scale of 0 to 20, and a final mark of at least 10 after rounding to the nearest whole number.
- b) Laboratory assignments require the submission of technical reports, code and evidence of validation via the academic management platform (InforEstudante), with unambiguous identification of the repository version, and a defence marked on an individual basis.
- c) Laboratory assignments, including individual practical assessments, are carried out exclusively during the teaching period.
- d) Prior registration via the academic management platform is required to sit the tests and take part in the laboratory assignment defences.
2. Assessment by examination (main, resit and special examination periods)
Final mark = examination (10/20) + laboratory assignments (10/20)
The examination is individual, covers the module syllabus and fully replaces the test component.
- a) Passing the module requires a minimum mark of 45%, without rounding, in each of the aggregate assessment components, equivalent to 9 on a scale of 0 to 20, and a final mark of at least 10 after rounding to the nearest whole number.
- b) Laboratory assignments require the submission of technical reports, code and evidence of validation via the academic management platform (InforEstudante), with unambiguous identification of the repository version, and a defence marked on an individual basis.
- c) Laboratory assignments, including individual practical assessments, are carried out exclusively during the teaching period. The mark for this component remains valid for all examination periods within the same academic year.
- d) Prior registration via the academic management platform is required to sit the examination and take part in the laboratory assignment defences.
Provisions common to both assessment methods
The laboratory assignment component comprises three submissions, weighted at 5%, 10% and 15% of the final mark, respectively; two individual practical assessments, each weighted at 5%; and a defence marked on an individual basis, weighted at 10%. This component accounts for 50% of the final mark in total.
Minimum marks apply exclusively to the aggregate components (tests or examination, and laboratory assignments). No additional minimum marks are required for individual tests, submissions, practical assessments or the defence. The schedule, acceptance criteria and marking rubrics will be published in advance.
Generative artificial intelligence assistance is not permitted during tests, examinations, individual practical assessments or the defence. Its use in laboratory assignments is permitted provided that the tool and the purpose of its use are identified, relevant contributions are recorded, and evidence of review and validation is provided. Students are responsible for the code and documentation they submit.
Internship(s)
NAO
Bibliography
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/.