Tuesday, 7 June 2011

My Top Ten TDD Code Smells

I'm setting up an online training course for test driven development, and as part of the preparation I've been formalising my thinking around TDD. The easiest way to do this for me is to think about all the things I've seen, and done, in the past that have caused problems with the TDD process.

I know there are loads more, and I'd love to hear your top ten, but these are my major teeth grinders!

Not writing the tests first!
Sounds obvious right, test driven development means driving the code through tests, but it's surprising how often this goes out of the window even with experienced people. Honestly though it's entirely understandable. Almost every other item in this list (spoiler alert) is just a code design issue that can be applied to production code as well as test code. Writing the tests first is a real mental shift that can take years to engrain. This seems especially hard if you've been hacking away in semi-productive bliss with the adrenaline fuelled highs of squashing bugs late into the night to meet a release deadline for the past however many years.

The sobering fact is if you want to get the main benefits of TDD: clean design, simple code, safe refactoring, minimal code, you need to write the test first. By forcing yourself to write the tests first you are always thinking of your code from the client classes perspective, which leads to cleaner interfaces. You are also focusing on the concrete requirements of any calling code. Writing the test first helps you drive out a specification of exactly what you need to implement. This is a great antidote to developer gold plating.

Always thinking about your code from the perspective of a client class first will help when trying to write the tests first.

Only test the happy path
You can make a surprising amount of progress very quickly if you don't worry about edge cases! If you are paying for the support costs, then good luck to you. Out here in the real world, professional software developers know that we need to think about the exceptional cases where an API we call might return null, or what happens if a user enters a negative number, etc. With a test driven approach there is no excuse for not exercising these paths in your code. Automated unit tests make it hundreds of times faster to check these conditions than the old way of writing the code then running it to check the result manually. 

Use the power of test driven development to build confidence in the robustness of your code from the very start.

Meaningless test names
The tests we write are supposed to be a living form of documentation of the system. You should be able to understand the behaviours of any class by going directly to it's associated test class and viewing the method names found there. Therefore, tests that are named 'testTheMethodRunsOK' are less than desirable. 

Everyone has their own style of naming tests, that's fine, just make sure they are legible.

Testing test code
I've seen two flavours of this. One is a waste of time, the other is just plain ridiculous. The common scenario for the first occurs after a number of support classes have been built to make the tests easier to write. This is a good thing. However, what comes next is not so hot. The test support classes get so complicated that someone suggests writing tests for the test support classes. This is a big no no. If you have test support classes that are so hard to understand that you need to write tests for them, it's time to simplify.

The other scenario is utterly incredible and I have only seen it happen twice. Tests that test production logic that has been duplicated inline in the test. Let me try and explain. Imagine a method that takes two numbers, performs a calculation and then returns the result. Now imagine a test in the associated test class that defines the two inputs and has the calculation logic copied from the production code into the body of the test and then checks the result of the calculation is as expected. What happens when the calculation in the production code changes? Of course the tests still pass, because they are testing the duplicated version of the logic hard coded in the test! 

Make sure your tests are exercising production code, or don't bother writing them.

Mocking madness
Mocking is a great tool for isolating the code under test, giving you confidence that your test is only exercising the code that you really want to test and freeing you from side effects. A common use case is to create a mock instance of a collaborating class and inject it into your class under test allowing you to control the behaviour of the collaborator to create the correct conditions for your test. 

You know you are in the realms of mocking madness when test after test, the first few lines of your test is dedicated to setting up mock behaviours, just so you can get your test to run. With the explosion in popularity of dependancy injection frameworks like Spring it becomes more and more common for multiple dependencies to be injected into a class creating spider web like dependencies between collaborators. When this happens it's an obvious loose coupling violation. The good news is that TDD exposes this issue very early on as you get fed up of constantly tweaking dependant mock objects. Just make sure you address the underlying coupling issue before you either throw your computer out of the window, or worse still, throw your tests out of the window!

Refactor early to make your tests small and easy to write. Look for commonly paired collaborators and either combine or encapsulate them with composition.

Big fat mothers
This smell goes hand in hand with my deep mistrust of inheritance but for some reason it seems so much easier to go super class crazy in test code than it is in production code. Perhaps it's due to programmers putting less thought into the design of their test code (more on that later). 

