Career growth is something everyone wishes they were better at (up to a certain point anyway). I've found an incredible amount of advice out there, but it's often written in a one size fits all manner and my experience is that career growth plans need to be highly individualized. So here's my take, with a set of useful tips to follow. It's still not personalized, but at least broken down into sections depending on seniority. In particular, paths are more standardized early on; and branch out a lot (and advice gets correspondingly harder) as you get more senior.
NOTE: This is just, like, my opinion, man. There are many equally valid ways to grow as an engineer, and the specifics depend on your situation and company. In addition, this assumes you are meeting expectations at work and looking to grow. If you're not meeting expectations, please focus on that first before getting to this guide. The themes I'm highlighting should be general enough, but make sure to apply the right advice to your situation. I'm happy to offer more tailored advice in a private setting.
Your approach towards career growth should vary over time - depending on your environment, your desires, and your experience, what worked today may not work well tomorrow. However, certain principles are useful throughout. Let's go into those first.
Have a plan. Or don't. It's fine.
You'll often be asked about your career plan. Often in the form of "where do you see yourself in 5 years?". I'll be frank: I find that question super annoying. I don't know what I'll be having for lunch tomorrow, let alone what I want to do 5 years from now!
Having a long-term plan for your career certainly helps make growth easier - you know what you want, and you can make a list of steps, and check them off one by one to get there.
But the lack of a plan shouldn't stop you. I struggled for far too long trying to find the "perfect" career growth plan, and delayed taking that first step on my career growth journey. As long as you are meandering in the general direction, you'll get there eventually. You can always course correct.
That principle has served me well in general: as long as I am growing in some form I'm happy. You'll often have a huge list of things you want to work on, and that's fine! Pick something - anything - and work on it for a few months. It'll often be obvious which thing to work on next due to situational factors (feedback you've heard, opportunities from a project, etc) and that makes things easier.
If you have a hard time making long-term plans (like myself) then align yourself on a quarterly or biannual scale - at the start of every period, reflect on what you did in the last period, and set one or two things to focus on for the next period. And then get that done.
Hold yourself accountable
Having a plan is all fine and dandy, but you also need to put in the work. The trouble with career growth is that no one else cares about your career growth (unless you have great mentors - but don't rely on having them). So you need to step up and hold yourself accountable.
Every so often, ask yourself: "am I growing? what new skills have I gained? what have I learned recently?". If you don't like your answers, introspect and make some changes.
A common struggle here is that work is often very busy and saps up all your time and energy, leaving little room for growth. That is totally understandable and very unfortunate. Depending on your situation, there are a few ways around it:
- Prioritize, and say no: You shouldn't be working at 100% capacity all the time. That's a recipe for burnout. I try to follow the 80-15-5 rule and make sure to have at least 5% of my time purely focused on learning, and 15% of my time on projects that have a large learning component.
- Align your work to your learning: Try to find at least one project/work item that aligns with your career growth goals. That way you can learn more directly on the job. Want to learn Rust? Find an excuse to use it on a project! Want to grow your project management skills? Volunteer to lead a project! Opportunities like this are often readily available - just give yourself the freedom to ask for them.
Find role models to learn from
One of the best ways to learn is by making mistakes - you see what you did wrong, then (hopefully!) avoid doing the same thing again. But there are so many possible mistakes out there and you likely don't want to suffer through them all.
So, find people who can tell you what to do and what to avoid. A great mentor is worth their weight in gold. Endeavor to have at least one mentor beyond your manager as you'll get a different perspective on things. Mentors don't need to be all-encompassing (though that helps): You can learn C++ from one person, project management from another, and so on. That may actually help as it's easier to get a half hour a week from 3 people than it is to get 2 hours a week from one person.
If you're struggling to find a mentor, ask your manager for help, ask your friends, and reach out to your network. Hopefully, there will be someone out there. All else failing, fall back to just reading advice columns and feedback from folks in the broader tech community - I've learned a lot from just reading and absorbing that material.
Value feedback as if your life depends on it
Feedback is crucial to career growth, and often very underappreciated. Look, I get it. It hurts - painfully - to hear negative feedback. It's hard not to take it personally.
But without feedback, there's no way to know what to work on. When you hear feedback, seek to understand - and ask clarifying questions. Ask what you could have done in the moment that would have been better, or what you can do going forward. And once you've made changes, follow up and ask if you're doing what they expected.
If you're not getting enough feedback, go out and seek it! Proactively ask folks for feedback when you complete a project or do something for them. When someone uses a tool you wrote, watch how they use it and ask what they liked and disliked. You'll learn what to do more of (this is so important, and often ignored) and what to do less of.
Lastly, look within for feedback - after every major project, spend some time reflecting upon what went well in the project and what you could have improved, and use those lessons in the future.
Engage your curiosity
Some of my best work (and learning) has come from experiences that started with a simple "huh, I wonder how this even works". Engage your curiosity often. In the worst case, you'll have learnt a new and valuable lesson. In the best case, you might find a huge area of improvement that gets you recognized.
This can be hard to do under time pressure, so I often time-bound myself. I first spend a few minutes exploring the situation, see if I can resolve it soon (in which case I go in), or leave a note to follow up later.
As you do this more and more, you'll build up an invaluable knowledge base that comes in handy at the weirdest of times.
Random activities always come in handy.
It's crucial to invest in career growth early on - career growth is exponential, so starting on the right foot will pay a lot of dividends later on.
Fortunately, there are a lot of resources for early career engineers out there.
At this stage in your career, learning mostly should focus on how - how to get things done, and how to do them effectively. Here's how I approached things:
- Take classes: I took every relevant class offered by my employer (by last count I think there were about 20 at the time). I learnt a lot about time management, project management, code architecture, etc. At this stage, just knowing about the topics to learn more about is super worth it.
- Manage your time: Learn about how you most effectively work and find a schedule that lets you be effective. Practice the art of balancing your time between coding, testing, reviewing code, meetings, etc. Early on you won't have a lot of time pressure between individual work and overhead (like meetings), so it's easier to grow your skills.
- Read: Read all the material you can. I spent a lot of time reading code, both for my team's systems and other random systems. Learning how things are designed, and how code is structured and tested, is valuable - you'll get a breadth of perspectives the more you read. Beyond code, look for design documents, post-mortems, and any communication you can read and learn from.
- Reflect regularly: Whenever you're done with a task (every few days), look at how you did it, and see if there was something you could have improved. Ask your mentors for feedback early, and often. Before starting the next task, confirm that what you did just now matches what they expected.
- Focus on improving your craft: Challenge yourself to get better at whatever you do. Try to get a little faster with each pull request. Or cut down on the number of bugs. Or make your code a little faster. Or speed up your workflow. Whatever it is, focus on building those foundational skills so you can rely on them in the future and not get held back by your poor execution.
- Ask why: When you're given a piece of feedback - especially during code review - ask for the why behind it, so you can incorporate it into your work directly next time. When your mentor or manager breaks down a feature into smaller tasks for you, ask them why they picked the breakdown that they did. When you see someone doing something a specific way and you're not sure why - just ask! People are often happy to explain to anyone willing to listen.
- Ask good questions: When you're stuck, don't give up immediately and ask for help. Spend some time researching the problem, try out a few approaches, and then ask for help. My usual guideline is to spend an ~hour before I ask for help. That way instead of going "help! I have no idea what to do", you can ask "hey, I was trying to do X, I tried Y but that didn't work because of Z, do you have any ideas on how to fix it?". Everyone will thank you for this.
At this stage, growth progresses a little from the how to the when. You'll likely be given more tasks to do in parallel and be expected to prioritize the work yourself so you can meet deadlines. So, time management becomes even more crucial (continue practicing it!), as well as managing your projects so you do the right work at the right time. Focus on the following:
- Manage your projects: Now that you've seen how projects are broken down into tasks, it's time to do it yourself. When you get a new project, spend some time breaking it down, making estimates, and then get feedback on whether your plan seems reasonable. Go back to the plan each time you complete a task and make sure things are still on track.
- Prioritize: You'll probably be working on a few features at the same time, or fixing bugs in one while working on a new feature, etc. Whenever you get a new work item, resist the urge to hop on it immediately. Understand how urgent/important something is, and focus on the right things. You will drop things at this point, and that's okay! Learn from your mistakes and adjust how you prioritize.
- Incidents: Chances are you'll be involved in some sort of incident or outage - either causing one yourself or being around when it happens. These are amazing opportunities for learning. Look at how folks approach debugging under time pressure, how people collaborate, and how the problem is fixed. Spend even more time looking at the retrospective, to see how mistakes like these could have been prevented in the future, and proactively incorporate those into your work.
- Collaborate: Work with other people on your team (or others) and learn about how they approach work. Observe which styles are more effective than others in any given situation.
- Make predictions and learn: Before you launch a feature, try to predict what will go wrong and what will work well. Once it's launched, go back and see how your intuition fared. If things didn't go as expected, ask your mentors for advice - what did they know that you missed?
- Ask why: Continue to ask why and learn. When you're asked to work on a feature, ask why it's important and what the expected impact is. That will influence how you build it, and give you a chance to reflect on whether it was achieved in the end or not. When you see someone give a time estimate, ask how they arrived at that estimate. Never stop asking questions.
At the senior stage, resources start to thin a little. Your expectations, and your growth, will often shift to the what: you need to figure out what you should be doing, and rally your coworkers around the cause to build something together. Here's what worked for me:
- Courses: There are only a handful of courses targeted at senior engineers, but they are worth it. Often they won't even be explicitly listed as engineering courses - so go out and seek them. Courses on writing, communication, and leadership become crucial at this stage.
- Learn by doing: A lot of your growth will now come through the work you do. Make sure to pick projects that allow you to grow, and as you do them, make the most of any learning opportunities.
- Embrace failures: Half the fun of being a senior engineer is being able to tell people "oh yeah, we tried that and it didn't work". Make sure to keep the lessons from those war stories close to your heart, and know when to apply them. And avoid repeating those mistakes.
- Embrace delays: Now that your projects are on longer timescales, delays are inevitable. Try to course correct when you can, and plan upfront with plenty of buffer room. At the same time, look into their causes: did you miss a dependency? was there a skills mismatch? Could you have predicted this delay at the start rather than at the end?
- Help others: Do what you can to help others - even if they're not on your team. This will help build your network; but more importantly, through helping others you'll internalize the knowledge you have, and learn about more types of work. It pays off very quickly.
- Keep asking why: When you're asked to lead a project, ask why -- ask what outcome is expected, and make sure your work delivers the expected business impact. Gain more insight into the overall business needs and keep an eye out for opportunities to get more impact out of your work. Make friends with your product managers and people on teams you work with.
At the staff level, resources are few and far between. There are a few books and posts out there - I've linked to some in my last post, but you'll have to network and hustle to find resources and a support network. You'll have to rely on yourself for career growth at this point.
Growth at this point is really about why - keep asking why the org has certain priorities, why your team is focusing on X, and why your customers care about Y, so you can come up with new solutions.
Here's what helped me:
- Find mentors: It goes without saying but mentors are crucial at this stage. Find someone you trust who can give you advice, and meet them regularly - even if they just play the role of a sounding board. Talk through the problems you're facing, ask for advice, and try it out.
- Make observations on a longer scale: You'll be mentoring people, and working on projects with a multi-year timescale. Take notes upfront and regularly about what you expect to happen and what has happened. It's easy to forget why you made a certain decision, and you lose out on learning opportunities if you don't go back and reflect.
- Take calculated risks: You learn the most when something spectacularly fails or is a wild success. Unfortunately, it's hard to know, going in, what any given effort will be. Communicate your plans well, set up criteria to fail fast, and then go in and take risks. You'll thank yourself later.
- Delegate: Your time is a valuable resource, with many people competing for it. It's hard to let go, but delegate whatever you can - so you free up your time to focus on your growth and learning. And through this, you'll help someone else grow!
- Prioritize ruthlessly: Give yourself room to say no to things that aren't important - and spend your energy on the things that are both impactful and exciting
- Own your calendar: Time management becomes crucial - with the number of meetings you likely have, you'll barely have any time for focused work, let alone growth. One thing that worked well for me was to offer to book meetings - it appears like I'm being nice, but I'm being selfish and booking meetings to fit my ideal schedule and defragment my calendar.
A lot of these overlap with growth strategies for entry-level EMs - unfortunately, going into more depth is out of scope for this post.
At the end of the day, your career growth is in your hands. If you're in a poor environment, your growth will be negatively affected (until you can change environments); but the environment alone won't fix it. You can be in an excellent environment and not grow until you put the time and effort into it. So, do what you can, and work on it at a sustainable pace, and you'll grow and be happy with your career (hopefully).
As always, please reach out with comments and feedback, and opinions on which topics you'd like me to expand on first!