I wrote yesterday about an interesting discussion I had with about a development process that has no user involvement, and mused on how it would be possible to create a good system in a situation like this.
I had some interesting comments here, so I thought I might expand on some of my beliefs - it’s good to question your own rhetoric sometimes 
Although my post implied that I thought programmers should have some involvement with users, I’d like to clarify that. I think that it is very important that programmers gain an understanding of the user group and their needs. Even if they have a good set of specifications (yeah, right) or a prototype or good design to follow, that understanding will help with many of the small decisions.
However, I do not believe that programmers should be doing the requirements gathering process or the interface design.
Now it’s not that I think that programmers can’t talk to users. I believe that programmers think in a *very* different way to the users (unless they are writing a product for other programmers, and that isn’t terribly common). Programmers are fabulous at solving problems - the cognitive capabilities to create code are similar to those that we use to solve problems. They are so fabulous at problem solving that they see a problem and think of a solution, immediately. What they aren’t so great at is seeing lots of conflicting problems, determining the underlying cause, thinking about it some more, and then designing a solution. That’s an entirely different way of thinking. Every programmer I have ever personally known collapses at this point - conflicting priorities and individual differences frustrate them to no end.
So how do I think it should be done? Requirements gathering and design are one process, not two (which I probably should elaborate on further another day), so should be done by one person (or one team in a big project). The most difficult issues for this person is then communicating the important parts of the requirements or the design to the people who are going to implement it. There are lots of documented methods, many of which I have never managed to get to work. The things that do work for me are:
- involving programmers in some representative user contact
- doing lots of sketches for people who can understand my diagrams
- lots and lots of discussions (not arguments)
Actually, on thinking about it, the thing that works best for me is respect. I show respect for the abilities of people that I work with, and they usually show respect for me. This means that we discuss ideas, problems and solutions rather than arguing about *my* design. I don’t know how you build a methodology on that!
Notes:
- I stole today’s post title from Opposable Thumbs, because it was far better than my original title
- I’m not the first to say this - many people have put it more eloquently than I
- I know lots and lots of incredibly talented programmers, and recognise that they think very differently to the way I think, so this is not an anti-programmer post