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. This includes 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. These can be Java, Python and JavaScript. That creates versatile multi-paradigm programming environments.
Algorithms
In this module, students will build upon the foundations of algorithms and their complexity. Through that students develop a deeper understanding of algorithmic approaches to computational problem solving. They will explore computational complexity theory. That allows them to consider the very nature of computability: 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. Examples are: divide and conquer, recursion, and parallel approaches, emphasising 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. With that approach they explore the efficient construction and use.
These theoretical aspects are grounded through practical work in the lab. They are placed in the context of case studies of extreme scale and embarrassingly parallel computing, derived from real-world problem domains. It is introduced by invited speakers where possible. Finally, students explore key implications of algorithm performance. That includes the impact on energy efficiency and sustainability to provide a coherent interface with other modules.
Computer Networks and Systems
Building upon the foundations set in SCC.131, 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. They also learn about 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. Part of that is 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. They will create 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. Furthermore, they discuss different user interface paradigms and key technologies such as pointing. They also 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. This applies for both, 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. Alongside they will get to know Entity-Relationship Models, the relational model and the data normalisation process. Furthermore, they study alternative schema definitions, NoSQL and object-oriented data models, big data. On top of that they learn about 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. In addition they will be 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. This includes 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. They will be introduced to object oriented design with UML.
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. They will be able to interpret and construct UML models of software. On the other hand they can implement a design expressed as a UML mode and understand how to use various design patterns to address certain problems.
Artificial Intelligence Concepts
This module introduces the key ideas and fundamental principles of artificial intelligence (AI) and the types of problems that can be addressed by AI. Students will be introduced to the core concepts and philosophy of AI. This includes its history and definitions, approaches to AI, and its presence in the modern world alongside its ethical considerations. The focus lays on the underlying principles of search spaces, knowledge representation, and inference logic that form the core of rule-based systems.
Students will then go on to learn the principles of machine learning. It emphasises on clustering (e.g. k-means), classification (e.g. k-nearest neighbour) algorithms, linear regression, and neural networks. This deep dive provides the essential grounding necessary to progress to other modules: Machine Learning, Computer Vision, and Natural Language Processing.
Computer Science Group Project
The group project will give students experience in executing a project through all stages. That includes working to the demands of a client and practically combine and apply concepts and skills gained in previous modules. Students will learn to apply their knowledge about prototyping, project planning, management, design, and user evaluation or testing strategies. Teams will deliver reports, code, and demonstrate a working system. They will also communicate their work through reports, demonstrations, and presentations.
The project content may differ from year to year, and groups may be able to select projects aligned with the School’s main themes. These are Software, Systems, Data and Theory, Interactions and Implications, and Cyber Security. Example topic areas could be desktop application development, game programming, computer graphics, user interfaces, mobile computing, or other areas. The exact requirements of a group project will vary according to the focus of its theme. However, the course structure of a group project will be the same between themes and different years. Students will receive about 30 hours of workshop contact time throughout the module, in addition to lectures. Then they will be expected to work independently as a group.
To support this practical activity, two strands of lectures are delivered. One covers programming and continues the development of the students practical programming skills. That allows them to confidently contribute to larger, team-based programming projects. The second covers teamwork, project management, risks, and costings so that the student has a sound base for managing collaborative projects.