I had been aiming for a promotion to staff software engineer for a couple of years but no matter how many features I pushed, no matter how much good work I did… nothing seemed to stick.
Was I doing something wrong? Surely I had it in me to make it to the next level. After all, I did excellent work (or so I like to think), so what was holding me back?
For many software engineers, working life is most comfortable when they can just wrap a set of headphones on their head, perch themselves in front of a screen, and write some code.
There's nothing more satisfying than successfully solving a difficult code challenge you've been focusing intently on all day without distraction.
I was one of those engineers and, for a long time, I remained one. There's really nothing wrong with the desire to just focus on what you do best.
But at the end of the day, if you want to push-on as an individual contributor, you're going to have to do more than just writing code and one of the best ways in which you can stand out is by venturing down the path of leadership.
Which is exactly what I did.
So, why did I Choose to Improve my Leadership Skills?
Some may ask at this point: “Why exactly would I want to be a leader? I'm an engineer. It's not my job.”
Theoretically, you could make a case for that argument but in reality leadership is as crucial to the practice of effective software engineering as is writing code.
In modern agile teams, engineers are expected to take ownership of features, contribute to the product's technical conventions, and to provide feedback on their colleagues' work.
Each of these tasks is in some way based upon taking the lead—at least in part1.
When Tech leadership is looking for someone to promote, it's the engineers who've successfully shown that they're able to lead who'll rise to the top.
There will of course be some who implicitly recognize this because the idea isn't really that extreme. In fact, if you're already a senior engineer, you're practicing some forms of leadership today2.
But if you want to transcend the staff engineer level barrier you're going to have to kick it up a notch.
For me it was a no-brainer: I was experienced enough to impact the work of my teammates and, to an extent, the organization as a whole. It was clear that making a conscious effort to grow could only benefit both my team and myself.
I embraced the chance to broaden my skill-set and take on some new responsibilities and was able to reap the rewards.
Okay, Sounds Good but… How do you, you know, Lead?
When you think of great engineering leaders, who comes to mind? Linus Torvalds? Uncle Bob Martin? DHH?
Each is, of course, unique but there are common characteristics which unite them. For example, they're highly principled, have extensively shared their expertise with the broader community, and have made a massive impact on the world… whether all of the non-techies out there know it or not.
Oh, and then there's me.
No, really, don't laugh. I'm being serious.
I can't claim to have written an operating system or source control management system used around the world. Nor did I create a revolutionary web application framework. Nor did I teach a generation of developers how to write good code.
But it was through practicing principles of leadership that I was able to earn the right to call myself a Staff Software Engineer.
Leadership is Something you do with Regular, Everyday Practices
We're all familiar with the process of iterative development. You write a feature, it gets tested and reviewed, you deploy it. Rinse, repeat, ad nauseum.
As we repeat these practices, we create and improve our code until countless tiny changes eventually accumulate enough to produce sophisticated software.
In a similar way, you become a leader only when you act like a leader every day.
It's not about stepping up to save the day in an emergency, nor having a brilliant vision for everyone else to follow, nor making that one decision which earns the company a million bucks3. It's about consistently and systematically doing the right little things.
Major life-or-death moments might come along from time-to-time but don't sit around waiting for them to happen. If you're not practicing the art of leadership on a daily basis, you'll miss your chances when they occur.
An essential part of my approach was as modest as it was effective: I made sure to proactively write code reviews at the same time each day. If there were open PRs pending review, I reviewed them.
But I took my time doing so. I made sure to provide thoughtful, constructive, and detailed feedback. Even on pull requests which could probably just be rubber-stamped, if I felt there might be good opportunities yet to be unlocked before a merge.
By consistently providing high quality feedback, I earned the respect of my teammates—and my manager. One good code review won't get you promoted but a reputation for being an excellent reviewer certainly won't hurt your chances.
Seek Out Opportunities to Make a Difference
Whether you like it or not, you're not always going to be given a major project which you can use to leap-frog up to that next stage.
You have no control over what kind of work your manager or product owner will have for you. So if your strategy is to keep your head down until that perfect opportunity comes your way, you might be waiting a long time.
Don't wait for others to solve your problems for you, it's a losing strategy.
Instead, proactively take responsibility for realizing potential opportunities yourself4. You just need to make sure you're paying attention to the right things.
When you're in a standup, retro, or grooming session with your team, listen to what people say. Take note when they're complaining about, well… anything.
Every problem is an opportunity. Each complaint leveled by a teammate or manager is a gift—if you're ready to accept it. Even if somehow nobody has anything to complain about, there are many places to find problems if you're paying attention.
Make it a habit to find ways for you to solve those problems.
When my team got divided into three more focused teams, I spotted a great opportunity to make a positive impact.
With multiple teams working on the same codebase, there was a risk we'd fragment the repo with conflicting approaches. So I approached my manager and offered to establish a cross-team engineering guild.
It would mean that I'd need to take on a few extra responsibilities but the business would benefit from their product teams acting in alignment with each other.
Taking the initiative to establish the guild made a strong impression on my manager and was probably the single most instrumental factor in me earning that promotion. It was only possible because I looked for a need, then found a way to solve it.
Coding can also be a Way to Practice Leadership
Many senior engineers slide across to management roles but, for some of us, the idea of hanging up our keyboard is just too hard to imagine5.
But you can easily show leadership without having to give up on coding! In fact, writing code is one of the best chances you get to demonstrate your leadership chops.
Hopefully you've been making a S.O.L.I.D effort to learn as many principles and practices as you can in the course of your career6.
Those principles aren't just there to help us pass our coding interview tests or demonstrate how l33t we are. Used appropriately, they're a sure-fire way for us to grow our technical capacity as programmers7.
As you learn more about practices, try to understand why they're important and apply that knowledge to your coding. Do so and your effectiveness will skyrocket.
If you consistently produce high quality product, it will make a difference and it will be noticed.
I found myself working on some code which needed to be fixed before someone accidentally brought the whole product down.
So I used classic patterns to progressively divide the code into cleanly separated areas.
As a clear separation of concerns emerged, I and my teammates became more confident making changes without running the risk of triggering a P1 incident and keeping some poor on-call dev from their precious late night gaming sessions sleep8.
By applying this pattern I helped make my colleagues' lives easier. Making their lives easier meant they could produce more features. More features meant we produced a better product.
In this way, my changes moved a lever in the right direction for the business at-large. I demonstrated leadership by helping to lift the capacity of my whole team up alongside myself.
Becoming a Leader will Enrich Your Career and Life
No matter what your profession is, learning to lead will be worthwhile. It's a skill which can really help you in any domain or situation.
You might notice that I haven't really focused too much on specific tactics up to now. That's because the tactics themselves aren't really important in pursuit of the bigger picture.
Learning one or two little tricks won't make you a leader, nor will doing so earn you a promotion to the staff role.
You need to make changes to the way you work today which will pay-off down the track.
No matter how old you are, it's never too late to begin making small changes to your approach—you can teach an old dog new tricks… if that dog is willing to adopt a growth mindset.
Don't focus on the results but have patience, be persistent, and the results will come.
I spent a couple of years trying and failing in one job only to get promoted shortly after I started another.
The longer you demonstrate consistent results, the greater the chances that your manager will call you into a meeting to give you the good news.
Whatever results you see, being able to lead is a killer skill to have. You can take it with you anywhere and it will continuously make a positive difference in your life.
Keep it simple and start doing something which makes a difference that you can manage each day. What have you got to lose?