Students on the BSc in Computer Science will undertake a Project and will choose eight optional modules. The current list of available modules is shown below, but please remember that these courses tend to deal with cutting-edge material: modules can quite quickly become obsolete, meaning they will be dropped; and new areas of the subject become important, meaning new modules are created.

  • Writing Mobile Apps
  • Foundations of Artificial Intelligence
  • Artificial Intelligence Applications
  • Internet Computing
  • Building Reliable Web Applications
  • Cryptography and IT Security
  • High Integrity Systems
  • Computer Graphics II
  • High Performance Microprocessors
  • Interactive Theorem Proving
  • Concepts of Programming Languages
  • Programming with Abstract Data Types
  • Functional Programming II
  • Designing Algorithms
  • Logic and Semantics
  • Constraint Satisfaction Problems and Applications
  • Algebraic Specification of Software and Hardware
  • Numerical Algorithms and Computation
  • Scientific Modelling and Simulation
  • History of Computation
  • Teaching Computing via a School Placement



All students (except those on some Joint Honours programmes) undertake a large project throughout Level Three. Most students choose a practical project, involving some programming. However, this is not necessary, and a significant number of students choose either theoretical or specification-based projects. Projects do not have to have a well-defined end goal (e.g. to produce a specific software package), and many are open-ended, or curiosity-driven. It is common for projects to be linked with the work of research groups, or with the industry (usually from links arising out of IT Wales).

Writing Mobile Apps

The aim of this module is to give the student an understanding of the history, development and future of apps for mobile phones, tablets and other related devices. Students will learn how to develop apps for Android devices. They will learn how to write apps and what kinds of apps, and interaction, works best with mobile devices.

Foundations of Artificial Intelligence

Artificial intelligence (AI) is the study of how to make computers behave in ways a human would regard as ``intelligent''. This module studies some of the fundamental, underlying concepts necessary to build AI systems. For example, natural language recognition, game playing strategies, and machine-based learning.

Artificial Intelligence Applications

This module builds on the fundamental techniques introduced in Foundations of Artificial Intelligence and applies them to practical systems. The main applications considered are intelligent knowledge-based systems (IKBS), often called expert systems, and genetic computing. Expert systems encapsulate and can apply expert knowledge gained from one or more people. Experimental examples are common in medicine, where they often outperform human doctors. Genetic computing is the study of computer systems that evolve progressively-better solutions to problems by a process that mimics biological evolution.

Internet Computing

Internet-based applications are providing many new ways to exploit computer and network technology, as well as enabling easier web-based access to existing legacy applications. This module introduces the hardware and software technologies on which internet computing is based, and considers how we can engineer reliable and adaptable web-based applications.

Building Reliable Web Applications

Modern computer systems are often access from web pages, and although the actual appearance of the page is often the most obvious part, most of the technical work is hidden in programs that provide the function (often call the business logic) of the page. This module deals with techniques for building reliable, secure web applications, using state-of-the art technology.

Cryptography and IT Security

Data security is now a very important topic, and one way to protect data is encryption. Encrypting data so that it is protected from those who should not be able to read it, while actually allowing access to legitimate users, is actually quite difficult. Encryption however, will not solve all security problems - so this module also deals with the wide range of strategies used to defeat malicious attempts at gaining access to computer systems.

High Integrity Systems

Computers now control much of the technology we use everyday - cars, communication systems, avionics and air traffic control, medical equipment, industrial machinery and so on. For many such systems, the consequences of failure could be disasterous - avionics, air traffic control and medical systems are obvious examples, as is the control system of a nuclear reactor. Such systems need much more than the usual care when they are being designed and built. As well as looking at the technical tools to help with building such systems, this module also deals with the legal and ethical issues that arise.

Computer Graphics II

This module builds on the foundational material introduced in Computer Graphics I, and introduces the software techniques needed to model and render advanced three-dimensional images. It also considers more advanced techniques, like volume graphics and animation.

High Performance Microprocessors

The microprocessors used in modern desktop systems are highly complex, and use a variety of techniques to maximise performance. For example, modern microprocessors are both pipelined (they overlap the processing of instructions) and superscalar (they try to process instructions in parallel). Modern memory systems are highly sophisticated, using techniques such as interleaving and multi-level caches to maximise access speed. This module studies the techniques used in microprocessors, and how best to exploit them.

Interactive Theorem Proving

This module is concerned with the tools and techniques that enable computer systems to prove that mathematical theorems are true. Although this may seem very theoretical, in practice, we use these techniques to prove complex properties about software: particularly software used in High Integrity Systems, where failures cannot be tolerated.

Concepts of Programming Languages

We can approach the problem of programming computers in a number of ways, or paradigms. For example, the programming languages Java, C++ and C# use the object oriented paradigm; Pascal uses the imperative, or procedural paradigm. There are other paradigms: for example, logic, functional, equational, and visual. This modules looks at the concepts, differences and similarities that underly these various different programming paradigms.

Programming with Abstract Datatypes

Abstract datatypes are an important concept in the design of reliable software systems, where they have a key role in the specification of systems. They are also a key foundational concept in Object Technology. This module looks at the fundamental concepts of abstract datatypes, and application in practice.

Functional Programming II

This module builds on Functional Programming by considering more advanced applications, and also addressing how functional languages are implemented.

Designing Algorithms

Modules Algorithms and Computation and Algorithms and Complexity showed how to measure the effectiveness of algorithms, and choose between different algorithms based on performance. But how do you design new algorithms? This module shows how it is possible to apply a range of systematic techniques, and develop new algorithmic solutions to problems.

Logic and Semantics

This module is an advanced treatment of the underlying mathematics of computing, introduced in Logic and Foundations of Mathematics. It is mainly concerned with modelling behaviour - that is, what exactly our computer systems are supposed to do.

Constraint Satisfaction Problems and Applications

Constraint Satisfaction (often just called SAT) is about solving traditionally difficult problems, like scheduling, timetabling and planning. It also has applications in fields such as Biology.

Algebraic Specification of Software and Hardware

This module is concerned with the same kind of things as High Integrity Systems, only from a different approach - how do we know what complex software and hardware systems are supposed to do? (As opposed to what they actually do, which is often not quite the same.) In many ways this module builds upon the Second Year course System Specification.

Numerical Algorithms and Computation

Numerical algorithms and computation are the core techniques used to generate computer simualations of real-world situations. Examples include simulating airflow over and around aircraft in flight, determining how molten plastic flows during injection molding: in fact, many simulation problems rely on numerical techniques to some extent. This module introduces the core concepts and algorithms of numerical computation.

Scientific Modelling and Simulation

This module is related to Numerical Algorithms and Computation in that it is concerned with simulation of real-world systems. However, Scientific Modelling and Simulation is concerned with a wider range of problems than those solved by numerical techniques. It also has a more practical focus, with emphasis on using a set of computer-based tools to build simulations.

History of Computation

At first sight it would seem that the history of computation is a relatively new subject as the first electronic computers were built in the 1940s. (Many people's perception of the computer goes back no further than the PC!) However, mechanical computing systems have existed for many centuries. This module addresses the history of computation, and the computer, from the earliest primitive computing machines, to the modern era.

Teaching Computing via a School Placement

This module is for students with an interest in entering teaching, and involves a weekly placement in a local school under the mentorship of a Computing/ICT teacher. The student will engage both in observation and in various teaching activities. The module will be assessed on the basis of the mentor's report and on written project work.