In this paper, we discuss lessons that we have learned from 20 years of running the successful Software Engineering undergraduate program at the University of Waterloo. Our focus reaches beyond the curriculum to include critical elements in program success, specifically including co-operative education, community-building, student support, and governance. We revisit our program design decisions and judge them with the benefit of our experience. We hope that this paper is useful to others contemplating new programs or seeking to improve existing programs.
[also accreditation]