Best Student in Faculty Award

In November 2019, I officially graduated from Coventry University with my First Class Degree in Computer Science, including a placement year. It was an amazing ceremony to be part of and a brilliant day I will never forget.

Leading up to my graduation, I was informed that I had been chosen by the university as the winner of the prize for Best Student in Faculty of Engineering, Environment and Computing.

It was such an honour to receive this award and was the ultimate way to celebrate everything I have achieved over the last four years. When I started this journey I had no idea where it would lead to, but to achieve this award is the perfect way to reflect on the great experience I had and exhibit my accomplishments.

Thank you so much to my friends, colleagues and everyone who has been part of these last four years. I can’t express enough how much the support and guidance has helped me on my academic journey.

Graduating from University

I have now completed my four years studying BSc Computer Science, with a Placement Year, at Coventry University and I’m very proud to say I achieved First Class Honours with a final grade of 89.6%.

The modules I studied in my final year were:

  • Software Quality and Process Management
  • Android Applications Development
  • Web API Development
  • Theoretical Aspects of Computer Science
  • Individual Project (Dissertation)

Software Quality and Process Management was about DevOps and the functions I can use within a software team to improve how I work as a software developer. One of the first major topics in this module was Test Driven Development and how it can help improve the quality of my code. Another major topic was Continous Integration/Continous Development Pipelines and how to configure automatic tasks such as Unit Testing, Code Coverage, Linters, Acceptance Testing and Deployment to be run everytime I make changes to the codebase. This was particularly useful so that I could run all tests regularly, ensure my code passes regression testing, meets coding standards which I set at the start of a project and is always in a state ready to be delivered to the customer. The coursework for this project involved utilising all these skills whilst developing a web application using JavaScript/NodeJS. I achieved 72% for the coursework and 83% in the exam.

Android Applications Development was a project based module where I was tasked with designing a smartphone application from my own idea and then developing it myself from scratch. The assessment for this was based on the technical features I included in the Android application, such as utlising a smartphone’s sensors and hardware, as well as it solving a problem for users. This project was all completed using Android Studio and therefore I was developing in Java for this module. I achieved a grade of 84% for this project.

Web API Development was another project based module which taught how to develop modern day web applications and RESTful APIs. It started from the basics of how to use HTML, CSS and JavaScript, before moving onto learning the ReactJS library for user interfaces and NodeJS for RESTful backend APIs. This module also focussed on features of the HTTP protocol, Advanced API Design and how to implement Web API security and authentication. For this module’s coursework I developed a MERN (MongoDB, Express, React, Node) web application using ReactJS for the frontend user interface and NodeJS for the backend API. I achieved 92% in this module.

Theoretical Aspects of Computer Science was related to how we can solve different types of problems logically and understanding computation from a theoretical point of view. The module progressed in difficulty to learn how to solve different problems, from first learning how to recognise languages using DFAs/NFAs/PDAs. It then proceeded into how to use regular expressions and grammars to generate regular languages and context free languages. It then progressed onto Turing Machines and how Universal Turing Machines can represent all theoretical computations possible, showing how modern computers are based on this principle. The rest of this module was about the P vs. NP problem, including NP-complete and NP-hard, and also how to define the complexity and computability of abstract problems. The assignment for this module was to analyse the complexity of the Travelling Salesman Problem, and to develop an experiment to demonstrate how different approaches are useful for providing solutions. The conclusion of this coursework was to recommend which methods are best to use as the instance size grows. I achieved 86% for this module’s exam and 93% for the coursework.

For my dissertation, I designed a solution to try and solve the problem of age verification online. This software utilised machine learning processes to predict age from photos of users and determine whether they are old enough to navigate to age restricted content online. The project consisted of two parts: the machine learning model for age prediction and a user facing application which used the model for age verification purposes. The machine learning model used a dataset of images that included a person’s face and the age of the person in the image. I trained a convolutional neural network with this dataset so that it could learn which features determine a person’s age and I analysed its accuracy for this project. With this trained model, I exposed its prediction functionality to a web browser extension which utilised it whenever the user navigated to an age restricted website. Once the user accepted usage of the software, it would take a photo of them using a webcam, then process this image through the model and if the person was determined to be 18 or over it would then allow them to continue browsing the website. I tested this application both on a testing dataset as well as with user testing. I am very pleased with this project as it gave me the opportunity to learn and implement machine learning processes, as well as attempt to solve a very difficult problem in computing. I achieved 82% for this module.

