Buy My Account


Basics
Overview
Video Demos
Pricing & Ordering
Sample Applications
Customers
News & Reviews
Download Now!

Product Tour
Product Tour
Web Applications
Mobile Applications
SharePoint Applications
Charts and Reports
Security
Architecture & Code
Team Development

Technical Materials
Training Courses
Online Help
Technical Forums
White Papers
What's New in V9.0
One Day Web Apps E-book
System Requirements
Product Roadmap
Version History

Practical Guidelines and Improvements in Agile Software Process Development

Be More Productive!

Agile embraces changing requirements and does not even blink when it happens. Agile is about providing consistent and early working software - not prototypes.

April 26, 2005

A family of Processes

You have probably heard of Extreme Programming and perhaps SCRUM, Evo, Crystal, and a host of others. Think of Agile as the ‘Abstract Base Class’ and each method as concrete implementations. I am often asked ‘what MUST you do to be called Agile’. This is a tough question, and in my opinion, you must do perform the following steps to be considered ‘Agile’:

1) All coding is done is timeboxed (fixed-length) iterations (typically ranging from two weeks to four weeks). No extensions are allowed to this duration. If features cannot be completed it is up to the project stakeholdersto decide if they would like those features moved into the next iteration (they could decide for whatever reason to cut the features for example – a rare occurrence but one that is at the heart of being Agile – responding to change).

2) Coding must be done using ‘Test Driven Development’ (TDD) and a ‘Unit Test Framework’ must be in place. Personally I call this ‘Intention Driven Development’ as programmers often psychologically do not respond well to the term ‘Test Driven Development’. They often immediately say (or think) ‘I’m not a tester I’m a programmer’. Well I know that is not true as should they as all programmers are testers in a sense when they compile their code and check for errors. This simply formalizes the ‘Assertions’ that are made that their code must satisfy to be considered ‘correct’. There are many benefits to TDD that I will be covering a bit later on. The main point (and one of the hardest to culturally get ingrained) is that software is not written until the test is written that validates the code. This means the test will always fail at first as there is no code. The code is then written to make the test pass. Let this sink in as this is one of the most critical aspects of Agile, and one of the most poorly executed. The benefits of a team doing TDD correctly are astounding as there is a strong correlation between the early discovery of defects and high quality. With TDD you immediately know about defects, far before your Quality Assurance team (or individual) would ever see the code. You have fixed the bug before it was even checked it. More on this in a bit.

3) Plans are fine to create, but be prepared to completely ignore them. Agile is about responding to change. For example, if you have a culture that creates GANNT charts running out 12 months and believes it has any relation to what the reality will likely be, your organization is deluding itself. The best you can do is statistically speak in terms of ‘probabilities’ and even that is pretty hard to do with accuracy (but I will show you how to at least vastly improve on the binary success/fail model so prevalent today in corporate America and likely one of the largest fallacies of logic still allowed to exist in our highly competitive business environment). Agile allows the Stakeholders (the CEO, the Business Experts, the Customers, etc.) to dictate the work to be done and when it is done. It is the rule, not the exception that you can expect your plans for the work you do (in other words the business requirements) in any future iteration to not be realized due to changes from your stakeholders. I am still astounded by the organizations that believe they can capture all of the requirements upfront, using a waterfall approach when it has been proven time and time again to be a recipe for disaster. Old habits die hard.

Agile embraces changing requirements and does not even blink when it happens (and it will). Agile is about turning on a dime, responding to change without hesitation, and providing consistent and early working software (not prototypes) to the stakeholders to see, touch, and possibly even use.

Elements Up for Negotiation

1) Pair Programming

It’s hard to argue that this doesn’t work when done correctly. We know from the work of people like Dr. Laurie Williams in her book ‘Pair Programming Illuminated’, that this particular practice is filled with myths and false assumptions. When done correctly you can expect roughly the same amount of work produced as if the two individuals had worked alone. However you gain two critical elements:

a) Collective Code Ownership. By using Pair Programming and switching your pairs consistently, you will create a shared knowledge of your system across your team. The typical model I see today is the ‘cowboy’ programmers pulling 100 hour weeks to get a system done, with the rest of the team struggling to add value on the far less critical elements of a project. Studies prove that these ‘cowboy’ programmers are up to 2,800% more productive then their worst peers (see Robert Glass’s excellent ‘Facts and Fallacies of Software Engineering’ for more information) so it is no wonder these high bandwidth individuals tend to say “OK move out of the way and just let me do this. I can get this done in a few weeks”. They are often viewed as ‘superstars’ and even promoted to management!

This is another fallacy of logic as there is nothing about a high performing developer that would indicate they would be an effective manager, however I believe that is a main reason why we suffer in the US from astounding losses in software development in Corporations (up to $140,000,000,000 based on studies from the Standish Group). When performing pair programming, ‘cowboys’, often feel that they are doing more training then pairing, a key cultural problem to watch out for.

