When I started studying programming and computer science, I was capable of doing it from morning until dawn. It was an addiction. It felt like those days, when I was playing World Of Warcraft. Only this time I was doing something a lot more useful. The reason for my dedication was my deep interest in learning how things worked.
How do you make your own exe file?
What is it like to make a game?
Can you make your own Facebook?
But as you advance more and more into programming, you find out that much of the things you are interested in are hidden behind various abstractions. Nowadays, when you want to draw a pixel on a screen, you call the magic function Draw(x, y), from some library and it does the work for you. You don’t get to manipulate the bits of the screen yourself.
And this high level of abstraction is what keeps the industry going forward and lets you focus on higher-level tasks such as choosing the best algorithms for processing the data you are working with, or focusing on more sophisticated topics such as machine learning.
But I am that kind of guy, who always strives to delve deep into the details of the low level nature of machines. I am not satisfied from knowing how to use a function for drawing a cat on the screen, I want to know what are the actual mechanics done on the bare metal for achieving that.
I’m not satisfied with knowing that you build a C# program by clicking Ctrl+F5. I want to know what is the process of transforming a stream of text into a stream of bytes, that the computer knows how to interpret. This genuine interest in the nature of computers is what fuels my passion for computer science.
And if you are like me, then I have a challenging conquest for your weary mind, young padawan.
The Nand2Tetris Course
Nand2Tetris is a computer science course, where you learn how to build your own computer. It is split in two parts, which have been recently packed in two courses in coursera. Those are recorded by the initial authors of the course and the accompanying book, which gives you a more detailed view of the covered concepts. Most of the chapters of the book you can find on their site.
Building your own computer is a huge endeavor. But it will satisfy your hunger for knowledge and it will drive your interest in computer science to a whole new level. Apart from that, do you remember all those computer science subjects you studied in university such as boolean algebra, grammars, automata, etc.?
Even though we have studied the subjects, we never really develop an understanding of why we study them or how can we use them (at least I didn’t). But this course will provide you with answers. Because you will not study boolean algebra to complete a set of tasks to get a high grade, you will study it to build your own CPU.
The course comes in two parts – first you build the hardware, and then the software running on top of it.
Hardware
Here you start from the atoms of a modern computer – the logic gates. You will start with the simplest logic gate found in computers, called NAND (That’s where the course name comes from).
You will use it to build other logic gates such as AND, OR, XOR. Up to more complex ones such as a multiplexer.
You will learn what a register is and use it to create the computer memory we all know today as RAM. Then you build an Arithmetic-Logic unit (ALU) and, finally, your own processor.
The final mini-project of this part is to build an Assembler which translates symbolic notation into binary. Modern computers have their own machine language and your computer does not differ.
The good thing is that for building the hardware of your computer, you don’t need any prerequisite knowledge.
You will use a hardware description language which will be explained during the course and is not hard to use. The only exception is the final project of building an Assembler, as you will need to write a program that actually does the translation for you. However, you will choose the programming language and you don’t need a lot of in-depth knowledge.
Software
Surprisingly, it turned out that building the hardware of the computer is easier than building the software. In the second part of the course, you will build a virtual machine. It is very similar to the virtual machine of the Java programming language. Next up, you will build a compiler. Here, you will learn what a grammar is and how to implement it in code.
Finally, you build an operating system. Here is the part where you will learn what happens when you click the ON button of your computer. Ever wondered how the Heap memory actually works? Don’t worry, you will learn that too.
For this part of the system, you will need a more in-depth knowledge of a programming language. You will need to understand a bit more complex topics such as recursion, as well as Object-oriented programming. A basic knowledge of data structures and algorithms will be helpful as well, although they are explained in the course when used.
What you need to get started
As I mentioned, for the first part of the course, you don’t need any prerequisite knowledge. For the second part, understanding at least one programming language to a decent extent is necessary.
But most importantly, you will need to put in a LOT of effort for this course. It is not a feel-good course you just go through from start to finish by watching 20 minutes of video per day. You watch the lectures first, then you read the book and then you do the project.
The whole course consists of 12 mini-projects along with the accompanying lectures. Each one of those will take you at least 5 hours for watching the videos, 1 hour for reading the chapter in the book and anywhere from 5 to 20 hours of work for completing the project, depending on the complexity.
As you see, it will be hard. The first part took me about 2.5 weeks of focused learning to complete. Meaning I was studying and coding for 10 hours a day, every day. The second part took me around 3.5 weeks. But if you are doing the course on the weekend due to work, then it will take you a lot more time.
Now, I’m not saying all this to stop you from taking it. Actually, it’s the other way around. Don’t consider this course as a destination, rather – a journey. Every step you take to completing it will make you at least a bit happier. The reason is that there is so much to learn from it. Completing it will feel more like playing a game, than working.
But that is only if you have genuine interest in computer science and programming. Which brings me to the next topic:
Why bother with such a course?
Well, as you see, this course won’t teach you a lot of marketable skills. Companies search for people who know how to use AngularJS, not someone who knows how to build a compiler. Also, it is not a particularly easy course. It will require a ton of dedication and a lot of contributed time to complete.
It is for those who want to gain a deeper understanding of computer science, not just a deeper understanding of the most popular JavaScript framework.
Although, the knowledge that Nand2Tetris provides a long-term prospect for you as a professional. Because, modern frameworks change, but fundamental knowledge stays the same.
And you might say that this is all obsolete and no one needs this anymore, because someone else has done the job for you.
But even so, would you hire an electrician to model the whole electrical scheme of your house if he doesn’t know Ohm’s law?
Sure, there are devices that give you the metrics out of the box, but an understanding of the basics is still important.
Conclusion
The Nand2Tetris course is a work of art. It’s made from passionate people for passionate people. It goes from A to Z of computer science topics and let’s you take a breadth-first approach to the nature of computing systems.
So, if you are like me. If you want to understand how things work on the bare metal. If you consider yourself a craftsman, rather than simply a worker, then you will definitely love this course.
Once you complete it, you will feel utterly exhausted, but deeply satisfied.
It is a huge step on your journey to mastery.