The first whiff of this smell comes when you see all of the test classes extending a base class. Are all your tests really testing the same thing? Do they all need the same set of helper functions? This makes me nervous but I can live with it so long as the super class is kept to a minimum, but the problem with super classes is they are sneaky. They are very good at two things. They love to suck up more responsibility than is good for them and they are very good at spawning offspring. Before you know where you are you'll be struggling with a set of unwieldy base classes full of methods that look really useful, but never seem to pay their way when the next test class comes along. Somewhere in this tragic story, a bright spark will suggest putting setUp and tearDown methods in the base classes and now you are really in for a world of hurt trying to figure out what exactly the state of your test is before it starts.

Keep an eye out for complex class hierarchy structures in your tests. Start building test helper utilities through composition and only create simple super classes to encapsulate common use cases when they become painfully obvious.

The Über test
A test method is supposed to test one thing and one thing only. The über test laughs at such restrictive pedagogy. Why test one thing when you can test ten! 

I'll admit it is tempting, in the name of getting things done, to roll a number of related tests up into one so you don't have to duplicate the setup code. Unfortunately, as with many shortcuts, the problems start coming later. As you refactor you'll find that it takes longer and longer to maintain these tests if the underlying code changes. What tends to happen is that the first assertion fails, and so the test fails. You fix the first problem, and then the next assertion fails, and so on and so on. These tests also end up being horribly complex and hard to follow as you cram more and more into them. Not only are there many assertions to fail, but the purpose of the test becomes unclear and you are unsure which parts are still relevant and which parts can be removed. Once these sorts of questions start bubbling up, you can bet it's only a short while before you either spend a chunk of time rewriting the tests so you can understand them, or even worse, binning them.  

If you can keep tests small and focused on expressing one intention they will be far easier to maintain and will be much more useful as a form of living documentation in the future.

Cling film tests
When was the last time you used cling film in the kitchen? You pull it out from the roll, rip it off to put over a bowl and you end up with it tangled all round your hand and up your arm. Five minutes later you are still trying to unravel it. There are tests like this. There are a lot of tests like this. You'll notice them when you try and change a commonly used interface in your production code and you spend a disproportionate amount of time wading through your tests making them compile because of the interface change. Test driven development is supposed to make it easy to refactor, but when you don't isolate the touch points between your code and tests you are going to start having problems. 

If you have ever experienced this, and I find it hard to believe that you haven't, the next time you are in your IDE do a search to find usages of the public interface of a core class in your system. You will probably find ten or more times as many uses of the interface in your test code than in your production code. If not you should either be ashamed (you don't have enough coverage) or be feeling very smug (your test code is isolated from your production code and refactoring will be easy).

Try to make sure you encapsulate calls from test code to production code to make refactoring easier as the design of your system evolves. 

Spaghetti test data
It's common for test data, i.e. strings, numbers etc. to be hard coded in tests as input and then compared as output. Fine, no problem. It's good to have the context that data provides close to the test for clarity. What you need to avoid though is duplicating this information within tests, and even worse, duplicating the data between test data files and your test code. The number of times I have seen tests that define an input string when creating an object to pass into a test, and then the same string hardcoded in the expectation of the test is mind boggling. If either of these string definitions changes independently of the other then the test will fail, for no good reason! We don't put up with magic numbers and static strings in our production code, it should not be tolerated in our test code. 

Use constants, or at least variables to reference test data that you will use more than once in a test.

Not refactoring
Red, green, refactor is a common mantra in TDD. Red: write the test first and see it fail. Green: make the test pass. Refactor: given what you have learned, do you need to refactor the code. We often get so caught up in the rhythm of writing the tests and seeing the green bar when they pass that we forget about the refactoring step. Take the time to refactor as you go. It will improve the design of your code and make your tests easier to change. 

If you are finding tests hard to manage while refactoring, they will be much easier to improve while the context of the task is fresh in your head. 

Treating test code as a second class citizen
If you're keeping count you'll notice this is number 11. It's a freebie, a bonus. It is also quite possibly the most important item in this list. There is a common attitude among developers that test code is somehow less important than production code. I am always hearing statements like "I'ts only test code". This attitude is used to excuse poor design, hacks and generally illiterate code in tests. What's more important, the code that proves that your system works or the code that makes your system work? How many lines of production code is in your project? How many lines of test code? If you're practicing TDD I'd guess the amount of test code far outweighs the production code. We've already seen that each public interface is exercised many times more by test code than production code. 

