My wife is a video producer. Her job is not very different from our jobs as software developers. Both jobs demand lots of creative problem-solving where we face different challenges every day, and both jobs often involve close collaboration with our customer or a subject matter expert. My wife, Staci, is great at creating videos that serve the needs of her clients. Here are seven strategies I learned from her for collaborating with customers.
1. Make the customer your partner
It is natural for us to get attached to our ideas. Staci is great at partnering with her clients and assimilating their feedback into their projects. Not only does this make her customers feel heard, it also makes it far easier for them to accept the work. After all, it was based on their ideas.
2. Teach them how to give feedback
Creative collaboration involves learnable skills. Color correction and audio sweetening is the last step on a film project but it is often the first thing clients notice and comment on when viewing a rough cut. We have to coach them on the level of feedback we need at each phase of a project. The same is true on software projects. If we ask our customers for the kind of feedback we are looking for at each stage of development then we are more likely to get the feedback we need. Customers don’t always know exactly how to articulate what they want but they can recognize what they want when they see it, so show them examples with the caveat that it is a work in progress and ask for the kind of feedback you are seeking.
3. Welcome changing requirements
The Agile Manifesto says, “We welcome changing requirements, even late in the development cycle.” It does not say, “We tolerate changing requirements…” In Agile we want the customer to change their minds because it means they have found a better way to do something. Rather than discouraging change, we follow engineering practices that make code easier to change so we can give our customers more of what they need.
4. Define acceptance criteria up front
For any feature or task, asking the question, “How will I know when I’m done?” is highly valuable. This keeps us from spinning our wheels and overbuilding features. Ideally, our acceptance criteria can take the form of automated acceptance tests using tools like SpecFlow, Cucumber, or FIT.
5. Focus customers on what and why, not how
I want my customers to tell me what they want accomplished and why it is valuable to them but it is not their job to tell me how to implement it. It is my job to figure out how to implement a feature. This is one advantage that stories have over use cases and specifications, which are far more narrative and often yields procedural code that doesn’t take full advantage of the object-oriented paradigm. If we know what and why the customer wants a feature, we can often figure out better ways to implement it than what they may never have thought of. After all, creating maintainable, extendable implementations is our job as developers.
6. Use the “feedback loop” in critical communications
Language is inherently ambiguous and miscommunication is at the core of many challenges in software development. When a customer tells us something important it is valuable to ask, “What I heard you say is…” and restate what they told us. This will help resolve ambiguities and deepen a common understanding.
7. Ask for help when you need it
Customers know what they need and they have a vested interest in getting it from us. If we are stuck or have questions that our customer can answer then ask them; it is in their best interest to help us.
Collaborating with customers is a valuable skill to have. This one skill can help distinguish a good developer or consultant from a great one. The better we become at working with our customers the more valuable we will become to them.