Source: http://www.ccs.neu.edu/~vkp/Papers/Patterns-sigcse2000.pdf