Hitting the Plateau: Why You Feel Stuck in React (And How to Break Through)
The truth is: it’s a long game. You don’t master anything overnight.
Most developers hit a plateau.
In the beginning, everything feels fast: you learn the syntax, follow a few tutorials, and build your first working app. But soon after, the pace slows. You start realizing that real-world problems don’t fit neatly into the examples you've seen. And that’s when the self-doubt creeps in:
Am I actually getting better?
Why is everything so confusing again?
Will I ever become great at this?
The truth is: it’s a long game. You don’t master anything overnight.
Quick Wins Disappear, Long-Term Growth Begins
Learning the basics—JSX, hooks, routing—is relatively quick. But as your projects grow, so does the complexity. You’re suddenly faced with decisions you didn’t expect:
Where should data fetching logic live?
How do you test this component?
Why does performance feel slow?
And frustratingly, there’s no "one right answer" to any of it.
When I first started, I used useEffect
for all my data fetching. It worked—until it didn’t. I ran into performance issues, loading flickers, and race conditions. That pain eventually led me to learn about preloading, suspense
, and finally, Relay—where you fetch all the data before the component even renders.
Same thing with testing. I used Enzyme for a long time. I knew about React Testing Library, but didn’t switch right away. Why bother? My tests were passing. But then they started breaking—often. It turned out I was testing component internals, and my tests became fragile and hard to maintain. That’s when I made the shift.
The point is: you don’t need to learn everything all at once. But you do need a learning mindset.
Learning Is Not Linear
Learning isn’t a straight line. It’s more like collecting jigsaw pieces.
At first, it’s confusing. The pieces seem unrelated. But if you stick with the process, something clicks. A pattern emerges. The picture becomes clear.
I remember not knowing why useEffect
was called an "effect". I followed tutorials, used it for data fetching and event handlers—and it just worked. But it wasn’t until I learned about "side effects" in programming that the name clicked.
Suddenly, it made sense: anything that happens outside of rendering, outside of view = f(state)
, is a side effect. That’s what useEffect
is handling. One concept unlocked another. That’s the real shape of learning.
Concepts Are Easy—Application Is Hard
I remember struggling with this in middle school. I could follow everything the teacher said in class—but the moment I sat down to solve problems on my own, I’d hit a wall.
One day, I asked my teacher why this kept happening. She told me, “You need to do exercises right after class. That’s how you internalize the concepts.”
She was right. Concepts are abstract; they only become real through practice. That’s how I started improving—not by reviewing notes, but by working through problems. And it’s the same in software.
Read, Pair, Reflect
A few other things helped me grow:
Reading others’ code – Open source, blog posts, or even your teammates’ work. You start to see different styles and solutions to similar problems.
Pair programming – At Thoughtworks, I used to pair almost daily. At Atlassian, less so—but I still try to do it often. Every session teaches me something new.
Writing things down – This is the big one. Writing helps you think. Most people treat writing as a way to share what they know—but it’s actually how you organize what you’re learning. It forces clarity and helps new patterns emerge. Writing connects the dots in your head.
Writing isn’t output. It’s internalization.
So if you’re feeling stuck...
You’re not broken.
You’re not behind.
You’re just in the part of the journey where things get real.
Keep building.
Keep reflecting.
Keep going.