Surviving my second year of CompSci at Cambridge

19 June 2024 • 27 minute read

It feels like just yesterday that I was writing about my first year at Cambridge, but it’s already that time of year again when my exams are over, I’ve begun to catch up on sleep, and I can sit down and reflect on the past year. And what a year it’s been.

In this post, I’ll be looking back at my second year studying Computer Science at Cambridge, sharing some of the things I got up to and what I learned along the way, as well as discussing the courses I took, and my experience of Cambridge as a whole.

One of my favourite things about this year was that the courses all intertwined with each other in a way that didn’t quite happen in first year. We looked at the same concepts through many different lenses, which made the year as a whole feel very cohesive and made the content much easier to understand. For example, we thought about computation from two different theoretical perspectives in Computation Theory and Semantics of Programming Languages, and from two different practical perspectives in Computer Architecture and Compiler Construction. Everything tied together in a such a satisfying way, and it really reminded me why I love Computer Science.

Anyway, enough waffle - let’s start by discussing my approach to this year compared to last.

How to Survive Second Year

Lots of things I tried in first year worked well, so many things I didn’t change. I still went to all my lectures (except a few in Easter term), took notes in lectures by annotating the slides, and wrote up condensed LaTeX notes to revise from.

However, I found that last year I was spending my entire Christmas and Easter holidays writing up these notes rather than more productively doing exam questions, so I decided to write up my notes at the end of each week, rather than at the end of each term. This worked really well in that I had time to be much more productive in the holidays, and I had my work-in-progress notes during term time to help me with supervision work. However, this took up pretty much all weekend, every weekend, so I had a huge amount of work for the entire year, a large proportion of which was self-inflicted. Also, I lost the benefits of going over the course in its entirety in one go, which was very useful last year as a revision exercise and to get a better understanding of the bigger picture.

Last year some of my friends used my notes to revise from, and the mistakes they inevitably found were mostly mistakes in my own understanding, which helped me improve my understanding without doing any work myself! To make my notes more accessible to my friends, both for studying and for editing, I built a private website to host them, automatically generated by a GitHub Actions workflow on a shared repository - quite the upgrade from last year’s Google Drive folder! This was a huge success, and I continued to extend the website to provide easy access to past papers, course materials, and other resources, partially through a fun search system I built that indexes keywords in the notes.

My notes and their website

Clockwise: my notes website, the first page of my Compiler Construction notes, the search feature of my notes website in action

Last year, I printed out my notes once lectures had ended in Easter term to revise from in the days and weeks before the exams. I found this extremely useful, so I continued doing it this year. I can remember where things are on the page and, after reading the printed notes a couple of times, I can see them in my head in the exam. Last year my notes were 62 pages, but this year they were 95 - there was a lot more content this year!

I’m not planning to share my notes beyond my immediate friends as I don’t want the responsibility of teaching people the wrong information; they also contain a lot of copyrighted material. However, I have some ideas for making the website even more useful, and I might make a public version of it in the future.

Michaelmas Term

Collage of photos from Michaelmas term

Left to right: formal at Trinity, writing notes late at night, fireworks at Downing

I returned to Cambridge at the start of October after a long and exciting summer of work, travel, and fun. By now, it always feels like coming home, and I was excited to see everyone again and get started with Part IB of the Computer Science Tripos!

I had been warned that the second year would be a lot more work than the first, especially in Michaelmas term, and it certainly lived up to that expectation. Alongside having five courses on the go at any one time with 13 hours of lectures a week, I was also interviewing for summer internships, just about managing to keep up with supervision work, preparing and then giving an award-winning half-hour talk, and trying to maintain a social life (for some definition of “social life”). Let’s take a look at the courses I took in Michaelmas term, and then I’ll talk about internship applications, my talk, and other things I got up to.

