I remember a junior engineer I worked with who genuinely thought he was a bad software engineer.
Not average. But Actually bad.
Why?
Because every ticket took him too long. He could not debug production issues fast. He got confused in code reviews. And whenever senior engineers spoke about caching, queues, indexing, retries, race conditions, he would just go silent.
So naturally he made the worst conclusion possible:
"Maybe I am just not smart enough for backend work."
But that was not the real problem.
The real problem was much simpler.
He was missing a few boring prerequisite skills that nobody had properly taught him:
1. How HTTP actually works
2. How databases really read and write data
3. How logs are used to trace a bug
4. How to read an unfamiliar codebase without panicking
5. How to break a big problem into smaller checks
6. How async code fails in real systems
That is it.
Not talent or IQ.
Just missing foundations.
So instead of telling him to "work harder" or "be more confident", we fixed the inputs.
For a few months he did very basic things:
- wrote simple SQL queries by hand
- debugged small bugs slowly and documented the path
- learned API flow end to end
- traced requests from load balancer to service to database
- read old incident reports
- picked one concept every week and went deep on it
Nothing fancy. No 10x engineer nonsense. No fake motivation.
Simply repetition on the right prerequisites.
And things changed!
The same guy who used to freeze during debugging started finding issues before others. The same guy who thought he was "bad at coding" started writing cleaner code reviews. He used to get stuck on every production issue and now became the person people tagged for backend bugs.
A year later, new joiners thought he was naturally talented.
He was not.
He was finally practiced.
This is something a lot of people in software do not understand:
A weak foundation feels like low intelligence. A strong foundation feels like talent.
Many people are failing because they are trying to do senior-level work without junior-level repetitions.
And the opposite is also true.
Some people think they are geniuses when really they just got early exposure: better college better peers better internship better manager better starting point
That lead disappears very fast if they stop practicing.
Software engineering is like that.
Prerequisite knowledge is intellectual capital.
It can take a person from: "Maybe I am not cut out for this" to "I can probably build this"
And it can also take someone from: "I am the smartest guy here" to "why is everyone catching up to me so fast?"
Do not judge yourself too early.
Sometimes you do not need more confidence. You need more reps on the fundamentals.
It's so easy to think you're untalented, maybe even dumb, when really you're just unpracticed on some prerequisite skills.
Reminds me of the time I tutored a Real Analysis student who hadn't gotten much practice with proof-writing beforehand.
She thought she was gonna fail the class. She thought she might just not be cut out for it.
But we just shored up some of those missing proof foundations and then she came out with a well-deserved A.
And then she took Fourier Analysis the following year and crushed it. Didn't even need my help.
There is also a flipside: it's very easy to think you're a genius, when really you're just better-practiced on prerequisite skills than everyone around you.
That's actually a great situation to be in, provided that you recognize why things are going so well for you -- but if you conclude that "geniuses like me don't need much practice," then, well, your advantage is short-lived.
The moral of this story is that prerequisite knowledge is intellectual capital and can take you from academic rags to riches -- or from riches to rags, if you squander it.