I've been working on my class for the last few days and I'm starting to get a little more confident about teaching a course (or at least CIS 450 in particular) now that I'm starting my third semester of teaching it solo and fourth overall. (Dave Schmidt has shared that it really takes at least 4 semesters in a row to get a CS course down pat.)
I've been thinking a lot about what makes a good course at college and I've decided that there are really just a few principles:
- It must be interesting.
- It must be informative.
- It must be personable.
It must be interesting. One might think, "Duh." However, one must be careful to take into account the nature of the course I teach: CIS 450 Computer Architecture and Organization. Probably anyone whose taken CIS 450 (or CIS 350 before it was renumbered) from Dr. Mizuno, Tim Bower, or myself, the first thing they think of is, "Ewy! Assembly!" And then they start twitching as they remember pointers and memory maps and they might, perhaps, remember Masaaki's Rules (if they took it from Masaaki Mizuno, my "rules" aren't quite the same).
Basically, I have to make a subject about assembly interesting. In my opinion, an instructor makes a topic interesting by being interested in it. Therefore, I've taken it upon myself to figure out what is so fascinating about this subject and I think I have a good grasp on that now. Computer scientists aren't quite mathematicians, aren't quite engineers, and aren't quite scientists, but they do all of those things and most have some similarity to these. Engineers like to take things apart and see how they work. Assembly language is really the deepest guts a computer scientist can get to without having to get out the screwdrivers and soldering iron. ("Dammit Jim, I'm a Computer Scientist not an Electrical Engineer!")
Furthermore, this class is the class that lets you know how programs really work. Bugs happen. But, if you don't have an understanding of how programs really work, you're going to run into bugs that you can't explain.
For example, try to explain the output of this C++ code (taken from the course notes):
int x[3] = { 1, 2, 3 };
int y = 5;
char z[4] = { 'a', 'b', 'c', 'd' };
for (int i = 0; i < 5; ++i) {
cout << "x" << i << "] = " << x[i] << endl;
}
without knowing how a program is translated into machine code. You can't.
Some would argue that by using Java or Python or Perl or Ruby or Ocaml or Scheme or Haskell or any of the slew of "modern" programming languages out there this isn't a problem. WRONG! Everything has to work on a machine level sooner or later and someone has to right that code and that someone is human and makes mistakes. All of those programming languages occasionally have bugs that run into system issues that have to be explained and fixed by some computer scientist somewhere. Any computer scientist that doesn't at least know the basic theory here should be shuffled away to management where he can do less harm.
Anyway, I have learned to find this stuff really interesting. I don't have a lot of time to dabble in it very deeply, but after having played around for awhile I do yearn for the time to play around with assembly, compilers, and virtual machines.
It must be informative. Again a duh. However, I found frustratingly often as a student that professors were often more interested in their research than sharing knowledge with me. Professors are very busy people. At a research university, they have to try and get grants to fund research, they have to publish papers on their research, they have to hire and train RAs to help with research, they have committees and the other beaurocrapsy everyone in a large company has to deal with, and all the rest. Then, they have to teach. Many professors see teaching as their second job and prioritize the time they spend there as such. They create notes and then live off them for years. (In the field of computer science, where parts of the field have shifted and changed focus several times in just the 8 years I was pursuing a degree, that's crazy!)
Thus, I find that being informative is more a challenge of preparation than a challenge of finding information. In fact, one of my problems is that 14-15 weeks is just not enough time to cover all the topics in the course. This course works in C++ in order to get down closer to dirt level. I then have to teach the theory of computer architecture, assembly, C++ to assembly translation, pointer arithmetic, memory allocation, memory mapping, and some other miscellaneous stuff. That's really a lot to fit in to 50 hours of instruction (that's about the amount of time I work in a single week!). As such, I'm continuing to adapt my notes and try to adapt to changes in the field and fit in my particular interests.
It must be personable. Everyone has a favorite course they took or at least a few stand-outs. Why? I don't particularly remember most of my courses, but I vividly remember a few. I remember thinking Nora Ransom was a loon that really knew what she was talking about. I remember John Hatcliff hopping back and forth in front of the chalkboard to show how to ideas related. I remember talking about parking problems with Dr. Huth and a philosophy professor. I remember Masaaki Mizuno, laughing about some story about bad documentation and stating his famous epigram, "You must read the code." It's the instructors that make a course memorable.
Therefore, the instructor himself must invest his energy into not only making the course interesting, preparing to make it informative, he must put a bit of himself into it. I do this by showing bits of Strong Bad before class and inserting my brand of dry humor into my slides and lectures. I also try to do it by making sure to always be available for students after class and in my office. I have one student from two semesters ago who still comes by every other week to ask questions about C++. I try to invest myself in their lives because I know it will make them better if they know that CIS 450 isn't just some subject they have to learn, it's something enjoyable and it fits into a greater whole of humanity. It matters.
Of course, I have another motive that the average instructor isn't likely to have and that's one of Christian conviction. I invest in people because that's what Christ would do. If I can show them that a person does care for them a bit, perhaps I can make a difference in something eternal (as CS isn't likely to be). It probably also makes me a holier-than-thou prick every now and then, especially to students that tick me off, but I pray that doesn't happen often. (Just so long as I don't start preaching to the poor students, like some...er, folks have a tendency to do...*ahem*... :)
Anyway, it's bed time. Cheers.
