
Job titles are meaningless (outside of pay bands), but lets pretend for a minute
Here we will bucket IC Software Engineer tiers (Junior/Senior/Staff/Principal) based on what the engineer prefers to focus on.
The Junior Engineer focuses on learning.
A junior engineer's priority is learning. This isn't to say an IC ever stops learning, or really anybody ever stops growing. But the reward for putting hours in as a junior is accumulating experience.
This makes juniors super valuable, especially if they are high performers. They are easy to direct, they're inexpensive (relatively), and they generally aren't afraid to work on the nasty stacks.
The Senior Engineer focuses on the code.
Senior engineers care design patterns, paradigms, DRY, performance, etc.
They can be like teenagers with regards to personal blind spots, but valuable as they have the ability and desire to keep a high bar on your software quality.
The Staff Engineer focuses on the product.
A staff engineer cares less about low level code quality, and more about the product utility. What's the point of pristine code if it can't be shipped? Or if it's not useful?
This is inherently cross functional, an engineer at this level is growing their soft skills and learning KPIs outside their department.
The Principal Engineer focuses on the business.
They don't get to code much, if at all. Their job is to find places where technology can be leveraged to advance the business, and defining KPIs to get there.
A principal engineer is concerned about market competition, budget constraints, ROI, etc.