Teaching these two introductory classes well is crucial for the growth of strong CS majors and minors. Students learn, not just the basics of programming and algorithmic design, but that Computer Science is much more than simply writing code. I expose the students to both the practical and abstract sides of CS, expressed through programming. They begin to understand the necessity of good program design to address complexity and the levels of abstraction that make it possible for human beings to communicate with digital machines. I consider the discoveries that students make in these classes to be among the most important in their time as undergraduates, as these revelations can strongly influence their career and life paths.