Source: https://www.cs.cmu.edu/~charlie/courses/15-214/2016-spring/slides/02a-design-for-change.pdf