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.
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.
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.
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".
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.