29 May 2014

A Strategy for Building a Software Team

Software development is hard. Putting together a team of people who can do a good job of it is no easier. Having spent time with a few companies, though, I have seen certain approaches that appear to correlate with high-performing teams.

This post is my team-building strategy based on those ideas I've seen work... and a few of my own.

How do you build a winning team?
(with permission from

Define the Team’s Culture with Principles and a Philosophy

Before I can look to bring people into a team I need to draw up a list of opinions, principles and practices that will be fundamental to this team - like the 7 digital tech manifesto. This is important to me because I want a group of developers that can work together to build software systems.

When developers have incompatible opinions, it’s asking for trouble. Some people write tests and some don’t. Some comment their code, and some don’t. Too many sources of friction like this can be very harmful to the amount of value the teams adds. The friendly atmosphere can also turn very negative.

Below are a few key principles that I would likely go with:

Delivery and Customer Focused

I want people who understand why they are building software. I think it’s important that micro decisions made by developers are aligned with the strategic goals of the business. This means that developers need to take an interest in the business side and feel part of the company.

Software actually needs to be delivered before the business can get value from it. So I'd also seek developers who understand that getting new features in front of users is as important as writing the code for it.

At all costs I would be trying to avoid developers who see development as a jira-ticket production line. Instead I would look for those who can cut out an unnecessary layer of non-technical management with their all-round skills.

TDD and Pair Programming

I don’t think you can have half a team doing TDD and the other half not. Based on the fact that I have had big success on multiple projects with TDD I would definitely go with it (but not dogmatically).

I have to admit that of the programmers I’ve worked with, the ones who practice TDD are by some margin more passionate, more productive, and more likely to deliver results. As a consequence, I have to accept there are many great programmers who don’t practice TDD and I would have to miss out on them.

Pair programming is an incredible tool for sharing skills and knowledge. Get a group of developers with different technical skills and thinking patterns, and there’s a fantastic chance they will all help each other to level up. Again, not dogmatically, though.

Share knowledge and skills with pair programming
(with permission from

Prove me Wrong Principle

As part of my team, I would want people who are anti-dogma. Any of the principles and practices set by the team are always up for debate. Anything the team does is up for debate. People should always have an opportunity to go against the grain if it benefits the team or the business.

For this principle to be successful it needs analytical thinkers who want to improve, and it requires humble personalities willing to listen and change their opinion. Much easier said than done, mind.

Make Joining the Team Desirable

To get the right people on your team it can be a massive help if your team looks desirable - can you offer them exciting challenges, opportunities to work with smart people, or plenty of new skills to learn? Here are a few tricks that I’ve seen work and would try myself.

Tech Blog

A blog helps a dev team show the outside world what technologies they are using, what innovations they are producing, and how many millions of requests they are processing a second. To passionate developers who care, this is often a big sign that the joining the team will lead to many rewarding experiences.

Open Source Code

When looking for a new role, a development team’s github account can tell you a lot about what they are getting up to. What projects did they create, what projects do they support and contribute to etc?

Talk at Meetups and Conferences

Developers who speak in public tend be regarded higher than average. If someone from your team is speaking in public, it gives other developers the impression that being part of your team will be an above-average opportunity.

Identifying the Right People

Attracting the right kind of people is a hard task, but so is choosing the right people.

Ask Them to Teach Me

Instead of just asking a developer loads of questions to which I know all the answers, I would instead ask them to teach me things. I may ask them to challenge our dev team or present to us on some of their favourite topics.

For any questions I did ask them, there would always be the encouragement to challenge mine or the team’s *correct* answer. Maybe our belief is wrong, or this person has a better way of thinking.

View Their Public Profile

Twitter, facebook, github, blogs are all resources I would use to get an idea of someone’s personality. This can help look beyond the technical skills on a CV and see some of the things they are prepared to say in public. It’s not a guarantee of anything, but it helps.

Assess on a Variety of Topics

I wouldn't base hiring decisions solely on a person’s ability to write fizz buzz in thirty seconds. I’d have a chat with them about topics like architecture, delivery, and innovation.

Maybe they are strong in a few areas, and after spending some time with the team could improve on their weaknesses. At the same time they could bring important skills to the team and help everyone else improve.

Prioritise Attitude and Personality

If a good candidate doesn’t follow the philosophies of the team, but does express a sincere willingness to learn, then I would always consider taking a second look. I believe with pair programming and a good personality fit, it is almost always achievable to get people upto speed if they have expressed a desire to do so.

I personally believe that great personalities are harder to find than great technical skills.

Always be Available for Applications

In a competitive jobs market the candidates you are looking for are not always available. To combat this I would always be advertising for vacancies. Whenever someone suitable becomes available I would try to bring them on-board or keep in touch with them until it was possible.

Obsess Over Motivation

Once the right people are on-board you still have to keep them motivated.

As a developer I know that if I’m not motivated then I will not be as productive. So trying as hard as possible to maintain a team of motivated developers I would ensure that certain values and practices are baked deeply into the culture. Here are a few:

Empower People

I've been part of self-organising teams where I felt like I've made a real contribution to the success of the team and the company. I've also been micro-managed and dictated to. For a team I was building, I would fully advocate the former.

I'd be looking for developers that are motivated by being given freedom, ownership and responsibility.  And I would always be looking to ensure that they got it.

Provide Support for Improvement and Innovation

Technology is always improving - the business need to make better use of new technology for competitive advantage, whilst developers need to keep on learning for excitement and for their career.

I would do everything possible to ensure that the team I was building had opportunities inside working hours to be creative and to improve themselves. I would get on my knees to management explaining to them that innovation time or hack days are crucial to the productivity of the business.

Comfortable Environment

For most people, myself included, we can’t do our best work if we’re not comfortable. A solution to this may mean providing comfortable chairs, quiet working conditions, or any tools that help people do their job. Perhaps even a bit of working from home.

Unfortunately, everyone is different. Some people like background music, some people don’t etc. It takes a lot of effort, but if people aren't comfortable everyone loses out.

Maybe not quite this comfortable
(via Ambro @

There is Always Someone to Talk to

If someone has a problem that is affecting them then I think it’s best to try and resolve the issue as soon as possible. As humans we are influenced by emotion; if we can get something off our chest or someone else can give us another perspective, a lot of the time we can clear our minds before the problems take a hold and start affecting  motivation or relationships.

Imagine you are annoyed that someone is never willing to comprise and always insists on doing everything exactly as they say. These people can kill team harmony and turn friends against each other. It’s important, in my opinion, that people can talk about these things. Mentors and 1-2-1 sessions are possible practices that can be used for this.