b) The quality gains in your code are significant, often as much as 200-400% when code is written in pairs. In turn, producing a productivity rate that is roughly equivalent to that of an individual, once the team learns how to pair program correctly. Yet why do so many organizations flat our refuse to embrace this obvious (and free) practice? The pair programming experience is highly social, with one person ‘driving’ (coding) and the other person watching intently and both individuals changing roles often. For the person watching and discussing the code, it is not so much syntax checking (we have compilers and IDEs for that). It is about keeping in mind the big picture, and asking for explanations where code doesn’t make sense. Think of this as a traditional‘code review’, done in real time. These two parties swap roles when it feels right to do so and they form a highly productive team. Thus, ensuring that all aspects of their project are accomplished: Strategic, Tactical and Operational. This is especially helpful when you have a developer who likes to write incredibly complex code that nobody can understand when a far simpler and 'boring' solution exists. The pair helps ensure this doesn't happen right at the source (where in a more traditional code review process it would be to late). One problem in Agile I will address are the 'cowboy' programmers who are used to being the superstar and being greatly responsible for a successful project based on their immense talent and long work hours.

One partner could say to the other:

“Do we really need to manually implement a recursive quick-sort when it is already provided for us in the framework we are working in?”

”Well I can optimize the sort I am sure as I read on a message board they didn’t optimize it properly”

”Well, the few CPU cycles we would save are not worth the time it would take (if indeed you are even correct). Remember we optimize last in Agile or we risk optimizing the wrong item, so lets use the framework and if we find it is a bottleneck we can always refactor to your solution later on. Deal?”

“OK you do have a point. In that case let me write this line, and we are done. OK let’s run the Unit Tests to make sure we are all green”

“Great Idea. If we are all green I’d like to drive and lets move on to the next task in our Story”.

NOTE: The term “green” is often used as the color of a successful unit test is green. It is more common then most developers ever predict. Later iterations of code are almost always written that break code from previous iterations. These broken segments are often items the developers were not even considering. The RED test is usually a fairly obvious problem that is quickly resolved. Once we are ‘all green’ code can be checked in (but that does not mean the build with all the developer’s code integrated was not broken. I will cover that in Continuous Integration, one of the easiest and most underutilized wins a team can implement (and the software is free).

2) A ‘War Room’ Environment for a Shared Working Team Space.

This is optimized by walls covered in white boards for impromptu ‘Agile Modeling’ sessions where all team members are extremely well versed in Object Oriented Design Patterns. This is nothing new (in fact there is very little new in Agile, It is the fact that these common practices have been brought together that makes Agile unique. Unfortunately, corporations often cannot dream of asking their people to leave their nice cubicles. Many managers cannot make this happen so they take a big hit in their probability of success to allow the core team to often be spread apart, have closed door offices, and suffering vast distances and time zones separating the team, making one of the most important aspects, face to face communication, hard if not impossible.

These processes are a negotion, not a 100% mandate. Agile is almost always crafted to the organization. So how do we deal with these hindrances? How can we quantify the impact these poor decisions have on our likely outcome?

Applying New "Best Practice"

A process competency that has been sorely missing from Agile is a solid Risk Management Framework based on the concept of probability. One of the most influential books recently published is ‘Waltzing with Bears’ by Demarco and Lister, a must read for all Software professions (as is their classic ‘Peopleware’, in my opinion the single most important book for a manager to read (if I could only choose one).

As we know software is often about predicting the future (which we know we cannot do) there are techniques that have proven applicability in many areas of business. It is astounding to me that these have not found their way into software. Perhaps people feel software is simply too complicated (and perhaps sometimes it is) but I would argue that it is light years ahead of the typical IT Manager committing to unrealistic dates and failing. In ‘Waltzing with Bears’ Demarco and Lister provide us not only a scathing analysis of the current state of managers predictive capabilities, they also provide us with something incredibly valuable: A Probability Distribution Curve for Software Projects. Armed with this (taken from thousands of projects) you are now armed to discuss all future events in terms of their probability, with the accuracy increasing over time. Here is a quote that accurately describes the current status quo in Corporate America:

"Without knowing anything at all about your current project, I'll bet even money that you'll be late. After all, well over half of all projects deliver late or deliver less than was promised by the original deadline. It's far worse when a project is on an admittedly aggressive schedule. Project people seem disconcerted when I proclaim that I'm willing to bet against them. They try so hard to believe that they'll buck the odds. What usually happens is that everyone agrees that the deadline is very tight; everyone works very hard; and then, when people see that they won't make it, they are shocked, disappointed, and deeply dismayed."
—Tim Lister

Reprinted by permission of Dorset House Publishing from WALTZING WITH BEARS (ISBN: 0-932633-60-9), p. 48. Copyright © 2003 by Tom DeMarco and Timothy Lister. All rights reserved.

About the Author

Damon W. Carr
CEO and Chief Technologist agilefactor.

Damon Carr is the CEO and Chief Technologist of agilefactor, based in NY, New York. The company continues its growth via Microsoft.NET Leadership, Software Engineering best practices Agile Process Evolution and the new book by Mr. Carr covering "Agile Software Factories" to be published in early 2006 by Addison-Wesley. Prior to joining agilefactor, Damon was the CTO and Co-Founder of Monetaire, a global company with offices in Europe and the US, where he spearheaded all technical innovation, including their flagship product which was named a 'top three solution' in Europe by Forrester Research. Damon continues to speak at the software industry's most prestigious conferences including the upcoming 'Better Software Conference' (http://www.sqe.com/bettersoftwareconf/) where he is a featured speaker on 'Agile Processes and Software Factory Evolution', he also leads various high profile global user groups.

Contact the author.

Credits:

Taken from the forthcoming book by Damon Carr titled, agilefactor: A Necessary Evolution in Agile Software Development Process.
  Support   Company Info  
 

Privacy Statement