Design
Software engineering is not just an objective science but also an art. While one can objectively determine the performance of various algorithms or discuss the tradeoffs of various different approaches, some parts of programming are subjective. For example, determining which set of tradeoffs is preferable or making an implementation of a particular data structure or algorithm elegant is a matter of personal opinion and taste. This is where design comes in.
Design is the process of applying past learning and experience (of both oneself and others), an examination of tradeoffs and choices as well as their consequences, and personal intuition and taste to produce code that not only works but also exemplifies other desireable (but qualitative) properties such as simplicity, understandability, consistency, testability, extensibility, maintainability, efficiency, and aesthetic appeal among other such properties.
- First Principles - considerations and principles for making a good design
- Design Patterns - well-known solutions to common programming problems and how to apply them