Early in the career of a software engineer, a lot is about developing technical skills and contributing code towards features. With more seniority, the expectations shift. A post on working as a Senior Software Engineer.
As a junior or mid-level software engineer, your work is mostly about individual contribution. You participate in the sprint meetings, pick a ticket or get one assigned, come up with a solution, discuss it with your peers and implement it. You might involve yourself in architecture discussions, review your peers pull requests or fix a reported bug in production. The most of your work is focused though on contributing code towards features. During that you refine your skills as a software engineer. You gain experience on which code is good and which is bad. You learn to navigate within your codebase. You learn about various technologies, libraries, frameworks and languages.
As a Senior Software Engineer, this work as an individual contributor shifts towards work as an accelerator of a whole technical team. It's not anymore about what you are able to contribute as an individual towards the success of the team. Instead, you set a basis to make your team members successful. You have proven yourself to be able to write high-quality code autonomously. Now it's time to elevate your team members to achieve that too.
There are multiple roles that aim for that. One is the role of the engineering manager. These are often targeting people and processes. They guide their team members in their career and manage expectations. They figure out structural problems within and surrounding the team that prevent it from succeeding on its mission and they communicate internally and externally to resolve these structural problems.
The role of a Senior Software Engineer is instead targeting the technical and product basis. As a Senior Software Engineer, you need to ensure that the technical quality of your products does not block the further development of it. You need to find ways to implement new product requirements and discuss and adjust them to make sure they provide value and don't reduce the technical quality.
As a Junior Software Engineer, most parts of your work are within the team. As a Senior Software Engineer, you are taking on additional internal responsibilities as well as new external responsibilities.
Team-internal responsibilities 🔗
- Leading and defining epics: Your work shifts away from completing predefined work items and towards taking vague problem statements and defining the required work items to solve that problem. While you iterate on the solution, you ensure that the set of work items still works towards solving the problem and you define additional work items and refine existing work items based on the insights you gain during implementation.
- Design architectures: As part of leading epics, you need to come up with suitable architectures to support the long-term success of the solution you are building. This also includes iterating on an existing architecture and anticipating required architectural changes due to changes in the nature of the problem or how the product is being used.
- Ensure value delivery: You need to ensure that the implementations of your team actually provide value to your users. Sometimes there might be small obstacles that prevent an implementation to be usable end-to-end.
- Guide other engineers: During pair-programming and PR reviews, a Senior Engineer can guide other engineers towards a common coding style and agile practices. That is not acting as a police, but as a guide for the other engineers aligning them towards a common technical direction.
- Take on the hard, high-impact work: There is always work, that engineers are hesitant to do. As a Senior Engineer, there is no more hiding. If you don't take it on, there is no Super Senior Engineer that will take it over for you.
- Anticipate and resolve blockers: Similarly to hard, high-impact work, there are blockers for other engineers or the whole team that can come up. As a Senior Engineer, you resolve or delegate these blockers making sure they are addressed. Ideally, you anticipate them before they actually block other engineers.
Team-external responsibilities 🔗
- Present learnings: Your team is doing great work. Other teams are interested in hearing about the technical solutions you applied to solve problems. They might encounter similar problems and will want to reach out to you to adopt a similar solution.
- Adopt learnings: Other teams are doing great work as well. You want to inspect their work, reach out to them, listen to their presentations to reevaluate the approaches you took and are about to take.
- Push back on hard, low-impact work: Sometimes stakeholders outside of the team don't realize how complicated a small feature request is. It's now your job to push back on this kind of work such that your team can focus on high-impact work and easy low-impact work.
- Communicate problems: If outside expectations can't be met, then it is now your job to communicate that. That needs to happen as early as possible and always with an alternative plan in mind. Pushing the timeline, reducing scope, reconsidering technical approaches. It's important to offer a solution when bringing up problems.
As a Senior Software Engineer, your work shifts away from individual contribution towards working as an accelerator of your team. You take over different team-internal work and new team-external work. Much of your focus moves from work items to epics, from code to architecture and from coding to communication.