While Agile and Unified Software Development-style processes claim to be iterative and adaptive rather than defined and predictive, they both have limitations when it comes to efficiently producing software in medium sized teams. This particularly true when these span multiple geographies. However, they can both teach us how to achieve what I'm calling 'resonance' (see part one of this series).
Note that the Rational Unified Process (RUP) is the official IBM refinement of what is essentially the Unified Software Development Process (Jacobson, Booch, Rumbaught). As background, I'll first proceed with this embarrasingly incomplete review of the Agile and RUP practices.
The RUP is "use-case driven, architecture-centric, and incremental and iterative". Each iteration is part of four overall 'phases': Inception, Elaboration, Construction, and Transition. Iterations occur in each phase. Activities in iterations are focused on one of the four activities: gathering requirements, analyzing, designing, implementing, and testing. Each of these activities place a more or less important role as the project moves from phase to phase. As Craig Larman points out, RUP is not the dreaded 'waterfall' approach. It's the mis-application of its myriad of optional workflows and documents that tend to promote that illusion. Here are some personal observations about how it works in practice. RUP practitioners are:
- document-centric - they labor to produce detailed documents whose prescribed purpose is the necessary outcome of many of the activities in the overall process
- perfectionists - since they move only once from phase to phase, it is imperative that the artifacts (code, documents, etc) they produce be perfect. In theory, iterating within the phase should allow for mistakes and trend towards more and more perfect artifacts.
- cautious - RUP practitioners cannot afford to design or implement a mistake because it will destroy the integrity of the overall plan that was established during or even before the first phase.
- independant - some might unjustly say "isolationist". The truth is, they trust the RUP process 'framework' within which they expect the right information to be available in order to get their specific job done. Well defined interfaces between all the components, allow each person to work in relative isolation and then later plugin their individual pieces.
Agile development is more of ethic than a process (the founders refer to it as a "manifesto"). To get a feel for what a completely "Agile" process might look like, take a look at Xtreme Programming (XP). In essence, to be agile in software development is to quickly and appropriately react to new information in the development cycle in a way that best satisfies the customer. To best make this happen, Agile practitioners are:
- customer focused - they insist on having the customer highly involved in each aspect of what is being produced. The customer's regular feedback is immediately incorporated into the development effort, even it if means significantly changing what had already been produced thus far.
- real - they don't try to make guesses and purposeful keep the scope of their efforts small. They explore often to get the information necessary to continually make small steps forward.
- intuitive - they rely on experience to guide them through the process and try to minimize activities that 'just don't make sense' for the task at hand. If a comprehensive design specification doesn't get the job done, then they don't attempt it
- communicators - they try to 'peer program' as much as possible. They try to convene strategic and tactical thinking in the same activity by having someone 'drive' while their peer 'navigates'.
The "independant" and "communicator" characteristics in each of the previous lists are the ones most worth focusing on in order to achieve resonance. Part three will consider RUP and Agile practices' techniques for dealing with independance and the basic communication issue, the very heart of resonant practice. Most importantly, we will consider exactly what this means for geographically disperse teams. Stay tuned!