It's much harder to teach students who work 40 hours or more at menial, low-paying jobs in order to be able to afford to attend even a second or third-rate school full time. It's even more of a challenge to teach students who have been getting low grades for one reason or another up to and including behavioural problems and emotional issues that may or may not have been caused by their upbringing and/or current life situation. I have every respect for and frankly, I am slightly jealous of the brilliant professor at an elite university teaching a dozen or so of the best and brightest students in the nation, but one of the most rewarding parts of my job is helping a below-average student turn themselves around, graduate with good grades, and start a career at a major technology company such as Google, Microsoft, Apple, Intel, IBM, or NVidia.
I do this by teaching video game programming. Game programming is arguably one of the most difficult kinds of programming there is. It requires knowledge from almost every area of Computer Science, and at the same time it gives students incredible motivation to gain that knowledge. I've taught game programming at UNT since 1993. I teach as if the students in the class are intending to go into the game industry, although in fact only the very best of them do. The rest of them have to make do with Fortune 500 companies.
To me, the most important thing about an undergraduate Computer Science program is not just the outcomes (graduates highly educated in Computer Science), but the difference between the admission standards and the outcomes. Yes, you can increase the outcomes by increasing the admission standards, but that's loading the dice in your favor. Of course you're going to have better outcomes with better students. That's cheating! To me, the best Computer Science program is one that has low admission standards and high outcomes.