Now how can we possibly manage to level the playing field between the Alan Kays and the Jackson Pollocks in class? The answer is simple. Use a programming language and a programming paradigm that is generally not used by high school students. I favor Haskell, Scheme or maybe ML or O'Caml. From what I have seen as a TA, high school programmers mostly write code in C, C++, Java, C#, some dialect of Basic or some dialect of Pascal. All of these languages are imperative languages while none of the suggested languages are imperative. Well, ML and O'Caml are kinda imperative but I'd focus on the functional parts of these languages.
Can you imagine what the results of teaching freshmen these languages are? Well, except the endless bitching and moaning of the students who have prior experience in languages like C++ and Java. "This is useless", "Why don't we learn C++", "That's not how it works back home", "Nobody outside of academia uses these languages", "These language are too slow". I know all the complaints already. But they're not important. What is important is to level the playing field between freshmen who believe they know everything already and freshmen who know that they don't know anything about programming. Of course we're not going to level the playing field perfectly. Prior programming experience means something, no matter in what language people programmed during high school. Consequently even the leveled playing field will not look like the Bonneville Salt Flats. It'll be more like the Low Countries but at least it's not the Himalayas anymore.