I never studied computer science but I always wondered: is it useful to have a glimpse of it as a software developer? To know at least the basics? Is it interesting?

Could it bring value in my professional life?

I like software development and I always strive to improve myself. However, I always felt as well that I was lacking some key concepts in some precise contexts. Image manipulation or animations (when Flash was still a thing) are good examples where my lack of knowledge in Mathematics was pretty frustrating.

Then, something happened: I bumped into this fantastic article: teach yourself computer science. It’s basically a guideline how to study Computer Science as a software engineer, alone, without spending a lot of money trying to enter MIT.

It suggests 9 fields of study and recommend studying them from 100 to 200 hours.

I tried to follow this study plan for almost 100 hours. Now It’s time for a little assessment: was it useful? Did I lose my time? What would have I done differently?

If you wonder as well if you would benefit from studying the wide field of computer science by yourself, my experience might help you answer your questions.

## Why studying computer science: my personal goals

That’s a simple but important question: why one would do that at the first place?

For every project which require a good amount of motivation, I try first to define proper goals:

- Being able to learn a new language / new technology quicker by knowing some core concepts you can apply to every language / technology.
- Improving my understanding of lower abstraction levels. Understanding a bit better “how it works under the hood” could improve my understanding and therefore my efficiency for solving bugs or designing algorithms.
- Improving my logical reasoning skills and therefore make my code more logical as well.
- I believe that understanding the underlying concepts is a key for innovating in the development field.
- Understanding the history of the industry: why are we where we are now, what can we do to improve the computing world?

## Study plan

I’m not interested to read every book about computer science if I don’t understand anything I’m reading. It should at least provide me some sens of understanding.

That’s why my study plan focus on memory retention, understanding and building a quick reference about what I’ve learned, to be able to come back to it and solidify my knowledge.

- I’m studying about 2 to 3 hours every week, depending on my priorities. I don’t want to do too much not to finish burned and disgusted by computer science. The most important to me is to study on a regular basis, whatever the amount of time. It should stay something I enjoy doing.
- While studying new material, I write summaries on it in mindmaps. This has two advantages: writing helps to remember what I learned and I can easily recall some key concepts when I need them, in no time.
- My study time is divided in two categories:
- New learning (new chapter in a book, watching a new video course, doing examples and exercises)
- What I call “knowledge base recall”. It’s mainly doing (more) exercises about the new material I’ve read / seen the week before, reading my mindmaps and try to remember what I wrote in it.

- Regarding the exercises, I try not to spend more than 30min on each of them. The goal is to struggle enough to remember the concept but not too much to feel burned. It’s a delicate balance.
- I try to redo some exercises I could not do the first time, days (even weeks) after the different attempts, to see if I my understanding improved.

I’m trying to apply here some active learning principles by doing as many exercises as I can and asking myself questions while reviewing my mindmaps.

Revisiting what I learned from one week to the next is really, really beneficial to improve my memory retention and my understanding.

## Where I’ve gone so far

Here what I’ve precisely done during these (almost) 100 hours of computer science study, in chronological order.

### I. Programming (32h55m)

The article teach yourself computer science specify that I should follow “roughly” the order of study they propose, beginning by the `Programming`

field.

#### Main resource: Structure and Interpretation of Computer Programs (SICP)

This book is considered by many as the bible every developer should read. It’s free and you can find the best epub and PDF versions here.

You can find the solutions of the exercises here.

I succeed to do almost all exercises till `1.2.5 Greatest Common Divisors`

.

#### Complementary resource: Berkeley videos

The videos are available here. The notes of the course are here. If you search some sample exams from Berkeley, it’s here.

These are a very good complement to the book: concepts are explained without asking you too much about Mathematics, in contrast with the book. It shows and explains differently what’s in the SICP, which is perfect to be sure to understand what the book try to teach you.

#### What I learned from SICP so far

- The beginning of this book is very interesting to really understand the roots of functional programming and recursions.
- It defines a lot of terms programmers use every day, in a very precise manner. Perfect to be even more precise during technical discussions.
- I learned quite a lot about algorithms in a very broad way, space and time complexity and how it’s really calculated.
- The book pushed my analytic and solving problem skills with its exercises.

#### What can I use in real life?

The whole discussion about recursion in the book helped me quite significantly to easily write them. It’s a topic I’ve always struggled a bit with. Now it’s a breeze to go through any problem I want to solve with recursion.

#### What difficulties did I encountered?

This book is not for math haters. It was written for MIT students who have already quite some mathematical knowledge. Without this prior knowledge, the exercises can be pretty difficult and frustrating at time.

It was the cause of another problem: I spent too much time on the exercises. I could solve most of them but it took me hours in some case.

I decided from there that I would not spend more than 30 minutes by exercise, to keep the frustration low without discarding the huge benefit of doing them.