Courses

  • Introduction to Computer Architecture: an introductory course on computer architecture, including instruction sets, memory hierarchies, pipelining, and GPUs. I really enjoyed this course because, as you’ll know if you’ve read some of my other posts, I’m a big fan of high-performance low-level systems stuff, and knowing more about how computers actually work is hugely useful for writing more efficient code. Despite there being quite a lot of content, the lecturer Prof. Simon Moore delivered it in a very well-structured and interesting way. We also learnt about SystemVerilog, a hardware description language, which provided a completely new perspective on programming.

  • Data Science: probability models, statistical inference, and random processes. While the course was fairly interesting and definitely useful, it was just a bit too maths-y for me. I thought a lot of the content was presented in a pretty overcomplicated way, and the course gave quite a philosophical view of statistics, which, while interesting, didn’t help me to understand or learn the material. I ended up dropping this course for the exam (I’ll discuss how that works later).

  • Programming in C and C++: does what it says on the tin. This course consisted mainly of online videos about C, with a couple of in-person lectures at the end on C++. If you read my post last year, you’ll know that I’m not a huge fan of video lectures (that’s a bit of an understatement), so you’ll understand why I didn’t enjoy this course. I also have a confession to make: I didn’t actually watch the videos. From what I’ve heard, they weren’t bad, but I can’t comment on that myself - I correctly assumed that my knowledge of C from my internship would be enough to get me through the supervision work and the exam.

  • Concurrent and Distributed Systems: two courses combined into one, with 8 lectures on concurrency (threads, locks, transactions, etc.) and 8 lectures on distributed systems (time, replication, consensus, etc.). The two parts even had different lecturers, so I’ll discuss them separately.

    • Concurrent Systems: I found the content of this course very interesting indeed, and, contrary to popular opinion, I thought the lectures were quite enjoyable. The lecturer didn’t always explain things in the clearest way, but I thought he was very entertaining - it was like having a course taught by a more competent version of Boris Johnson (in more way than one), and for a course where I already knew a fair bit of the content, that was perfect.

    • Distributed Systems: this was the complete opposite of the concurrency part - really really well-taught and well-explained, but not quite as engaging. Dr. Tim Harris was a very good lecturer, and despite the content being quite difficult, he made it very easy to understand.

  • Further Graphics: geometry, animation, and rendering. We were encouraged to drop this course - my director of studies (DoS) didn’t even organise supervisions for it - so I did for the exam. I did attend the lectures, though, and I thought they weren’t too bad. As you’d expect, there was a lot of difficult maths, but I think that’s a me problem rather than a course problem. There were also two “ticks” (assessed practicals), but they fell into the usual trap of being “write some code without having to understand any of the course”, so I breezed through them and got absolutely nothing out of them. I kind of wish I had taken the course more seriously, especially as it was examined on Paper 7 (more on that later, but let’s just say that is NOT a fun paper). My advice to anyone going into second year is to look at the other courses on Paper 7 and decide whether you really can afford to drop Further Graphics…

  • Semantics of Programming Languages: the mathematical foundations of programming languages, including operational semantics, types, subtyping, and concurrency. This was a brilliant course, and one of my favourites of the year. The structure of the course was fantastic, starting with a very simple language, proving some properties about it, and then gradually adding more and more complexity. I loved thinking about programming languages in this way, and the lecturer, Dr. Neel Krishnaswami was incredibly knowledgeable, enthusiastic, and engaging, which made for a very enjoyable course.

  • Economics, Law, and Ethics: a very brief introduction to economics and law, with a couple of lectures thrown in on ethics because it’s probably some kind of requirement for a Computer Science degree. This course had the potential to be really good, but unfortunately it didn’t live up to it. The course was designed and originally taught by Prof. Ross Anderson, who sadly passed away this year, and who was one of the best and most engaging lecturers I’ve ever had - his lectures last year on Software and Security Engineering were fantastic. For the last few years, a different lecturer has taken on the Economics, Law, and Ethics course, but hasn’t changed it at all, and while the new lecturer is not bad, the style and structure of the course just does not work without Ross. I think the course would be much better if it were redesigned from the ground up to fit the new lecturer’s style.

Internship Applications

Alongside all of this, I was also interviewing for summer internships. I submitted most of my applications in August and September, but this meant that I had several hours of interviews a week for at least the first half of the term.

Internship applications Sankey diagram

