At a place like Stanford, a majority of undergraduates will have taken an introductory computer science course by the time they graduate, but it's obviously not true that a majority will be computer science majors. And while I appreciate SICP and Scheme and functional programming, and completely understand why that kind of thinking should be valued, it may not be the best way to present a breadth of introductory programming knowledge that will motivate, interest, and offer practical examples. Sure, lambdas are awesome, but when you are just starting out in your first programming course, the deep theory behind why lambdas are so interesting will almost certainly be lost on the students. It's like building up a field of math from, say axiomatic set theory or algebra. By the time you get to multiplication and fields (perhaps akin to variables or for loops in programming), you gain a very deep understanding and appreciation for the topic that can only be gained by this bottom-up problem based approach, but then again, a non-mathematician (or non-computer scientist) could have probably just assume the existence of multiplication or loops for the sake of solving higher-level problems.