Goals and Principles for the Redesign of a Programming Course