FIRST YEAR: 2022-23

BSc Computer Science at the University of Warwick



CS118: Programming for Computer Scientists

This module is an introduction to programming paradigms and techniques, ranging from very basic concepts such as variables and types, all the way to more complex ideas such an encapsulation, inheritance, polymorphism, and multithreading - specifically how to do these in Java.

For our coursework, we had to implement a series of pathfinding algorithm to help a robot navigate a maze. These exercises increased in difficulty; for example, later on I had to modify my pathfinding algorithm so that the robot was able to traverse mazes with loops by adding backtracking, and also saving the current shortest path for each attempt so that the robot could 'remember' what it had done in previous runs of the maze.


CS126: Design of Information Structures

In this module, we learned about algorithmic data structures, starting with lists and arrays, and ranging up to more complex ones such as skip lists, AVL trees and graphs.

The coursework for this module required us to build our own data structures and use them to implement functionality inside a film database. Some of the required functionality included: listing every film that an actor has been in, finding the shortest path of co-stars between two actors, finding the average rating of a film from the ratings database, and much more. This coursework was very confusing at first, but after some thorough design, it became much easier!


CS130: Mathematics for Computer Scientists I

This was an in-depth look at the field of discrete mathematics - predicate logic, set theory, injectivity, bijectivity, surjectivity, relations, functions, probability spaces, graphs and more.


CS131: Mathematics for Computer Scientists II

Following on from CS130, in this module we instead delved into more detail with calculus, spaces, series, sequences, number systems, matrices, eigenvalues and eigenvectors in transformations, power series, and more.


CS132: Computer Organisation and Hardware

This module covered the architecture and design of computer systems, from looking at individual circuit components such as encoders and multiplexers, to investigating the way that processors are constructed and the different design methodologies (microprocessors vs random logic) used, as well as the hierarchy of memory and addressing modes built into instructions in the CPU.

In lab sessions, my lab partner and I had the task of building many different components out of logic gates on a breadboard, as well as writing programs in Assembly to use our new components. After we had completed this, our coursework involved writing a program in C to control a robot arm made from 5 independent motors to solve the Towers of Hanoi problem with blocks. Our solution was scalable for any number of blocks, and our combination of clean, scalable code and in-depth technical documentation got us a high first class grade.


CS133: Professional Skills

In this module, we were taught about a variety of different study skills, such as presenting, writing essays, communicating and how to be a good employee/interviewee.


CS140: Cybersecurity

This module educated us on different forms of encryption (secret key, public key, digital signature), as well as how these are linked to forms of modular arithmetic, yielding one-way functions that are very difficult to reverse without a key. We also learned about hashing and its uses with authentication, as well as the importance of the CIA triangle in defensive systems design. My coursework involved investigating a Linux disk image for security defects, ranging from incorrect permissions to incorrect data in crucial system files.


CS141: Functional Programming

In this module, I learned about functional programming, a paradigm that works very differently, and yet shares much with, imperative programming languages. Initially this was a very confusing module as I had no experience with functional programming except for very basic lambda statements in Java before. However after lots of practice, I began to understand all that Haskell has to offer which cannot be done in imperative languages.

For the coursework, we had to implement functionality in a chess-like game, including writing a primitive AI that could choose winning moves, as well as loading and saving game files to disk in game notation, and checking that the loaded game contained a string of valid moves (I did this using a custom parser built using the Megaparsec library).