This post is dated, but it contains some classics - and not just in programming either!
Although I would've preferred Scheme. Not that language ultimately matters a great deal. It's about understanding the underlying concepts. In this respect, I'd say SICP aka the wizard book is the answer inasmuch as there is a single answer.
As a side note, I hope Berkeley hasn't done what MIT has done (which in many ways seems to mirror how many medical school curricula have moved from traditional to more integrated problem-based learning or PBL):
The discussion has been sharper recently because MIT underwent a major redesign of their lower division EECS curriculum. People outside MIT tend to summarize that redesign as "MIT decided to switch to Python," but that's not a perceptive description. What MIT decided was to move from a curriculum organized around topics (programming paradigms, then circuits, then signal processing, then architecture) to a curriculum organized around applications (let's build and program a robot; let's build and program a cell phone). Everything about their courses had to be reorganized; the choice of programming language was the least of those decisions. Their new approach is harder to teach; for one thing, each course requires a partnership of Electrical Engineering faculty and Computer Science faculty. Perhaps in time the applications-first approach will spark a revolution as profound as the one that followed SICP, but it hasn't happened yet.