Almost all of the smells I've listed are really just code design issues. Each one of them will reduce your teams productivity and slow development progress down to a crawl. As your tests grow out of control they will smother your production code and start sapping value from the project, rather than providing the benefits of security and freedom to refactor. If you want to keep your project moving at steady pace over time you are going to have to take the design of your test code seriously and start treating it like a first class citizen. 

Apply all the coding and design techniques that you reserve for your production code to your test code to make your tests easier to maintain.

What's next?
I've identified these smells from my own experience and am guilty of falling into many of the traps myself, but we learn by doing. Hopefully this list will provide some context for your design decisions in the future when writing test code. I'd love to hear any TDD code smells you have come across. I'm always looking for more early warning signals. 

Join my online training course to find out how to address some of these issues. 

Monday, 6 September 2010

For B2C Apps - iPhone is not the only game in town

iPhone is a popular phone, there is no doubt about it. Let's start with some numbers: with 8.4 million phones sold in Q3 of 2010, and similar numbers for the prior two quarters, there are a lot of iPhones out there.

Now for some more numbers. According to a story on TechCrunch, there are currently 200,000 Android phones being activated per day. Using some very basic maths, which is admittedly going to lead to some inaccurate results, that equates to roughly (((52 / 4) * 5) * 200,000) 13 million units a quarter. 

13 million Android activations at Google versus 8.4 million phones sold by Apple. With that number of units being activated per quarter, Google's Android platform is not to be ignored.

Now lets take a look at growth. Over the last year, iPhone sales have gone up 131%. Over the last three months Android sales have gone up from 100,000 units a day in May 2010 to 160,000 units a day in June 2010 and are now at 200,000 units a day. That's a growth of 200% in three months. Whether this a significant impact on the earnings of Google is a matter for debate. Search is their business and more iPhone sales means more search, as does more Android sales.

If you are a B2C company looking to provide services to your customers while they are on the move, the iPhone is not the only option available to you. With sales of Android phones experiencing such a phenomenal growth rate, when you are building apps for your customers, they are as likely to be carrying an Android phone as an iPhone.

The smartest companies have already figured this out of course. Facebook recently updated their Android app.

While some forward thinking companies like Starbucks are pushing their brand out into the mobile space to communicate and interact with customers, it is common for these companies to limit themselves to the iPhone platform. With the growing popularity of Android phones these companies are missing out, and even putting off a large part of their customer base by ignoring the Android platform. There is an anecdotal demonstration of this on the Starbucks blog with frequent calls for an Android version of the Starbucks apps in the comments.

So for the moment, our brand perception instinctively makes us think of iPhone as the obvious priority when app development is mentioned. But the numbers are starting to show that you should be prompt about following the release of your iPhone app with an Android version.

Thursday, 10 December 2009

Dream Week - a tool for agile innovation

A team that I have been working with for a while now recently came up with, and executed, a great idea for inspiring innovation and improving collaboration in an agile environment.


It is worth noting that this has only been performed by the team once, so I am making some assumptions about how it may be executed in the future. The goal of this post is not only to document what happened but also provide a framework for moving the technique forward in the future.


What is the context of the product team?

Everyone works in different ways, agile or not, so here is a bit of context about this team that you can bear in mind if you want to apply the idea to your organisation.


The product team consists of two delivery / feature oriented sub-teams. Each of these teams contains programmers, a UX professional and a business analyst. There is also a product owner (from the UX discipline), a chief architect and another UX professional 'floating' across the two delivery teams. The entire product team works on two week sprint cycles, performing a demo and retrospective at the end of each sprint. A product release is performed every few sprints.


What is Dream Week?

At the beginning of a new release one week is set aside as Dream Week. Each member of the team comes up with ideas for work to be performed within the week. The only limitations for the ideas are that they must benefit the product and must be deliverable within the week. The ideas are then pitched to the product owner at the beginning of the sprint. The whole team helps to work out a common understanding of the idea, during which time the idea may change and go through a number of quick iterations. Once all the ideas have been pitched the product owner prioritises the ideas and then the team cracks on with delivering them in priority order.


The ideas that are pulled into the sprint are built to production quality and go into the product. Ideas do not have to be product features, they could be paying back technical debt or investigation into future technologies. However, the ideas are prioritised by the product owner, so just like every day stories, the payback of technical debt must be justified against improved product capability.