Overall, I have completed so many different projects in this last year and it has been a really enjoyable end to my four years at university. Looking back these have been the best four years of my life and it has set me up fantastically for my career as a software engineer.

Reflecting on my Placement Year

From June 2017 to June 2018, I undertook a placement year as part of my Computer Science degree, where I completed an internship working at a software company called Opsview Ltd. During this year I worked as a Junior Software Engineer in Opsview’s main office based in Reading, UK.

It was very important to me to take a placement year as part of my degree so that I could learn the industry I want to work in, and confirmed to me that being a software developer is a career that I will enjoy. It also means that I will graduate with a degree including a year in industry, which proves I have the experience and capability of working in software development, as well as the academic knowledge gained through my studies. My placement year also counts towards my final degree classification, and for the portfolio I created over the year I achieved 92%.

This was an incredibly rewarding experience for me to work in a software development team and apply my programming knowledge from my first two years at university. It gave me the opportunity to utilise my programming skills and apply them to developing for a real world software application. I believe I had good programming skills before my placement year, but now I have gained much more experience and confidence, which I can take into my final year of my studies at university, which begins in a few weeks time.

For my placement year I worked at Opsview Ltd, who develop IT monitoring solutions. My responsibility was writing integrations for their software that monitors the performance and system health of a variety of different technologies and applications. My integrations would be used as part of Opsview’s software to alert IT support teams on any issues within their IT infrastructure. I mainly developed these integrations in Python, Go and PowerShell.

My part of the product was to provide an IT administrator with everything they need to monitor their infrastructure automatically from the moment they install it, so required lots of investigation into exactly what customers want. This was a fantastic role for me as I was working with lots of different technologies, gaining valuable experience working in an agile environment and enhancing my programming skills in a variety of programming languages.

I worked in an agile software development team, using the Agile Scrum methodology on a daily basis. My role also involved using Linux every day, as well as various open source tools, such as Git, Gerrit, GitHub, Vagrant, OpenStack, Jenkins and JetBrains IDEs as part of my development environment. I was also required to investigate various aspects of customer requirements, document how my integrations worked and demonstrate my solutions to the engineering team, ensuring I provided efficient, high quality software.

During my year at Opsview, I won the employee of the quarter award, across the entire company, and twice won the employee of the month award within the engineering team. It was a fantastic year and great to work in a fun, fast-paced and rewarding environment.

 

Software Engineering

Another module I completed in second year was Software Engineering. For this module I got 95% in the coursework assignment and 83% in the exam. The coursework was to create a Booking and Check-In system for a ski centre where I was part of a group of five, but each of us were responsible for only our own part of the project. The main idea of this module was to create software using different design patterns, principles and methodologies, and to have a better understanding of how to create a proper software application.

For this project, we were given a brief to create a booking and checking in software for a ski centre, and according to the business’ requirements we set out what the main five tasks were. We created our solution using Java, which was then integrated together at the end of the project. My part was the actual booking of a session which was combining the registering of a customer and creating a session, which other members of my group did. The below screenshot is an example of how my booking screen looked:

enter_date.png

For this software project, we used the four layered architecture model to separate the different areas of concern. We also used the GRASP Use Case controller pattern to split up the different functionalities of the software. Also, we used many object oriented principles such as polymorphism, to assign alternative behaviour for some functions.

Another aspect of the project was that we used the prototyping model, with our tutor acting as the client. We provided two different prototypes during the semester where we were provided feedback accordingly. We also used version control tool GitHub for us to easily integrate within the group. Unit testing was also required for the final product. We also set out the design for this software using a class diagram and use case documentation, which we had to ensure the criteria were met.

I was particularly proud of this project because I put a lot of effort into it, and I really enjoyed being creative to make my own piece of software and to be able to consider using different software design patterns. I received 95% for this assignment which I was very pleased with because I think it reflected the amount of effort I put in.

Real World Project

In my second year at university, one of my modules was the Real World Project. This involved being part of a group of six members, who I didn’t know before the project, who were from varying courses. Our task was to think of an idea for a new product, research into how to create it and which software tool to use, design the system, and then to actually develop it ourselves to implement our design.

For our idea, we decided to create a smartphone application to help students with revision and make revision more enjoyable. The main idea for our app was that students were sent notifications of questions relating to their course randomly throughout the day, to keep them reminded of their lecture’s material. To develop the application we used Android Studio and had a working prototype at the end of the project.

