The ability of a designer to reason effectively is an important skill in software design. We postulate that there are three key skills that a designer must possess to make good design decisions. They are knowledge, reasoning and creativity. The knowledge that a student or a designer of software must possess can be trained. That knowledge comprises of knowing the characteristics of software systems and products, e.g. how does JavaScript work; and of knowing some design methodologies, e.g. object-oriented design and analysis. However, given a real-life design situation, a designer must possess the skill to recognise issues, and find ways to design a solution to solve the issues. Design reasoning techniques attempt to fill the gaps in this area, which is often not taught explicitly. Creativity is a mental process involving the creation of new concepts. It has been studied widely in the field of psychology but in the software industry, we know little about this to train a person to be creative. In this document, we do not discuss the software engineering techniques that are used in software design, nor do we discuss how to be creative in design. Instead, we discuss several reasoning techniques that can be used to help a designer reason with his/her design.