The obligatory Sankey diagram of my internship applications

I found the interview process very scary at first, and I was very nervous for my first few interviews, but as I got more practice, the novelty wore off and I became more comfortable. I read a lot of things about how the way to succeed in interviews is to do lots of practice questions on Leetcode and the like, but I don’t think just memorising common question types will get you through any interview with a competent interviewer. The most important thing is to be able to explain your thought process clearly and concisely, ahead even of writing code that works.

In the end, I received 5 offers, and I’m extremely excited to share that I’ll be spending my summer at Citadel Securities in London, working in their real-time trading technology team.

Signing the offer was a huge relief, and it was great to have one less thing to worry about going into Lent term. I withdrew my applications from the other companies because I was fed up with interviews and didn’t want to waste their time too much, although maybe being able to flex that I rejected Jane Street would have been fun. (I did turn down an interview…)

Computer Science Talks

My DoS organises a series of talks for the second years to give in Michaelmas and Lent terms, and I was asked to be one of the first speakers of the year. I decided to talk about the security and privacy issues with biometric passports (very random, I know) because it was something I had looked into quite a bit over the summer out of curiosity.

Me giving my talk

Giving my talk on biometric passports at Churchill College

You can watch the talk on YouTube or read my blog post about it if you’re interested. You can also find my slides here, which contain all the references.

I think the talk went pretty well - my delivery could have been a lot better, and I think I tried to cram a bit too much information into too short a talk, but overall I was very pleased. After the whole series of talks was over, I was very surprised and very proud to be awarded the prize for the best practical talk.

Life

While I did only have limited free time, I made the most of it! I went to lots of concerts at West Road Concert Hall as well as at Trinity College, where I also went to a very fun formal. I think my favourite concert of Michaelmas was Tchaikovsky’s first piano concerto at West Road, which was incredible. I still feel so lucky to have so much amazing music on my doorstep - Cambridge really is one of the best places in the world for classical music. It was also really fun to not just go to concerts by myself - there’s nothing better than getting post-concert Jack’s together on a cold winter night and going for a walk around the city.

Over the winter break, I spent a fair bit of time studying for my mock exam in January (which I didn’t do particularly well in anyway - a good reminder that I needed to work harder), but I also went to Prague and Vienna because I got a bit addicted to travelling over the summer and I couldn’t resist.

Prague and Cesky Krumlov

Left to right: Cesky Krumlov in the snow, Charles Bridge at dawn in Prague

This isn’t a travel blog (although I feel like I’m saying this often enough that maybe I should start one), but I had an amazing time, especially in Prague and on a day trip to Cesky Krumlov, despite it being -10°C! I even went to a concert at the Rudolfinum in Prague, for which I was horrendously underdressed (people don’t wear black tie to concerts in Cambridge, okay?), but it was an amazing experience.

Lent Term

Collage of photos from Lent term

Left to right: Dron’s birthday dinner at Kibou, signs of spring on the way to the lab, a special orchestral evensong at Trinity for the centenary of Stanford’s death

Lent term was the term of the group project, which, I’ll admit, I was dreading. It did mean that we had fewer courses to worry about, but instead of being sensible and having a couple of courses on the go at once for the whole term, they put ALL the courses in the first half of term and none in the second. As you might expect, the first half of the term was a huge amount of work, but the second half was a nice relief.