By running Dream Week at the beginning of a release it gives the team and the product owner the most freedom to follow potentially controversial ideas as any mistakes made can be corrected throughout the release. It is the least risky time to innovate.


Why only a week?

"Constraints breed creativity"

http://37signals.com/svn/archives2/constraints_breed_breakthrough_creativity.php


For many people given a free reign to come up with new product features, wild and fanciful ideas start to bubble up to the surface. This is a good thing. But that creativity needs to be harnessed. By requiring the idea to be implemented within a week, the would be innovator needs to pare down the idea and get very creative about the potential solution to allow the goal to be achieved within one week.


"A change is as good as a rest"


By using a shorter time period than the team is used to there is a buzz of excitement about the weeks work. The regular heartbeats of agile iterations are useful for creating a rhythm that the team can get into and create useful touch-points for the rest of the organisation. However, the change of pace and focus for a short period is good for getting the collective heart pumping.


How does it improve collaboration?

Anyone can suggest an idea, programmers, UX practitioners, business analysts, but everyone needs to be involved to deliver. The ideas are fresh so anyone has a chance to get involved to shape the solution. The time scale is short so everyone has to pull together to meet the deadline. Because the idea has originated from within the team there is an increased sense of ownership.


Dream Week creates a vacuum of time that must be filled by work generated within the team. It's more than likely there will be too much work to fit within the time. Sound familiar? In this environment your idea is competing for space with all the other ideas being presented, so you better sell it well. Figuring out the needs of the person you are selling to, and pitching the idea, is a great way to improve communication skills.


Did it work?

The team certainly seems to think so. We fixed a number of usability issues that had been hanging over the product for a while and introduced a new pattern to achieve a user goal in a much more effective manner. The teams enjoyed the process, the product owner is happy with the delivery and the next Dream Week is scheduled for the first week after the next release.


The team have actually decided to call it Innovation Week as this makes it an easier sell to business sponsors, but I'm personally a fan of Dream Week as innovation has become almost as overused as Agile.


Wednesday, 9 December 2009

XPDay 2009 - Fostering collaboration between developers and UX

I convened an Open Space session at XPDay 2009 on the subject of fostering collaboration between developers and UX in an agile environment. Participants in the session were invited to tell a story about their experiences of working in an environment where software developers and UX professionals worked together to deliver a product. The stories could describe a positive or negative experience, and anything in between. We then pulled out and recorded positive and negative properties from these stories. These properties are recorded here.


None of these stories were thorough experience reports, but they were, to the best of my knowledge truthful and an accurate representation from the perspective of at least one person.


Negatives


Solutioning stories too early

An emerging pattern when integrating UX and Agile development is to have the designers work as part of the customer team to help drive the prioritisation of what gets built. This was a common theme for most of the stories, and seems to work well. However one story highlighted the need to be wary of performing too much design work before passing the user story to developers to implement. The developers in this story started to feel disenfranchised with the solution and unable to make suggestions for changes to the design.


UX is a more volatile resource

Another story told of having UX practitioners working in sprint with developers, only for the UX resource to be frequently pulled out of the sprint to work on other tasks with the customer. This had the effect of obstructing the flow of work as the developers were unable to complete the story without help from the UX practitioner.


BDUF was a source of conflict

This is a more extreme example of a UX team solutioning stories too early. In this case the UX team would produce large amounts of design documentation for each feature to be implemented, and then hand this documentation over to the developers to build. This ended up being a source of conflict between the developers and the UX team as the developers did not want to read through lots of documentation to build the feature. To get round the problem business analysts would 'paraphrase' the documentation to let the developers get on with building the features, which understandably, caused a lot of friction between the various groups involved.


Positives


UX contribute to definition of 'done done'

UX practitioners on the team contributed to the definition of the 'done done' criteria for a story. This means the values and the overall integrity of the experience of the product can be controlled by UX practitioners on the team. In addition, every single person involved in delivering the product is acutely aware of the standards that each and every feature needs to be delivered too.


UX sitting with devs and working in sprint creates a good flow of work

More than one story told of successful working environments when developers and UX practitioners sat together. One story in particular told of a transition from the UX members of the team moving from sitting with the rest of UX people in the company to sitting in the same space as the developers. While this transition was difficult in the short term the team experienced a much improved flow of work as it was easier to coordinate the different tasks that needed to be performed by developers and UX for the completion of a story.


UX working in sprint improves understanding and empathy

