Source: https://ocw.mit.edu/courses/16-355j-software-engineering-concepts-fall-2005/pages/lecture-notes/.pdf