
Job titles are meaningless (outside of pay bands), but let us pretend for a minute.
IC Software Engineer tiers (Junior/Senior/Staff/Principal) can be broken down 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 that anybody ever stops growing. But the reward for putting hours in as a junior is accumulating experience.
This makes high performing juniors very valuable. 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 about 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.