Source: https://ocw.mit.edu/courses/6-170-software-studio-spring-2013/pages/lecture-notes/.pdf