The best interview question I was ever asked was so perplexing in its simplicity. It was What Makes a Good Development Team?
What made it interesting is that when engineering positions are advertised, there are always lists of technical qualifications. And most position descriptions pay homage to the question of “What Makes a Good Development Team” with a throw away line about “fit” or something like that. However, crafting a good team may be one of the most important parts of creating a successful project.
##Technical My answer was divided into the technical needs and the personality traits. As for technical needs, there needs to be a mix. There needs to be people with highly developed skills and those with skills that are not as highly developed. We all understand this intuitively. There are difficult problems that require a lot of knowledge and experience, but there are lot and lots and lots of small problems that do not necessarily need a PhD to solve them.
However, the mix shouldn’t be just of skill levels, it also needs to be a mix of goals. A good team needs beginning developers that want to be senior developers and it needs senior developers that want to be leads or managers, but it also needs a mix of people that like their position and do not necessarily want to change. Why? Because there needs to be a line of continuity and also a path of succession.
If new people aren’t challenged, they are going to leave. If senior devs do boring work, they are going to leave. Even if that is taken care of, though, people will still leave. That’s what people do. Teams that are mixed can fill in the gaps easily. A junior developer can step up. Small, but necessary problems can be spread out and eventually a new hire will happen or people will shift around until a balance is maintained.
That was all pretty uncontroversial, I’m sure. However, I’ve seen cases where new devs are treated as if they never want to move up. No challenges are presented. They don’t get to understand the whole system and then when a senior disappears, there is panic. Usually management will go to recruiters and hire expensive senior devs who have overhead in learning the system when there should’ve been a plan from the start. It’s good to bring in senior devs from the outside and organizations that rely exclusively on internal promotions (either because of policy or because of convention) will suffer, but they should never be hired out of desperation.
##Personality The second part of what makes a good dev team is harder to pin down. We all know we don’t want to work with jerks. And we all know that there is this elusive quality called “fit” that everyone talks about, but no one defines. Well, what is fit?
###Empathy If I could sum up the single most important personality trait an engineer should have, it’s empathy (which I would argue is the most important trait for all people to have). Why is empathy important? Empathy is what makes individuals a team. When individuals empathize with each other, they are able to create a set of shared goals. They are able to understand how code will effect others on the project. They are able to think how a user will interact with the system.
There is a stereotype of the grumpy programmer. They are cranky, hate to be disturbed, will complain about every UI tweak or change, but are somehow geniuses that can solve any problem. They are not worth the time. I personally hate that stereotype, because it conflates two character traits that have nothing in common: logical ability and lack of empathy.
My current team, has been working on a large project for months. It’s going to define the future of our product, so it’s a pretty big deal. During that time we’ve had an important team member leave and we’ve acquired new clients with their own problems. This means that even though there is a this giant looming deadline, we’ve all had to shift in our roles. I’ve had to finish client facing websites that another developer started and I’ve had to shelve a major project that I’m completing (a project that I loved working on) because I needed to offer support to the engineers working on the bigger project. Another developer had to take over managing the project which meant his responsibilities shifted to another engineer who had to deal with an increased workload. The only way this works is because we all understand we are trying to do our best work as a group. Any single individual can complain about their role, but doing so wouldn’t advance us towards the goal. Empathy for teammates, for clients, for individuals throughout the company keep things moving forward.
The other trait that individuals need to make a good team is tenacity. They need to be able to persevere and have drive to complete projects and launch big ideas. There are a lot of mundane programming tasks, but there are many more difficult tasks that are, at best, partially solved. Programming is a creative act and carries with it a certain amount of frustration and confusion.
For most programmers, that is the point. They want the challenge. It are these programmers that make a good team. A good team not only is undeterred by difficult problems, they are invigorated by them.
##Great Teams Make Great Things A CEO I know said that the most expensive problems are always human problems. Development teams tend to take on the personalities and skills of their members. If balance is not maintained people leave or fight or create divisions that can persist long after the original instigators are gone. A well balanced development team will make a great product. A poorly formed team will just create problems.