To understand where Agile fits we need to look at the bigger picture. You can think of all development methodologies as on a continuum from predictive to adaptive. The further you move from the predictive end of the continuum, the less formal planning and process is employed. Agile methodologies fall at the adaptive end, so they can say less about what will happen in the future, but they are better equipped to deal with change. Take a moment to read the Agile manifesto:
We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:Glossing over the tragically ill-formed opening sentence (and trust me I'm having to hold myself back here), let's consider each of these statements in turn:
Individuals and interactions over processes and toolsThat is, while there is value in the items on the right, we value the items on the left more.
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan
Individuals and interactions over processes and tools. I can quote many occasions that process (and tools to enforce that process) are merely a substitute for good engineers, so in essence I agree with this sentiment. But in practice it may be foolhardy to assume that every member of your team is such a high-calibre and well-rounded engineer that they will only ever do the right thing. Maybe the Googles of this world can afford to assemble such a team, but generally it is unlikely. Consider carefully how little process you can afford to do away with. Are you really not going to employ a change-management or code review process/tool just because you trust your guys?
Working software over comprehensive documentation. Obviously, the former is more valuable than the latter. Stating it in a manifesto is at best bland, but at worst it engenders a culture that considers documenting software as not important. It is important. Ask someone who has been asked to upgrade a 15-year-old system consisting of one million lines of code. But the real point here is that no compromise is actually necessary. With model-driven development the software and the documentation can be one and the same thing. Why should this not be a tenet in the manifesto instead?
Customer collaboration over contract negotiation. Customer collaboration throughout the development life-cycle is essential, but if your project is being funded by an external customer then you must have a contract specifying at least the key user requirements. Sure, the holy-grail is to sign a contract on an hourly-rate basis, where customer collaboration (and indeed procrastination) is just money in the bank, but that's why contracts are rarely drawn up this way and only between the friendliest of companies. I've seen companies lose millions over woolly contracts. In the real world it would be suicide to overlook the value of a solid contract with the promise of some jolly fun customer collaboration down the road.
Responding to change over following a plan. Having the ability to respond to change is unquestionably beneficial, but suggesting that change is valued more highly than a plan is a little suspect. There is no world in which regular change will result in a more efficient outcome than following a plan (and having no change). Change is absolutely inevitable, I accept that. But it should be minimised where possible rather than welcomed. The key, as with everything, is balance - knowing what elements are reasonably stable with high confidence and so knowing at what level of detail to plan.
Despite my misgivings in the wording of the manifesto, I am not against Agile development methods in general. But it is vitally important to be aware that such methods are only ever going suit a subset of projects. Agile methods may work well with small co-located teams (<10) of high-skilled senior members, but the more the structure varies from this, the less chance an Agile method is going to have of achieving greater agility, with a lower-case 'a'. In addition, I would argue that Agile methods are most suited to the development of products for a mass market rather than for projects with a small number of defined stakeholders.
As with all disciplines which offer extreme views, the right answer for any given scenario is almost always somewhere in the middle. With this is mind I intend to propose what I have named the Balanced Methodology, and I shall detail this over coming posts.
The problem with trying to minimise change by massive investment in upfront design ignores the potential for implementation issues to derail the costly and rigid design. It implies that potential change can be anticipated, and factored into the planning and design phases.
ReplyDeleteAs an example, the architects may make assumptions about the performance of subsystems and design a solution dependant upon those assumptions. If those subsystems do not perform (either individually or combined), this results not in a user driven change (which your post implies is the main outcome of employing an Agile development methodology), but an engineering driven change to create a more performant system.
ReplyDeleteIt's a good point to distinguish between user-driven and architecture-driven change. However, I feel that a Balanced approach can help to mitigate both. Firstly, it would encourage that time is taken to state and qualify assumptions and risks upfront, and to implement a process (heaven forbid) to manage them. It would also recommend an agile prototyping phase of top-to-bottom slices of possible approaches to inform the solution.
ReplyDeleteMoreover though, I would argue that an agile approach does not make architectural changes easier but harder. Well designed and documented software (with suitably abstract, layered, modular architecture and well-defined capability encapsulation and interfaces, yada, yada) is far easier to modify architecturally than rapidly developed software, which runs the risk of growing increasingly fragile over time.
In fact, with model-driven development, it is possible (should you consider it necessary) to produce an entirely Platform Independent Model (a PIM), from which you could even change your language half-way through at the touch of a button.
Agile evangelists would counter that argument by saying that you could potentially be investing a lot of resources into an over-engineered solution, with levels of abstraction that may never by required or used. By going the Agile route and embracing change, I think you end up learning about and using re-factoring. Tools like Eclipse help with this.
ReplyDeleteIn my experience, many engineers are scared of re-factoring, when it is possibly one of software engineerings biggest assests over classic (hardware) engineering. Many engineers end up adopting the 'if it works, leave it alone' approach, whereas they should have the confidence to rip out or alter superceeded code. I suppose Test Driven Development can help install a degree of confidence in any re-factoring changes.
Regarding risks, I would say that generally, there is not enough effort put into identifying risks, and mitigating those ASAP.
I would also agree that an agile approach in itself does not make architectural changes easier. However, neither does it make it harder. It's the skill of the engineer, her confidence in her abilities, and her skill at re-factoring that ultimately determine the success of any modification. And I would argue that those abilities and skills are gained faster in an agile environment.
So, basically, to boil down your argument, you're saying the software industry needs to employ more women. Can't disagree with that :)
ReplyDeleteSeriously, though, good points about re-factoring, etc. Something the Defence sector is particularly bad at in my experience.
:-)
ReplyDeleteI had a very long comment, and then it got lost when I submitted :((( Can I summarise by saying "you're wrong on lots of (but not all) points"?
ReplyDeleteNo ;) I'd like to know where I'm wrong. Paraphrase?
ReplyDeleteWell, you've snared me again now :) Where to start? (Credentials: I manage an Agile software development team of 9 developers including me, the team have been following Agile and XP for 7 years so are pretty old hands at it, and have delivered major software projects to the likes of Verizon, Nokia and Sony Ericsson. We're also currently managing an Agile project involving 28 developers in 3 companies in 3 timezones. Prior to that, I spent 5 years as a developer at JPMorgan, which is a litle less agile :)
ReplyDeleteThe assumption here is that "change" is "I don't like it, I want something else" change, whereas the intention of Agile is to cater to the "I didn't know what I wanted when we started, but now I've seen some stuff, it's becoming clearer" change.
At the end of the day, customers want working software, and developers want customers to have working software so they can bunk off and play more WoW, so nobody is really just making up change for change's sake. I don't think Agile invites change, it just says "we understand that you can't think of everything up front, so let's start building and then hopefully you can figure it out from there".
"Glossing over the tragically ill-formed opening sentence" - I'll give you that, the authors of the Agile Manifesto are a little self-congratulatory
"Are you really not going to employ a change-management or code review process/tool just because you trust your guys?" - Nope, I don't employ change management because I trust *two* of my guys :) We do pair programming, being the most extreme form of code review (who needs tools and processes? JFDI!). That's far more valuable to me than some process that means I have to get signoff from some wonk in an office who's never heard of my product, let alone knows what the code does and how it's deployed. At JPM, we had a rigid change control process, 2 weeks lead time, everything signed off by every man and his dog, the works. We didn't have code reviews, tests, or automated deployments. Almost every deployment went wrong in some way and required hours in the office on a weekend to fix. Of course, every time something went majorly tits up, another week would be added to the lead time, because code just needs time to compose itself before it's deployed, right? At WDS, we have zero change control. I write my code, I check it in, I make sure the build works, and then I hit the button to deploy it (and we're trying to automate that!). I've never had to do a minute of overtime to fix a deployment. We deploy so often we don't even talk about deployment, it's just something you do as part of your day job.
No, you can't rely on people to always get things right, but you can make sure they work collaboratively, either with the rest of the team, or with customers, who'll tell them when they're wrong.
(Part II: comment was too long)
ReplyDelete"Ask someone who has been asked to upgrade a 15-year-old system consisting of one million lines of code"...with no tests. No-one says documentation isn't important, it's just that there are, as you recognise, vastly better ways of documenting systems than a Word doc. In my view, that's tests - unit tests (for code documentation), system tests (for architectural documentation), and acceptance tests (for user documentation)
"if your project is being funded by an external customer then you must have a contract specifying at least the key user requirements" - there's nothing in Agile that precludes this, and I certainly agree. However, Agile accepts that whatever is in this document is almost certainly going to be wrong or ill defined at some point down the line. That said, this sort of stuff can cause problems for Agile, in my experience, because it's difficult to tell a customer that "it'll be ready when you tell us it's ready".
"There is no world in which regular change will result in a more efficient outcome than following a plan" - yes there is. It's the world in which the plan was wrong in the first place, because the customer didn't really know what they wanted. Oh wait, that's *this* world!
"Well designed and documented software (with suitably abstract, layered, modular architecture and well-defined capability encapsulation and interfaces, yada, yada) is far easier to modify architecturally than rapidly developed software," - I want my software to be modular, well encapsulated, well defined yada yada. Nothing about Agile prevents that happening. However, what we do strive for is to avoid over-engineering until it's strictly necessary (YAGNI). It's amazing how simple (and hence easy to maintain, easy to debug, easy to understand) software can become when you realise that JMS queue really isn't required to do what you need to do.
Isn't the biggest barrier to Agile just architects who realise they're not really needed? ;)
Oh, nearly missed this
ReplyDelete"Yet, from upper-management, recruitment consultants and job specs alike, I'm hearing/seeing the word the 'Agile' a lot."
If I'd spotted that earlier, the rest of my comments would have been redundant.
If you're not hearing about Agile from *the developers*, don't touch it with a barge pole.
Firstly, let me clarify that by documentation I mean a decent UML model, not a Word document. Never ever a Word document!
ReplyDeleteI'd be interested to know how your contracts are written and signed off with the likes of Nokia, et al. Are they fixed price? And how is the output defined?
I'd also be keen to know how manage the deliveries of 28 developers across three time-zones without change-management/config-control strategy?
To respond to your points about the particular parts of the agile manifesto, I'll take each line as it comes (and I do agree, it's not the most fabulously written words in the world, but the intention is honourable ;))
ReplyDelete- Individuals and interactions over processes and tools
"Individuals and interactions" _are_ the agile processes and tools. If you do that right, there's no need to proscribe methodologies etc which may not suit. In my experience, people are more flexible than tools, and talking has a higher bitrate than a workflow. :)
- Working software over comprehensive documentation
Your comment that software can document itself is spot on. Do you even need a UML, when you can walk through the code, or even just read the component names and 'get' what's going on?
- Customer collaboration over contract negotiation
As you and Mark rightly point out, this can be tricky, but only if the two sides to the 'transaction' approach it with differing mindsets. An 'agile' customer wanting delivery from a 'waterfall' provider would be just as frustrated as if the positions were reversed. I think if the customer can understand and accept the inherent benefits in incremental, iterative delivery, the rest of the agile framework would be largely immaterial to them.
- Responding to change over following a plan.
Mark makes lots of good points about this, so I won't go over it much more, apart from to point out that to be truly agile/Agile, you do still plan, in fact you may plan more than in other development/process methodologies. You have lots of plans; virtually definite ones about what test you will right next, very well defined ones about what component to work on after this, a good idea about what you will work on tmrw, a pretty nailed down list of what needs doing in the near future, and vision on what the project encompasses and what will govern whether it meets it's objectives. A good agile manager/team member will also have plans for all of these timeframes in the event that things go better than expected or worse than expected, and on a scale between and beyond. These plans may not be written down or recorded in a traditional sense, but they will exist in one sense or another, even if that means that they can be produced or developed instantly when needed by using good agile tools and processes (ie, people and interactions ;)). This is where the response to change comes from. We know we are wrong. We move forward all the time using what we know, knowing that it is wrong and that it will change, but that in doing so, we are doing the best work we can at the time and doing damn fine work out of it.
To answer your question about delivery with multi-located teams, I always find that nothing beats a good CI, which while you could consider it a process/tool in the traditional sense, it is possibly the shining pinnacle of XP and agility... Thanks to a robust CI, I've put features live an hour and a half after they've been developed, including the annoying hour it took to redeploy the live servers, with total confidence I would not break any existing functionality.
Nice article btw, thought-provoking points :)
Thanks for all your contributions guys. It's good (and very educational) to hear from people actively employing Agile methods, and being successful at it. I have an associate who will probably be knocking on your edoor to ask you more questions ;)
ReplyDeleteI think the Defence industry is still not ready (or able) for Agile - especially wrt mission critical systems. If for no other reason than external auditors would not allow it. They want to see justifications for this, rationales for that, traceability between those and documentation for everything. It'll be interesting to see if adoption of Agile methods progresses in this sector ... and whether a new Agile framework is developed with this in mind.
For now though, one point that seems unanimous: testing, testing, testing is key.