The advent of the computer era is a major breakthrough in history. Mankind created amazing machines to handle the tasks our brains struggle with. Telling computers how to solve our problems has become a practice called Software Development. Over time, higher level languages have made programming less daunting. We realized the difference between a program and a product . We built frameworks to avoid repetitive tasks. We discovered how important it is to automate tests and deploy as often as possible. In essence, we've made development more efficient, enabling it to tackle heavier, more intricate problems.
Moreover, we've turned software into a US$400bi industry. Software is ubiquitous and demand is increasing faster than almost all other industries. Development firms have grown to the level of tens of thousands of employees. Back in the day, programming was a one-person hobby, almost a form of art. Now, it's carried out by large distributed teams across the globe. How did that massive upscaling happen so fast?
The Real Challenge
DeMarco and Lister have presented us with a bold claim: the biggest challenge today in software development is not technology. What actually still stumps us is the people factor. Software Engineering has tried-and-true answers for most of what enterprise systems need. How to enable several engineers working together to achieve effectiveness is still an open question. Attempts at answering it pop up every day from different schools of thought. The more we try, the more we realize a fundamental truth: people teams are complex.
We know the difference between a group and a team, and what keeps the latter together. Trust and interdependency are crucial for teamwork. But everything that begins to exist needs a cause. How can one lead a group of people into becoming not only a team, but an effective one?
The Project Management discipline has discussed the subject of team building almost to exhaustion. Organizations are hungry for a checklist they can apply to make people work better together. The truth is that experience shows you can't actually build a team. Building implies you can make a big effort to create a stable foundation that stays up indefinitely. A more appropriate term for teams would be to grow, meaning to cultivate. You can work to make the soil fertile, and then hope a nice garden springs up.
Just like gardening, growing teams takes time and demands effort. This is especially true when we talk about development teams. The abstract nature of software adds to the natural intricacies of social interaction. The result only reinforces the main characteristic of people teams, which is complexity. People’s behavior is often unpredictable and influenced by many external factors.
From the perspective of the leader, this unpredictability can be intimidating. Traditional management presupposes measurement and control. But the fact that teams are complex does not mean they're impervious to improvement. As a leader, there are actions you can take to tend the garden - that is, create conditions in which your team can thrive. Here are a few suggestions:
1) Know Thyself
A team consists not only of people, but also of interpersonal relationships. We all have our idiosyncrasies, and we can't simply leave them at the door when we come to work. Try to understand what motivates, frustrates and influences you. Learn to predict how you will react to certain situations. Encourage your team to do the same. Tools such as the Myers-Briggs Type Indicator (MBTI) and Predictive Index (PI) can be useful. Have people sharing their results with others, as far as they're comfortable. This will enable people to shape their interactions to make the most out of each other.
2) Act on Trust
Trust is a word that's often abused and taken out of context. Trusting people is not only being able to predict how they'll behave. In the context of a team, trust has to do with belief and exposure. When people believe other's motives are good and feel comfortable around them, there's trust. This requires people to be open, even vulnerable, to each other. People in a trusting team are confident on each other's abilities to get the job done. They also understand each other's weaknesses and are able to self-organize around them.
Fostering trust in a team can be as simple as starting a conversation. Inspire people to open up and share things about their personal lives. It's amazing what a quick round of peer introduction can do to a group of people who've never met before. Help people identify their own strengths and weaknesses and bring those to the team. Avoid second-guessing people's abilities, but instead show you're confident they can do it. Take risks by delegating actual responsibilities to others. And, more importantly, be vulnerable yourself. Don't be afraid of admitting mistakes and letting your shortcomings show up. When a leader is transparent about her errors, people feel trusted to be open about themselves too.
3) Discover Your Measurable Goal (and make it public)
When you're in a software project, several things can be desirable achievements. On time delivery, fewer bugs, high code coverage, low turnover, etc. Yet, it's also true that each project has to have a few objectives that are more important than the others. Otherwise, by "focusing on everything", you actually end up prioritizing nothing.
To achieve success, a team needs to have clear alignment on what's their primary goal. They also need to be able to measure their progress towards that goal. Above all else, you can't set a team's goal from outside; you can only help them find it. And once you do, make use of boards, charts and other radiators to ensure it's crystal clear. Talk about it often, and make sure everyone knows precisely where they are towards it. To achieve true commitment, you need to ensure people are included in the decision process. We can only comfortably agree to something we had a say on, even if we don't get our way. Consensus can be dangerous, and healthy teams don't get paralyzed waiting for it.
4) Encourage a Culture of High Standards
It's easy to fall for the trap of holding people accountable. Obviously, if you're a manager, part of your job is to align expectations and monitor results. However, true performance has little to do with pressure, and everything to do with motivation. You can hardly motivate anyone by telling them what you want them to do. In any case, great teams don't need many external motivators. They self-motivate, as their people hold each other to high standards. When a team is committed to a shared, clear, measurable goal, people know they depend on each other to succeed. As a result, they know the quality of their work is contingent on the efficiency of their peers. And, if there's trust, they'll make their expectations on each other clear through healthy, constructive conflict.
5) Rinse and Repeat
The "growing" metaphor is not only about providing the conditions for the team to thrive. If you grow a beautiful flower garden and then leave it alone, entropy can quickly bring it down. In a similar way, maintaining effectiveness in a team requires constant work. People can easily drift away from good team practices when work starts to pile on. Just as important as taking the steps above is to persist on them. If something hurts, do it more often. When practices become habits, habits can become principles. And when your team starts to act on these principles, there's no way it won't achieve effectiveness.
“You’re never going to be made the tech lead of your team unless you’ve demonstrated that you’re also bringing up the next generation,” says Rachel Laycock, market technology principal for New York.
Johannes Thönes spoke with Rachel and with Jeff Norris, technology principal in San Francisco, in an 18-minute interview about how to enable both learning within teams and personal development throughout careers.
- Brooks, Jr., Frederick P. The Mythical Man-Month: Essays On Software Engineering, © 1995, Addison Wesley Longman Inc.
- DeMarco, Tom and Timothy Lister. Peopleware: 2nd Edition. New York: Dorset House Pub, 1999. [DeMarco, Lister 1999].
- Appelo, Jurgen. Management 3.0. Upper Saddle River, NJ: Addison-Wesley, 2011. Print.
- Lencioni, Patrick. The Five Dysfunctions Of A Team. San Francisco: Jossey-Bass, 2002. Print.