In software design, understanding the problem to be solved should be the primary step. This is because there is no right, wrong or better way of solving a solution provided the solution solves the current problem effectively. Each problem is essentially unique and the designer should therefore understand it deeply before designing a solution strategy. However, before choosing a strategy, it is good to also understand the solution space besides understanding the problem. Understanding the problem means considering the possible technical constraints, functional requirements, quality traits and business limitations.
Before choosing the appropriate strategy, understanding these constraints is of critical importance as they will define some aspects of the solution space. Functional requirements basically refer to what is to be done by the system while quality attributes relate to the way the system will behave while performing these functions. Lastly, business constraints relate to what the customer requires in the solution for business purposes.
The solution space is multi-dimensional and full of unlimited possibilities. A programmer should figure out ways to navigate these possibilities in this space to decide on the best solution for the problem. The current understanding of the problem determines the solution scope and in most cases, the solution is only understood after referring to another possible solution. This means that the understanding of the problem determines the understanding of possible workable solutions. This principle also determines the appropriateness of the design strategy.
It is also important to examine the project risks in order to support the design strategy chosen for the problem domain and solution space. This will serve as a guide to the path along the knowledge curve. For instance, if the programmer feels that the chosen solution has more risks associated to it, it is prudent to explore different designs before settling for one. After deciding on the best design strategy, then one can go ahead and start developing the solution.