Stop Teaching Intro CS
Monday, April 6, 2015 · 3 min read
One of the reasons I love computer science is that in a good community, everyone is a teacher. You don’t need to attain some degree of credibility before you can go around helping others—you just need to have information and the will to share it. That’s why I can write informative blog posts and help people debug Python issues. It’s why StackOverflow exists and thrives.
It’s like we’re all trying to climb a mountain, and we do so by lending a hand to whoever’s below us while getting a boost from whoever’s above us. The people at the very top are researchers, people blazing new trails and discovering new computer science.
In a way, this is better than the classical model of those at the top of the mountain pulling us all up. Someone who has just understood an idea—recursion, the Y combinator, type theory, whatever—is better-equipped to teach it than someone who takes it for granted having worked with that idea for ages.
…except it doesn’t quite work out like that. The problem is, somewhere near the middle of the mountain, people stop helping you up. After the first few cliffs, you suddenly lose sight of the smarter people, the people who were always a step ahead of you and ready to help. You have to pull yourself up, and that’s hard and lonely. And you wonder where they all went.
Then you look down, and you realize that all those people are back at the base of the mountain running “Learn Python in Two Weeks” workshops.
Why do we put so much time, money, and energy into teaching newbies computer science?
Part of it—and it’s hard to admit—is that it looks really good. Teaching intro CS looks like community service. For institutions, it’s a great selling point. For students, it’s résumé material.
On a less cynical note, it’s fun. Teaching is inherently fun, and CS is something that we have the opportunity to teach to an excited audience without any formal barriers.
(Just to disclaim myself: I totally believe in getting more people into CS and providing young students with opportunities to learn. I just believe in keeping a very high standard for these opportunities, and (more importantly) leaving them as just that: opportunities.)
Anyhow. I see two major problems with this.
Firstly, there are now a million different ways a beginner can learn CS, and so there is naturally a huge variance in quality. I think one of the saddest things is when someone is promised to be taught “web development” and is instead force-fed a PHP crash-course that confuses them, potentially turning them away from CS. Pedagogy is hard; it should be left to the experts.
Of course, “expert” doesn’t necessarily mean “has a teaching degree”. I would trust an excited teenager who just HTML’d his first blog to do a perfectly good job teaching a newbie web development.
As much as I support entreating beginners to learn CS, I believe that the best learning is self-driven. The people who will go on to have happy, successful careers in technology don’t need to be led by the hand. They will figure things out for themselves without a curriculum, and they will probably end up learning more from the process.
All this attention towards teaching beginners is superfluous and only serves to dilute the brilliant resources that amazing teachers spend time creating.
Secondly, focusing so intently on teaching beginners takes attention away from the “intermediates”. People who have conquered the first few cliffs, and are now looking up at the next few. The number of resources for such people is strikingly lower. Once you’ve graduated a beginning course, you don’t know which way to proceed.
Everyone in the CS world has a responsibility to guide those below them.
Paying attention here would catalyze progress, and give hundreds of smart high schoolers (and middle schoolers) around the world goals and ways to achieve them.
Remember when I said CTFs are better than hackathons? This is another reason why. CTFs cater to both beginners and experts alike, giving both challenges and helping both find ways to learn new things.
So what can we do?
We can write blog posts about advanced topics. We can spend less time creating beginners’ tutorials, and more time telling post-beginners the way forward. Creating maps on how to go from “experienced” to “expert”.
Finally, we can try to bring smart, like-minded programmers of similar experience levels together, because these interactions result in a great deal of learning.