When experiencing an agile event, we naturally focus on nimble changes of direction, the grace and efficiency of execution, that make our own lives seem heavy and inert in comparison. This is true whether seeing an athlete in motion or participating in an Agile software development project. However, there is a necessary counterpart to the seemingly light and effortless movement: a solid foundation that frames and enables the agility.
As your favourite hockey player rockets down the ice, note the sprays of ice whenever he carves around an opponent. Those manoeuvers are only possible with a smooth, solid sheet and a honed skate. When the gymnast launches freely spinning into space, she knows exactly where the balance beam will be upon descent.
So it is with software development. We can only provide efficient and responsive adjustments to our applications because we have a solid foundation to frame our efforts. First, and most critical, is a basis of trust with our clients. In order to respond efficiently to their emerging and evolving needs, we rely on minimal documentation, loosely-defined requirements, and an initially generalized view of what the end product will be. This is natural enough — when beginning a new project, it is always uncertain exactly which details will best solve the business problem that brought the client to us, but it requires a lot of trust to begin the exploration, especially in a business world rife with “buyer beware”. Our team must work hard to establish the necessary foundation of trust, showing that client and developer are part of the same team, and both parties will only benefit from solutions that effectively and efficiently meet our clients’ business needs.
As development begins, we anticipate changes of direction by implementing test-driven development. With a comprehensive set of tests to ensure the software behaves in a known manner, we can confidently make significant changes as new business needs arise, knowing that a solid test framework will uncover and pinpoint any side effects of the added changes.
We undertake a series of short cycles, or iterations, in our development process. At the end of each iteration, we deliver a functional, though incomplete, software application. This allows our clients to experience our software early and often, which yields critical discovery and feedback which guides the development process. We develop on a fixed schedule, which establishes an effective rhythm to our development, which helps our clients anticipate and accommodate their review of the application in progress.
In order to deliver on a fixed schedule, the set of features slated for inclusion in each iteration cannot change mid-iteration, and our developers need the freedom to make some adjustments to those features to best deliver as time allows. Within the solid foundation of the iteration schedule, our developers gain the freedom to deliver rapidly and effectively, and at the start of each iteration, the client has the freedom to respond to the delivered software with very informed feedback from their hands-on experience. Each iteration can then launch freely into the direction that best meets the clients needs, with the agility to capture the optimum solution for their business.
We are proud of our ability to respond nimbly, mid-project, to the changing needs of our clients. However, like the lithe-limbed athlete, our movements are not as effortless as they appear — there is much work required to provide that solid foundation from which to safely change directions.