There’s a popular take in tech circles: “Algorithm interviews are outdated. Real engineering is about system design, not LeetCode puzzles.”

I get the frustration. But this argument hides an assumption that doesn’t hold up.

The False Divide

When people contrast “algorithms” with “system design,” they usually imagine two separate activities:

Algorithms: Array manipulation, recursion, graph traversal. Academic. Disconnected from “real” work.

System design: Drawing boxes and arrows. Databases, caches, load balancers. Practical. What senior engineers actually do.

But here’s what I’ve noticed after years of teaching people to code: the engineers who struggle most with system design are often the ones who rushed through the fundamentals. Or worse—memorized solutions instead of actually understanding them.

Not because they lack vocabulary. They can name all the components. They know what a message queue is, what eventual consistency means, when to reach for Redis.

They struggle because they never developed the underlying muscle. They learned what without learning why.

Architecture Is Just Algorithm at Scale

Think about what you’re actually doing when you design a system:

Strip away the infrastructure jargon, and you’re doing the same thing you do when solving an algorithm problem: tracing the flow of data and decisions.

A load balancer distributes traffic. That’s a scheduling algorithm.

A cache decides what to keep and what to throw away. That’s an algorithm.

Database indexing, sharding strategies, retry logic with exponential backoff—algorithms, all of them. Just wearing production clothes.

When you design a system, you’re not abandoning algorithmic thinking. You’re applying it at a different altitude.

Memorization Is the Trap

Here’s where people go wrong.

You can memorize the architecture of Netflix. You can recite the components of a URL shortener. You can draw perfect diagrams with all the right boxes in all the right places.

But memorizing architectures is like memorizing chess openings without understanding the principles behind them. The moment something unexpected happens—and in real systems, unexpected is the default—you’re lost.

The same thing happens with algorithms, by the way. People grind hundreds of LeetCode problems, memorize patterns, and still freeze when they see a slight variation. Because they optimized for recognition, not understanding.

Real system design ability comes from somewhere else entirely. It comes from problem-solving instincts you can only develop by getting your hands dirty.

If you’ve never felt an O(n²) solution crush your runtime on a large input, you won’t have intuition for why certain designs fall over at scale.

If you’ve never debugged a race condition in your own code, “exactly-once delivery” stays an abstract phrase instead of a solution to a problem you’ve personally cursed at.

If you’ve never implemented a simple cache yourself, the Redis vs. Memcached discussion is just trivia. You won’t feel the tradeoffs.

You can’t reason clearly about systems you’ve never built pieces of.

Deep Understanding vs. Surface Knowledge

There’s a difference between knowing that consistent hashing helps with distributed caching and understanding why it works—why adding or removing a node only reshuffles a small portion of keys, why that matters for cache hit rates, what happens at the edges.

The first is something you can pick up from a blog post in ten minutes. The second requires you to think through the problem yourself, maybe implement a rough version, definitely bang your head against some edge cases.

This is the hard truth about learning: deep understanding takes longer. It’s less efficient in the short term. You can’t speedrun it.

But it’s the only thing that actually compounds. Surface knowledge gets you through the interview. Deep understanding lets you actually do the job—and keeps paying dividends for years.

The best system designers I know have all written a lot of code. Not because they’re gatekeeping or nostalgic. Because the pattern recognition that enables good design comes from working with systems at the ground level. From seeing how things actually behave. And break.

The “Big Picture Person” Problem

There’s an archetype in tech: the person who says they’re “more of a big picture thinker” and prefers to “leave the implementation details to others.”

Sometimes this is legitimate specialization. More often, it’s a way to avoid the discomfort of not fully understanding the systems you’re supposedly designing.

The uncomfortable reality: the implementation details are the design. The “big picture” emerges from thousands of small decisions. If you can’t reason about those decisions, you’re not designing. You’re decorating.

Those boxes on your architecture diagram aren’t magic. Each one contains code someone has to write. Code with performance characteristics, failure modes, edge cases. If you don’t understand code deeply enough to anticipate these things, you’re designing systems you can’t actually think about clearly.

What This Actually Means

If you’re early in your career, wondering whether to invest time in fundamentals versus jumping straight to system design content—do both. But don’t skip the fundamentals. And for the love of god, don’t just memorize them.

Learn data structures because every system you’ll ever design moves data through structures. Solve algorithm problems not to collect checkmarks but to build intuition about efficiency and tradeoffs.

Build small things end to end. Implement a basic key-value store. Write a simple rate limiter. Create a bare-bones pub/sub system. These don’t need to be production-ready. They need to teach you what the blog posts and YouTube videos leave out.

When you study system design, don’t just memorize the architecture diagrams. Ask yourself: what would I actually need to understand to build this? What algorithms hide inside these components? Where would I get stuck? What would I Google at 2am when something breaks?

The Real Connection

When someone asks you to design a rate limiter or a notification system, they’re asking you to think through a problem from first principles:

That’s the same process you use on an algorithm problem. The scale is different. The vocabulary is different. The underlying skill is identical.

System design isn’t an escape from algorithmic thinking. It’s algorithmic thinking applied to a bigger canvas.

And you can’t develop that thinking by memorizing. You develop it by solving problems yourself, by writing code, by building things that don’t work and figuring out why.

The diagram is just how experienced engineers communicate what they learned the hard way.