The above pitch video was the final submission for our assignment and was used to demonstrate our prototype, as well as allowing us to discuss our contributions to the project.

I was the project leader for this task and so had to overlook all aspects of the project, ensuring all deadlines were met. This involved having good time management skills, being very organised and establishing clear communication within my group for the entire project. I had to put in the extra effort to meet all the goals I set out for the group to do and make sure every one was clear on what was expected. I tried to go the extra mile – not just because I was the group leader but because I wanted it to be clear to the rest of my group the quality of work I wanted us to produce. It was a valuable experience being group leader for a project like this, as the whole module was set up to be like what it would be like in a real world software development team. However, I did have to deal with issues during this project, such as no communication from my group for periods of time, or some not completing their share of the work in time.

My other contributions to this project was firstly the project management. We carried out weekly meetings between the group, I set out a project plan and gantt chart for us to try to meet, and I conducted market research towards the beginning of the project. For the system design and planning stages, I set out the requirements specifications that we needed to develop for the app, I created the UML diagrams (such as the use case, class, and sequence diagrams), and I also created the concept drawings for how our app should look. In the software development stages I was focused on the notification that users would receive for the questions relating to their course/lectures. This was the unique idea of our app so it was important this part was done correctly. I also created the interfaces for how users would interact with the courses and modules for their university within the app, and how users could create courses/modules to customise their experience.

The video along with this post has a much better overview of how the app would be used by students, and was the actual submission for this module. If it was possible I would have liked to have carried on with this project beyond it being just a prototype, as developing a smartphone application was very enjoyable for me.

Reflecting on my Second Year at University

Last week I finished my last exams for this academic year and I am really happy with how this year went. I have really enjoyed my modules this year, it has been very busy but looking back it has seemed to have gone so quickly.

My six modules I had in my second year were:

  • Programming, Algorithms and Data Structures
  • Data Information and Retrieval
  • Technology and its Ethical Context
  • Software Engineering
  • Operating Systems, Security and Networks
  • Real World Project

I very much enjoyed Software Engineering and Programming, Algorithms and Data Structures. These modules were more focused on programming than the rest which is why I think I really enjoyed them.

I got 96% in my Programming, Algorithms and Data Structures coursework, as well as 93% in the exam. This module was focused on weekly programming tasks which I had to solve in a programming language of my choice. I decided to use Python and C++ for these tasks. The tasks varied, starting with sorting and searching algorithms, then moving onto data structures such as Linked Lists, Binary Trees and Graphs. The module also involved looking at algorithm efficiency and methods to reduce an algorithm’s complexity using Big O Notation.

In Software Engineering, I received 95% for the coursework assignment. I am still waiting for my exam grade as this was a second semester module. The assignment was to create a Booking and Check-In system for a ski resort centre, similar to what would be used at a reception desk to book in customers for sessions. The project involved a lot of different aspects of software design, architectural patterns, design patterns, and development methodologies. I will create a new post with more detail about this module, as there was a lot to cover and I can go into more details about the project.

Overall, I am very happy with my second year at university and I have easily got a first class honours grade across the year. I am now set to do a placement year, where I will be working as a software development intern assisting a software engineering team. I am very much looking forward to a year of experience which will be a huge benefit when I graduate. My passion for the last couple of years has been programming, so I believe after a year of programming experience in industry, it will allow me to only improve even more.

My First Semester at University

Overall I have really enjoyed my first semester at Coventry University and feel that I have done really well in the past three months. This semester I studied three modules: Introduction to Computing, Logic and Sets, and Enterprise Information Systems.

For Introduction to Computing, I achieved 85% in my first phase test and 100% in the second one. My coursework grade and exam grade make up the rest of the module but I am still waiting for both of these results back. I think this was my favourite module so far because it is the one I did best in, and because it all involved programming and this is one of my favourite parts of computing.

Logic and Sets is made up of two coursework assignments. In the first I got 100% and the next one is to be submitted at the end of the semester so I haven’t yet got any feedback for it.

In Enterprise Information Systems, I achieved 90% in my first phase test and 65% in the second phase test. I am slightly disappointed that I didn’t get 70% or over in the second test as this would have meant I got a first in everything so far at this point, but it is still a good grade. I am still waiting for my coursework grade back and take my exam for this module in a few weeks.

Overall I think I have achieved good grades throughout the course so far and I am fairly confident I will get good grades in my upcoming exams and coursework at the end of the semester.

