Source: https://ocw.mit.edu/courses/16-355j-software-engineering-concepts-fall-2005/resources/cnotes1/.pdf