This is what I remind myself to do on a daily basis. It forces me to be problem-focused, not technology focused. It also enforces the design principle of "deferred decision-making".
- Isolate design decisions (via proper allocation of responsibility) so that the final, final decision can be made as late in the development process as possible.
- Create an architecture that allows designers the freedom to tackle as many issues as possible as part of detailed design.
- Create a detailed design that makes as many questions as possible into simple programming choices.
- Make programming choices reconfigurable with minimal rework.
- Implement reconfiguration through run-time parameters: the final decisions are now the user's to make.