The Art of Instruction, or, The Art of Learning, or, How Universities are Broken

Originally posted on 2008-03-21 at masonbrowne.info

My friends and I went out tonight. After settling in and ordering some drinks, we quickly landed on a topic of conversation.

My roommate, a graphic art student, decided it would be a good idea to learn ActionScript, the language that drives Flash. All told, there were four of us at the table, three of whom are (or are studying to be) programmers. Surely, between the three of us, we could teach our B.A.-pursuing friend a thing or two, right?

Scott and Jacob, brothers both in the MSU C.S. program, started with the jargon of classes, objects, methods, properties, inheritance, and encapsulation. As my friend's eyes began to glaze over, I began with a different approach, describing things in abstracts, not specific to C.S., but to the world in general. This was the manner in which my most favored professor, K. Stuart Smith, taught me, and after several minutes, it was clear that my approach was gaining traction. Between the three of us, we had a good blend of jargon, examples, and philosophy. Throughout the process, I kept having the same thought: However difficult learning programming is, teaching it feels harder.

Ever since I was taught the object-oriented paradigm, I've thought of the world in code. I see objects and properties of those objects and actions performed on and by those objects. It's been wired into my brain, and feels quite natural. Explaining this to someone who has had four years of art school feels like teaching an elephant to climb trees. No matter how I dice it, there's always one aspect that isn't quite grasped, that's not quite clear enough.

Surprisingly, Thomas did an amazing job learning the concepts of object-oriented design. He was eager to ask questions, give his own examples for confirmation, and wasn't afraid to say if something wasn't clear. By the end of the night, he had a firm understanding of classes, objects, properties, methods, and inheritance.

That is, in four hours, Thomas learned and understood things a lot of sophomores in the MSU C.S. program do not. He wasn't just typing lines of memorized code into an IDE and hitting "run". He was actually modeling the world in the terms of object-oriented design. He understood the concept of instantiating an object from a class definition, understood the purpose of constructors, and even understood encapsulation to a certain degree. Granted, he wasn't ready to cut code, but he had a very deep understanding of high-level programming.

Was this because Scott, Jake, and I are amazing teachers? Hardly. In my opinion, it was because of the way Thomas was learning. He wasn't sitting in front of a whiteboard with twenty other students while the professor droned on about god-knows-what. He was taking an active role in his learning. I'd say "class", and he's say, "Okay, what is that?" I'd "object", and he'd say, "Just to be clear, and object is, like, the manifestation of what I describe in a class?" Questions. Examples. Confirmation.

It makes me wonder if we're not wasting our time in the universities. In an intro-level class of 200, maybe 100 will stick around for the next semester. Maybe 75 will make it to upper-level classes. Perhaps fifty will become competent programmers. Twenty will be the type that are self-starters and go searching for answers to their own questions outside the realm of the classroom. Five will be super-stars.

And that's a four to five year process.

I'm no super-star. I probably consider myself somewhere between the fifty competent coders and the twenty self-starters. I can learn just about anything thrown at me, but I lack the finesse of the hot-shots. (The majority of my skills have come through experience, not academia.) Imagine if, instead of preaching at 200 students in a lecture hall, there were classes of ten.

In a class of ten, the teaching is directed at ten individuals. That is to say, the professor it teaching to the strengths and weaknesses of those ten people in that class, something one just can't do with 200 students. In a class of ten, it's less a lecture, and more a conversation. Students ask questions. Students give examples. Students even start answering other students' questions in class. And its nearly impossible to "fall behind", as any slip in performance is very noticeable.

So out of those ten, few if any students will drop out because they were left behind. In an interactive, engaging classroom, few will drop out because of disinterest or boredom. I dare say that by the end of four years, all ten of those students will be competent, seven will be self-starters, and perhaps five of those students will be hotshots.

Am I pulling these numbers out m'arse?

Yes and no. The numbers are pretty arbitrary, but the trends are borrowed from my own experience. My entrance into Computer Science was not at MSU, but at Rocky Mountain College, a small liberal arts school in Billings. The C.S. program had just two instructors, and the class sizes ranged from five to fifteen. Out of all the "unlikelies" I had classes with, nearly every single one of them kept up, or even thrived, in even the most difficult classes. We had single moms, a kid who wore goofy hats, a girl from the Equestrian Studies program who started out just taking a few classes (and later earned her C.S. degree), and high school students (I was one of them). And we learned about OOP, data structures, algorithms analysis, assembly programming, C, and database systems. We could model and store and analyze and lshift and alloc like the best.

When I transfered to MSU, I had quite a few credits coming from Rocky. There was one in particular that still makes me laugh today. I had taken a C programming class at Rocky. It was, I believe, two credit-hours, with something like four lab hours (might have even been one credit-hour). When I transfered to MSU, they wouldn't accept it as my C programming credit, since theirs was three credit-hours with two hours of lab, and an assignment due each week. I dutifully signed up.

I showed up for the first two days of class. I showed up on test days. I showed up for the final. All told, I went to one lab. At the end of the semester, I had the second-highest grade in class (like a 97%, due to style issues, not quality), topped only by the other kid who had similar attendance habits.

It turns out MSU's C programming class was like.... Java programming in C. Only it really couldn't even be called that, because at least in Java you are learning OOP and design. This class seemed afraid to touch memory management. It was afraid to touch pointer arithmetic. It was afraid to touch all the gritty things that C is actually good for - low-level, in-the-computer's-guts action.

At Rocky? Well, by the end of the semester, we had created a basic version of objective C, complete with constructors, limited inheritance, and polymorphism. We did it with cool things like function pointer tables and type-casting and knowing about memory alignment. We covered all the things MSU was too afraid to cover.

My point? We were able to do so much because we had a dedicated professor and a small class. We weren't a crew of fifty, and he wasn't someone who has to teach because of an agreement in his research contract. Our conversations were engaging and interesting, not forty slides of computer parts, famous programmers, and isolated code snippets. At Rocky, we'd spend an hour designing, creating, and refining code on the blackboard, and afterwards my friend and I would go straight to the lab and see if it all actually worked. That's the kind of excitement a class should provoke, not the dread of wondering when our next pop-quiz was going to be.

More than anything, our instructors at Rocky (Smith and Benner both) had faith in our ability to learn, and exploited it to the fullest potential. That's something I am eternally grateful for, and I wish every young person had the same opportunity.