Skip to main content

Command Palette

Search for a command to run...

A Job Taught Me More in 2 Hours Than Books Taught Me in a Day

Updated
•5 min read•View as Markdown
A Job Taught Me More in 2 Hours Than Books Taught Me in a Day
A
I’m a curious learner and aspiring software developer who enjoys building real-world systems, exploring new technologies, and learning in public. I write about coding, personal growth, and turning ideas into practical systems—while simplifying complex concepts for others.

I learned more in two hours this week than I used to learn in a full day. Nobody pushed me to do it. The job did.

In my last post, I wrote about what my internship taught me about how developers really work. This week I started the job properly, and the biggest lesson wasn't a technology. It was what responsibility does to the way I learn.

How I used to learn

I'm self-taught, so I thought I knew how I learn best. Pick a topic, read, take notes, come back tomorrow. It worked, but it was slow, and I rarely knew whether what I was learning would ever be used.

I'm also not a reader. Books put me to sleep. I read a few pages, reach the bottom, and nothing has stayed, whether it's fiction or non-fiction. I read mostly to stay away from my phone, because scrolling leaves me with a dopamine hangover.

The problem I carried home

This week our project needed a logging system. When something breaks, I want to know exactly what happened, and every log entry needs to be identifiable on its own. [One line on what a log entry looks like in your system, e.g. which fields it carries.] Many services write logs at the same time, so no single place can hand out IDs. I came home with that problem still running in my head.

At my daily study session I was already reading Alex Xu's System Design Interview. This time I skipped ahead to Chapter 7, Design a Unique ID Generator in Distributed Systems.

Here is what two hours looked like:

  • I started with one question: how do many services create unique IDs without asking each other?

  • I wrote down my constraints before looking at any solution.

  • I compared four approaches against those constraints and ruled three out.

  • I ended the night with a decision I could explain.

Before, the same two hours would have given me a page of notes on a topic I might never use. And I didn't fall asleep, because I could see where every idea would land in my own work.

Constraints come first

The chapter opens like an interview: ask questions, clarify requirements, agree on constraints, and only then design. I had read it before as interview preparation. This time I saw that the constraints step is real engineering. My constraints:

  • every log entry gets its own unique ID

  • many services generate logs at the same time

  • services shouldn't have to ask each other for IDs

Four options, quickly

  • Multi-master replication: auto-increment stepped by the number of servers. Simple, but it breaks when servers are added or removed.

  • Ticket server: one database that only hands out IDs. Easy, but a single point of failure.

  • Twitter Snowflake: a 64-bit, time-sortable ID built from timestamp, data centre, machine and sequence. Great design, but more setup, and it solves a problem I don't have.

  • UUID: a random 128-bit ID that every service can generate on its own.

Why I chose UUID

UUID is the only option that meets all three constraints. Each service creates its own ID with no coordination, and collisions are extremely unlikely.

Its weaknesses, the 128-bit size and no time ordering, matter less for me because every log already has its own timestamp.

One thing I still need to check: fully random UUIDs (v4) can be hard on database indexes, because new rows land in random places. Time-ordered UUIDs (v7) avoid that while keeping the no-coordination benefit. I'll test both before I settle on a version.

I didn't pick the "best" approach. The constraints picked the one that fit my problem.

Why I grew faster than I thought

The same chapter read differently this time. Same book, same words. The difference was that I had a real problem, and the problem decided what to read and what to skip. I wasn't reading to finish a book. I was reading because something depended on it. That's why I stayed awake.

It also compounds. Today's chapter gives me the vocabulary for tomorrow's design, and each piece I learn makes the next piece faster.

What I'm not sure about

I haven't built this yet, so I can't say how UUIDs will behave in the real system. I also haven't solved the second half of the problem, which is following a single request across multiple services. That likely needs a shared trace ID passed between them, and I'll have to learn how that works.

But I can explain why I made this choice, and a month ago I wouldn't have been able to. I didn't get smarter. I got responsibility, and it turned out to be a better teacher than any study plan I've written.

If you're stuck in a study loop, try this: don't pick a book first. Pick a real problem, then find the chapter that solves it.