Having UX and developers working together throughout a sprint to achieve a common goal gives a real opportunity to gain a deeper understanding, even a level empathy, into the effort that is required to deliver a story from both the perspective of developers and UX practitioners. The specific example given in one story was that, by being involved in the estimation process, UX understood better the amount of developer work required for certain solutions.


Allow developers to collaborate on design without forcing it

We were fortunate enough to have Jeff Patton with us in the session. He relayed the story of an experience report at Agile 2009 Feature Teams - Collaboratively Building Products from READY to DONE. This company moved from a process of designing and planning work separately from the development team to what sounds like a 'by the book' scrum process of performing all activities necessary to define the work, design and deliver the required features within a single sprint. This allowed the developers to be involved in user interaction design as it became just another activity to be worked through on the road to delivering a feature within the sprint. The interesting point for me in this approach is that not everyone had to be involved in the UX work. For example, developers that were happy not to get involved in the solutioning of stories were free to work on repaying technical debt while the solutions for the stories were being worked out. Thus giving the opportunity for design collaboration if the developers wanted to provide input, but without forcing the issue.


Innovation Sprint \ Dream Week \ FedEx Day

Three ideas around the same theme, giving a delivery team more ownership of a solution and improving collaboration and innovation all tumbled out at the end in quick succession. The innovation sprint is something that people at Yahoo were toying with, please correct me if I'm wrong here. Every fifth sprint is an innovation sprint where the team get to decide what to work on. The idea being to try and introduce innovative, potentially risky ideas, that would not normally be prioritised by the product owner. I'm not sure if the result of this work is committed and deployed or if the work is all prototypal in nature to feed future stories? Interestingly the amount of time this takes away from delivering customer features, is 20%, the same amount of time as the Google Innovation Time Off.


Dream week is something that the team I am currently working with has come up with. The idea being that, at the beginning of the week anyone in the team can suggest an idea for something to work on that will add to the value of the product. These ideas are pitched to the product owner who prioritises them to be worked on and delivered within the week. Keeping the time available down to a week increases the focus of the solutions and reduces the risk.


Taking the focus on innovation company wide, another company would hold FedEx days. The idea being that you had to deliver something at the end of the day. The entire company would be arbitrarily grouped into pairs for the day. Each pair had to deliver something of benefit by the end of the day, The pairs can choose their own thing to work on, or can pick ideas out of a hat. The pairings are arbitrary so you can end up with anything from product owners and developers pairing to sales people and UX practitioners pairing. Of course something of benefit may not be software.

Explore many ideas up front

Another suggestion for improving the collaboration between developers and UX practitioners was to follow an approach of exploring more options up front, together as a team, and then focusing in on one option for delivering the solution. I believe this was given as an alternative to gradually iterating towards the solution through frequent delivery.


I would like to express my thanks to everyone who participated in this session. I thoroughly enjoyed hearing all of the stories and your experiences. I was glad to hear of so many positive experiences working on products with heavy UX and development involvement.


A number of the stories come back to what I have been learning over the past couple of years, which is, there seems very little cause for irresolvable conflict between agile developers and UX practitioners and in fact, the solution to many of the problems can be found by taking a step back and reviewing the principles of the agile manifesto and tailoring the implementation of these principles to your own environment and context.


Here are a few of those principles that I see as being particularly relevant to the positive experiences that were reported during the session:

* Business people and developers must work together daily throughout the project.

* Build projects around motivated individuals. Give them the environment and support they need and trust them to get the job done.

* The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.


Take a moment and have a look at the rest of them.


Wednesday, 25 November 2009

Accolade Passes Accredit UK Standard

Back in the summer, Accolade Consulting signed up to the Accredit UK standard in the specialism of Software Product Design and Development. Since then we have been beavering away, tweaking our processes and getting the evidence together for the site inspection.

I am delighted to announce that Accolade has passed the certification process and is now fully accredited. The accreditation is recognition of the technical excellence we bring to bespoke software development projects and the sound business practices that we have put in place.

The goal of the Accredit UK standard is to give customers confidence that they are dealing with credible companies supplying ICT solutions. While this is useful for ICT in general, I believe it is invaluable for customers looking for bespoke software suppliers. Building bespoke software can be an expensive investment and customers need to be able to trust the supplier they are dealing with.

Find out more about Accredit UK at http://www.accredituk.com.

Friday, 3 July 2009

Book Review: Debug It!

