Regard code as a means of expressing requirements. Any complexity that does not contribute to the requirements is a bug. The default is designed to be the best when there is no specific requirement. Follow these steps only as far as necessary:
- Look for existing similar solutions.
- Refine the requirements using existing norms. Do not proceed until the requirements are clear. Disregard hypothetical future requirements; they are best understood when they arise.
- Reuse existing solutions. If one leaves a requirement unmet, check whether it is common; if so, modify that solution. Existing solutions should cover implicit requirements such as validation and error handling.
- Implement a new solution or override configuration. If a similar solution exists, explain why its default is insufficient.