Programming Coursework Project

My programming module in my first semester requires me to write a programme to play the game Noughts and Crosses.

The games requires:

  • Displaying the grid which updates after each turn
  • A check for when the game is complete (won or drawn)
  • Option to play again after the game has finished
  • Option to play against the computer or against another human player
  • Artificial intelligence for how the computer takes its turn instead of just making random moves
  • Ability to save the game mid-way through for completion later
  • Documentation, instructions to the user, comments in my programme to explain the code, and use of docstrings.

When first starting this project, I began by planning out how the game of Noughts and Crosses is played normally, and broke down into stages the different parts, and functions required for the game. From this I could think of it from a programming point of view and set out what processes and functions I will need to develop.

To do this I first put comments for each section and sub-section of my code and ordered them in the order I thought they would need to be in. I like to do this when starting a project because it helps to set out what I am going to have to do; instead of just diving straight into coding, I feel that good planning helps a lot. Obviously I cannot plan everything and when I started coding I soon found that I had to rearrange the order, or maybe add in more sections than I initially thought were needed, but this is a normal process when programming and I still found that it helped a lot to set out the foundations of my programme. This process also allows me to set out the requirements for the game and allows me to meet the minimum requirements for the game before moving onto other sections.

One way to help me plan and organise this project was using a flow chart to illustrate the structure of my programme. Below is a copy of the final version, but this was updated and edited throughout the development process until I got it to a stage I was happy with:

Assignment Flow Chart PNG

One of the main features the game must include is for the game’s grid to be updated after every move and displayed to the player. For this I could have just printed out the grid after each turn, but instead I chose to use Python’s turtle function. Turtle is a feature of Python which allows you to draw lines and shapes in a window, so is an ideal representation of when you draw the noughts and crosses if you were playing the game on paper. This also meant that I didn’t have to keep showing the grid multiple times, as the grid would just update and is always in the same window. This is a feature of my game I was really pleased with, and I am glad I made sure to include this as it makes it look higher quality and more professional; as well as being easier for the user to see what is going on. This was something which helped improve my game, so I didn’t include this until the basic functionality of the game was done first, and then I could focus on using turtle and making a graphical version of the game.

To check if the game had been completed (won or drawn), I used a global list variable to represent the grid squares. This list is what is updated throughout the game and is the key part of the programme. Every time the player makes a move, a function is called to check this list. This checks to see whether there is a winning scenario depending on the values in the list, or if the list is full with no winning scenario then it is a draw.

These features I have so far discussed are all for when playing versus another human player; however, one of the main aspects of the game is playing against the computer. After I created a multiplayer game that I was happy with, I started developing a version where you play against the computer. To include this, the game now includes an option for the user to choose if they want to play multiplayer or versus the computer.

When playing versus the computer, the computer cannot just be making its turn at random and so there needs to be some sort of artificial intelligence in the decision making of how the computer picks its turn. I have created a separate blog post detailing how this was implemented here.

One of the last features I included in my game was the option to save the game and complete it later. To do this I used Python’s pickle feature to save and load to a text file. I saved the grid squares list to the file and from reading this the game could load up to the same point it was at and then continue the game. One problem for this was that because I was using turtle, it meant adding a loop to redraw all of the already existing symbols again, but after this is done the game can continue as normal. One issue I had was implementing the save/load feature for the game versus the computer. I was saving the list to the file and there was no way of loading this data to find out which game mode had been selected. Therefore, I decided to create a global variable for the game mode that was selected and pickle this variable as well so that it could load this and know which type of game was saved.

Throughout my programme I have made sure that it is documented using comments and docstrings. This has meant it is really easy to see what is going on through my programme and when errors have occurred it meant that I could easily identify what went wrong. For all of my functions I have made docstrings which sets out what each function does step by step, and which function call or output is returned from the function. Also for some areas in the code it has been useful to have short descriptions in comments of what the variables, if statements, and loops are actually doing.

Overall I am very happy with my programme and think I have achieved what I set out to do. However, I feel that I could have gone one step further with my programme to improve it. I was considering have a feature where the user can point and click on the grid squares to make their move, instead of entering a number corresponding to the grid square. This would have been a great feature to have because it would have meant not needing to explain to the user which number represent which grid square. However, this would have taken more time than what was needed and doesn’t offer any further functionality to the game, so I decided to leave this out.

