There has been an explosion of online coding classes, coding bootcamps, coding do-it-yourself sites, and more over the past few years. 594 million results for "Learn to code" on google presently (8 million more than when I first queried this a few weeks ago). These sites aim to make you an able-bodied programmer as fast as possible. To be clear, I believe this to be a good thing overall. Democratizing the ability to enter a meaningful, and let’s be honest, lucrative career is great. This post isn’t about those sites though. This post is about what is usually, considered the boring, slow, “why am I doing this?” approach to learning computing.
This post comes based on a comment I made to a past post, that you should read. I think the true problem is not the theoretical approach, but the implementation.
A Little History
My initial exposure to programming came in my high school Computer science class. I lowercase ‘science’, since nothing we learned seemed to be based on science or real understanding. Even though I built a working paint program by the end of the semester, I didn’t understand nor appreciate the power of software. To be honest, I kind of hated it. Things seemed arbitrary and I didn’t understand WHY things were the way they were. I mostly just knew how to regurgitate code blocks, and do some OOP. I still enjoyed using computers and technology, so when it came time to apply for college, I decided to see if making computers, rather than programming them, would be of more interest.
A Turning Point
In my first semester of university, I took Introduction to Computer Engineering. Everyone in the entire program (a few hundred) gathered in one of the largest auditoriums for lectures. This class followed the “bottom-up approach” to learning. Since this was an engineering class we truly started at the bottom - transistors. After transistors, we learned logic gates, then digital circuits components (adders, multiplexers, etc.), then instructions processing, and finally assembly programming. Before the end of the semester we were writing 2 player games in assembly - Proof. In later classes, we continued to build on our knowledge base as we learned higher-level computing concepts. Learning how to think about computers and software systems has enabled me to not only learn new concepts faster but to create systems I would have otherwise not been able to.
Instruction Set for the LC-3 Simulator - I used to know this by heart (due to use, not rote memorization)
Why Critics Get It Wrong
A big criticism of this approach is how much students learn without context, which ends up confusing them or killing motivation. This is due to a laziness in teaching and not taking the time to construct a meaningful syllabus rather than the approach itself. Teaching what is necessary to learn the concepts without forcing students to memorize and regurgitate details, ensures students can leave the class with what they need to be successful. This is also where project based work helps to motivate students to apply those concepts and learn details where necessary for their interests. This can be summed up as "Teach them to think not do".
Why It is Worth Your Time
The integral part of bottom-up learning is de-mystifying and breaking down abstractions. Abstractions are great until something underneath breaks. Having a core understanding of fundamentals and the layer beneath where you are working helps immensely in designing and creating software systems. Granted, do I think everyone needs to be able to read assembly code of the platform they create software on - no. But do I think that there is significant value in understanding conceptually how the machine they are programming processes what you tell it - absolutely! For many, getting a Computer Science degree may be prohibitive in many ways and not necessary. However more and more resources are becoming available that can help you break down the abstractions. MOOC’s are bringing content that used to only be available in University programs to the masses. Shoutout to GT OMSCS* for making this cheaper and more accessible than ever before, and also for having most lectures available for free. If you are writing web code, why not learn how the networking stack works. If you write system code, learn how the OS works. Everyone should take a basic software security class. You don’t need to be an expert or build a system from scratch, but as they say knowing is half the battle!
Note: I linked to a page from the class I took at my university, so to give credit where it's due, my knowledge of this approach goes to Dr. Yale Patt. Also, much credit as to why I am where I am today would be his as well.
*Full Disclosure: I just finished the OMSCS program - DM me if you have questions about it.
Top comments (6)
Is there a mooc similar to the programme you mention that's free (or at least low-cost)?
Here you can find many of the Georgia Tech classes on Udacity for free - udacity.com/courses/georgia-tech-m...
(As an FYI - Doing the OMSCS Program runs about 10k and takes minimum 2 years)
I don't have much familiarity with other MOOC's, but I know of Edx and Coursera which should have similar content for free. Seems like the model is anything that ends up giving you a certificate or more costs some amount of money.
Yep, but many of the courses on there seem to be very job oriented, teaching the skills that companies are looking for directly, like mobile development, web development or data science.
True, there are still plenty that are either theoretical and/or fundamental courses across areas like: security (network or otherwise), algorithms, software engineering, etc. I can say having recently looked between Udacity, Edx, and Coursera there are many classes that wouldn't fall under explicit "job training" classes.
Try nand2tetris.org/ (also on Coursera, two parts). Amazing experience, starting from logic circuits, through building a CPU, assembler, VM, upto a real compiler!!! Also, very challenging, but don't be afraid.. xD
... and you can have fun, playing games that will teach you the assembly language:
spectrum.ieee.org/geek-life/review...