From Nand to Tetris

A classical problem with the way Computer Science is taught is that it does not connect the dots between the different layers of abstractions which build up modern computer applications. Now I am talking about everything from the hardware components up to multi layered software. People tend to focus on one of upper-most parts of the cake and get really good at that, without understanding what happens beneath. Some people are really good at writing code and solve complex domain problems without realizing why their application performs like a drunk mule. For example:

  • Doing some computationally intensive tasks, not understanding how CPU caches and memory architectures work.
  • Using fancy built in data structures in their favorite language, without knowing anything about the different implementations, like the difference between ArrayList vs. LinkedList.
  • Dive into multi-threading, thinking it is easy as one-two-three.
  • Thinking that by having garbage collection means no memory leaks.

The courses I have had in my education have tackled each of the layers in a computer very well, but have generally lacked a focus on what the bigger picture is and how things relate. Therefore I got really interested and excited when I saw this clip where Shimon Schocken from Efi Arazi School of Computer Science explains a course and book he came up with along with Noam Nisan. The point of the course is to have students learning about all the different abstractions by starting at building logic gates from nothing but Nand components and ending up with a computer game like Tetris. I highly recommend everyone to take a look at this video, and as a bonus, the entire thing can be done for free with the tools and exercises from their homepage.

5 Comments

  1. Arnar:

    You have an excellent point. Sadly, I’ve heard from a few businesses that they can’t be sure anymore that someone with a CS or Software Engineering degree has the skills or understanding to solve problems that requires you to go deeper. Such traits are only discovered through interviewing individuals. I think this is a flaw in how we teach programming today..

  2. Einar:

    I agree with your bullets on typical mistakes, although I believe that these topics are covered by most computer science curricula. I would therefore argue that the people who make these mistakes fall into one of the following categories:

    • Uneducated programmers (i.e., not computer scientists)
    • Educated programmers from subpar universities or departments
    • Educated programmers from good universities or departments, who just do not care enough about these things to pay proper attention to them in class, or just memorize them long enough to pass the courses.

    But then again, maybe I’m just an education snob :)

  3. stefan:

    Baahh… this course that you point out is bloody brilliant! The Google Tech Talk is awesome! This is not only the course that should be taught but it also is exactly the way it should be taught.

    I’m pretty sure that any student that would take such a course and pass it (in other words, manage to create the end application on their own) would benefit for life!

    This is it! I’m gonna fight to see this course realized here at RU! And from what I gather from Arnar, the work has already started and is well on its way ;)

    Thanks for pointing this out.

  4. arnihermann:

    Am I the only one who notices the bit about performing like a drunk mule? Brilliant piece though, hope it makes it into RU classrooms.

  5. Guðmundur Bjarni:

    @Arnar & @Stefan: Thank you both for spreading the word. It would be amazing if this would be added to curriculum at RU. Please tell us about how it goes!

Leave a comment

Sorry about the captcha, we were getting buried in spam. At least this one serves a purpose.