Source: https://se.inf.ethz.ch/old/teaching/2010-S/0050/slides/17_softarch_key_concepts.pdf