In early-2020, I completed two courses: Part I and Part II of nand2tetris (Build a Modern Computer from First Principles: Nand to Tetris). I completed Part I a few years ago, but wanted to re-do it because (a) it is wonderful, (b) to re-establish my foundation to tackle Part II.
- https://www.nand2tetris.org/
- https://www.coursera.org/learn/build-a-computer (the course and lectures are hosted on Coursera platform)
I wrote programs in Python to complete the assignments, but most of the files in this repository originated from the course.
The course was great for the following reasons:
- Broad. The course promised and delivered great breadth, progressively building in complexity from a single NAND gate to a simple 'operating system'. The high-level overview afforded by zooming out gave me a greater understanding of how computers work.
- Deep. The course assignments required the building of a (simple) 'computer' in software: RAM, CPU, increasingly complex logic gates and structures; and a simplified versions of an assembler, Virtual Machine (VM) translator, and compiler to translate from a high-level language to machine language. Those assignments were really tough and interesting.
- Practice programming. Assignments allow you to practice programming, solidifying understanding of the concepts.
- Challenging and Rewarding. Build your own compiler! And assembler! And 'operating system'! (albeit simplified versions, of course)
- Fantastic Resources and Great Dedication. The course lectures are supplemented with a well-written book, great assignments, their own hardware description language (HDL), assembly language, high-level language, simulator programs etc. The professors built a complete ecosystem to administer this course.
- Engaging Teaching. The professors are passionate and articulate in conveying concepts that are necessary to begin building complex tools like the assembler, VM translator, compiler, and 'operating system'. Their lectures are just as engaging (and necessary) as their assignments.
- Well-designed. The professors went to great lengths to 'teach from first principles', providing an understanding of how computers work at each level of abstraction and complexity, beginning from the elementary logic gates. Each chapter is meticulously crafted to progressively take you from logic gate to operating system.
This has been my favorite course, and I enjoyed every part of the many full-day weeks I spent on it. (~1 week+ for Part I, ~2 week+ for Part II). I cannot extol this course's merits enough. Every course should be built this way: engaging, broad and deep.