Pursuing a quality computer science (CS) education at a non-IIT college in India can be challenging due to a shortage of well-trained faculty. By the end of your undergraduate CS degree, you should ideally have a solid understanding of various components of computer systems, including hardware, operating systems, compilers, programming languages, databases, and applications like deep learning and machine learning.
The best way to grasp these concepts is by building minimal, realistic versions of these components yourself. Unfortunately, many colleges provide only a high-level overview, without delving into the implementation details. This often leaves students confused about how these components fit together, even after completing their degree. For many, a CS program seems to focus only on data structures and algorithms (DSA) and programming, as these are the skills most companies look for during placement interviews. While DSA and programming are indeed important, there are many other fascinating topics that are crucial for becoming a well-rounded CS engineer.
If you are self-motivated to learn computer systems, here are some useful resources I've personally completed and found extremely valuable:
Nand to Tetris
This course offers a chance to build an entire system using just NAND gates. It covers digital logic design, computer architecture, assembly language, assemblers, virtual machines, high-level languages, compilers, and operating systems—topics you'll explore more deeply during your undergraduate studies.
Programming Languages-a
Programming Languages-b
Programming Languages-c
Most modern programming languages you know, like Python, Java, and C/C++, follow the imperative paradigm. These courses introduce you to the functional programming paradigm, explaining why different paradigms matter. They also cover statically and dynamically typed languages, with excellent programming assignments to reinforce the concepts.
Pintos
Pintos is a uniprocessor operating system designed for x86 hardware that supports multiple applications. You'll implement different subsystems, such as threads, user programs, virtual memory, and file systems. The assignments are structured to be completed within a semester. By the end, even complex production OSes like Linux won't seem mysterious.
Compilers
This course guides you through building all phases of a compiler—lexical analysis, parsing, type checking, and code generation—for an object-oriented language called COOL. You'll also learn to formally define type-checking and code-generation rules. After completing this course, you'll understand how your favorite programming languages translate into machine language and may even design your own.
Deep learning specialization
Curious about how ChatGPT works? This deep learning specialization takes you from the basics to advanced topics like large language models, with programming assignments for each key concept.