Agile software development is an evolutionary, highly collaborative, disciplined, quality-focused approach to software development and delivery, whereby potentially shippable working software is produced at regular intervals for review and deployment. Canonical definition of agile is provided in terms of agile manifesto and principles (http://agilemanifesto.org/). Agile development environment is created with the help of several practices derived from agile manifesto and principles and building a culture. Let’s have an overview about this environment in coming text.
Iterative and incremental development
Agile development environment is primarily created by iterative and incremental approach of development. It helps to get the continuous feedback from the customer and other stakeholders. To understand the meaning of the Iterative and incremental let’s go through three different approaches for making of paining of Mona Lisa.
In first approach, complete work is divided into several pieces and then each piece developed one by one. This is called Incremental development approach. In the second approach, first an outline of image is created on the basis of initial understanding of what to be done and then several refinements done in various steps, this is called Iterative development. Final approach, as you can see, is the combination of both these. Here first an outline of complete work defined, then it was broken into several pieces and in each step these pieces developed with several refinements. In software development, each piece defined here is similar to an iteration which consists of certain features which are developed first time and some features in which we have to incorporate some enhancements. This approach of development facilitate end customer to have early deliveries which help him to provide valuable feedback in advance, so that at the end he get the product which he really needed. This also helps the customer to launch the product in market at early stage and earn the profit at early stage while development of the complete product is still ongoing. In today’s competitive and dynamic environment this is real need of customer. In such kind of development approach, prioritization of features plays an important role. Development is carried out in such a manner that ‘Minimum Marketable Features’ are provided to the customer at early stages. This also helps the complete team and customer to work on ‘Fail, Fail early’ concept. Team targets to work on ‘High Value Low Risk’ features first and keep low value high risk feature for later part of development so it helps customer to end the product development at early stage if he thinks that reaming features are not of use and hence getting the product with less cost. One of the main advantage to the project team from this iterative and incremental is that focus on the quality remains throughout the project, as in every iteration, team analyze, develop, test and demonstrate working software.
Short feedback loop
Agile team recognizes the fact that change becomes costly, if it comes at later stage. In the above figure (as per analysis of feedback cycle of various development techniques by Scott Ambler), feedback mentioned in green color are coming as per agile practices while feedback mentioned in red color are as per traditional practices. Red color feedbacks are coming at later stage so are more costly to incorporate. To support rapid feedback in order to detect and correct errors as quickly as possible agile development environment uses certain technical practices as mentioned below:
Create daily build of the code and run all the unit tests and system test to maintain code quality on the daily basis.
Test Driven Development:
Write a “single” unit test describing an aspect of the program. Run the test, which should fail because the program lacks that feature. Write “just enough” code, the simplest possible, to make the test pass.
Automate all the functional tests and user acceptance test to reduce the qualification time. Also these tests can be run on daily basis with the help of continuous integration.
Efficient and Effective Communication:
Efficient communication is one of the most important points to maintain the agility. An agile development environment can be distinctly categorized by the way of communication medium it uses. Efficient and effective communication achieved by:
Keep all the important information of the project visible with the help of big visible charts, Task/Kanban boards.
Daily Stand up:
Team meets for 15 minutes on daily basis to share progress of their work with all team members:
- What I did yesterday?
- What will I do today?
- Any bottlenecks?
Delivery mindset is an important aspect of agile development environment. To make this achievable and making each delivery valuable agile team follows certain practices:
A timebox is an amount of time taken before starting the work. Rather than allow work to continue until the goal is reached, timebox approaches consist of stopping work when time has consumed and evaluating what was accomplished. Timebox approach is reflected in all agile practices (where it can be applicable). Example includes Daily Stand up meeting for 15 minutes, Timebox iterations, timebox analysis of complex features (called spike in agile terminology)
Definition of Done:
Define simple points which can ensure completion of any task/feature. This is to ensure common definition of completion of any task/feature between all team members.
As said by Kent Beck, “’Perfect’ is a verb, not an adjective”. Agile team recognizes this fact and continuously works for improvements. At the end of every iteration, agile team gathers for a retrospective session to discuss – What went well, what didn’t go so well, learning and improvement areas for next iteration. This helps agile team to be better day by day and create a continuous learning environment.
In an agile development environment project manager works differently. He works as servant leader. He is a “un-blocker” rather than a “status taker.” He works for the self-organizing team, doing whatever it takes to help them succeed. He works as a coach, mentor, and a guide. He pushes the team to do their best work, not in the traditional way of command and control. He serves as an “amplifier” to the team, by “plugging in” and boosting team’s performance. As a result, the team gets better, stronger, and faster over time. He does not sit behind a desk only, working Microsoft project plans and asking for status against those plans. He knows the status implicitly by virtue of the agile ceremonies he attends and facilitates himself.
How to Create an Agile Development environment
Creating agile environment is not just only following certain practices. It is much more than that. Agile is an idea supported by a set of values and beliefs. It is about fundamental shift in thinking. We are ‘doing agile ‘when we follow practices and we are ‘being agile’ when we act with an agile mindset. Agile is not a process – it defines a culture. A culture which doesn’t resist change rather welcomes change. We need to develop a culture of collaboration and cultivation. As per Schneider Culture Model, Collaboration is about working together and Cultivation is about learning and growing with a sense of purpose.
As discussion is about environment, so before ending, let me share an interesting post on TED – “Agile programming — for your family” by ‘Bruce Feiler’. Inspired by agile software programming, Feiler introduces agile environment and practices in family which encourage flexibility, bottom-up idea flow, constant feedback and accountability. You can go through same on http://www.ted.com/talks/bruce_feiler_agile_programming_for_your_family and enjoy this interesting talk J