Friday, November 03, 2006
More on My Ideal CS Cirriculum
Alice had some interesting things to say about my previous post. Instead of responding to Alice's comment as a comment, I thought I'd make it an entry by itself.
"I go to a school where there is no computer science department, and thus all of the "computer science" courses I've taken have actually been math courses. I don't exactly think I've somehow satisfied the requirements for a undergrad degree in CS, but I am hoping to persuade some CS PhD programs to let me in anyway. I like the idea of a CS degree as fundamentally distinct from software engineering or what have you, though it is kind of strange for me to actually have this degree given the current expectations of graduate programs."
From my understanding of the current climate, I think you'll find graduate CS programs put a lot of value on applicants who have mathematical maturity. This would be especially true if your interests are more on the theoretical side than applied CS. See this discussion on Lance's blog.
"I found that understanding object oriented programming helped me when I got to my programming languages class. The concept of an object helped ease in things like functions being first order in SML (or really in lambda calculus). Would you really not want to teach this? Or just teach it conceptually, leaving out many of the details of implementation?"
Object oriented style programming is found pretty much everywhere to a degree, even in simple functional languages and plain C. But getting very deep into OOP very early is a distraction from more fundamental principles which should be learned first. A lot of huge and successful software has been written without the benefit of explicit object oriented programming. Also, most research on the theory side is completely orthogonal to anything object oriented.
I've been influenced a bit by Alexander Stepanov, the creator of the STL (Standard Template Library of C++) which is one of the most useful and well written libraries I have ever used. You might find this interview with him interesting. He finds absolutely no value in things like inheritance and virtuals. I'm not as extreme as him, but I do think that these concepts are overused.
"Most of my classes have had some programming projects, but we weren't really taught to program so much as sent off to make something that worked in the language of our choice. Often we would modify existing code, so the projects were smaller but more focused on the theoretically significant bits. Would the theory courses have programming components?"
Yes they would, which is one reason why I think a functional language should be taught from early on. Many theoretical concepts can be illustrated in languages like Scheme or ML without too much extra baggage.
"I'm kind of surprised that you leave automata to the third sequence - this was actually the first thing I learned in college CS class, concurrent with an overview of very simple programming structures (variables, loops, etc) in java. What's the rational for this?"
It's interesting you learned it so early; I can certainly see the appeal of learning it alongside your first language. But I left it until a bit later because I think a certain degree of mathematical and computer science maturity is needed to appreciate and understand automata.