Teach yourself Computer Science

After spending the last years of my life working on the business / product side of software companies, I have reconnected with my innate desire to build things on my own. Last year, I already investigated what would be the best way to teach myself how to code. The consensus seems to be clear: just start coding. Then you read on Medium and Twitter how people score engineering jobs after only 12 weeks of learning how to code in a coding bootcamp. It actually might work for some, but after jumping into courses on Codeacademy et al. I have realised that this approach is not exactly the right way for me. In the last years, I have become a person that prefers to put things in a long-term perspective: instead of trying to swim faster and greater distances every week, I aim to become a great swimmer in 5 years by regularly working on it.

With this mindset I had started to research and structure my learning path. When I stumbled upon Peter Norvig’s “Teach Yourself Programming in Ten Years”, I had found a good roadmap for how to approach a ten-year plan. However, he also advises to mainly start coding right away and I do think that there are some people who need a slightly different approach to coding.

Practical vs. systemic thinking

For the people who follow the advice to just start coding, it seems to be a rewarding enough experience to just type a few lines to make a program print “Hello World” to keep going at it. I also do see how you can become a good programmer with enough practice through this very practical approach. However, the utility of this approach depends highly on what your goal is and most people without a STEM background will find it hard to deal with more complex applications that require a deeper understanding of how hardware and software interact.

Some people prefer to first observe and investigate the bigger patterns and components that make up a system or a process. Their brain first tries to get a grasp of the system as a whole. Hence, with computers they want to understand everything from the binary code up. This also includes the mathematic and logical foundations which are completely neglected by most “just-do-it” courses. That’s me.

Why do you want to learn programming?

Answering the question why you want to learn programming will define your learning path. For me, it is the desire to learn the craft of building efficient and powerful software, analog to a great Swiss watch or Japanese carpentry. For that, I have started to design a curriculum that will equip me with the necessary systemic understanding. I’d like to share it here on an ongoing basis to provide an alternative to the just-start-coding camp which might help others who are interested in a more holistic approach with their endeavour.

A clear goal in mind

I do think that it is important to start coding right away even with this more holistic approach, as long as it’s not a stand-alone effort. Furthermore, I’m fixated on building a small mobile application for a side project of mine until the end of 2017, so I need to learn how to actually write software. It is important to have clear (realistic!) short term goals to be able to measure your progress, receive feedback and motivate you. For achieving this, I have identified the following resources for the first months:

My desired outcome after approx. 6 months of intense studying and 6 months of work: producing a working, stable iOS mobile app for video subscriptions with Swift. This goal obviously influences my choice of resources, so if you are interested in writing scripts or web apps this might look different for you.

A long-term vision

When I tried to figure out where to best start with teaching myself programming, I often felt very lost. Hence, I started to look into the curriculum of different CS programs and started to get a better understanding of the different branches of knowledge one has to master to be able to build more complex software. After the introductory courses, you usually take a deeper dive into Algorithms, Operating Systems, Systems Design and more advanced Mathematics. To prepare myself for that and to provide the bigger picture for the actual coding, I started to work my way through the following resources (this is my first “semester”):

  • Code: The Hidden Language of Computer Hardware and Software: This book is a tour de force through the history of computing and the most basic concepts behind it. It also introduces you to the common logical concepts behind code in general, also outside of computers.
  • How Computers Work: The title says it all and it truly does it’s job. Reading this book will make you understand the device(s) you use every day, which was really fascinating for me. Its explanations are rather high-level, but that was exactly was I was looking for.
  • What is Mathematics: Albert Einstein has praised this book and accordingly I felt completely overwhelmed a few pages in. The book was written for beginners and scholars, so you have to learn when to stop digging deeper. However, so far it does a fantastic job in explaining the fundamental concepts of mathematics which are essential to Computer Science.
  • Introduction to Logic: Stanford offers a great course on logic via Coursera and many of the rules presented here find their way into the programming logic.
  • Introduction to Algorithms: After CS50 and having brushed up your basic math skills , MIT’s course on algorithms is just the right primer on crafting the spells that make the magic happen.

My desired outcome after one year of studying: having a basic understanding of the broad world of computing and being prepared to take more advanced Undergraduate courses (I will post these here, too).


As I’m working on all of this besides my full-time job, it will be quite challenging to keep up with my ambitions. However, I hope that the information presented here will help people to get started with teaching themselves Computer Science. It’s a fascinating world.