Courses

  • Compiler Construction: lexing, parsing, and translation. The first half of this course was very well-taught and well-structured (although it would be quite a feat to structure a course on compilers badly), and the lecturer, Dr. Jeremy Yallop, gave clear explanations and was very engaging. However, the part on translation took quite a strange approach, very focussed on one specific example, and it felt quite disjoint from the rest of the course. I could definitely write a lexer and parser after this course (and in fact I did just that as part of my revision), but I think I would struggle to write a full compiler just by following the course content.

  • Computer Networking: an introduction to computer networking, from the physical layer to the application layer. Computer networking is a very chaotic field, built on a lot of historical hacks and workarounds, so the only way to teach it is to impose some very strict structure on it. This course did not do that, and hence I found it very difficult to follow and understand the huge amounts of content. The lecturer was very good and knew his stuff very well indeed, but the course structure and his slides made it hard for him to communicate that knowledge effectively.

  • Logic and Proof: a course on automated reasoning for some reason framed as a course on logic. We effectively learnt how to build a theorem prover, without ever mentioning that we were learning to build a theorem prover. Fortunately, my DoS made this clear in his supervisions, and the content of the course was actually very interesting - one of my side projects at the moment is trying to build an efficient SAT solver, so maybe I’ll even get a blog post out of it! It’s just a shame that the lecturer framed the course so weirdly (and also got lost in pretty much every worked example).

  • Computation Theory: theoretical models of computation, including Turing machines, register machines, and the lambda calculus. I really enjoyed this course - it gave another very interesting collection of perspectives on computation, which even more interestingly turn out to all be equivalent! The lecturer, Prof. Anuj Dawar, was fantastic, and the slides, provided notes, and general structure of the course all made for a very enjoyable learning experience.

  • Further Human-Computer Interaction: where do I start… I still don’t know what I was supposed to take away from this course. It’s supposed to be about the theoretical foundations of human-computer interaction, but I feel like it was just a collection of the lecturer’s research, delivered in a very unstructured and incoherent way. Everything felt so handwavy and ill-defined - if I’m honest, the whole course felt a bit “made up”. It was also very difficult to revise for, because much of the actual examinable content was not even in the slides or notes at all!

  • Prolog: the Prolog logic programming language. I really like Prolog - I’m planning to do my Part II project on it - but I don’t feel like the course was the best way to learn it. Every lecture had “pre-lecture videos” to watch (which I didn’t) about the actual practical stuff, and then the lecturer would go through “conceptual things” in the lecture. There are not 8 lectures’ worth of conceptual things about Prolog, at least not at this level, which made for very drawn-out and uninteresting lectures. I learnt Prolog by reading through the slides, doing supervision work, and actually writing stuff in it, and I feel like I have a pretty strong understanding of the language now (at least, I found this year’s exam question on it very easy). I wrote a recursive descent parser in Prolog when I was revising Compiler Construction, which was a really fun exercise and definitely helped with my understanding of both courses.

Group Project

Alright, time for the rant. Project briefs were submitted to the department by “clients”, often alumni with startups, and we could rank our preferences as to which project we wanted to work on. Out of the 25 projects, there were only THREE which weren’t either unrealistic “solve this complicated problem with AI” or “build a wrapper around ChatGPT” projects, and of course I didn’t get one of those three.

Our project was to build a system to evaluate how easy it is to cheat on interview and coding assessment questions, then automatically tweak the questions to make them harder to cheat on. This involved, you guessed it, building a wrapper around a bunch of LLMs that just asks them to solve the question and then checks if the code they give compiles and passes the testcases.

Our group project

Our project, showing that all the big LLMs can write a one-line add function

I shouldn’t be quite so negative - my group could have been a lot worse, and we did manage to build a genuinely cool system. The client was helpful too, and he let us have a lot of freedom in how we approached the project. I took on the role of group leader (alongside building the UI), which was a lot of work, but very necessary work to keep everyone on track. I learnt a lot about project management and conflict resolution, and I think I did a pretty good job of it… at least, we submitted a working project on time!

However, I can’t help but feel like the project was largely a waste of time. I didn’t learn anything new academically, and it replaced the “ticks” (assessed practicals) that we had in first year, which I think were orders of magnitude more useful. A tick or two for the majority of the courses would have been much more beneficial to my learning than a big pointless project that I won’t put on my CV and that I won’t ever think about again.

Life

I continued going to concerts and formals, which was really fun. In particular, since I got a first last year, I became a Scholar of the college, which meant I got to go to the Scholar’s Feast - a very, very fancy 5-course dinner with live choral music, lots of speeches, and which was preceded by a ceremony where I dressed up and shook hands with the Master of the college!

