The goal here is to do the minimum amount of design we can get away with while still making a quality product. Think of this as a tool to help define the problem, analyze solutions and share results. Feel free to skip sections that you don’t think are relevant (but say that you are doing so). Delete the bits in italics.
Contacts: The primary contacts for this spec.
Date: YYYY-MM-DD
Short description of feature. Consider clarifying by describing what it is not.
Why are we doing this now? What value does this give our users? Which users?
Must
What things will make the project a failure if not done?
Nice to have
What things will improve the project if done but which are not fatal if not done?
Must not
What things will make the project a failure if done?
Out of scope
What things may or may not be nice but which belong in a separate project?
It might be a good idea to stop at this point & get feedback, to make sure you’re solving the right problem.
What we’ve considered. What trade-offs are involved with each choice. Why we’ve chosen the one we did.
Focus on external and internal interfaces, how externally-triggered system events (e.g. sudden reboot; network congestion) will affect the system, scalability and performance.
If we get this wrong once, we lose forever.
Links to related things. Other designs, tickets, epics, mailing list threads, etc.