Source: https://web.stevens.edu/academic_files/courses/syllabus/CS511syl.pdf