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.