Artificial Intelligence in Noughts and Crosses

One of the main features of my first semester’s game was to include some sort of artificial intelligence when playing the noughts and crosses game against the computer.

When thinking about this I decided to split this into two different sections, early game and end game. Early game is the first move of the game where the computer decides its move to give it the best advantage of winning. End game is where the computer has to make its move to block the human from winning, or make its move to win the game.

There are 8 possible winning scenarios in noughts and crosses, so when the computer is making its move it should be doing so, so that it can win in as many scenarios as possible. Therefore, in the early game I want it to make its move where it is giving itself the best chance of getting three in a row. For example, say the player has gone first and chose the top-left square in the grid. If the computer was to choose a square next to it in the same row or column as the player, then they are limiting themselves to just one possible winning scenario, whereas the middle square would give the computer three possible winning scenarios at this point in the game. So my artificial intelligence needs to tell the computer to check what will give it the best chance of winning, based on the already existing move.

Here is an example of what the computer should be deciding for its move:

Artificial Intelligence Diagram 1 PNG

After the first move has been made by the human player, there are 3 general rules that the computer is taught to play:

  1. If the human plays a corner square, play in the middle square
  2. If the human plays the middle square, play in a corner square
  3. If the human plays a side square, choose the middle square or the corner squares furthest away from the already chosen square

Artificial Intelligence Diagram 4 PNG

To implement this I first did a check when the computer makes its turn to make sure that it is the first turn. If there are 8 possible moves for it to choose from, then it must be the computer’s first turn. Then I do a check for each of the 9 squares to see which one the human player played in, and depending on which square has already been played I then narrow down the possible moves to just the ones it should be playing. So before this there were 8 possible moves, but after it has checked where has been played, the list of possible moves will now be either 1, 3, or 4 grid positions (depending on the scenario). After it has determined a new list of possible moves that it should be considering, it then carries on to choose a random selection of these possible moves.

The more important part of the artificial intelligence in my game is what happens in the end game. The first check should be if the computer can win the game, and the computer needs to be able to know when it is one move away from this and to pick the square that will win the game. As well as this, when you play noughts and crosses normally, you must always look to stop your opponent from winning if they are one move away from doing so. Therefore, I need an initial check by the computer to analyse the state of the game so that it knows that the first thing it needs to do is try to win the game and if it can’t do this then stop the opponent from winning.

Here is an example of what the computer should be doing when it is one move from winning the game:

Artificial Intelligence Diagram 3 PNG

Here is an example of what the computer should be doing when the human player is one move from winning the game:

Artificial Intelligence Diagram 2 PNG

To implement this I used two checks, first check if it must play a certain grid square to win, then check if it must play a certain grid square to block the opponent from winning. For each of the 9 grid squares I checked all of the scenarios where that square will fill in a 3 in a row scenario, and therefore must pick this square. If this is the case then the computer will pick that square, otherwise it will keep checking the others. If it doesn’t meet a scenario where picking a certain square wins the game, then it will do a similar check to block the opponent. The only difference in this check is that it is checking the opponent’s moves instead. If it doesn’t meet a scenario in this check, then it means it doesn’t have to pick a specific square to play in, and the computer is allowed to choose any random square from the possible moves list.

 

Objectives for my time at University

My main objective whilst at university is to achieve a first honours degree in Computer Science from Coventry University. This is my primary goal for the next three years and it is important that I aim as high as possible in terms of the grade I will get when I graduate. Gaining a degree isn’t always the normal route for people to take these days, and I have considered alternative routes in the past, but I believe now that achieving a degree will give me a great start to my career and set the foundation for success. This is my main goal whilst at university, but there are other aspects of university that are important for me to consider as well.

Whilst studying at Coventry University I want to gain experience and knowledge that I can take into my career. This is important for me so that I can demonstrate the skill set that employers are looking for after I graduate. Employers want to know that I am a capable individual that has the skills required for their roles, and that they don’t need additional training because I will already have the experience and knowledge from my time at university.

It is also important for me to take advantage of the opportunities available to me whilst I am studying and possibly work in projects that become available for students to participate in. There may be opportunities for me that I won’t get the chance to do again so  whilst at university there will be lots of projects like this and it is a great time for me to do things like this to build a portfolio and show to employers when I start applying for jobs.

Another part of my university life is the experience of meeting lots of different people from many different countries and different backgrounds. Coventry University has students from over 150 countries, and I am already meeting people from various different pathways