Also during Lent term, I took on a role on the committee of the 2024 Churchill May Ball as their IT Officer, which, to be honest, was a pretty big mistake. I thought I was just going to have to build a website and get a free ticket to the ball, but it turned out to be way more work than I expected. I had to go to a lot of completely irrelevant meetings (although I’ll admit that I did miss a few), liaise with disorganised people (although the people in charge were very organised), and do a lot more of the design and writing work than I thought I would. It’s all done now though, and the ball was great fun! (even if they did run out of food very quickly…)

As you might expect, I spent the vast majority of my Easter break studying for my upcoming exams, mostly doing exam questions. However, I did manage to escape for a few days to the south of France with my now girlfriend (!!) Elizabeth, which was an absolutely incredible trip where we ate a lot of amazing food, enjoyed the beautiful scenery, and had a lot of fun.

South of France

Left to right: us in Villefranche-sur-Mer, the view along the coast

We returned to Cambridge very happy, ready to face exam term, together.

Easter Term

Okay, I’m getting distracted… let’s talk about EXAM TERM.

Collage of photos from Easter term

Left to right: me and Dron at the new Wendy’s (it is very good), looking across the river from Trinity to St. John’s, the lab at sunset after an exam

This term was by far the most work I’ve ever had in my life, and by quite a long way. Not only did I have exams to study for, but I also had 13 hours of lectures a week right up until just over a week before the exams, all covering important examinable content. I was absolutely swamped in supervision work, past papers, note-writing, and other revision, and I’m still recovering from it now! That being said, I really enjoyed the term, and I’m very proud of how productive I was able to be (some of the time…).

Courses

  • Concepts in Programming Languages: the history of programming languages, with a bunch of random stuff thrown in at the end. The history part was pretty interesting, but the rest of the course just felt a bit all over the place, with most of the content having been covered anyway in other courses. The lecturer was extremely good, but the course just didn’t have much substance.

  • Formal Models of Language: grammars, parsing, information theory, and a lot more random topics. Similarly to Concepts, this course had a lot of random content that was either covered in other courses or didn’t really need to be covered at all, but it was still quite interesting and provided some much-needed easy questions in Paper 7! The lecturer was quite good, and I appreciated that it was quite a well-defined course in terms of what I needed to know.

  • Cybersecurity: computer and web security. This course, in terms of content, was fantastic - it was very interesting, very useful, fairly well-structured, and the provided notes were the best of any course I’ve taken. Unfortunately, the lectures let the course down a lot. It was like the lecturer decided “I’ve written these really good notes, so that’s enough”, and then just read his notes in the lectures. The practical “SEED labs” definitely helped to reinforce my understanding, and I think they would’ve worked very well as ticks, rather than just supervision work. I wish this course hadn’t been in Easter term - I would’ve liked to have been able to spend more time on it.

  • Complexity Theory: the complexity of problems, including P, NP, and reductions. This was a very interesting course, and the lecturer Dr. Tom Gur was clearly extremely enthusiastic about the subject, which made for a very engaging course. He emphasised the concepts and the intuition above the proofs and the rigour, which was definitely preferable for me, but this was the first year he had taught the course, and the materials were by the previous lecturer, who emphasised very different points. That being said, I think that, after a few years and a few adaptations to the materials, this course will be one of the best in the Tripos.

  • Artificial Intelligence: search problems, constraint satisfaction problems, planning, and neural networks. I think the lecturer massively overcomplicated this course, as the content is not actually that difficult, but it was presented in a confusing way. Again, my DoS saved the day in supervisions, but that shouldn’t have been necessary!

Life

As I’ve come to expect in exam term, my life was pretty much just work. I did go to Dron’s concert with the Cambridge University Wind Orchestra at West Road, which was awesome. I was going to go to another formal at Trinity, but unfortunately I was pretty ill for an entire week, which was very stressful as I was physically incapable of doing the mountain of work that was accumulating… Luckily, I was a bit ahead before I got ill so I didn’t get too behind, and it only took me about a week of very hard work to catch up.

I found myself studying in the lab a lot, which I actually really enjoyed. The atmosphere there is very conducive to work, and one day I was even the last person to leave (at around 1am), which I considered a very big achievement. How can I not top the Tripos after that?

Exams

