In this article, I provide tips on choosing a software-engineering career path that is right for you. We will take a look at whether you should stay as a Senior Software Engineer, switch into management (Engineering Manager), or move into technical leadership (Staff Software Engineer).
Before we begin, there are some caveats that you should be aware of:
- Everything in this article is my own opinion.
- Job titles, job descriptions, and career ladders vary greatly company to company.
- As it is often the case, the terms software engineer, software developer, and programmer are used interchangeably as synonyms.
With that out of our way, let’s start :-).
A Software Engineer’s Career Path
You have become a software engineer because you love coding and enjoy the whole process of turning ideas into code. Building something out of nothing. Learning new technologies, programming languages, frameworks, etc. Figuring out how things work. From a Junior Software Engineer, through a “regular” Software Engineer, up to a Senior Software Engineer, you have been enjoying everything you do.
Now, depending on the company you are in and its career ladder, your path branches and opens the following three possibilities for you:
- Stay as a Senior Software Engineer. Keep doing what you have been doing and keep getting better at it. There is nothing wrong with that as a Senior Software Engineer can be a career (final) position at which you might want to stay.
- Switch into people management by becoming an Engineering Manager. Instead of working as a pure individual contributor, start taking care of a team of people and work through them.
- If you are lucky enough and your company provides a so-called dual-track career ladder, then there is another option for you: If you enjoy leadership but do not want to manage people, you can continue down the path of being an individual contributor on the technical track and become a technical leader. The first position on the technical-leadership track of the ladder is often called a Staff Software Engineer.
In this article, I focus on choosing one of the three options described above. They correspond to the three highlighted positions in the following example career ladder, taken from my talk on engineering career ladders:
Why Would You Want To Stay As a Senior Software Engineer?
Let’s start with the Senior Software Engineer position.
First, let’s take a look at what people on the Senior Software Engineer position might be doing:
- In general, they are seasoned, independent professionals with deep technical knowledge.
- They are the workhorses of the engineering department and get a lot done.
- They are the true individual contributors.
- They design and implement features, investigate and fix bugs, write tests, do code reviews, etc.
- They can be given an arbitrary task, epic, or a medium-sized project, and will work almost completely independently to get it done.
- They know the used technologies, programming languages, and frameworks inside out. Their orientation is often towards technical depth rather than breadth.
- They mentor and train new team members and share their knowledge with them.
- Outside of their team, they have mostly passive contributions (e.g. by answering questions, providing feedback, or doing consultations).
- They generally spend most of their time coding or focusing on code-related aspects (like 70-90%), do not have to attend that many meetings, and do not have to deal with people that much.
Reasons For Staying
Here are a few reasons why you might want to stay at this position:
- You want to be coding most of your time. This is the last position on which you can do that. The higher up the ladder you go, the less coding you will do.
- You enjoy having a clear-cut description of your job and of what it means to be successful. The higher up the ladder you go, the fuzzier the job descriptions get and the more you have to define the actual job description by yourself.
- You really enjoy what you do and do not want to be doing anything else.
- You have no interest in moving into leadership and leading people, be it management or technical leadership.
- You are fine with doing an issue-tracking-system task after task. This is the last position on which you can do that. The higher up the ladder you go, the more strategic you have to be and cannot be working in a “I will do yet another task from the sprint next” fashion.
- You need a fast feedback loop and clear definitions of done. Finishing a task is quite satisfying and gives you an immediate sense of accomplishment.
- You are fine with the level of responsibility and power to influence things you have.
- You want to primarily focus on sharpening your hard skills rather than soft skills.
To get better at being (not only) a Senior Software Engineer, I can recommend the following books:
- D. Heller: Building a Career in Software (2020)
- D. Thomas, A. Hunt: The Pragmatic Programmer, 2nd ed. (2019)
- E. Lau: The Effective Engineer (2015)
- R. Martin: The Clean Coder (2011)
- C. Fowler: The Passionate Programmer (2009)
- R. Martin: Clean Code (2008)
- S. McConnel: Code Complete, 2nd ed. (2004)
- …and books on programming languages, version-control systems, databases, message brokers, operating systems, networking, algorithms, distributed systems, systems design, communication, etc.
Why Would You Want To Switch Into Management?
The second option that you usually have is to move into management and become an Engineering Manager.
First, let’s take a look at what Engineering Managers might be doing:
- In general, they manage a team of 5-10 people (usually individual contributors, i.e. software engineers) and work through them. They get results by enabling people to do their work, not by doing the work for them. Senior managers may manage more people or have team leads in their team (a team lead is a person who manages a small team while being an effective member of that team).
- Most importantly, they care for the well-being of people in the team. They have regular 1:1 meetings with them, gather and provide feedback, and work on improvements.
- They focus on improving the motivation and morale of team members and their growth.
- They write performance reviews, manage performance issues (when people are under-performing), and assign bonuses.
- They handle administrative tasks (like approving of vacations and training) and communication with the HR and IT departments.
- They maintain budgets, head counts, and handle salary increases.
- They hire, promote, and fire people.
- They represent the team in external communications with other people and teams.
- They shield (protect) the team from what is going on in the organization and ensure that team members can focus on their work.
- They delegate a lot of tasks to members of their team instead of doing them by themselves.
- Depending on the company and circumstances, they may wear the hat of one or more of the following roles:
- Product Manager: Gather product requirements (what should be done and why), create roadmaps, and prioritize work.
- Project Manager: Plan, assign tasks to team members, specify deadlines, monitor progress, evaluate the results, provide feedback, and eliminate roadblocks.
- Technical Leader: See the job description of a Staff Software Engineer below.
- They either do not code at all or only sporadically (e.g. 0-20% of their time), have to attend many meetings, and deal with people a lot.
Reasons For Switching
Here are a few reasons why you might want to become an Engineering Manager:
- You enjoy the people side of software engineering more than the technical side (or at least the same).
- You love working with people and through people more than working on your own. You enjoy seeing people succeeding in doing tasks more than doing the tasks by yourself. This is absolutely essential.
- You want to focus on people issues rather than on technical issues. For example, you prefer dealing with performance issues of a team member rather than dealing with performance issues of a system.
- You enjoy taking care of people in your team, having regular 1:1s with them, listening to their work-related and personal issues, and helping them overcome those issues.
- You enjoy or at least do not mind the tasks that an Engineering Manager has to perform (e.g. administrative tasks, performance reviews, maintaining budgets, hiring, promoting, and firing people).
- You enjoy or at least do not mind having difficult conversations with people (e.g. dealing with underperforming employees or resolving conflicts).
- You enjoy or at least do not mind having lots of meetings.
- You enjoy or at least do not mind being constantly interrupted. At this point, your job is to be available for your team.
- You enjoy or at least do not mind reactive work. A lot of what a manager does depends on what is happening.
- You want to be able to build bigger projects than you would be able to build as an individual contributor.
- You want to have a more strategic role, more responsibility, and greater power to influence things.
- You want to earn more money. While it is not technically required for an Engineering Manager to earn more than a Senior Software Engineer, it is most often the case. I realize that this might not be a great reason, but it is still a reason.
- You want to have a fancy job title. Again, not a great reason, but a reason nonetheless.
- You would like to try doing something else than coding all the time or doing a task after task. If this is the case, it is important to mention this to your manager so you can prepare an exit strategy in case you realize that being an Engineering Manager is not something that you would like to keep doing.
- You either do not want to code anymore or do not mind coding only sporadically.
- You want to have a sense of progression on the career ladder.
To learn more about the management track, I can recommend the following books:
- J. Stainer: Become an Effective Software Engineering Manager (2020)
- W. Larson: An Elegant Puzzle: Systems of Engineering Management (2019)
- C. Fournier: The Manager’s Path (2017)
- M. Lopp: Managing Humans (2016)
- P. Drucker: The Effective Executive (2006)
Why Would You Want To Move Into Technical Leadership?
The third option that you can have is moving into so-called technical leadership. You would be leading people or projects, but unlike an Engineering Manager, you will not have any direct reports and will primarily focus on the technical side of software engineering.
The first position on the technical-leadership track of the ladder is often called a Staff Software Engineer, so we will focus on it.
First, let’s take a look at what Staff Software Engineers might be working on. Before doing so, please note that the job descriptions of a Staff Software Engineer tend to be rather fuzzy and differ greatly between companies, even to the point that Staff Software Engineers at two companies might do completely different work.
- In general, they are technical role models leading the design and development of larger or more complex projects.
- Unlike managers, they do not have any direct reports. Instead, they lead by gravitas, i.e. people follow them because they respect them and trust their expertise.
- They have vast technological knowledge. Their orientation is often towards technical breath rather than depth.
- A part of what they do is similar to what Senior Software Engineers do (e.g. code-related aspects), which makes the transition from a Senior Software Engineer easier than to an Engineering Manager. Do not be mistaken though; a Staff Software Engineer is a different type of job than a Senior Software Engineer.
- They create and work towards fulfilling a technical vision, set the technological/architectural direction, put together coding standards and processes and ensure people adhere to them.
- They advocate for the team in technical matters. They actively work on reducing technical debt and identifying and removing technical risks.
- They have the final word in technical matters (e.g. when the team cannot decide on something).
- They write specifications and review technical proposals.
- They often choose the problems to work on by themselves. However, Staff Software Engineers must be thoughtful when choosing a problem to maximize their impact, i.e. they must choose the right problems to solve.
- They mentor team members on higher-level technical issues (e.g. design techniques).
- They focus on improving the motivation and morale of team members and their technical growth. They act as technical role models.
- They support and foster team members, often in cooperation with an Engineering Manager.
- They do a lot of so-called glue work, which is a term coined by Tanya Reilly for much needed and valuable but often invisible and less-promotable work to keep the team moving forward. Examples of such work include writing meeting notes, keeping documentation up-to-date, interviewing, onboarding new team members, noticing when people are stuck and unblocking them, organizing off-sites, or responding to ad-hoc questions and triaging incoming requests.
- They have active cross-team contributions and drive initiatives.
- Depending on the company, a Staff Software Engineer might belong to one of the following four archetypes:
- Tech Lead. They guide the execution of a particular team or project. Arguably, this is the most common of the four archetypes.
- Architect. They make high-level design choices based on technical constraints and user needs and work together with development teams to implement those designs.
- Solver. They dig deep into arbitrarily complex problems and find an appropriate path forward.
- Right Hand. They extend an executive’s attention, borrowing their scope and authority to operate particularly complex organizations. They work to scale that leader’s impact by removing problems from their plate.
- They still actively code, although much less than Senior Software Engineers (e.g. 20-50% of their time can be devoted to code aspects). They attend more meetings than Senior Software Engineers and also have to deal more with people (but less than Engineering Managers).
Reasons For Switching
Here are a few reasons why you might want to become a Staff Software Engineer:
- You enjoy leading people and projects but do not want to be a people manager. That is, you prefer the technical side of software engineering to the people side. This is absolutely essential. If you do not enjoy leadership or if you like the people side more than the technical side, this might not be a position for you.
- You want to oversee and work on projects from a more high-level viewpoint instead of focusing on particular parts.
- You want to have a more strategic role, more responsibility, and greater power to influence things, mainly from the technical viewpoint.
- You want to be able to build bigger projects than you would be able to build by yourself as a pure individual contributor (Senior Software Engineer).
- You want to be able to choose the problems to work on largely by yourself.
- You want to use and improve your soft skills as well as hard skills.
- You enjoy or at least do not mind writing and reviewing technical specifications.
- You enjoy or at least do not mind having lots of meetings. It probably will not be as many meetings as an Engineering Manager would have, but you will definitely attend more meetings than a Senior Software Engineer.
- You enjoy or at least do not mind being constantly interrupted. At this point, your job is to be available for the team.
- You want to earn more money. Similarly to an Engineering Manager, it is not technically required for a Staff Software Engineer to earn more than a Senior Software Engineer, but it is most often the case. Once again, I realize that this might not be a great reason, but it is still a reason.
- You want to have a fancy job title. Again, not a great reason, but a reason nonetheless.
- You want to have a sense of progression on the career ladder while still being actively coding.
Those with a keen eye might have noticed that some of the reasons for switching to technical leadership are the same or similar to those concerning people management. This is not an accident; the technical-leadership and managerial tracks have a lot in common.
To learn more about the technical-leadership track, I can recommend the following books:
- T. Reilly: The Staff Engineer’s Path (2022)
- W. Larson: Staff Engineer: Leadership beyond the management track (2021)
- …and books on engineering management
Please, let me know if you know about more good books on the technical-leadership track as they are rather scarce.
Reasons For NOT Switching Your Position
Now that we have listed a few reasons for switching to a new position, let’s take a look at some reasons why you might not want to do that:
- Loving what you do. You are content with your current job, absolutely love doing it, and cannot imagine doing anything else. For example, if you absolutely love coding, moving away from it will make you feel disconnected from your passion, and you will eventually burn out and start hating your job.
- Circumstances. You are at a point in life when you need to focus more on your personal life rather than on career advancement.
- Outside pressure. Do not take a managerial or leadership position only because there is nobody else in your team to do that. This is not your fault. You should choose your career path consciously. Otherwise, not only you will get harmed, but also the company you work for.
- Fancy title. Of course, having a fancier job title might feel nice, but is that really important to you? Do you actually care? Should you even care?
- Money. Remember that your wage is not everything. If you enjoy what you do, earning less could be a better option than being a manager or leader earning more but feeling miserable and hating your job.
To conclude, there are two important questions to ask yourself when choosing your career:
- What energizes you? There is energizing work, and then there are activities that are mentally draining. Try to do more of those that recharge you. For example, do you feel better after a four-hour long coding session or after four hours spent in meetings talking to other people? This may give you a hint as to where you should be heading to.
- What do you want to get better at? As Tanya Reilly argues, you should ask yourself what are the skills that you would like to have. It is not about what skills you already have. We are all learning by doing things, so whatever you choose to do, you will eventually start getting better at that. Do you want to be better at coding and sharpen your hard skills? Or do you want to leave coding behind and focus on growing an engineering team? Or do you want to get better at leading people while still being technically competent? The choice is yours.
What do you think about software-engineering career paths? Do you agree with the reasons I have provided? Is there something else that you think might be worth considering?