Sustainable software development requires a certain kind of culture. While it is hard to completely describe the desired culture, it is possible to help focus on what that culture is by using some descriptive words and phrases.
The team must be highly disciplined in its approach and goal focused. Discipline is what the team uses to ensure that all the work is done properly and with no shortcuts. For example, discipline helps teams ensure that their work is really done when they say it is.
Unfortunately, agile development has been labeled as being undisciplined by some. Yet any team, regardless of its practices, will not succeed unless it is disciplined. What I suspect is happening is that there is confusion about the difference between discipline and ceremony. Ceremony in this case refers to the required activities that must be performed in a project: for example, a requirements document before a certain milestone, milestones such as a feature freeze, weekly status meetings, design documents, or mandated beta programs. Agile teams minimize ceremony in favor of keeping to the task at hand and producing results (a working product), while more involved processes emphasize ceremony and documentation over the results. In many cases, unfortunately, people mistakenly believe that unless documents are created there is no discipline. This is a mistaken belief however, because these documents are frequently wasted effort and are no guarantee that a prescribed process is being followed.
The team must be responsible for its work and not play the part of a victim. Victims go along with anything and don't rock the boat, then absolve themselves of any responsibility so they can lay the blame elsewhere. There are actually very few situations in life where you are truly a victim. In most cases, the victim is just as susceptible to his or her own line of thinking and unwillingness to take charge of the situation as they are to the situation. For example, if a decision is made that a responsible person knows is wrong, that person doesn't just go along with it, he or she ensures that everyone is aware of the consequences so that the decision is either made with the right data or is changed. Victims, on the other hand, go along with the decision and then say, "I was told to…," even though they knew it was the wrong thing.
Responsible people have courage to take on any situation and do not get swept up by events. They trust others to do the best they can and are always diligent to ensure that nothing falls between the cracks. They don't just say, "that can't be done." They explain why and then help uncover the real problem and provide a viable alternative.
The team has multiple leaders who work together, and the leaders are not just the managers, team leads, or coaches. See Chapter 8 for more ideas on leadership in sustainable software development.
I also believe that an attempt to build a successful culture is enhanced by the presence of at least one level 5 leader [Collins 2001]. These are the individuals who recognize that the greatest success is when they can help others succeed and give them the opportunity to receive the accolades they deserve, who view success as a team accomplishment and failure as a personal responsibility, not an opportunity to apportion blame on others. These people are few and far between and are unfortunately rarely promoted into senior management because they often lack the charisma, high-volume talking, and massive ego and self-confidence; the traits most often associated with getting ahead in the corporate world.
Visionary and Tactical
Effective teams strive for the optimal balance between being visionary (thinking about the long term) and tactical (focusing on today's problems), and this balance changes over the course of the project. In the early phases of a project there should be a heavier emphasis on being visionary, and in latter phases the emphasis should be placed on tactics related to finishing the project. Projects fail when there is too much emphasis on being visionary late in the development cycle or when there is too much emphasis on tactical issues too early in the project. Great teams are able to balance the two at each moment in the project.
Shared Sense of Urgency
In sustainable development it is important that everyone on the team shares the same sense of urgency to complete the project. If the business people are worried about the competition and the developers are more concerned about the perfect architecture, failure will result.
A shared sense of urgency is also the most important factor in building teams. It isn't compatible personalities or team building exercises or even necessarily mutual respect that make the best teams, it's a shared goal or aggressive but achievable deadline that the team uses as a rallying cry for getting the project done.
Collaboration is a vital success factor in sustainable development. Good teams are able to work together, embrace the differences between personalities and roles, and strive for a successful project. They also recognize that there are clear roles for each of them to play. Businesspeople don't write software and programmers don't write business plans. Collaboration should be like breathing; it is always there and is done almost subconsciously. And it should be done in person (as opposed to e-mail or voice mail) as much as possible because that is the most effective form of collaboration.
Complementary Talents and Skills
Great cultures recognize talents and skills as separate from each other. Too many companies are focused on skill alone and recruit only for skills. But skills can be taught, whereas talent can't. Software development is a perfect example because people who are talented at complex problem solving make excellent programmers. Excellent programmers can learn new programming languages in a short period of time and will over time outperform their peers. And yet, most job ads in our industry still look for a certain number of years of experience programming in a particular language when what they should be looking for are people who are talented problem solvers.
Continually Improving and Learning
Continual improvement and learning is a vital element of sustainable development. Great people and teams continually learn and refine their projects and how they approach the projects. They use short time increments (many times per year) to ensure their pace is high and lightweight and use techniques to monitor progress, keep themselves on track, and introduce changes as required.
Great teams understand that change is necessary and desirable. They also understand that change must sometimes be made in the face of conflicting or incomplete information. However, they also realize that just because a decision is made at one point in time does not mean that it can't be or won't be modified as new information is available. Hence, being change tolerant also means that sometimes some extra work must be done at the current time so that change tolerance is possible in the future as well.
Risk is a constant element of all projects. Effective teams are always aware of risk, are able to differentiate between real and perceived risk, and are not afraid to make decisions with the best information possible in the face of risk. They are also constantly looking for ways to reduce or alleviate risk.
You can't always choose what you do, but you can choose how you do it [Lundin et al 2000]. Good people and teams recognize this. They find ways to make work more fun for their co-workers and customers.