Agile QA is part of development
I was disturbed recently to hear that a major internet company is planning to move their entire QA operation to India. I’m not against offshore development done right (I have seen in done well, badly and terribly in my time), but this is not about offshore development: the development team remain firmly in London. This is a change to QA from being on the other side of the building from development (bad enough) to a continent and several time zones away. This is craziness, especially for a company trying to embrace agile software development.
At the core of agile development is the delivery of small increments of production ready code that have meaning to the customer. Each of these user stories is not considered done until it has been coded, tested, any necessary documentation written, refactoring done, and the customer has approved it. It is in fact this incremental approach that makes agile development agile. When you are 6 weeks in to a 3 month waterfall project, you have a fully written spec and some half written code, none of which is tested. That doesn’t give you much scope to change your mind on anything: changing the scope is hard work because the final requirements document is the one thing that you *have* delivered. And if you cut the project short after 6 weeks you have delivered precisely nothing of any use. With agile, 6 weeks in to the project you will have produced the highest priority 50% of your original requirements to production quality, and could stop the project there if you wanted to (subject to the overhead of a release of course). Or the requirements for the second half of the stories can be updated to reflect real user feedback from the stories delivered so far. For me this is the essence of agile, and why organisations that continue to do waterfall, but chop up the development phase in to two week iterations and think they are “doing agile” are completely missing the point. As are organisations that think testing is something that starts once development is finished.
In my experience, here is what happens when QA testing is a phase that starts when development have finished, and is executed by a team that don’t sit alongside the development team (on a different floor or across the world). The development team write code for a month or so. They don’t really care about whether it works or not because that’s QA’s job, and anyway, they are under pressure to hit “code complete” on time not to produce production quality code. The release then gets thrown over the wall to QA, who run it, say it’s junk and then throw it back again. After this has happened for a couple of days, there is a kind of workable version of the application to test, and QA test and raise loads of bugs. Developers then reject them all. And QA reopen them. And developers say it must be an environmental issue as “it works on my machine”. This conversations is of course happening via comments on the bug tracking system with each side fuming at their keyboard at the incompetence of the other. They are on different sides after all, and never actually speak to each other. In the end it turns out that QA had written a bunch of test cases in isolation from the developers writing the code, and both had a slightly different interpretation of the requirements specification, and both think that they are right. An exaggeration? Well, maybe, but I am sure you recognise bits of this.
Agile testing is an integral part of development, and QA work alongside developers to produce quality code. They are on the same side and are jointly responsible a quality and timely delivery. Misunderstandings of the requirements are resolved by an actual face to face conversation (including the on-site customer as necessary), and this conversation happens well before the code is finished - preferably before it is even started. Of course, developers and QA analysts are coming at it from slightly different angles (which is why both are necessary in the team). Developers like creating things of beauty, and once created don’t like poking them too hard in case they fall over. They like thinking of exciting ways what they have written could be used or reused, not of ways that someone may break it by doing something they didn’t expect. QA analysts on the other hand are good at exactly that: analysing all possible paths through the functionality, not just the “happy path”, and defining test cases that will ensure a quality product hits production.
Integrated testing is a fundamental part of agile, and QA belongs in the development team, and in the iteration. Moving QA to a different time zone to the developers is simply not compatible with this.
March 7th, 2009 at 8:01 pm
I wonder what company you are talking about….! But if one doesn’t have the luxury of having QA in the same building/time zone/continent what steps can you take to work in as agile way as possible and overcome the restrictions? Any thoughts?
March 8th, 2009 at 12:39 pm
Yes, no prizes for guessing who this is, but didn’t want to name names as I wasn’t sure how public this info was at the moment.
To your questions…. tricky. I can think of two basic approaches to try and make it work:
1) Treat off-shore QA as purely regression test / pre-release validation, and focus the development teams on producing quality code, including proper testing of new functionality. Get them to write test plans for user stories before they start coding, and get a developer who did not work on the story to execute the test plan within the iteration. If you have the luxury of a Business Analyst in your team, they could be responsible for the test plan. You could also start measuring valid bugs raised by QA during regression testing and consider that number as key measure of the performance of the development team as a whole (lower is better obviously!), and give awards (teams lunches or whatever works) for teams with a high quality of output. This is probably the best approach if the offshore QA team is relatively small compared to the size of the development team. It’s just about making it clear to everyone that quality matters and is non-negotiable, that the development team are responsible for it, and that nothing is “done” until it is fully tested and production ready. Each story should be tested and signed off before the next one is started.
2) If the offshore team is bigger, and it would be wasteful to use them purely for release-level regression testing (i.e. this would not keep them all busy), then you can try and make them feel integrated in to the development team. This is always really hard, if not impossible: making one or two remote people feel integrated in to an an otherwise co-located team. But you can try. I think it would involve assigning individual QA people to work with specific development teams, and get them to work onshore alongside the development teams for a few months to build relationships. Once they are offshore again, make sure you have daily conf-call standups to keep the remote QA person in the loop on what needs a test plan written, what is ready for testing, and any questions about requirement or scope. Make sure that whatever you are using for tracking progress (XPlanner, Mingle, VersionOne, a whiteboard with a webcam on it etc) is always kept up to date so remote team members know the latest status. A chat room (IRC, Jabber) for the team also helps. This is the hard work option though, and should really be avoided if at all possible. Distributed agile is possible (maybe more on this another time), but a single team split across sites isn’t really.
Hope that helps!
March 15th, 2009 at 6:25 pm
Thanks for the response. I agree that option #1 is the better (or easier) option. I like the onus being put back onto the developers to write the test cases and to execute them. Whilst some developers may not see this as their role, it is important to restate the emphasis on quality and that it is the responsiblity of everyone.
If I get the chance to try this out, I will let you know how it works out for us!
Would be very interested in seeing a topic on distributed agile in the future.
Thanks
Alex