In this paper we introduce the ambiguity criterion in software design. There is neither an objective criterion to measure the quality of a software design nor a general strategy to manage complexity and uncertainty. Ambiguity, as a specific kind of uncertainty, is a powerful tool to face uncertainties in the environment as well as a descriptive complexity reduction mechanism. Ambiguity is present at every level and stage of the software process, which has never been acknowledged by the software engineering community. We show that many of the sophistications in software design, from the use of variables in assembly language to the most recent patterns in object-oriented design, are in fact uses of ambiguous relationships among software elements. Ambiguity can help to establish the basis of a software design theory.