Jim has a problem.? He's been tasked to write this new feature which will require him to store a good amount of data on disk for later use.? Speed and scalability are not critical, as the client doesn't believe the storage requirements will grow beyond current estimates.? Suzie, of course, believes that Jim should store all the data in a database because it will make things better down the road if and when things change.? Bill is adamant that this all overkill and he sees no reason to store the data in anything other than a simple text file, thank you very much.? Why fix a problem that doesn't exist yet?? Karen doesn't really care what Jim does, she just wants Jim to hurry up and finish the interface so she can start working on the analyzer code she's been tasked with.
After several meetings attempting to hash out a workable compromise, everyone finally agrees on a resolution – ask the client what she wants.? Whatever the client picks, that is what Jim will implement.? The developers all believe they have reached a perfect solution – not only will they finally get an answer, but they are involving the client in important decisions.
Sometimes asking the client can be the right decision.? Anytime you are implementing a feature that behaves differently (no matter how slightly) from the expected behavior in the given domain, you should always present your reasoning to the client and work with them to either fix the underlying problem or bring the feature in line with the expectations of the users.
On the other hand, “implementation details” are rarely of interest to clients (there are some exceptions, but in my experience they are the proverbial proof to the rule).? I am well known in some circles for my habit of waving my hand and dismissing a discussion as “implementation details” whenever a member of the team would attempt to engage the client in a discussion of underlying technology.? If the client has the knowledge and ability to make the hard technical decisions that your team cannot, why would they want to hire your team in the first place?? Instead, they are trusting you to provide them with the appropriate technological foundation to solve their target problem.
The other reason I distrust developers who want to involve the client in a low-level technical discussion is that inevitably they seem to want to use the existing state of the system as proof that feature A can't be done and should be scrapped.
Ed: Well, Steve, you see, we can't really do an unlimited undo/redo because we are actually running in separate processes, and in order to do it properly we'd have to correctly synchronize all the inter-process data calls and make sure that the interfaces are all correctly locked and thread-safe.? Unfortunately that will pretty negatively impact your performance.? On the other hand, we could just implement a message-passing system that will handle all the synchronization for us, but then we'd need to guarantee that the messages are all processed in order, and we'd still need to address the issue of whether or not we could undo the messages and still maintain the correct internal state across both processes.? Of course, we could always just combine all our processes and do away with the whole synchronization issue, but then you wouldn't bee able to scale up if the computing needs outgrow the abilities of a single machine.? So what do you think Steve?? Should we implement a thread-safe API, a message passing system, or return to a single-process implementation?
Steve:? Ummm, well that sounds hard, so maybe we should leave everything as it is…
Ed:? Good choice Steve.? Good choice…
These types of discussions are just another way to confuse the client into doing what you want, as opposed to getting at what the client wants.? Inevitably the more the client is involved in these types of discussions, the less likely the end result will be what the client needs or wants.
Please notice that I am not advocating keeping the customer in the dark.? By all means, provide them with technical information about the way the system works.? But always phrase the discussion in terms of the abilities and benefits that the different technologies and approaches provide to the users.? The client probably doesn't care whether you implement a polling system to pull data from the server or a push system to send data to the clients, but they do care about the differences in user experiences that result from those differences.? Stick to those discussions and provide the underlying implementation details only as necessary to illustrate your points.? In the end, you will find that the client will be much happier with the outcome, regardless of the particular decisions that may get made under the hood.