- Analysis Paralysis is real. Agile development methodologies deal with this at a fundamental level. Yes, it’s not perfect, but waiting too long is even less likely to get it right.
- Trust is mandatory. Too many approaches seem to maintain an adversarial relationship between the different parties to the project. That’s an incredibly unpleasant way to make a living.
- Test-Driven Development. Done right, Test-Driven Development captures and stores knowledge in incredibly concentrated form. Far more efficient than boilerplate documentation.
- Mental Capacity of Users. Programmers, in general, are able to hold complex systems in their head, coordinating and visualizing the whole thing at once, able to understand how the various parts work, how they fit together and how changes in X will affect Y. However, most people do not have this ability, and furthermore, they don’t like to admit that they can’t do it. Unfortunately, these people are your customers and the ones who specify the project.
- Release Early and Often. Release early and often is the fundamental of software startups. It’s the closest thing I’ve seen to a “Golden Rule”. It’s done this way because getting it in the hands of customers as early as possible is critical to getting good feedback about how the sofware should change. Most projects could do with this level of intensity and desire to please the customers. Not all, but most.
- Build vs. Buy. The relative shortness of an iteration seems to increase the use of off-the-shelf software, reducing Not-Invented-Here syndrome.
- Daily Habits. Short, daily meetings (Stand up or sit down, I don’t care) set a tempo for the organization, one that eventually turns into a habit (and in my mind, it’s a very good habit to have - brevity, efficiency and a sense of urgency)
- User Stories. I find user stories much richer and more illuminating than use cases. Use cases often have more precise facts, and I use them, but I find the stories to be a better way to “get into the customer’s head.”
- Post-Mortems - I don’t do these as often as I should, at least not formally, but I think they’re very important. And doing one every 4 weeks is very useful to updating the course quickly.
- Fixed Iteration Deliverables - Again, like item 1 above, it may not be perfect to hold the deliverables constant for 4 weeks, but it works a lot better than the alternative in most cases.
You might be able to come up with another approach to software development that avoids these, but Agile development seems to embrace them all quite well.
I’m still a skeptic on a few things:
- Pair Programming - not against it, just not convinced, and not interested in trying to fight for it. It seems like a wash to me.
- Integrated Customer - seems infeasible, and with a decent team, unnecessary.
- Growing the Architecture - I’m actually ok with this to some degree, except in communications between systems - in my experiences writing and implementing communications protocols, they need to be thought through more than other parts of the system, because they aren’t as malleable as the software itself.