From the time we are born, 
we are free…

It doesn’t matter how strong 
those who would deny us that freedom are…

Flaming water… Frozen earth… I don’t care what it is! 
The one who sees them 
will be the freest person in the world! 

I’d willingly give my life for that! 
It doesn’t matter how terrifying the world is.

It doesn’t matter how cruel the world is! 

These words and the whole scene are quite beautiful.

Nand2Tetris Reflections

So the Nand2Tetris project was a self-study course where you build a complete general purpose computer from the gate-level all the way up the software hierarchy that powers it. It is divided into 12 modules each with a hands-on project. In the first half, the hardware part, you build the computer’s hardware platform (adders, muxes, registers, RAM, ALU, CPU, etc.) and in the software portion you write the assembler, virtual machine translator, compiler, and basic operating system. The purpose of the course is to develop an understanding of how computers work “in the marrow of your bones.” Completing it has been a proud accomplishment and one of the best projects I’ve ever worked on.

The first few chapters were pretty easy, but things became much more complicated afterwards, especially in the software portion. I first downloaded the materials at the end of last winter break and finished it during this winter break, so it took me a year to finish it (mostly because I was pre-occupied with classwork and I was working full-time during the summer). The software part was definitely quite challenging, especially when the compiler was being written. That module alone took me almost 3000 lines of code in Java. It was probably the first time I wrote that much code for a specific project on my own. One of the things that became difficult while writing it was scrolling back and forth between code when debugging. The most challenging part of working on the VM Translator and OS was debugging VM code or bytecode. This was difficult because the way you debug that kind of code is different from what programmers might be used to in Java or some other high level language (you can’t do print statements and see what your output is easily). With the bytecode it’s not as easy. And it’s not always immediately obvious which part of the code you’re in since all of the instructions look the same. And plus, the bytecode you’re debugging is a bunch of primitive instructions executing a higher level algorithm so it gets frustrating trying to keep track of exactly what is going on, what you’re looking at, and whether it all makes sense. My main issue with that part was keeping myself oriented. Fortunately, they provided a very good tool for us and I really got a chance to learn how to use breakpoints as a debugging technique.

The computer that was built is a very primitive one. It is a 16-bit computer (the largest number the CPU can add are 16-bits wide), has 64K RAM, and has a screen resolution of 256 x 512 pixels. So it has very limited resources. Yet, it is still a general purpose computer and can amazingly still do a lot. You can write lots of useful programs on it using the Java-like language, Jack. It’s powerful enough to run games like Pong and Tetris written in Jack. Surprisingly, using a limited resource computer is actually really great as a learning tool. It made me more conscious about writing efficient code in order to reduce the number of operations as much as possible. I also tried to use variables sparingly so as not to waste memory.

On the hardware side, I think I learned more from this project than I did in my Fundamentals of Computer Systems course. There were some things in that class that were not covered in this project, but for the things that were, I learned it much better in Nand2Tetris. In fact, when I started on the first few chapters of Nand2Tetris, I felt I had a huge leg up when I later took that Fundamentals class that semester.

One of the creator of the courses, Shimon Schocken, has occasionally called this a “Nand2Tetris pilgrimmage” and I think it is a really great phrase for it. It’s certainly a worthwhile adventure for any serious student (not just academic students) of CS and CE. You emerge from it with such a deep and connected understanding of computers. And you come out of it really proud that you have accomplished a very challenging technical project.

I’ve conquered the Nand2Tetris course!!!!!!! :D

In response to “Hell” on an exam, I counter first saying that he incorrectly assumes that souls have mass. Second, if Hell were to expand, it would require energy. Assuming the energy supplied comes from within Hell and that some of it is wasted in the process, it is exothermic. Lastly, if souls are burned in Hell and the number of souls is increasing exponentially, then more souls are being burned which means more energy is being released. So yes, I can agree that Hell is exothermic but for slightly different reasons.

This semester was probably the worst I’ve ever had, but one that I’ve probably grown the most from.

"stay…out of my territory"

House Music and coding are an excellent combo.

This section really spoke loudly to me:

One of the things you can lose track of when you attend a top tier university like Berkeley is just how exceptional and amazing you really are. I’m blown away every time I talk to you. The way you ask penetrating questions, the way you improved so much between midterm 1 and 2, the way you challenge me to be a better teacher, it just knocks my socks off. You really are amazing. I’ve taught students all over the world, and I’ve never seen a group of students so talented. I’m not just talking about some of you. I’m talking about all of you. It’s a privilege to be your professor. Sadly, however, I know many of you don’t feel that way. The difficulty you all face is that as you look around at all your fellow students, it’s easy to have your eye drawn by people doing better than you. Or rather, I should say people who look like they’re doing better than you. In reality the true extent of how much people are learning can be difficult to measure. Sometimes failures and adversity are better preparations for long term success than effortless progress.

Why am I telling you all this? 

I’m telling you this because you all need to know that there is not some great pool of amazing people in some other place who are going to shape the way our species navigates the coming decades. The simple fact is that, like it or not, technology is going to change the way we live in the future, and you’re going to have to solve some very hard problems, as well as figure out how best to use new technology for good, while at the same time facing human dangers that have haunted humanity throughout history.

Part of the work of your generation is going to be technological, using scientific ideas to serve the interests of society, and part of the work is going to be fundamentally human, tied inexorably with qualities of the human condition - human emotion - that dominate the whole of history. These things are not separate, but are inexorably linked, and you are in a better place to understand that connection than me.

I can’t tell you what your particular role should be in the new realities of the 21st century. It’s up to you to decide if you want to make the focus of your life technological, focused on new innovations to drive society forward, or essentially human, focused on the age-old struggles of trying to get along, work together, and find happiness, or some combination of the two. 

However I can tell you this:

Whatever you decide to do with your life, it’s going to be really, really complicated. 

Science and technology is complicated. History and politics is complicated. People are complicated. Figuring out how to be happy, and do simple things like take care of our kids and maintain friendships and relationships, is complicated.

In order for you to navigate the increasing complexity of the 21st century you need a world-class education, and thankfully you have an opportunity to get one. I don’t just mean the education you get in class, but I mean the education you get in everything you do, every book you read, every conversation you have, every thought you think. 

You need to optimize your life for learning. 

You need to live and breath your education. 

You need to be *obsessed* with your education. 

Do not fall into the trap of thinking that because you are surrounded by so many dazzlingly smart fellow students that means you’re no good. Nothing could be further from the truth. 

And do not fall into the trap of thinking that you focusing on your education is a selfish thing. It’s not a selfish thing. It’s the most noble thing you could do.

Society is investing in you so that you can help solve the many challenges we are going to face in the coming decades, from profound technological challenges to helping people with the age old search for human happiness and meaning. 

That is why I am not canceling class tomorrow. Your education is really really important, not just to you, but in a far broader and wider reaching way than I think any of you have yet to fully appreciate. ”