Advanced Programming
This module provides broader exposure to alternative programming language paradigms beyond imperative and object-oriented programming. Particular emphasis is given to functional programming languages, and their unique constraints and features. More specifically, students will investigate how introducing the concept of absolute immutability into programming languages enables a suite of expressive mechanisms within programming languages including pure functions, lambdas, higher order functions, pattern matching, currying, map/reduce, and pattern matching.
As a part of this module, students will also explore why functional languages bring about increased reliability and scalability, and how they are now experiencing a resurgence within the software industry. Finally, through hands-on laboratory sessions, students see how functional programming concepts are being integrated in mainstream programming languages such as Java, Python and JavaScript, to create versatile multi-paradigm programming environments.
Algorithms
In this module, students will build upon the foundations of algorithms and their complexity to develop a deeper understanding of algorithmic approaches to computational problem solving. They will explore computational complexity theory, which allows us to consider the very nature of computability; including non-deterministic polynomial (NP) complexity classes such as NP-hard, NP-complete and the classes of problems which cannot be solved. Students will be introduced to classical approaches to problem solving such as divide and conquer, recursion, and parallel approaches, emphasizing their relative benefits and weakness to different classes of problem. They will study advanced data structures in depth, such as tries, heaps, suffix arrays, k-d trees, and distributed hash tables, and explore the approaches for their efficient construction and use.
These theoretical aspects are grounded through practical work in the lab and placed in the context of case studies of extreme scale and embarrassingly parallel computing, derived from real-world problem domains introduced by invited speakers where possible. Finally, students explore key implications of algorithm performance including their impact on energy efficiency and sustainability to provide a coherent interface with other modules.
Computer Networks and Systems
Building upon the foundations set in Digital Systems, this module investigates the deeper concepts that underpin computer networking and operating systems. Students explore the role, operation, and design rationale of the IP protocol suite –which enables the global internet. Taking a top-down approach, students discover how protocols such as HTTP, DNS, and TCP/IP operate on a fundamental level, the metrics and tools we use to evaluate the performance of computer networks.
Using laboratory-based simulators, students will also explore first-hand how routing protocols ensure user data is efficiently and safely routed across the global internet. They will study the interface between computer networks and operating systems, and how the concept of virtualization has transformed the way computer systems and networks efficiently make use of their hardware resources.
Computer-Human Interaction
Most computing systems are interactive and have people in the loop. Human-computer interaction (HCI) is concerned with all aspects of designing, building, evaluating, and studying systems that involve human interaction. From a computing perspective, students focus on enabling interaction through user interfaces, and on creating interactive systems that are usable and provide a good user experience.
The module introduces students to the foundations of HCI in understanding human behaviour, technologies for interaction, and human-centred design. Students will review human perception, cognition and action and relate these to design principles and guidelines; discuss different user interface paradigms and key technologies such as pointing; and introduce practical methods for design and evaluation with users.
Data Engineering
This module builds upon knowledge gained in Part I by providing a theoretical background to the design, implementation, and use of database management systems, both for data designers and application developers. It incorporates consideration of information quality and security in the design, development, and use of database systems.
As a part of this module, students will be introduced to a brief history of database management systems, Entity-Relationship Models, the relational model and the data normalisation process, and alternative schema definitions, NoSQL and object-oriented data models, big data, as well as transaction processing and concurrency control. The module embeds practical access and retrieval considerations and how to interact with databases written in a number of programming languages.
Secure Cyber Systems
The module aims to provide students with information on Authentication, Authorisation, and Accountability (AAA) and its building blocks. An emphasis will be given on authorisation, where access control models, policies and mechanisms will be examined.
Students will review main categories of existing cryptosystems (e.g. symmetric, asymmetric) in order to understand their use and offered security properties (e.g. confidentiality, integrity, non-repudiation) in practice. They will explore operating systems security and network security concepts in connection to AAA and cryptosystems, as well as being introduced to formal verification and how it can be used to verify properties on cyber security systems.
Software Design
Software Design offers the opportunity to gain an understanding of the importance of software architecture design, different styles of architecture and the meaning of quality attributes for software design such as maintainability, performance and scalability. Students will gain knowledge of systematic approaches to developing software design using a set of graphical models. The design process involved in developing several modes of the system at different levels of abstraction is explained and they will be introduced to object oriented design with UML.
Throughout the module, students will appreciate the broader context of the role of computer science in the workplace, and the key role it plays in implementing software. The course also looks at understanding the meaning of quality attributes for software design as well as architectural models for specific software systems. Students will gain an insight into the main quality attributes for deciding classes. Students will be able to interpret and construct UML models of software and implement a design expressed as a UML mode as well as understanding how to use various design patterns to address certain problems.
Concurrent and Parallel Systems
Computer architecture has now reached a critical juncture where we are witnessing a step change in computer performance, not due to the increased performance of individual processors, but through the inclusion of many, sometimes even thousands, of processor cores in a single computer.
In this module, students will learn how to classify the different designs of multi-processor computers such as symmetric CPUs and general-purpose GPUs. They will investigate their benefits and drawbacks and study the theories and factors that can all too easily bound their seemingly limitless computational potential. Through a combination of lab exercises and lectures, students will discover how to use contemporary software tools and techniques to create high performance applications that exploit multi-threaded instruction parallelism whilst avoiding race conditions, deadlock and livelock, and utilise GPUs to exploit data parallelism.
Software Design Studio Project 1
In this module, students will get the opportunity to adopt a real-world software design studio methodology that builds upon the knowledge gained in Software Development to create a reasonably sized, concrete, group development project. In particular, students will learn how to apply project planning, management and execution, requirements analysis, systems design (using appropriate methods such as UML and design patterns) and testing strategies.
Furthermore, individual modules of a large-scale system will be implemented and integrated by the group. As part of the project, students learn how to deliver reports, code, and demonstrate a working system. The work is completed through the presentation of certain elements of work in written, graphical and verbal forms and through the production of materials such as reports, a website, poster, and presentations.
By the end of the module, students will be able to create clear and precise software engineering reports, recognise issues they may encounter during software projects, and demonstrate their ability to work collaboratively within a software development team.