Software development involves frequent design decisions. The designer has to decompose the system to into subsystems and modules. Furthermore suitable interaction mechanisms between the modules have to be defined, appropriate data structures have to be found and so on. Each of these tasks or “problems” comprises a decision on how to solve it. Normally there is more than one possible way to solve a given problem (several possible decompositions, interaction mechanisms, data structures, etc.), so a decision has to be made. The designer has to constantly assess possible solutions and to judge which one fits best to the given context.
There are several approaches that help the designer to fulfill this task. These can be grouped into two kinds: generative design methods and analytic decision techniques. First of all the designer has to generate a solution matching the problem to be solved. Given a certain problem description, generative design methods tell, how to construct a solution step by step. As there is no simple step-by-step method that automatically creates perfect results and there is not much hope that such an approach will show up suddenly, the designer now has to judge whether the generated solution is good enough or whether he or she needs to look for an alternative. Analytic techniques help judging this. Furthermore if eventually there are several possible solutions, they have to be compared so the solution that fits best can be chosen. This is a second application of analytic design techniques.
Principles and principle languages help for the analytic tasks. Nevertheless the wiki gives small generative hints. For each principle there is a “strategies” section which describes refactorings, patterns, and hints which might be applied in order to improve a design wrt. certain principles. This is not a replacement for a complete generative design approach but helps improving existing designs.