After four years, I've finally finished my degree 🎉. Since then, I've been thinking about how I developed personally over that time.
This post will aim to highlight the structure and key topics from my degree. Hopefully this will be able to help you decide on some direction to take during your personal development.
I'll sprinkle a few tips throughout 💖.
Already familiar with most of these concepts? Maybe look at a few topics you've dodged until now!
*DISCLAIMER* This is my personal experience, I'm not suggesting this is the correct order or way to learn these concepts. People will learn more/less in a greater breadth/depth, it's personal preference.
This is how I've described this year to others in the past:
Attack of the concepts 📚.
We were subject to a large number of introductory courses. Taking the time to let this stuff sink in was important long-term.
On the CS side, the year mostly consisted of teaching us how to code in C , Java , and Haskell.
C was used to help us understand the lower level aspect of development: how memory is allocated and how pointers work.
After this we learned how to think about programming functionally using Haskell. This felt unnecessary at the time, but it proved incredibly useful for helping me build an intuition for algorithmic complexity.
Finally, Java was used to teach us object oriented programming. Since this is likely the majority of programming a developer will be doing, it is vital to take time to understand OOP principles and design patterns.
If you are looking for a good introductory resource to programming, I love Daniel Shiffman's beginner friendly YouTube channel as a starting resource.
Introduction to Computer Architecture to me was the most important unit. We aren't programming infinitely complex theoretical boxes as developers, we are using finitely complex machines.
This unit explored computer hardware from silicon to stack.
After learning how to program, this unit helped all the pieces fall into place. It was the first big eureka moment for me as a beginner.
I would highly recommend Prof. Onur Mutlu from ETH Zurich's excellent lecture series on computer architecture.
As a developer, you won't get very far if you avoid maths altogether. So embrace it! Also embrace that there is often 100+ years of previous academic research - it's taken people a while to get this stuff.
Look up concepts as and when you need them, taking time to let them sink in. Filling in these spooky-ghost-shaped holes in your knowledge will always help in the long run.
You won't become an expert overnight and mathematics is notorious for its lack of a helping-hand, but you can do it!
Depending on where you want to go with your development, you will need to know different topics. I focused on statistics and machine learning so, for me, the most essential were Linear Algebra and Probability Theory initially.
Theory of computation was a unit dedicated to the fundamental mathematical properties of computing: what can and cannot be computed. Useful IMO. I found these course notes by Vassos Hadzilacos that may be a good read if you're interested.
For me, this year was a big motivational bounce-back from the first. It's the move from everything being new and tiring to everything being familiar and challenging. You start to focus in on topics you have knowledge of now and the details start to flow.
My stand-out units from this year all follow this pattern.
You know how to write some code ideally by this point (I thought I did 😅). The problem was applying myself to problems that were not designed to educate me.
Data Structures and Algorithms was an important unit all about understanding computational complexity. It was the step from writing code that worked to code that worked efficiently. Dynamic programming was a concept I learned here that I now use regularly. Here's a course PDF I found by John Bullinaria on DSA.
Symbols, Patterns and Signals covered how we digitally interpret the world around us. This was achieved through examples from applications in computer vision, audio, and machine learning.
This topic is broad so some searchable highlights from this unit might be "K-means clustering", "The Fourier Transform", "Audio sampling".
Databases and Cloud Concepts was also taught in my second year, although it was intended to be taught to us in first year. If you tackled this one earlier that would probably make sense. This unit was all about web security, how the internet works, and SQL. Roadmap.sh has a list of resources for learning key concepts with context.
Here's a great video from @3blue1brown about the fourier transform:
The fundamentals mathematics learnt so far will be enough to keep most developers afloat for the forseeable future. Further reading at this level is still important however.
From the Combinatorics unit I got a much greater understanding of discrete mathematics, including graphs.
So this is the year I also got my first internship over the summer. If I had to replace the internship, I would self-study what I learnt on the job: C++.
But C++ is one of many programming languages / tools used commonly in industry. Looking into what tools are used in your ideal line of work is a great step.
This year was all about taking the conceptual understanding of a variety of topics and churning it into rigorous understanding.
These units are all natural extensions of topics learnt from the first two years:
- Machine Learning: Linear regression, Gaussian Processes, Unsupervised Learning ...
- Image Processing and Computer Vision: Computer Vision algorithms and a bit about Deep Learning.
I found this blog post that lists several free online courses for ML. For deep learning, fast.ai have practical courses. For web technologies, again Roadmap.sh has a list of resources for learning key concepts with context.
A skill that is necessary for any developer is your ability to communicate ideas.
Don't have to be a public speaker or a poet.
Don't need to show it in fear of blowing it.
Meek creature; Word weaver.
Chat clearer, not to feature.
Seriously, you do need to be able to communicate your thoughts to your peers and colleagues.
This was the year I did my first serious academic project, which for further reading can be found here. This helped instil some of the key concepts needed for communicating ideas.
As a replacement, this would be a point in your development to start writing blog posts or other long form explanations of concepts. I like this thread I saw on twitter with some ideas of where to start:
Randall KannaA few ideas for your very first dev blog post. 🧵
What are some other good post ideas that you would recommend to a developer?19:59 PM - 24 Aug 2020
From common knowledge to state-of-the-art. The move from understanding topics in reasonable depth to understanding the bleeding-edge.
The units I took this year describe my specialisation as an academic through a focused set of related subjects.
The following subjects give a good view into my choice of specialisation:
These subjects are related through statistics, machine learning and data science.
At this point in your personal development you may want to find the topics you really enjoy and delve deep into them.
My Masters Thesis was on utilising the popular Transformer architecture for video summarisation. Key point:
- It was the most work I've put into anything in my life.
- It wasn't successful.
- It was fun!
I think this will describe a fair amount of work done at this point in a persons development.
That covers most of the subjects I took over four years at university! If people want anymore detail on specific subjects then feel free to tweet me @tim_cb_roderick or leave a comment.
Your personal development journey is unique and challenging. By highlighting the steps I took during my education, I hope I can bring clarity and guidance to those looking for it.
The way I learnt certainly isn't the only way.
You may choose to delve deep into certain topics and keep your focus there. You could skip all things hardware and focus purely on the software.
In the end that isn't the key takeaway from this review. For me, it's that learning is a long process that takes time. Rushing it will only hurt your confidence and abilities in the long run.
I hope I've provided enough resources throughout this post to help guide people if they are interested. If you have any specific queries feel free ask, I'll try my best!
Most of the maths modules I've mentioned so far can be found as free courses on Khan Academy.
A great set of CS courses covering a larger number of topics mentioned in this post can be found at freeCodeCamp.