And so, like last year, we’ve got to the dreaded exams. In the second year, there are four three-hour papers, and I had them on four consecutive days!

Each course appears on one paper only, with 1-3 questions on each course. Each paper has 8 or 10 questions, and you have to answer any 5. This gave me a lot more choice than last year, where I had to do at least one question from every course.

Each paper has a kind of “theme” (although I’m not sure how intentional this is):

  • Paper 4: programming languages
  • Paper 5: systems
  • Paper 6: theory
  • Paper 7: pain and suffering

Paper 7 doesn’t really have a theme - it has the two wordy courses (economics and further HCI), as well as AI, formal models of language, and further graphics. Effectively, they took the 5 courses I found the most difficult and put them all on one paper, which was not a nice way to end my year!

I think my exams went pretty much as I expected them to: not quite as well as last year, but for the most part not too badly. I get my results on Friday, which is very scary, but it’ll be nice to get it out of the way before summer properly begins.

Dropping Courses

Since we only have to answer 5 of the questions on each paper, we can drop at least one course from each paper (at the cost of less choice in the exam). This isn’t a formal thing - we can just choose not to invest time in revising for a course and then ignore it in the exam.

I think quite a lot of people dropped quite a lot of courses, but I was afraid to do that in case a course I found easy happened to have very difficult questions on the paper that I would be stuck doing. In the end, I only dropped Data Science (because I found it very confusing and I found all the other courses on that paper mostly straightforward) and Further Graphics (because I didn’t really do the course at all). Dropping Data Science was absolutely the right choice, but I wish I had taken Further Graphics more seriously.

After Exams and Summer

Collage of photos from June

Left to right: in a cafe in London, the view from a rooftop bar in London, me and Elizabeth at the Trinity May Week Concert, us at the Churchill May Ball

Exams only finished a week and a half ago, but in that time I’ve been up to so many fun things. The five of us went to London for a very fun few days, and me and Elizabeth went to the Trinity May Week Concert, which was incredible, and the Churchill May Ball, which was great fun too.

I’m enjoying relaxing and having no work to do, but I’m also looking forward to starting my internship at Citadel Securities in a few weeks. I’m very excited to spend the summer in London too - it’s going to be an amazing few months!

Other Thoughts

My post last year had a section called “other thoughts”, so here I’ll do the same, but also discuss how my thoughts have changed since last year.

Skipping lectures: last year, I skipped one single lecture (to go to the King’s Coronation), and I talked about how I think for most people skipping lectures is a bad idea. I still stand by this - unless you’re using the time to do something more productive (which is a valid excuse), you’ll learn more by going to a lecture than by staying in bed, no matter how bad the lecture is. I am ashamed to say that I skipped several lectures this year, especially in Easter term, mostly because I was working quite late every night and I needed the extra time in bed. Obviously, this is a bad excuse - I should have just gone to bed earlier - but I don’t think it massively affected my learning as I only skipped a couple of Cybersecurity lectures which I had already learnt from the notes.

Food: last year, I mostly cooked my own food. This year, I did not. I cooked a fair bit in Michaelmas term, but I found that it just took too long and it’s better in every way to eat out or get takeaway. That is, every way except one: it’s a lot more expensive. I quite meticulously track my spending, and this year I spent significantly more than double the amount of money that I did last year…

Note-taking: I talked about this at the start of this post, but this year I changed from writing up my notes at the end of each term to writing them up at the end of each week. I think this was a necessary change! This year, like last year, I took notes in lectures by annotating the slides on my Surface Pro in OneNote, but for next year I’m thinking about using pen and paper instead. We’ll see what happens.

Final Thoughts and Conclusion

My second year at Cambridge has been even better than my first. I’ve learnt so much, had so much fun, worked extremely hard, and survived to tell the tale. Thank you for getting to the end of this post (which has just surpassed last year’s as my longest yet), and I hope I’ve been able to give you some insight into my life this year studying Computer Science at Cambridge.

If you want to get in touch about anything, please feel free to drop me an email at hello@whenderson.dev - I’d love to hear what you thought of this post!

That’s all for now - same time next year?