Techniques to solve specific problems in software development
Why are they useful?
They save you a lot of time
They help you to be sure of the validity of your code
They establish a common language, each time you implement one, everyone can understand it