## II. Discrete Mathematics (50h)

More and more I was reading SICP, more and more the exercises were difficult for me to solve, especially since it was dealing with some mathematical concept I was not aware of. Therefore, I decided to move on and to begin to study the `Mathematics`

subject.

#### Main resource: Discrete Mathematics and Its Applications

Teach yourself computer science advise you to read the lecture notes by László Lovász, freely available here as a ps document. I converted it to PDF here for those who don’t know what a ps document is. I didn’t know either.

However, I’ve chosen another main resource of study, apparently more beginner friendly: Discrete Mathematics and its Application by Kenneth H. Rosen. It’s a pretty big book, quite inexpensive in its earlier editions.

In 50h I was able to finish the first chapter (propositional logic) and achieve 54 exercises.

#### Complementary resource: MIT 6.042J Mathematics for Computer Science, Fall 2010

These videos from MIT are more advanced courses about Discrete Mathematics. Again, they assume that you know quite a bit in Mathematics. Nevertheless, they are very interesting even if I had difficulties to follow them.

In the worst case it will at least give you a good glimpse what Discrete Mathematics is all about.

One teacher (Tom Leighton) has better teaching skills than the other (Marten van Dijk). However, they have both a very deep knowledge of their respective subjects.

#### What I learned so far

- The book taught me the basics of logic, a very good skill to have as a developer. After all, our work is based on proper logic.
- Propositional logic with quantifiers and rule of inference. Basically it’s the way to write logical statements, verifying that logical statements make sens and proving their truth values.
- Basics of sets and graph theory, thanks to the videos. It’s very interesting and it’s pretty useful for a lot of things: state machines, networking…

#### What can I use in real life?

- Truth tables can be very useful to sort out complex conditional statements or to refactor them.
- Recently I could apply DeMorgan laws to improve the readability of some conditional statements.
- Expressing confusing and short specifications with predicates, conjunctions and disjunctions (the language of propositional logic) can show contradictions and the details missing. It can summarize very succinctly complex specifications precisely. It can be a good bridge between the specs and the code itself.

#### What difficulties did I encountered?

- Understanding how to write a mathematical proof is hard, especially when nobody can’t help you or correct your proof.
- I still lacked of some basics in Mathematics, especially needed for the videos from MIT.

## III. Return to the basics of Mathematics (11h15)

After having some other (minor) problems with my Mathematics knowledge in Discrete Mathematics, I decided to come back to the basics.

Another important reason which guided my choice: I really enjoyed doing some Mathematics. Without that, I would have not continued to study computer science.

Don’t be confused: the Mathematics related to computer science are different from the one you studied (and maybe hated) at school. I would advise you to give it a try.

At that point I decided to alternate between studying Discrete Mathematics and the basics of Mathematics.

#### Main resource: How To Learn Basic Arithmetic Fast

This video of 4 hours is really good to refresh a lot of things, from the sums and product through the percentages, exponents, logarithms… It covers a lot of ground very quickly with a lot of exercises.

The tips given are very good as well to understand and solve basic problems quickly.

You can see on youtube an hour long preview of the video. If you like it, you can buy it on Vimeo.

#### What I learned so far

- My mental calculation skills improved grandly. If you have difficulties to calculate quickly percentages or even doing simple multiplications without a calculator, this course will help you a lot.
- Basics to manipulate fractions, exponents, square roots, logarithms and so on.

#### What can I use in real life?

- Being able to calculate mentally is very helpful for a lot of things in real life. Calculating quickly promotions, roughly how expensive a full shopping cart will be…
- I can apply all this knowledge while studying computer science.

#### What difficulties did I encountered?

After studying the SICP and Discrete Mathematics, it was very relaxing to finally understand everything with a bit of work. I didn’t have any notable difficulties.

## My advices for beginners in Computer Science

If I could come back to the beginning of this adventure, I would have study the different subjects in that order:

- I. Basics Mathematics
- II. Discrete Mathematics
- III. SICP

I would have study Basics and Discrete Mathematics in parallel and then go for the SICP, trying to get the left Mathematics knowledge I miss along the way.

## What’s next?

I will continue to learn basics and Discrete Mathematics for at least 150 hours:

- The little I know about it already helped me quite a bit in my daily developer life.
- I feel (and read) that it’s the basic for every other field in computer science.
- I enjoy studying it! Again, it’s an essential component to stay motivated.

In short: a very good experience, underlying a lot of my weaknesses but as well teaching me a lot of basics I was missing.

Keep in mind though: if you expect to be a super wizard programmer by studying computer science, you might be disappointed. Computer science is hard to study. It has strong theoretical sides and even if I already found some use of it in my daily work, it’s not mind-blowing at all.

Going through this journey ask for work, patience and dedication. Having clear goals, a concrete study plan and enjoying the process are mandatory!