The slow death of the hands-on engineering manager
zaidesanton.substack.com
zaidesanton.substack.com
Mike Michalowicz's Clockwork has a really nice framework, called 4D:
- Do - the least important type of action a leader can do and where they should spend as little time as possible
- Decide - a level higher, but still not the core activity for leaders. Being the decision makes means that they have to be informed about everything.
- Delegate - this is an important skill for leaders, assigning who is responsible for which outcome
- Design - the most important type of action: designing the organization of the future and creating the right conditions for that organization to emerge; Put differently, this is truly working ON the business rather than IN the business.
I agree 100%, though I will add it is important to have a manager who can do, so that at the very least they can have technical conversations.
Nothing worse than a manager who has no concept of what the doing even is.
In practice, the last three Ds depend heavily on familiarity with the first one, as they ultimately boil down to steering it at (team) scale. Without it, you're going to decide the wrong thing for what your team needs to do, delegate the wrong things to people who can't do them, and ultimately design an organisation that can't do shit.
Actually doing it isn't the only way to attain that sort of familiarity but for lots of people it's the only one that works. For them it's anything but the least important type of action a leader can do. Once they stop doing it at all, the clock of knowledge obsolescence starts ticking and all the other Ds atrite, as they inevitably end up deciding, delegating and designing based on yesterday's realities.
Designing by Doing can cut through a lot of wasted time. If a principal engineer builds a working prototype, it can immediately move the discussion past the “Is that even possible or realistic” stage where lots of ideas go to die.
Leading by doing is often a much better use of an experienced engineer’s time than promoting them to an architect role where they produce diagrams that nobody barely looks at. Design isn’t a panacea.
Similarly prototyping enables simultaneous exploration of problem space and solution space. After prototyping one can propose a design/architecture which is rooted in ground reality. You are more clear about upstream/downstream dependencies. Might even uncover gaps in product specs.
If everyone in the business worked like this - carving out roles where they get paid, but did next to nothing, then I suspect the business wouldn't do very well.
That's exactly what happens at big tech companies, except the business can be doing so well that the impact is only felt on a 10-year timeline.
At best these just cost money, at worse they get in the way of the real work.
Obviously sometimes you really need these sort of projects - led by people who are truely trying to transform things - the problem is when it's led by people whose sole aim is to look busy by creating busy work for others.
But all of this was built on a solid foundation of the system my team owned. And that was only possible if I understood things at the code level how various product flows worked. And I personally can’t understand code unless I fiddled around with it.
As if that is ever easy to understand.
I found that losing touch with the code is disastrous - one cannot make sensible decisions without a familiarity. I need to know how difficult it's getting to write tests and get features done if I'm to make decisions about how to simplify everything for other developers. I have to understand what's possible.
I also cannot really review code well in a PR - it's meaningless until I've worked on that code and thought "oh #$%#$%, we can't do this like this.....!!"
So the decision part of management is just not possible without some time programming. I like to do refactoring - esp of tests and bits of code where I know that people have been in a rush and done a bit too much copy/pasting. I try to make log messages more useful, simplify things that I realise can be simplified. I write scripts to make annoying bits of work trivial so other developers have an easier time. I try to punch through problems with debugging or development.
Some management tasks soak up energy:
* hiring is one. I'm new to it and I am only beginning to have ideas about how to do it more efficiently. I wanted to get my team to help choose people but this ends up taking far too long to arrange. I realise I need to man up and do more of the initial choosing and present them with a limited choice at the end - I want people who will work well with everyone else. No arseholes, however good they might be.
* helping people get their tickets done - which is good work and always worthwhile but to do it well you do need to understand the codebase a bit.
* meetings about future features...which are incredibly inefficient because they're about getting everyone to understand what is wanted and trying to imagine an acceptably rapid way of doing it that will also fit in with other plans. This is very inefficient because people talk a great length then forget and have to understand it all again weeks later. On the other hand, doing work where everyone has a different understanding of what's needed is a deadly problem, so the horrendous hashing-things-out sessions generally pay off in the end. I just wish there was a better way.Process: Start the meeting, turn on your camera (surprisingly important for us), and set a timer. Everyone quietly reads for ~20min. AFTER they finish reading, restart and engage via comments - positive/agreement comments are great, questions are useful, answering/responding to other's questions is encouraged. Post 20min, one speaker goes through the comments. Many (70% is common for us) will already have been resolved or will not require discussion. Long comment chains or lack of consensus on a comment chain is where we spend the discussion time. Common pitfall - Speaker DOES NOT present the document, that just wastes 20min and bores everyone to death. Small nuance - speaker (doc preparer) is already familiar with doc, so they watch the timer. They also check in e.g. at 15 give a 5min warning, at 20min check if anyone needs more time, etc.
Huge net positive for us: - No more "pre-read" (no one does it), we just say that a 45min meeting is when you BOTH get the information AND discuss is - Post the "20min" we are already 80% on the same page - Far far fewer "basic" questions that kill time - those were answered by the doc - Quiet reading gives people time to mentally switch/shift from their last 5 meetings and come up to speed. Less "anxious energy" when talking - Increase collaboration - "Type A" talkers cannot (as easily) dominate the comments. Leaves "airshare" for quieter team members to participate via comments. We've begun encouraging all to leave at least 4-5 comments
Negatives: - REQUIRES senior team member support, else 1 senior "ass" will break the rules and start talking - Writing the document is time consuming and not easy. This really becomes one persons "work" to gather the data from all stakeholders in a 1-1 fashion, organize it, summarize it
This. Your decisions become less and less grounded in reality the farther you get from the code base. It is the same as in the military: generals always fight the last war, usually with disastrous results, like attempting to charge machine gun nests in WW1, because they are too far removed from the reality on the ground.
It's invaluable to have someone that can champion these technical aspects of the job. It doesn't mean that you need to relinquish all technical work to them, but having someone you can trust to keep the team technically solid and keep you in the loop when you inevitably have to focus on non-technical stuff, is key to a high performant team in my experience.
- need to work with your upper management to get the best talent for what may be more money than they are willing to part with. You need to be great at negotiating to achieve this.
- need to find the right culture fit. Will the team want to spend 40+ hours a week with this new person? Do they have any personality conflicts?
- find a way to get the best talent without offending your team. Sometimes you have the option to hire someone whose skillset is radically better than what already exists on your team. Do you hire that person? Does your team handle it well? Does this mean the person who thought they would get a promotion in 18 months is going to slow their output because they assume that their future "slot" is now gone? How do you cope with that.
- balance the time between your "day job" and hiring a new person. I believe when you have an opportunity to hire, it needs to be one of your most critical AND urgent priorities because the impact is ultra-high and the effort is much lower than most long-term efforts (I once made the mistake of moving too slowly on a backfill caused by a lateral promotion, and I didn't see the cracks forming until we lost a 2nd engineer to burnout. We ended up running way too lean for way too long. Eventually we backfilled the two positions with two superior engineers, but it was a very tough time and I could have realistically replaced those positions much more rapidly and my team would have been better for it.)
I kind of feel that way with code review in general. It's the author's code. I didn't write it. So I don't have much understanding or context (except for the simplest of PRs).
They'd let their source control licence lapse giving them an excuse to not get involved in shutting down long running PR debates, suggest they can only get involved in a discussion if we were still using XYZ dead language/stack from two decades ago.
All that said, I often get criticism that I should not be picking up coding tasks every sprint. There seems to be some unwritten rule that remaining a coder is a net negative when you start tickling the upper management ranks. On the one hand I'm told that I need to train the other managers to be more like me and then on the other hand I'm told that I code too much, I'm going to burn out and need to find ways have others do the work.
I personally think being able to do all kinds of coding tasks (prototyping, bug fixes, major time sensitive features, etc) does a lot for me as a manager... the team respects me, I stay close to the code so I can speak about it as well as anyone can and I can contribute to just about anything if the need arises. If I ever get promoted to Director level then I probably will have to step away from coding as an official duty, but I'll happily keep enjoying that part of my job for now.
That is beyond a full time job, and if your cup isn't full today, staying aligned with the product requirements and architectural implications, you need to let go and focus on that.
On a more serious note, 100% agree. I'm asked to delegate more, but I don't want my skills to atrophy and, I'm happy when I'm coding. If I had to JUST manage, I wouldn't survive, figuratively speaking.
sometimes I wonder if this is a thing because managers just don't want to code, and having other managers doing it makes them look bad
That did shift over time, I now manage teams maintaining three distinct products - and between managing the people and the products, setting the vision, dealing with customers.. there is just never any time for coding which isn’t taking away from the time I could better spent doing something else.
Managers who code learn they are inviting political suicide.
1. Managers need to navigate office politics - a full time and full energy job.
2. Other teams will use lack of 8 hours of "coding output" as a weapon to prove that manager is not working.
Putting more political pressure on them and their team.
If this is you I'd advise you to leave that job as soon as possible and take matter into your own hands.
I became an individual contributor at a different company after being in this non-hands-on manager role for just about 2 years. What followed was a sense of accomplishment, being a happier person overall and earning way more money.
I would argue the vast majority of other middle managers can't code, so play manager is all they can do.
If only. A lot of them have embedded themselves deeply in the org to make themselves feel indispensable to the upper echelons. So even though they are dispensable, as long as those at the top don't know that, they're not going anywhere.
Basically senior managers are offering less senior managers as sacrifice to embed themselves deeper. But that shtick doesn’t last forever I can promise
I now write software, assign tasks, hire and sometimes fire people too. But I don't do the hard stuff of managing people, doing their reviews, encouraging and coaching them and giving them a shoulder to cry on. I know my limits.
I love this arrangement. Sharing a role works well if you can find someone who is good at what you suck at.
If you want to continue on the manager path, I'd suggest leaning into that area of weakness and trying to improve it as much as you can. At Director+ levels, these skills are non-negotiable.
Whatever I'm doing, imposter syndrome be damned, seems to work. My team always look to me for help and plead with me to never leave; though I'm sure they'd find their way. I do find it difficult to keep up with all the projects going on at times, which complicates ongoing project discussions Especially when the developer isn't the best at communicating effectively and I need to be the liaison between them and upper management. Trying to keep up with all of that is really what limits my time as a developer.
I was pleasantly surprised that the article linked a write-up on building an internal ChatBot. We're been looking at doing the same through Elastic AI but scratching that itch myself seems fun. I just wonder how long it'll be before I have to hand it over to someone else...
AI and search is only as helpful as the content provided, and most applicable to those already familiar with the existing domain.
I might be a bit jaded, but I don't feel like I've seen an implementation of EMs I actually feel work well, at least from an IC perspective. The EM often ends up being a mix of both tech lead and all HR stuff, being overworked and unavailable, or neglecting one of the tasks.
I've actually preferred when my "EM" is on a different team than me. Can then speak freely to the person about issues in my team etc.
Engineering Management is supposed to be a support role, working from the sidelines on enabling engineers to deliver, manage career progression, and sometimes help untangle actual technical problems - but not act as a tech lead. My experience echoes yours: EMs serving multiple teams can do that most effectively without the role getting muddled.
It was meant to replace non-technical project management, and gives space for product to become a non-management role. If the EMs stop being technical, what's the point?
Probably because of my recent bad experience before summer. I was tech lead at a small 3 dev team (including me). Then we got an EM assigned working full time in the team. Somehow nothing changed, I still did all the technical leadership, contributed code and talked with the stakeholders. While he was just always "busy" going to some meeting, and never could contribute. But those meetings didn't exist before he joined, and no one really knew where his time went or what he did, even had PMs asking me. And upper management expected more output now that we were one engineer more, and I had to explain I hadn't seen him work in weeks.
Of course, this is a singular bad EM, but made me question the role even more. Not the first time I've seen EMs slowly fading, getting away with doing very little except busy work.
Surprise: Not all engineering is software engineering.
> Please respond to the strongest plausible interpretation of what someone says, not a weaker one that's easier to criticize. Assume good faith.
So, yeah, the context should make it obvious what I'm referring to here.
Tweet like quality.
I chose not to go higher, because I felt that I was being most productive, where I was, and because, quite frankly, I didn't trust anyone else to do the job right (I still believe that this was a correct assumption). I had absolutely no stomach, whatsoever, for the political games, "above" my level, and was making enough to keep me satisfied.
When I first became a manager, I continued to code, but, as time went on, I hired people who were better at it than I was (I was pretty good, but they were better), and also, I couldn't be reliable enough to be in a "critical path," so I worked on tools and experimental projects that didn't have deadlines.
My managers did not want me coding. They actively discouraged me from it. Eventually, I stopped coding for the company (but kept coding on my own). I feel that continuing to code on my own, made me a much better manager. I think my bosses were dead wrong to discourage me from being technical. It was a cultural thing; not a practical one.
I feel that "first-line" managers should still be very technical. Maybe they shouldn't have "critical path" responsibilities, but I believe that they should be absolutely conversant with the latest technologies and techniques, as well as be extremely sympathetic to the challenges faced by their employees.
I believe that the rules are different for higher-level managers.
BTW: I hated every minute of my work as a manager. I don't regret it, but I was glad to see the back of it.
Perhaps the belief is somewhat self serving, but I've seen dozens of examples of good non-technical EMs and good technical EMs, but never a good pseudo-technical EM. The pseudo-technical ones are so jaded with technical work that's palpable.
Also, reminds me of the famous Elon Musk quote[1]:
> Managers in software must write great software or it’s like being a cavalry captain who can’t ride a horse!
We've such crazy margins that we can support too many "i'm not technical hehe" managers than should really be feasible