How to Create Computer Scientists
I was talking to my dad about the design of a first computer science course and I said something like maybe I was more inclined to want to teach programming early because it’s what drew me into computer science in the first place. I started writing some PHP scripts and BASH scripts to solve some specific problems I had and got hooked. My dad doesn’t think it’s that simple. He reminded me that I played The Incredible Machines and other games like it.
The neat thing about the Incredible Machines is that mistakes are made. Lots of them. Solving the puzzles requires incremental design and experimentation to understand how each component can be useful alone or when combined with others. I remember feeling frustrated when things weren’t working but also really excited when I finally solved a level. In retrospect, it does seem like that process is a lot like programming.
Then I played a lot of Zork. It’s again a puzzle game but has the added twist of being command-line based.
To me, it was fun trying to figure out what commands were available when and having to visualize where I was and what was around me. I still have the maps I drew out painstakingly with colored pencils. I guess I was getting used to a limited command set and a form of abstraction. I also realized how efficient typing in commands could be and eventually switched to Linux and a very light weight windowing environment.
Somewhere along the way I got involved in personalizing Windows 95.
I never really thought much of it, but to make the Pink Screen of Death I had to change a setting in System.ini, figure out VGA colors and that kind of stuff. Not super complex, but I was learning about operating systems, data representation, settings, etc. I also did some fun registry hacking at the time which again got me curious about operating systems, frustrated at Windows, and on to Linux.
Of course, I didn’t just come up with these projects out of thin air. I was spending a lot of time on Usenet and was perfecting my web searching skills. Most importantly, I was learning how to learn. That’s perhaps one of the most important things in computer science given that all of its fundamentals as well as its artifacts are man-made abstractions and that new ones come up every day.
So maybe I didn’t get to programming first. And maybe what an introductory computer science class should do, in part, is give students an opportunity to be hooked by experiences similar to my own. How about games like Lightbot 2.0 or Manufactoria? Customization experiences through CSS?