How I operated as a staff engineer at Heroku
amyunger.com
amyunger.com
A long tenure engineer is the perfect fit for this. They know how to surgically remove the useless code. They remember all the hopes they had for the feature and when it failed to produce those results. They know well that code is not free, it's an ongoing cost to maintenance and complexity. This is not easy work to give to a junior. It's not even for senior engineers because they often lack the context and broad system knowledge. Only the long tenure staff engineer can confidently say, that feature failed, and I can remove it without breaking anything. If someone brings up sunken cost fallacy and how some users use the feature, only the long tenure staff has the background, respect, and authority to say, no this feature failed, it has 1% of the results we wanted, it's not worth the ongoing maintenance burden.
A staff engineer is supposed to a team multiplier through code. People often think of designs, refactoring, helpful tools, architecture discussions and documents. And it's true, these are all code related things that can multiply a team's efforts when done well.
But what better way to multiply a team's productivity than to reduce the size of the system? Think of how green field projects start. They feel so fast and progress is so quick. Then the features come, more and more, slowing down development with expanding system complexity and maintenance of code. How much faster and quicker can the team move after the staff engineer has reduced the system by 50%? It's like turning back the clock on an aging system. Suddenly it feels years younger, able to move quickly again, but this time with the right features in place from the experience of past years. And the team is happier, less useless code to wade through and understand, less strange bugs caused from code that supports a useless feature.
I definitely take on the grim reaper role and make deletions happen. But it does take all the skills in the post.
Dead code is often a negative for maintenance, understanding and performance. With version control one can always go back and recover deleted code that proves to be useful later on.
At some point the cost of figuring out how to remove the code will be less than the cost of keeping it around.
* When new folks are onboarded, they should be spending a lot of time looking through the code base. Maybe on their own, maybe as part of other tasks, but they'll be reading this dead code multiple times.
* If the dead code is an entire method, and hasn't been used in a while, it probably doesn't work. What happens when someone calls that method now?
* Your CI/CD pipelines spend time building (and probably testing) dead code.
Nothing ever could be done.
It is much more powerful than simple static analysis and is setup as a continuous destruction platform alongside continuous integration.
See https://www.youtube.com/watch?v=29UXzfQWOhQ for more on this idea.
Spent a good 2 weeks on this but the result was around 120 files changed and over 4000 lines removed, it felt great! And it was also an amazing opportunity to understand the codebase and ask the right questions to other team members when figuring out what was outdated and what wasn't.
In that case, what can happen is once the requirements change for one part of the system, now you must change a generic component in such a way as to not disturb the other part using the same component.
That way madness lie. (Of course, cut-n-paste programming is also madness inducing.)
I still consider one of the highlights of my career to be a release of mature software where I was able to deliver the whole additional feature set on time, AND reduce the overall size of the codebase by about 15%. There was so much cruft from a long history of incremental development that there was duplicate logic, lack of single responsibility, and many bits of code that were 90% similar and could be made redundant with some basic abstraction.
It was glorious!
I would say the biggest challenge with roles like this is the loneliness and what seems like constant conflict. One needs to work hard to keep up personal relationships with product/sales/project management/etc to ensure that the level of trust is there to be able to have the hard conversations. It is really easy to forget that, and a lot of those other folks start to feel like you're always just shooting down their ideas.
In the heat of the moment, on deadline with a bunch of bugs and yet multiple compliance hurdles to clear, with a short-staffed team and conflicting management priorities, it's pretty easy to lose sight of the common goal.
Microsoft has a nice cliche you can use when you catch yourself on the adversarial end of this type of conversation: "assume positive intent". It's written on most of the Redmond campus whiteboards. If we are all assuming positive intent, it can give us the right empathetic mindset with which to build this trust even when it seems difficult. I've found working with other teams through the hard conversations with compromise instead of "no" leads to better results. They're assuming positive intent as am I and it's OK. If I'm feeling something is adversarial I need to understand why.
Personally, I really didn’t have the stomach for the work, eventually; I have gone back to active programming, this time for scientific projects, and I am much happier.
Gold.
Anyway, it's kinda good to know that it's not just my company/team that seems to have this issue.
It's not a push because a push comes from behind. It's you grabbing onto something elevating and interesting because it's juicy.
A reasonable senior will recognize your talent, but a stagnant organization will simply extract your current value without pulling you up with that bite.
I know the analogy is bit inhumane, but the human part comes from those very human people who just want to solve problems.
Whether they be lower in pay/'rank' or higher, find the people who appreciate your strengths immediately. Don't ever be afraid to express your ideals in your capabilities and learning process.
In any organization from 10 to 10,000 you will find those folks who can take a genuine appreciation for your skillset and apply it.
The failure state should always be: "I'm departing to company Y, I wish you the best."
The success is an expression of your ideals.
The 'meat' of my argument is - at your level - don't look for the push, find the pull.
You've got this.
Edit: an -> and (Para. 5)
Why must one be a senior engineer in tech before they can become a staff engineer? To me, this seems much more like a communication role. Moreover, the tech that is needed to know is at a high level. Is it really needed to know the technical finer details of systems when high level software architecture and communication seem to be 90% of the whole role?
Or put in a more blunt, albeit unrefined, way: why can't someone who specializes in communication become a staff engineer? I mean people like consultants. They get so much experience with communication and high level tech (some of them at least) that this seems to be what they'd be good at.
So:
1. You have to keep writing code to remain an effective tiebreaker 2. You still need to be a badass engineer in order to hire and keep exceptional talent who‘s looking up to you for mentorship. Respect and excellence are non-negotiable ingredients in a working meritocracy.
Sure you can also work outside of a meritocracy, but results and engineering happiness/productivity is usually subpar.
So that‘s exactl why the hunt is on for those unicorn engineers who can also socialize: It‘s proven to work.
The difference with a staff engineer is that TPMs are not expected to be technical experts, while a staff/principal engineer is. So they're not just routing information between stakeholders, they're also synthesizing and evaluating, partly responsible for the project going well and empowered to make changes they think necessary.
All of that takes a lot of experience in the trenches, having seen many projects succeed and fail. It also requires a lot of trust and respect, which takes experience to cultivate.
For Staff+ engineers, communication and high level architecture are just the tip of the iceberg. You have to understand the problem domain and the solution domain, be able to come up with good technical solutions (which is generally a collaborative process), and sell others on these ideas. Then you have to follow through with implementing them yourself and leading others working with you on them. If you don’t have the technical depth to understand the details, you’re not going to succeed at that. If you haven’t already internalized a lot of the details through your past work, you’re not going to have enough time to both learn the technical details and do all the communication, implementation and other parts of your job.
A really had thing for someone without actual work experience in the field is spotting the difference between: someone with the exact right experience, someone with the wrong experience but a valuable set of skills and personality to learn, someone bullshitting their resume and talking like they understand the tech stack and someone who seems to have the right experience but is actually a bad fit.
For a staff engineer it's critical to be able to spot knowledge gaps in teams, explain complex technical issues to business people, spot opportunities for the implementation of new tech and estimate the complexity of implementing it, etc. No matter how good you are at communicating, you will be unable to do this without actual understanding of the tech stack. Just explaining why last week it was ok to hire a react dev to fulfill an angular vacancy, but this week you really need a dev with super specific knowledge to fill an urgent need is hard to do without understanding those technologies.
They can't afford to spend time to get super deep technically, since it's not worth it. And I imagine that those that do dive deep just get a technical job for less pressure and more money.
Maybe you're just extremely lucky.
I'm already happy if I get a recruiter mail where the buzzwords aren't even used in a nonsensical way, e.g. just from two sentences I know the person hasn't ever written a single line of code or worked in a project using any of the 10 buzzword technologies.
Made up examples "using exciting database technology like mysql and mqtt", using "programming languages like SQL and XML"
Are we sure about that? I thought one of the most common compensation structures is they got a commission of approximately 10% of the first year's salary for each hired candidate, payable after the candidate has completed 3 months at the new job.
I hope the average recruiter places more than 10 developers per year.
The smart ones develop relationships with frequent job-hoppers. It turns almost into an agent-talent relationship.
The role that most companies these days call “Senior Software Engineer” is actually an intermediate-level role (e.g., 5 years of experience). Staff is arguably where the actual senior-level roles start. This corresponds with the transition from being told what to do to being told to figure out what needs to be done and make it happen.
Maybe that works for you, if you're in the right place getting paid the right amount, but we do ourselves a disservice when we allow this to occur.
My personal understanding was: junior: lots of tactical guidance
medium: less tactical, lots of strategic guidance
senior: no tactical, very vague strategic (normally coming from business partners).
Maybe that's just me, though.
>Maybe that's just me, though.
That's just you. I agree that's probably closer to how the terminology should work, but it doesn't. I'm unaware of any large company where senior engineers are getting direction directly from business partners.
You're lucky if "senior" engineers have 3 years of experience.
Senior: 53%
Staff: 35%
Senior Staff: 12%
When I came into the role I was stunned at the amount of time that I ended up talking to people and just trying to figure out what is going on.
I like the notion of articulating a career path in tech as of: 1) Learning the ropes 2) Being a producer / writing code / driving design decisions 3) Being a multiplier - working across different teams to unblock / amplify other peoples work
3) is pretty much communication centric, while 2) is deep knowledge of tech involved
There is a lot of nuance to that of course (which I think this article captures well within specific organization). I'm curious if this is something any one else has the same experience with
But the other half was only lightly touched on. Staff is as much spearhead as it is rearguard. So that means caring for legacy codebases, aging tech, and anything else that's falling behind. It's search and rescue and postmortems after things have gone catastrophically wrong.
Great great write up!
It's composed of interviews with Staff-plus engineers as well as guides for reaching and succeeding at Staff-plus roles
This one hits home. I've been at a rapidly growing org for nearly a decade and have grown a massive amount in turn. Things that I thought were the case sometimes ceased being so, literally, years ago.
I was a manager for most of my career, and spent most of that time pining for the fio- er, my days as a coder.
So, after I left my career position, I reverted back to a coder. It's been nice.
The reality is that in most teams you can delegate the "Deep Diver" responsibility most of the time. "Context sharing" and "Coaching" not so much.
So yes, as some comments in other threads mention, your coding/hard tech contributions diminish with time.
Why would any manager in his/her right mind choose to take any major risks while working for a big company? Maybe I'm looking at it wrong, but "looking not great" because you failed makes sure that next time you'll have to make the choice you'll always going to pick the safe bet. And safe bets aren't good for any technological company long-term.
[1]: https://www.levels.fyi/?compare=Salesforce&track=Software%20...
junior: 200-250
mid junior : 250 - 300
senior: 300-350
staff: 450-500
principal: 600-700
director: 800 - million+
vp: millionsYour job as a staff engineer involves going into a cross-team meeting and explaining in technical detail a given piece of work, thanks to which your/another team re-estimates a given ticket from 5 points to 1 point. Those 4 points of difference are your hard work, done over the course of a 30-60 minute meeting.
This is probably what people mean by "force multiplier".
Additionally, how often was coding actually involved in this role? I hear this claim often but in my experience it’s rare. One-line fixes don’t count. Specifically, what projects were you a code contributor to?
> While I do write code from time-to-time, it’s only after I’ve delivered on my obligations on these four functions.
> As someone who still does write code occasionally, this is something I struggle with. Our codebase shifts underneath me constantly, in ways I often don’t see. It has been my goal for the year to make sure I say “I’m not sure, let me check” even when I feel confident.
This is not at all consistent with Staff Software Engineer at any of the several Big Tech Companies You've Definitely Heard Of I've worked at. It would be more of a Distinguished Engineer level sinecure[1]. Staff is usually expected to spend at least 50% of their time actually writing software.
[1] Not pejorative. If I were the relevant hiring manager I'd be happy to let someone like, say, Leslie Lamport, to pick a name out of the hat, spend as much or as little time as he felt like writing software just to have him around.
Planning
Context sharing
Coaching & Culture
What is a staff engineer?
When it comes down to it my role is a lot of ad-hoc dealing with bun fights before they come actual fires.
It seems all the talent is focused on Salesforce.
All the way.