Isolation is pessimistic, collaboration is Agile
Wednesday, May 25th, 2005Working on several software development projects, both agile and non-agile, I’ve realized a few things:
- Non-agile teams favor isolated development practices
- Isolated practices are generally pessimistic
- Agile teams favor collaboration
- Higher collaboration seems to (naturally) require more optimism
Non-agile teams favor isolation
Most of the non-agile teams that I’ve worked for (including those who thought they were agile, but really weren’t) have generally favored isolated development practices. For example, developers take on different tasks and develop them in isolation. Developers have ownership of segments of code and take it very personally if somebody critiques or modifies their code. Teams also seem to either favor version control systems that use pessimistic locking or favor developing on isolated branches and then merging for releases (or both).
Isolated practices are generally pessimistic
Non-agile teams tend to use isolation as the solution to the problems of concurrency. If multiple people are touching the same thing, there are two ways to manage the concurrency, optimistically or pessimistically. The non-agile approach seems to favor pessimism by preventing the concurrency all together. But are you really preventing it? No, really what you are doing is delaying it, and in turn delaying the discovery of integration bugs.
Let’s take version control for example. If two people branch seperately from the same code base and develop in isolation, they are eventually going to have to merge. Somebody will have to merge first, and you still have the same potential for integration bugs as you do if the developers were developing on the same branch.
Agile teams favor collaboration
In my opinion, the most fundamental idea with agile processes is that the productivity of the team is more important than the productivity of the individual. This sounds rather socialistic, but we’re not talking about government, we’re talking about business. It doesn’t matter if you develop component A under time and under budget if your product can’t ship without components B and C and they are over time and over budget.
Agile teams seem to favor collaboration in almost every practice. Take Extreme Programming for instance. Pair programming immediately removes the isolation involved in development by having two developers work on the same code and calling for developers to change partners periodically. Collaborative code ownership allows anybody to touch any code. Continuous integration and fanatical unit and acceptance testing allow developers to work on the same branch with great assurance that they will not have integration bugs.
Collaboration naturally requires more optimism
In order to acheive high collaboration, development practices seem to naturally gravitate towards more optimism when dealing with concurrency. Concurrency is not dealt with via isolation, but rather by allowing the concurrency and building practices around it that minimize the liklihood of integration bugs, by forcing them to be visible and dealt with early.
Some other thoughts
Now, I’ve seen both models, and I’ve seen both models work. I’ve seen teams using either model effectively deliver high-quality systems on time. But from my experience, agile teams are more likely to be able to do this repeatedly. There are also some other nice side-effects; though there are no absolutes, when I compare agile and non-agile teams, I notice that agile teams have a tendency to:
- be smaller in size
- have more comprehensive testing
- have more focus
- have more fun
- be able to learn more from one another
- be able to adapt more easily to changing requirements
- have more frequent releases
- involve their customers more throughout releases
- have more uniform coding style, designs, and programming idioms
The agile thought process seems to be gaining ground and I think will eventually be the de facto way that people approach software development.