My main goal right now is to level up, and that next level for me is making the jump from junior to mid-level, hopefully within 2-3 years. To better understand the evolutions I need to make, what are the main differences between junior and mid-level when it comes to SWE?
At some point, we'll have a really high quality breakdown of the behaviors of entry-level, mid-level, senior, and staff engineer, right here on Taro!
In the meantime, my brief answer: a mid-level engineer should be able to handle most bugs without hand-holding, and should be able to implement features of medium complexity on their own. Mid-level engineers should start shifting from purely reactive (most junior engineers) to proactive -- they should anticipate bugs and suggest improvements.
This will obviously vary a lot from company to company, but generally what I've seen is that a competent mid-level software engineer should have extremely strong coding proficiency.
What a lot of folks don't realize is that coding proficiency is judged across 3 axes:
If I were to put things more concretely, I expect a competent mid-level software engineer to be able to deliver on any task that takes 3 months or less with high code quality, higher velocity than all junior engineers, and with minimal hand-holding from senior+ engineers.
In terms of what growth looks like from junior -> mid-level, it's primarily building up that super strong coding foundation. That's ~80% of the delta, and the remaining ~20% is various "softer" skills like being able to clarify requirements, sync with PMs/designers, and scoping out tasks.