How to build a great software engineering team.

Great teams build great software.

I love our little engineering team. (We're not so small anymore: 40+ developers). I'm still proud to be a part of it, through thick and thin, after almost 6 years of being in the trenches together. It got me thinking that I should be jotting down some notes to describe how we got here and what might transfer to other teams.

1. Only hire the right people.

Hire the right people, not the best people.

The best people have the credentials, ace the coding tests, and have 15 years experience.

The right people are curious and biased toward action. That's why they've picked up several obscure programming languages, have side projects, and at least one esoteric hobby. Your gut will know immediately in the first interview, and then it will be obvious when you finally get to talk shop about software.

Don't compromise. The open role can wait for this person.

2. Optimize for personal fulfillment

Optimize for the personal fulfillment of each individual, not happiness.

If a person is fulfilled in their work, they will find happiness. Don't put the cart before the horse. I don't like this wave of optimizing for the "developer experience". If everything were easy and fun, we might be happy for a day, but we won't be fulfilled.

To be fulfilled you need to have the power to build things that matter, and have the space to grow (points 3 and 4 below).

3. Push power down

Push power, authority, and decision making down from the top, through each layer, to each individual on the team.

Leaders should * not * be aggregating or delegating transactional power. Leaders should be listening to concerns, clearing a path for their team, and using whatever power they have to ensure everyone is growing and doing fulfilling work.

4. Ensure everyone is growing

It's worth breaking this down by phrase.

Ensure.

Everyone.

Is Growing

Every person on the team needs to have opportunities to try something a little harder, outside their current knowledge domain, with room to fail and try again. Nobody left behind. Not the introverts, not the juniors, not the individuals who don't quite fit in yet.

5. Structure and processes matter, but not that much.

Kanban, scrum, intake, reporting structure. None of it matters that much. Whatever structure and processes you have in place, they need to be constantly refactored to optimize for:

  1. Hiring the right people
  2. Optimizing for personal fulfillment
  3. Pushing power down
  4. Ensure everyone is growing

6. Leaders don't "do" anything.

If you're a leader, chances are you got there by doing things. By writing code, building software, and making things.

That's not your identity anymore. You need to ensure your team is hiring the right people, optimizing for personal fulfillment, pushing power down, and constantly growing. You can't do that if you're trying to help by writing code or debugging something. Your team will grow and feel fulfilled when you get out of their way and let them do things.