Skills vs. Science (Geeky Post #2)
I haven't posted much this week due to me being busy finishing up a programming project and preparing for the career fair (motto: "We're here, but we're not hiring!") tomorrow.
In my absence, Nathan (motto: "My posting frequency puts the rest of you to shame") has once again brought up the subject of whether our Computer Science department should be teaching us more concrete skills, such as fixing computers, compiling in Unix and Linux, and l33t haxoring. This was, in fact, also the subject of a heated discussion at the ACM fireside chat a few semesters back.
The consensus in the department was that they prefer the "teach a man to fish" approach rather than the "give a man a fish" one, that by teaching the concepts of how programming languages work, for example, we can then go off and quickly learn any programming language we need to know. This is, in fact, mostly true, as all object-oriented languages are pretty much the same.
I would like to contend, however, that it's both possible and desirable to teach both theory and practice, just not in the same class. CS342 is an unholy amalgamation of design patterns, C++, and Unix, and the result is that students don't really learn any of these things well. But both design patterns and C++ (and unfortunately Unix as well) are skills that any good student with a CS degree should know.
Therefore, I present for you the curriculum of The University of Chris Hill Festival (motto: "Tearing down the ivory tower and putting up a big top"):
100 Level
Introductory classes offered in a variety of major OO languages such as Java, C++, and Visual Basic. All students must take one of the three, and may take as many as they like but only one counts towards concentration requirements.
Tools and Environments class teaches students the basics of Unix, Linux, and Windows (all you Apple hippies can go smoke some pot), as well as the important tools of each (Emacs and make, for example) and how they relate to their GUI-fied Windows equivalents (for example, building Java programs in both JBuilder on Windows and Emacs+jikes in Linux/Unix). Required.
200-Level
All the basic theory courses like algorithms and data structures, etc. that we have now. Required.
300-Level
Design Patterns. Students use their OO language of choice to write programs using design patterns. Rather than being force-fed a new language, students will gain a better understanding of patterns by learning them in the environment they are most familiar with. Required.
Scripting languages. Students learn not only crazy Gawk but also useful things like shell scripting, Perl, and if they're very brave: Javascript (motto: "Java in name, unstable in performance"). Not required, but counts towards credit.
Assembly/hardware language and concepts. What WashU calls "CS306". Not required, but counts towards credit.
400-Level
Advanced theory courses such as Advanced Algorithms, compilers, etc. Students must take at least 2 of these.
Advanced programming courses (multithreading and realtime programming in Java, for example). Student must take at least 1 of these.
Design Project. Either on a small team or individually, propose and create one semester-long large scale programming project. Should take a few weeks on design (using appropriate patterns), then spend the rest of the time implementing in the language of their choice. Should be a large-enough scale project that it incorporates advanced topics. Can be done in the language of choice. This is CS456 without all the unnecessary documentation time and with more concentration on implementation. Required for graduation.
You'll notice that my curriculum is heavy programming, as that is my main interest. It's my school, and I can do whatever I want with it.
Comments
I like this idea a lot. But of course, it is too radical to ever work.
I'm in 342 right now, and I completely agree. I go into class wondering if we are going to be learning a new language feature or a new design pattern, or some weird mix of the two.
Posted by: Nathan at September 25, 2003 12:39 PM
I can't remember if 306 is required right now, but I think it definitely should be. While I doubt that (m)any of us will program in assembly ever again, it's very very important to see how things work on the processor level. Not so much because we need to understand call stacks and traps, but because we need to encourage a curiosity in how things work, and to realize that even black boxes have insides. The reason that Nathan fixes the computers of other CS students isn't that they aren't capable, it's because they don't have enough curiosity to work it out on their own (at least I hope that's the reason).
Posted by: Charlie at September 25, 2003 5:30 PM
I actually agree with charlie. but first I have to make the case for abstraction. I am not particularly interested in computers, per se, so much as the idea of making them do interesting things. to this extent, I dont care very much about the guts. in a perfect world, someone like me would be able to just assume that computers are magic instruction-executing boxes and not have to worry about the details. (the magical compiler would handle everything.) certain languages, like java, seem designed with this lovely idea in mind. in fact, if they ever invent a magic instruction-executing box someday, all someone has to do is port the jvm and java will run on it.
however, not every computer scientist is like me. and even the computer scientists that are, such as myself, are forced to program in terrible languages like c++. so every computer scientist should probably know how a computer, or at very least how a computer program, works.
tying this all back into cs306, I think it should definitely be required. especially with the changes that are being made to it this year. as I understand it, they are now operating in linux, and in addition to assembly, they plan to teach some introductory c, and show how to integrate the two together. I think that makes this a very valuable class, especially since the biggest problems people have with learning c++ in 342 are when they are forced to cross javas abstraction barrier and deal with memory management. if everyone taking 342 already knew c (in addition to java), then learning c++ would be trivial. and that might actually leave time for a couple more labs and might result in less questions about language features and more questions about patterns, finally solving the 342 problem.
Posted by: michael at September 26, 2003 11:07 AM
Chris sign me up, as a student or professor in the big top -- your choice.
I don't think patterns sell well until a person gets to the point of Really Big Software, where that the appearance, use, and description of patterns is real and not hypothetitical. When I've taken over parts of 342, I've always felt like you're giving students a chainsaw and saying, someday you'll face a Really Big Tree.
Posted by: rkc at September 27, 2003 4:57 AM
|