I graduated in Cybernetics and Control Engineering in 1999, escaping from university with virtually no knowledge of computer technology.
Spent 3 years as the main developer on a CRM solution. Lots of MovingGoalPosts from the customer. Never enough time, and lots of contractors turned out to be CowboyCoders.
Moved to Oz, almost up to a year as Web Master (whatever that is) in a Queensland Government authority. Currently trying to get a CMS in place.
I can affirm that the customers need to feel that they participate too. I like the slant that XP takes on this, and especially the GoalDonor/GoldOwner duality.
CollectiveCodeOwnership is correct, but fails to emphasize that the project has members from the customer base - we didn't appreciate this fully, they got upset at the lack of communication and punished us by overly-criticizing small (usually GUI styling) problems with working code. The problem actually lay with the customer's management structure, but we paid the price for poor project-team planning and communication.
there are several functions that need to be built into an application with long sessions and/or deep functionality (eg CRM solution, as opposed to an email provider). These may seem obvious, but were not when we started, and were hard to put into a web app;
session-tracking - so you know who is using the application, and what they have done.
the CommandPattern - so you can undo/redo. It also offers a way to tell a user what they have just done, and the effects that the action has had (not all users understand what they are doing).
messaging - so you can reach a user who is in mid-session, eg to tell them that the server is coming down in 10 seconds,9,8,.....
caching - so that semi-static objects can be refreshed as needed. Two different uses:
Avoiding once-only loads. For example, once you have found that a user is doing something they shouldn't, you can restrict their security access and have it take effect immediately. Our app loaded a user's security access once, when they logged on, and we could not kick them off or restrict access mid-session.
Infrequently changing dynamic content. In a web app, many dynamic pages only change infrequently - lists of documents, and calendars are the obvious ones - and these should be generated when the underlying data changes, not on every request.
set operations - once the customers can perform an action on one thing (eg change one contact's product data), they will want to be able to do it to a whole set of them (eg a list of contacts who have cancelled their subscriptions). Although it is not XP to anticipate, I think that this is fundamental enough to be built into every system asap.
set selection - follows from set operations - to operate on a set, you need to be able to find it, and save it and/or the criteria that found it.
flexible data visualization - this follows from set operations - most apps show one thing at a time for CRUD, but sets need to be able to show all the bits that fit into the set, and the things that stick out (eg. yes, these 2 contacts have cancelled, but they also cancelled then re-joined last month, so maybe phone them to check). Also makes the users happy - not everyone can interpret a particular representation effectively.
I have contributed (not necessarily well - this list is for me to track my own meanderings) to: