Over the years I’ve observed two bad things when it comes to computer science education. First, it simply is bad in general, with bad I mean badly structured and incomplete. Focusing on one thing but missing many other which are necessary to grasp the whole picture. In case the education is good, it still is mostly focused on a single area. I’m a holistic thinker
“The more basic knowledge you have the less new knowledge you have to get.” – Charlie Munger
I’m a holistic thinker which means I always like to understand the whole picture. I don’t just want to know how to write code, or how a compiler works, I also want to know how the code interacts with the hardware and how the hardware works on a fundamental level. Obviously, I can’t specialize in everything as there isn’t enough time, but I still can at least get a very good understanding and intuition about every area. The question is how? Universities and Online Courses have long given in to the notion that we must specialize in a niche and become intellectually limited to that particular pigeonhole. In German, there is a nice word for that place, Fachidiot. Fachidiot roughly means a specialist who is so specialized that he’s an ignorant in everything else, and that ignorance hurts so bad that it almost undoes his expertise (at least that’s my definition of the word.)
Anyway, I’ve found that for me, a good methodology to not succumb to “Fachidiotism” is reading good books. When I made my little free collection of some of the top books freely available on the Internet, I stumbled upon the book The Elements of Computing Systems: Building a Modern Computer from First Principles. Its approach is exactly what I think is so needed in Computer Science education. Fragmentation is bad and knowing a lot about First Principles is good. Below the description of the book, I highly recommend you to work through it if you feel you need a more throughout understanding of computer science.
In the early days of computer science, the interactions of hardware, software, compilers, and operating system were simple enough to allow students to see an overall picture of how computers worked. With the increasing complexity of computer technology and the resulting specialization of knowledge, such clarity is often lost. Unlike other texts that cover only one aspect of the field, The Elements of Computing Systems gives students an integrated and rigorous picture of applied computer science, as its comes to play in the construction of a simple yet powerful computer system.Indeed, the best way to understand how computers work is to build one from scratch, and this textbook leads students through twelve chapters and projects that gradually build a basic hardware platform and a modern software hierarchy from the ground up. In the process, the students gain hands-on knowledge of hardware architecture, operating systems, programming languages, compilers, data structures, algorithms, and software engineering. Using this constructive approach, the book exposes a significant body of computer science knowledge and demonstrates how theoretical and applied techniques taught in other courses fit into the overall picture.Designed to support one- or two-semester courses, the book is based on an abstraction-implementation paradigm; each chapter presents a key hardware or software abstraction, a proposed implementation that makes it concrete, and an actual project. The emerging computer system can be built by following the chapters, although this is only one option, since the projects are self-contained and can be done or skipped in any order. All the computer science knowledge necessary for completing the projects is embedded in the book, the only pre-requisite being a programming experience.The book’s web site provides all tools and materials necessary to build all the hardware and software systems described in the text, including two hundred test programs for the twelve projects. The projects and systems can be modified to meet various teaching needs, and all the supplied software is open-source.