Teaching computational thinking part 2
In order to teach computational and algorithmic thinking, I think you have to start, much as I hate to admit it, with a programming language. Since, if you can’t speak the language of a computer, you aren’t going to have much success in getting to do anything.
My criteria for a good teaching language:
- It must be used by professionals to solve real world problems. This eliminates LOGO, my beloved Karel ++, and BASIC and all its variants. While some of these languages might be useful for very young children, I think once you get into middle/high school, you really should be able to take on a language that is going to have legs.
- It must be reasonably easy to read. Bye bye C++ and your iostreams and overloaded operators.
- It must be free. This axes mathematica, much as I love its no longer necessary arcane syntax.
- It must be easy to set up. You shouldn’t have to spend hours installing an editing environment or complier, and you shouldn’t have to set up a webserver to test your code. So PHP is out, as much as I like it, and want to get better in this language.
- It must be powerful and easy to use. You shouldn’t have to start off programming from the command line, or making ascii art. You should be able to hop right into executing programs with minimal hassle, you should be able to handle writing and reading from files and to the screen without calling a bunch libraries, and basic graphics should be as simple as writing
sphere(). This loses JAVA in my view.
I'm not going to make a federal case for which language to go with, that's against my point that we should be focusing on teaching computational and algorithmic thinking, not programming, but I think there's a decent case to be made for learning python. Python meets all the criteria above, and really is a modern, powerful high level language used heavily in science and industry, but at the same time is very easy to read and user friendly.
The next thing is to find a good source of problems. When left to their own devices, Computer science textbooks, just like math textbooks, are likely to come with psudeocontext problems that don't really inspire engagement. Luckily, most of our subjects are filled with deeply engaging problems. Here are just a few I'm thinking of:
- How do you get to the moon? Plot a course of a flight for a spacecraft leaving the earth and landing on the moon. How much fuel is required to make this trip?
- Shakespeare-How different was Shakespeare's vocabulary from that of his contemporaries or modern day. Analyze the complete works of Shakespeare, works by contemporaries, and then some modern day authors, and compare and contrast their vocabularies.
Similar work is being done by historians at George mason, who evaluated the frequency of words used in the titles of British Victorian novels, with surprising results—despite the era's preoccupation on evil, the word hardly appears in book titles.
- Plane tickets and gas prices. How is the price of a cross country flight correlated with jet fuel prices? Build a program to scrape price data from an airline website and a Jet Fuel Price monitor.
- All those great project euler problems that seem to be keeping everyone on the twitterverse busy.
But again, as I saw with the synergy class, the real problems are the ones that students will come up with on their own.
If you want to see an example of how computational and algorithmic thinking can transform our subjects, the best example I've seen is the Matter and Interactions curriculum, which is hands down the best calculus based introductory physics curriculum I've ever seen. Here's a curriculum that shows the power of computational thinking by allowing students to go beyond solving simple textbook problem—in what other class do you write a program to plot a the trajectory to the moon during the first month of class? Or have the kids build a model of a solid as a series of balls connected by springs, and then use that model to explore the transmission of sound through solids?
In my next post, I'll discuss how I'm trying to do this specifically in my 9th grade honors physics class, with the help Danny Cabellero, a 5th year physics grad student at Georgia Tech, who has been instrumental in helping to bring some of the exercises they use with M&I students at tech down to a level appropriate for 9th graders (and if you happen to be at a university looking for an incredibly promising new physics faculty, Danny is graduating very soon, and you'll have a hard time finding someone with a better understanding of physics teaching).
I'll close with a couple of other articles I've stumbled across that further make the case for teaching computational and algorithmic thinking outside of computer science classes.
Kevin Carey wrote a fascinating commentary in the Chronicle of Higher ed about how his early exposure to programming has continued to help him throughout his life, even though he never pursued a major or career in computer science. Some quotes:
Coding taught me the shape of logic, the value of brevity, and the attention to detail that debugging requires. I learned that a beautiful program with a single misplaced semicolon is like a sports car with one piston out of line. Both are dead machines, functionally indistinguishable from junk. I learned that you are good enough to build things that do what they are supposed to do, or you are not.
Writing, in other words, is just coding by a different name. It's like constructing a program that runs in the universal human operating system of narrative, because, as Joan Didion once said, we tell ourselves stories in order to live. Authors adhere to a set of principles as structured in their own way as any computer language. Publications worth writing for insist on Galilean standards of quality and concision.
At the same time, Mark Guzdial, a computer science professor at Georgia Tech, wrote this equally fascinating blog post, Computational Science needs CS Education‚ which explores a number of fascinating trends, including the statistic that for every 1 student in computer science, there will be four more who will need computer science in their careers, and a study that found that many of the people who are programming as part of their jobs, almost all of them are self taught and lack basic CS knowledge and terminology, like how to read code. An obvious solution would seem to be teaching computational and algorithmic thinking in classes outside of computer science, but Mark sees problems here, since many faculty are uncomfortable with teaching computational and algorithmic ideas, or not good at it. I think this is indeed a problem, and I don't think I really have a solution yet, but I do see lots of hope in the work I'm doing in my own class, and some of the work being done by the fine folks at google, who have cooked up dozens of lessons in mathematics to that introduce students to computational thinking using python.