HN readers: universities that teach a so-called "How to Design Programs" curriculum [1] have discovered a partial solution to this problem. Emphasizing a design process in a functional language removes the advantage that students with experience but not a deep understanding gain from knowing how to cobble things together the way they learned in high school AP CS A.
I'm not saying it's the only route, but it works well and develops important skills that are (ime) not learned by tinkering.
[1]: https://htdp.org [2]: https://course.ccs.neu.edu/cs2500/labs.html
We even hand-mark their design recipes in the course! The students just do them after the fact.
They also don’t want to allow the advanced students to “test out” of the intro course, as some schools do, because the advanced students may be highly skilled at programming but totally lacking in introductory CS knowledge.
Source: Am a high school programmer
Firstly, a big part of the allure of CS50 is the fact that it's one big ol' nerdy computer party and you're invited!
Secondly, and I'm not trying to sell the Harvard mystique, but considering that Harvard's acceptance rate is 4%, the students handle brick-wall challenges gracefully.
Additionally, they don't necessarily want students that are going to do poorly in CS50 to pursue computer science at Harvard, so I'm sure it also serves as an effective bouncer for all of the students who haven't decided on their concentration deciding that they'll do CS because tech is sexy right now. The lectures look pretty straightforward, but we had to write code involving basic data structures and memory management in C on our paper midterm exams, with no reference, administered in a lecture hall. It's probably tough for kids that are used to acing everything, but it's a lot easier to find out you don't like CS in CS50 than it is to find out after choking on discrete math or a compiler class.
And as my first-year expository writing professor said after assigning like 70 pages of close-reading Kant for a weekly assignment, "Will it be difficult? Yes. Reading Kant is like running in sand. But that's why you decided to go to Harvard."
The problem with first year CS students is that, unlike math, they’re allowed to have a huge range of possible prior experience in the subject. Some have zero programming experience whatsoever, while others started programming in diapers and competed in numerous programming contests (and even won) before enrolling.
Yes, we do offer an advanced version of the intro course that is far more challenging and would be appropriate for many of those advanced students. But the advanced course is optional so no student can be forced to take it. Many of the advanced students opt to take the standard intro course in the hope that it would boost their grades.
So the course is dealing with (essentially) a strongly bimodal distribution of student ability and the professors don’t want to give the advanced students a free ride. That means the course is actually somewhat challenging for all but the most elite programmers and therefore extremely challenging for total beginners.
What this meant was that Monday office hours (assignments were due Tuesday mornings) typically had several hundred students (out of a total of about 1800) scrambling for help from a dozen TAs. Of course, my school only has a tiny fraction of the funding of Harvard, but there you go.
I doubt that Harvard would want to spend proportionally more on TAs for their course (which would mean more TAs than students), so even though their course may be way more “well-funded” than ours, it’s not at all so relative to endowment.