CS Fundamentals: Redeeming My Lost 4 Years

Confessions of a CS Major Who Skipped the Basics

The Arrogance of a GPA Chaser

Back in college, I thought I was hot stuff. I didn’t realize how crucial the ‘CS Fundamentals’ were; I was too busy chasing a high GPA.

I attended all the lectures, won awards in school programming contests, and even placed in the Capstone Design competition. When my classmates struggled with syntax errors, I would peer over their shoulders and do some ‘backseat coding’, feeling a sense of superiority.

But I have to confess: ‘My code was garbage.’

I found connecting a proper Database (DB) too difficult, so I saved data in a text file (.txt) separated by commas. Instead of using a Raspberry Pi—which required actual OS-level control—I took the easy way out with an Arduino that ran on a few lines of loop code. Professors praised the glossy, working exterior of my projects, and I deluded myself into thinking that surface-level functionality was my actual skill.

The diploma I earned through rote memorization was useless against the giant called ‘Production Reality’.

The Interview: Where the Tragedy Began

The moment I was thrown into the job market, my baseless confidence shattered. I faced rejection after rejection. My ‘Award Winner’ title couldn’t hide the hollow foundations of my CS knowledge.

As anxiety took over, I became obsessed with ‘Fake Knowledge’. Instead of understanding concepts, I memorized ‘Model Answers’ to pass technical interviews. My bible was a blog post titled ‘Top 100 Tech Interview Questions’.

When an interviewer asked, ‘What is the difference between TCP and UDP?’, I answered like a vending machine. ‘TCP is connection-oriented and reliable but slow. UDP is connectionless and fast but unreliable.’

In truth, I had no idea what a packet actually looked like, or how a 3-way handshake really worked. Ironically, that mechanical memorization fooled the interviewers. I passed. I got the job. I thought I was lucky. I didn’t know it was the start of a tragedy—a karma that would hit me all at once.

Survival in the Wild (a.k.a. The Small Startup)

I joined a small team. There was no friendly distinction between ‘Frontend’ and ‘Backend’ here.

From day one, a tsunami of tech stacks hit me. I thought being good at Java or JavaScript was enough. Reality was a black screen of a Linux SSH terminal, mysterious Docker containers, GitLab CI/CD pipelines, Spring Boot, Vue.js, Redis… Technologies I had skipped in school saying ‘I will learn this later’ or ‘I do not need this’ were now attacking me from all sides.

The definitions I recited in the interview were useless. Or rather, I didn’t know how to ‘apply’ them. To understand why my Docker container kept dying (OOM) or why Redis was eating up all the memory, I needed the real ‘CS Fundamentals’—the ones I had glossed over.

A Castle Built on Sand

Eventually, I became a ‘Ctrl+C / Ctrl+V Engineer’. I copied code blindly. The features worked, somehow, but I didn’t know ‘why’.

  • ‘CORS Error’: Why is my browser rejecting the server’s response? (Ignorance of HTTP Headers)
  • ‘OOM (Out Of Memory)’: Why does the server crash after a few days? (Ignorance of Memory Leaks & Garbage Collection)
  • ‘Connection Refused’: It works on localhost, why not in production? (Ignorance of Ports, Firewalls, and Networking)

Without understanding the principles behind the frameworks, I was powerless when things broke. I was building a magnificent digital castle on a foundation of sand.

Technology built without understanding principles is like a sandcastle—it crumbles with the slightest wave.

[Code Verification] My Code of Shame

Let’s look at the code that gave me a false sense of accomplishment in college. This is how I handled ‘Data Persistence’ without knowing what a Database or File System Lock really was.

// The "Database" I wrote in my senior year
public void saveData(String name, int score) {
    try {
        // Just appending strings to a file...
        // No transaction, no locking, no schema.
        FileWriter fw = new FileWriter("database.txt", true);
        fw.write(name + "," + score + "\n");
        fw.close();
    } catch (IOException e) {
        // Ignored the error because I didn't know how to handle IOExceptions
        e.printStackTrace();
    }
}

This code works fine when one person tests it. But in a real multi-threaded server environment (the ‘Digital Fulfillment Center’), multiple workers trying to write to this file at the same time would cause data corruption or race conditions. I didn’t know that because I never learned the OS fundamentals of ‘File I/O’ and ‘Concurrency’.

Re: Booting, Back to Square One

So, I decided to go back. Instead of adding another shiny project to my portfolio, I felt it was more urgent to answer the fundamental question: ‘How on earth does the computer understand and execute my code?’

This blog is a record of a CS graduate retracing their steps to rebuild their knowledge from the ground up. I won’t just list Linux commands or Docker installation guides. Instead, I will ask and answer the core questions:

  1. Language & OS: What happens to my Java code from the moment I hit ‘Build’ until it reaches the CPU?
  2. Network: When I hit Enter in the address bar, what journey does the packet take?
  3. Virtualization: How is my laptop different from the server room, and why do we need Virtual Machines?
  4. DevOps: How do I deploy my code safely and automatically?
The ‘Re: Booting’ Roadmap: Expanding from low-level basics to high-level architecture.

Escaping localhost

My ultimate goal is to build and control a Linux, Docker, CI/CD, and Cloud environment with my own hands. I want to evolve from a developer safe in the greenhouse of ‘localhost’ to an engineer who survives in the wild server environment.

For those like me who say, ‘I learned this in school, but I don’t remember anything’, I hope this series becomes a small signpost that makes you slap your knee and say, ‘Aha! So THAT is what the professor meant!’

[Next Post Preview]

We start with the most basic question that haunted me in Freshman year: ‘Why do I have to Build and Compile? Why can not I just press Run like in Python?’ See you in Part 1.

Leave a Comment