If you want to melt iron, you need an extremely hot fire. This wasn’t possible for most of history, so iron was wrought (literally “worked”) by laboriously beating at spongy lumps of iron and slag produced in a basic furnace called a bloomery.
This eventually changed with the invention of the blast furnace, but unfortunately the resulting cast iron was too brittle for many applications. It wasn’t until the development of the Bessemer Process in the 1850s that we could control the carbon content of molten iron reliably enough to make steel.
What I find fascinating about this history is that for 3,000 years, ironsmiths were just banging away at slag, oblivious to the fact that we would eventually find a much better method. This is the crazy thing about technology. There can be an obvious and universal way of doing something, until it isn’t. Just imagine yourself hammering iron blooms in the tradition of generations of smiths before you… what would prompt you to even contemplate doing things differently?
Better technique, better results
I like to ask people what they think is “the problem with education”. It’s a fun way to get a glimpse of their general worldview. Perhaps it’s an unfair question but everybody seems to take for granted that there is in fact a problem, and typically just one big one.
Depending on who I ask, the problem is that there’s too little school choice, or too much of it, or that the elites are too progressive or too conservative, or that we need to pay teachers more or dismantle their unions. Like I said, it’s a fun question.
The most interesting answers to me are technological, in the broad sense of “technology” as a repeatable technique, like pumping air into a blast furnace. I’m generally not swayed by the political arguments, because education is so broadly ineffective. We tend to be bad at teaching things both within and outside of traditional systems, whether or not the state in question has a voucher system, and so on.
The technological answers are exciting though because they suggest that we may be just one idea away from a breakthrough. We may be able to get better results simply by doing a better job.
Have you tried not blurting out the answer?
An acquaintance of mine runs a coding interview platform. When LLMs started taking off, they trialed an LLM based interviewer, but it failed somewhat comically: if a candidate showed any sign of struggle, the LLM would just blurt out the answer.
This is a major barrier to LLM use in education, too. We’d like AI tutors to debug student misconceptions and ask well-calibrated questions, like an expert tennis coach feeding balls with just the right amount of spin. Unfortunately they tend to prefer reeling off explanations, so the hard work falls on the user.
In fairness to AI tutors, human educators rarely do much better! Most lecturers just lecture. Most textbooks just explain. Standardized curricula lay out bodies of knowledge as a sequence of foregone conclusions: this is how you manipulate algebraic symbols, this is how you factor polynomials, this is how you differentiate them, and so on. Exercises tend to just check whether you were listening. Factor the given polynomials.
This is the standard way of teaching: we want students to know X so we tell them X. It seems like it should work, and in a way it does, like whacking iron blooms repeatedly with a hammer. It is true that some people manage to learn mathematics this way, but it is rare. If you don’t believe me, try factoring a polynomial.
Have I mentioned nand2tetris yet?
There are some educational resources that I can’t help but recommend over and over again, to the point where students joke about having them on their bingo cards. These are things like nand2tetris, or Silicon Zeroes and the Zachtronics games. Among programming books, those like The Little Schemer, with a thousand tiny questions. Among textbooks, those that are project oriented, like Coding the Matrix. Perhaps a dozen sites full of problems: Project Euler, exercism, cryptopals. Outside of computing, I keep raving about Caveman Chemistry, which is like nand2tetris for the physical world.
What makes all of these resources wonderful is that they don’t blurt out the answers. Each is a well designed set of challenges, problems, questions: ultimately, learning stimulus. They are fun, and in working through them you learn their subject matter enjoyably and authentically. The Little Schemer, is full of cartoons and starts very gently, but by the end you will have implemented a meta-circular evaluator.
Sadly, these resources can be hard to produce and challenging to cater to a broad audience. Many people find Project Euler too mathy, for instance, and give up after a problem or two, but one non-programmer friend to whom I recommended it disappeared for a few weeks and remerged as a highly capable coder. These challenges of problem-based education resources I see as akin to the brittleness of cast iron: something to be aware of and work around, through further innovation.
CS Primer is Generally Available
All of this is my uniquely convoluted way of announcing that CS Primer is now generally available, after over a year of paid beta. I am aware that writing this at the end of a rambling article is not optimal in terms of marketing, but I wanted to give you better context on why I designed it this way.
The biggest problem with how we teach, in my opinion, is that we use the blunt force tool of simply telling students what we think they should know. This is not nearly as effective, in my experience, as setting up a sequence of well calibrated challenges: at least questions, but ideally exercises or projects that are authentic to the topic being studied. For systems focused computer science, this means programming problems, so these are the backbone of CS Primer. I have included my best problems from teaching these topics in person and seeing what students find most rewarding.
At the same time, I’m well aware of the hazards of building an entire CS curriculum around programming problems. Most importantly, nobody should get stuck on a problem and left to flail. My attempt to address these challenges is to include full video walkthroughs to all of the problems, structured with hints and stretch goals to allow students to calibrate the difficulty for themselves. When progress on a problem requires a piece of conceptual understanding, that’s when I provide a short explanation, as a JIT supplement to the walkthrough. If that’s not enough, I’m available via Discord and office hours.
I’ve now given this treatment to four courses: algorithms and data structures, computer architecture, operating systems and networking. For most software engineers this will take a year or two to work through in earnest: there are over 100 hours of recorded content but of course it’s more about the time that you spend solving the problems, than watching me do the same. I’m still working on a few remaining courses but I’m happy with what’s there and excited to release general availability! There are many possible ways to learn computer science but this is the most effective way I could imagine for those who can already code, while still being self-paced and so affordable to students worldwide.
If you choose to sign up, I hope you find it challenging and rewarding. Good luck with the problems!
Have you had a chance to read 'Peak' by Anders Ericsson and Robert Pool? There is a nice section on pedagogy. Wrote a review of it some years ago (even referenced Bradfield, maybe I need to update.. ;) )
https://twicefire.com/peak/
Yes, humans learn by doing, not by watching! CS is not a spectator sport. Get in the game with CSPrimer. It's great!