After five long years of studies (seven if you include the two years of materials science), I've finally graduated with an MSc in Computer Science and Engineering from KTH Royal Institute of Technology. I'm still awaiting my degree certificates, but the thesis is published and I don't have to do anything but wait. I have two weeks left of my one month off before I start working, and I found that now would be a good time to reflect a bit on my education.
A CS degree does not an engineer make
Early on in my education, it became abundantly clear to me that my CS degree would be highly theoretical, and the practical elements were mostly toy projects. I needed side projects, both to practice applying the theory I learned in class, and to get experience with common software development practices such as version control (Git) and issue management.
While my first few projects were toy projects, such as clanim, I started my grail project in RepoBee fairly early during my bachelor's (technically, I started its predecessor). This was a "real" project for me, that I used daily and was also used by others. This gave me great incentive to create a good product and keep working on it. As RepoBee is a management tool for version control in education, it also came naturally to adopt proper version control practices, as opposed to just winging it.
The takeaway from this is that in order to be well-equipped for work after school, side projects are really invaluable. Not only are side projects invaluable, but I think it's important to work on real projects. It creates incentive to keep going, and also gives you something to show off to future employers. If you can't come up with something yourself, then there are a borderline innumerable amount of open-source software projects out there that need all the help they can get. Such as RepoBee :)
A CS degree gives you an exceptional theoretical foundation in computing
Although I think the engineering aspects were lacking in my education, the theoretical foundation that I now possess is nothing short of incredible. I never thought I could learn so much about mathematics, algorithms, operating systems, network protocols, computer security etc in only five short years. I also learned how to learn, and how to do so efficiently. This is probably the most important thing you can take with you from university.
I think that a lot of the theory would have been very hard for me to learn on my own, whereas the practical engineering practices were not. As such, in hindsight, I appreciate the heavy emphasis on theory. I've had a large amount of use for my knowledge of algorithms, data structures and time complexities already, and given my interest in programming languages and version control systems, I expect this trend will carry on.
A lot of people will tell you that a CS degree is not worth it, that you don't even learn the practical skills you need for engineering. This is true to an extent, but I think it's an oversimplification and whether or not it's worth it is highly individual. For me, the degree was entirely worth it. I was exposed to subjects I would not have found on my own and was taught concepts I would have struggled to grasp without a tutor. I also greatly enjoy learning for the sake of it, and I like to dive deep. I like to understand how things work, rather than just understand how to use them. A CS degree is definitely not for everyone, but the blanket statement that it isn't worth it is simply false. For those that enjoy learning and have a deep interest in programming, CS is the way to go. If you want to learn the practical skills you need to land a job as fast as possible, then it probably isn't.
Teaching is learning
After finishing the first year of my studies, I applied and was accepted to a position as a teaching assistant. I would go on to work as a TA during The remaining four years of my studies, year-round. I held exercises, worked labs, corrected student submissions, developed coursework, and much more. This greatly accelerated my own learning, for two reasons. First, in order to teach a subject, you really must learn it well, and students' questions inevitably highlight the shortcomings in your own knowledge. I received so many questions that I could not answer that I likely would not have known I could not answer had those questions not been asked. Second, in working as a TA I was introduced to other more senior TAs, who were much more knowledgable than I was. Discussions with them would lead to my learning things that I would not have found out on my own.
Another benefit of working as a TA was that I got the opportunity to develop RepoBee as a paid project, giving me another source of income during the summer and winter breaks. I also got the opportunity to write some short research papers, attend conferences, and connect with other faculty. If I wanted to, I could easily launch an academic career at this point. However, even though I enjoy science, I am more interested in practical engineering, and so an academic career seems unlikely at this point.
My point here is simple: if you have the opportunity to teach, then do so! I attribute a lot of my success to my experience as a TA, and many doors have been opened for me as a result of working with other academics. I can't recommend it enough.
My education has overall been a great experience. I've met a lot of interesting people and done a lot of interesting things. I've taken classes, taught classes, written software, theses and conference papers, and despaired in the face of the odd inordinately difficult exam. Although I greatly enjoyed my time at university, I don't want to continue with a PhD. I feel done with studies. For the time being, I'll be working as a research engineer developing experimental software at KTH, which seems like a nice middle ground between academics and industry. After that, I don't really know, which is pretty exciting in and of itself.