Designing a service can be intimidating. We sit down with only an incomplete list of requirements, our wits, and previous experience. How can we have confidence that our design covers the given requirements, is flexible in the face of inevitable changes, and doesn’t miss large areas of risk?
Start by asking good questions.
Whenever I design a service, I always start with the same set of questions. My goal is to ensure that the entire scope of the service is captured. The following should be true: “Everything necessary for this service is addressed by answering these questions.”
- Why is this service valuable to the business?
- Who will care if this service fails?
- What does it mean for this service to be “working”?
- How will we know this service is working?
- How can this service fail?
- How will we know when this service fails?
- How will we recover from failure?
Why these questions? Why not other questions?
- These questions capture all the important, system level decisions for a service.
- Providing answers to these questions makes the service approachable to new devs.
- Answers to these questions won’t change frequently, and the few changes will rarely be significant.
- It’s easy to get started and fill in detail over time. We won’t be able to answer these questions at the start, so being able to work incrementally is vital.
- Questions that are difficult to answer highlight questionable decisions, blockers, and/or misunderstanding.
Next time you design a service, think through these questions and see what insights they give you. You could also take a current service and use these questions to interrogate the design. At the minimum, they’ll give you great documentation for your service. They’re also likely to point out potential holes in your design.