In August of 2019 I became a Staff Engineer, which is what a lot of
companies are calling their “level above Senior Engineer” role these
days. Engineering leveling is a weird beast, which probably a post onto
itself. Despite my odd entry into a career in tech, my path in the last
4 or 5 years has been pretty conventional; however, somehow, despite
having an increasingly normal career trajectory, explaining what I do on
a day to day basis has not gotten easier.
Staff Engineers are important for scaling engineering teams, but lots of
teams get by with out them, and unlike more junior engineers who have
broadly similar job roles, there are a lot of different ways to be a
Staff Engineer, which only muddies things. This post is a reflection on
some key aspects of my experience organized in to topics that I hope
will be useful for people who may be interested in becoming staff
engineers or managing such a person. If you’re also a Staff Engineer
and your experience is different, I wouldn’t be particularly surprised.
Staff Engineers Help Teams Build Great Software#
Lots of teams function just fine without Staff Engineers and teams can
build great products without having contributors in Staff-type roles.
Indeed, because Staff Engineers vary a lot, the utility of having more
senior individual contributors on a team depends a lot of the specific
engineer and the team in question: finding a good fit is even harder
than usual. In general, having Senior Technical leadership can help
teams by:
- giving people managers more space and time to focus on the team
organization, processes, and people. Particularly in small
organizations, team managers often pick up technical leadership.
- providing connections and collaborations between groups and efforts.
While almost all senior engineers have a “home team” and are
directly involved in a few specific projects, they also tend to have
broader scope, and so can help coordinate efforts between different
projects and groups.
- increasing the parallelism of teams, and can provide the kind of
infrastructure that allows a team to persue multiple streams of
development at one time.
- supporting the career path and growth of more junior engineers, both
as a result of direct mentoring, but also by enabling the team to be
more successful by having more technical leadership capacity creates
opportunities for growth for everyone on the team.
In addition to experience and a history of effusiveness, like other
promotions, getting promoted to Staff Engineer is less straight forward
than other promotions. This is in part because the ways we think about
leveling and job roles (i.e. to describe the professional activities and
capabilities along several dimensions for each level,) become
complicated when there are lots of different ways to be a Staff
Engineer. Pragmatically, these kind of promotions often depend on other
factors:
- the existence of other Staff Engineers in the organization make it
more likely that there’s an easy comparison for a candidate.
- past experience of managers getting Staff+ promotions for engineers.
Enginering Managers without this kind of experience may have
difficulty creating the kinds of opportunities within their
organizations and for advocating these kinds of promotions.
- organizational maturity and breadth to support the workload of a Staff
Engineer: there are ways to partition teams and organizations that
preclude some of the kinds of higher level concerns that justify
having Staff Engineers, and while having senior technical leadership
is often useful, if the organization can’t support it, it won’t
happen.
- teams with a sizable population of more junior engineers, particularly
where the team is growing, will have more opportunity and need for
Staff Engineers. Teams that are on the balance more senior, or are
small and relatively static tend to have less opportunity for the kind
of broadly synthetic work that tends to lead to Staff promotions.
There are also, of course, some kinds of technical achievements and
professional characteristics that Staff Engineers often have, and I’m
not saying that anyone in the right organizational context can be
promoted, exactly. However, without the right kind of organizational
support and context, even the most exceptional engineers will never be
promoted.
In many organizations its true that Staff promotions are often much
harder to get than equivalent promotions to peer-level management
postions: the organizational contexts required to support the promotion
of Engineers into management roles are much easier to create,
particularly as organizations grow. As you hire more engineers you need
more Engineering Managers. There are other factors:
- managers control promotions, and it’s easier for them to recapitulate
their own career paths in their reports than to think about the Staff
role, and so more Engineers tend to be pushed towards management than
Senior IC roles. It’s also probably that meta-managers benefit
organizationally from having more front-line managers in their
organizations than more senior ICs, which exacerbates this bias.
- from an output perspective, Senior Engineers can write the code that
Staff Engineers would otherwise write, in a way that Engineering
Management tends to be difficult to avoid or do without. In other
terms, management promotions are often more critical from the
organization’s perspective and therefore prioritized over Staff
promotions, particularly during growth.
- cost. Staff Engineers are expensive, often more expensive than
managers particularly at the bottom of the brackets, and it’s
difficult to imagine that the timing of Staff promotions are not
impacted by budgetary requirements.
Because there are many valid ways to do the Staff job, and so much of
the job is about leveraging context and building broader connections
between different projects, people with more organizational experience
and history often have an advantage over fresh industry hires. In
general:
- Success as a Staff Engineer in one organization does not necessarily
translate to success at another.
- The conventions within the process for industry hiring, are good at
selecting junior engineers, and there are fewer conventions for more
Senior roles, which means that candidates are not assessed for skills
and experiences that are relevant to their day-to-day while also being
penalized for (often) being unexceptional at the kind of problems that
junior engineering interviews focus on. While interview processes are
imperfect assessment tools in all cases, they’re particularly bad
at more senior levels.
- Senior engineering contributors have a the potential to have huge
impact on product development, engineering outcomes, all of which
requires a bunch of trust on the part of the organization, and that
kind of trust is often easier to build with someone who already has
organizational experience
This isn’t to say that it’s impossible to hire Staff engineers, I’m
just deeply dubious of the hiring process for these kinds of roles
having both interviewed for these kinds of roles and also interviewed
candidates for them. I’ve also watched more than one senior contributor
not really get along well with a team or other leadership after being
hired externally, and for reasons that end up making sense in
retrospect. It’s really hard.
Staff Engineers Don’t Not Manage#
Most companies have a clear distinction between the career trajectories
of people involved in “management” and senior “individual
contributor” roles (like Staff Engineers,) with managers involved in
leadership for teams and humans, with ICs involved in technical aspects.
This seems really clear on paper but incredibly messy in practice. The
decisions that managers make about team organization and prioritization
have necessary technical implications; while it’s difficult to organize
larger scale technical initiatives without awareness of the people and
teams. Sometimes Staff Engineers end up doing actual management on a
temporary basis in order to fill gaps as organizations change or cover
parental leave
It’s also the case that a huge part of the job for many Staff
Engineer’s involves direct mentorship of junior engineers, which can
involve leading specific projects, conversations about career
trajectories and growth, as well as conversations about specific
technical topics. This has a lot of overlap with management, and that’s
fine. The major differences is that senior contributors share
responsibility for the people they mentor with their actual managers,
and tend to focus mentoring on smaller groups of contributors.
Staff Engineers aren’t (or shouldn’t be!) managers, even when they are
involved in broader leadership work, even if the specific engineer is
capable of doing management work: putting ICs in management roles,
takes time away from their (likely more valuable) technical projects.
Staff Engineers Write Boring and Tedious But Easy Code#
While this is perhaps not a universal view, I feel pretty safe in
suggesting that Staff Engineers should be directly involved in
development projects. While there are lots of ways to be involved in
development: technical design, architecture, reviewing code and
documents, project planning and development, and so fort, I think it’s
really important that Staff Engineers be involved with code-writing, and
similar activies. This makes it easy to stay grounded and relevant, and
also makes it possible to do a better job at all of the other kinds of
engineering work.
Having said that, it’s almost inevitable that the kinds of contribution
to the code that you make as a Staff Engineer are not the same kinds of
contributions that you make at other points in your career. Your
attention is probably pulled in different directions. Where a junior
engineer can spend most of their day focusing on a few projects and
writing code, Staff Engineers:
- consult with other teams.
- mentor other engineers.
- build long and medium term plans for teams and products.
- breaking larger projects apart and designing APIs between components.
All of this “other engineering work” takes time, and the broader
portfolio of concerns means that more junior engineers often have more
time and attention to focus on specific programming tasks. The result is
that the kind of code you end up writing tends to be different:
- fixing problems and bugs in systems that require a lot of context. The
bugs are often not very complicated themselves, but require
understanding the implication of one component with regards to other
components, which can make them difficult.
- projects to enable future development work, including building
infrastructure or designing an interface and connecting an existing
implementation to that interface ahead of some larger effort. This
kind of “refactor things to make it possible to write a new
implementation.”
- writing small isolated components to support broader initiatives, such
as exposing existing information via new APIs, and building libraries
to facilitate connections between different projects or components.
- projects that support the work of the team as a whole: tools, build
and deployment systems, code clean up, performance tuning, test
infrastructure, and so forth.
These kinds of projects can amount to rather a lot of development work,
but they definitely have their own flavor. As I approached Staff and
certainly since, the kind of projects I had attention for definitely
shifted. I actually like this kind of work rather a lot, so that’s been
quite good for me, but the change is real.
There’s definitely a temptation to give Staff Engineers big projects
that they can go off and work on alone, and I’ve seen lots of teams and
engineers attempt this: sometimes these projects work out, though more
often the successes feel like an exception. There’s no “right kind”
of way to write software as a Staff Engineer, sometimes senior
engineer’s get to work on bigger “core projects.” Having said that,
if a Staff Engineer is working on the “other engineering” aspects of
the job, there’s just limited time to do big development projects in a
reasonable time frame.