The Pragmatic Bookshelf has released a new book into beta called Debug It!: Find, Repair and Prevent Bugs in Your Code, by Paul Butcher. Paul is a friend of a friend, I don't know him personally.

I like the premise behind this book. When I showed it to a friend on the train yesterday while reviewing it, he joked that we should just code it right in the first place! We all know that even on the best teams, the reality is that bugs happen. But, as Paul points out in his introduction, there aren't many books that cover debugging. Given that debugging can be a frustrating exercise, having a resource like this is a huge benefit to the professional software developer.

Paul asserts that debugging is an 'intellectual process', it's more about the approaches you take to identify and then resolve issues than the tools that you use. Despite covering a number of popular tools and techniques that make finding and dealing with bugs easier, the message is that you have to get the mindset right. He defines the core debugging process as:
  • Reproduce
  • Diagnose
  • Fix
  • Reflect

From these basics, Paul covers a set of approaches to help with each of these steps in the process. A lot of the approaches will be second nature to experienced developers, although it's good to be reminded now and again of some techniques that you can fall back on if a bug is proving to be particularly tricky to root out. The book is split into three sections:
  • The Heart Of The Problem - all about the basics of debugging and the mental approaches required
  • The Bigger Picture - tracking and managing bugs
  • Debug Fu - some of the more interesting and advanced issues you have to be aware of when debugging and resolving bugs

One of the best features about this book is the number of real world debugging anecdotes that are told throughout the book. Apart from being amusing stories, the bizarre nature of some of these bugs should make anyone think twice before selecting the 'could not reproduce' option on their bug tracker.

In the Pragmatic Zero-Tolerance section Paul presents a great diagram that illustrates the effect of leaving bug fixing to the end of a project. He then provides some good rational for fixing bugs early. There are a number of team approaches described for 'Digging Yourself out of a Quality Hole', but no suggestions on how to manage early fixing of defects before you get into the hole. For the record, two approaches I have worked with are:
  • In an XP environment, have a bug pair, that clears all the outstanding bugs in the iteration before starting on any user stories. Rotate the bug pair every iteration.
  • In a Scrum environment, whenever a story is finished, the pair pick up a must fix defect before moving on to their next story.

There is a nice discussion of concurrency bugs and some techniques for identifying and fixing them. He agrees with other writers on the subject that simplicity is generally your best bet. Reduce the parts that are concurrent as far as you can.

A personal favourite of mine, and I was starting to worry that it wasn't going to come up, is the section entitled, Don't Be Too Quick To Point The Finger. This is aimed at developers that assume they couldn't possibly have made a mistake, it must be that 3rd party library that is broken, not their perfect code! I couldn't agree more with his sentiment that you should trust 3rd party libraries until you have proved, beyond a shadow of a doubt that it is not your code that is buggy. The library has probably been tested a lot more thoroughly than yours.

There is a real gem of a chapter in this book, which is all about assertions. When to use them, what to use them for, how not to use them. If you're after a short guide to the why and how of assertions, this is the chapter for you. Now here's the really good news -- this is available as a free extract.

There are some interesting organisational anti-patterns given in the last chapter, of which I have certainly seen a few so it is nice to see them documented from a debugging perspective. There was no specific mention of code anti-patterns, there's a section called Assertion Abuse, which strike me as anti-patterns for assertions. But a discreet set of code anti-patterns that are likely to lead to bugs would be useful. Some mention of code complexity on the effect of defects would have provided an interesting chapter.

Overall, I think this is a really useful book. It does a great job of setting the scene for debugging and getting you into the right mind set, while also talking about the complications that can arise once the bug is found and squashed. It's almost worth looking at for the anecdotes alone, to understand the lengths that you sometimes have to go to when trying to understand some truly bizarre defects.

Thursday, 18 June 2009

Agile and UCD article

My latest article on integrating Agile and UCD (Agile and UCD: Building the Right Thing the Right Way) has been published on DevX. In the article Darius Kumana, my co-conspirator, and I talk about the benefits of combining the two approaches, such as: using the frequent delivery of agile projects to help gather user feedback, and improved collaboration through collective responsibility.

We also sound a warning about two key issues inherent when integrating agile and UCD: loss of context and planning to iterate so teams can react to new findings from user testing.

Have a read and let me know what you think.

Look out for our next article on DevX where we illustrate the importance of retaining the context of use on an agile project and discuss techniques from UCD to help communicate the users to the whole team.