It's funny, because the situation we're in right now (at least in the US) does neither really well.
On the one hand, hardcore theoretical courses at the average CS school don't exist as weed-out at all. If you're lucky, you've got a good faculty member teaching a compilers or operating systems course that'll make it challenging, but only sometimes. Teaching things like Haskell, The Lambda Calculus, Prolog, Complexity Theory and C are "impractical" for someone doing a CS degree, because, you know, everyone uses "OO" (whatever that means) nowadays so that's the theory we should teach. Plus, if we teach a hard course about the theory of computation, lots of kids will flunk, and we can't have that, now can we?
On the other hand, any attempt to make the curriculum practical (since most schools border on vocational training anyway) is met with the response of "Well, a CS degree shouldn't prepare you to be an industry programmer!"
So really, most universities are left in a luke-warm middle-ground, where theory is being neglected but no one is willing to be the administrator who "flips the switch" and turns CS students into non-stop code monkeys.
Really, grounding yourself in a lot of CS theory, while occasionally forcing yourself to break out and hack up a project, is probably the best route to becoming a well-rounded programmer. Whether most people are capable of realizing how bad current CS education is and doing so, however, is another matter.
Interesting the you mention that some courses will only sometimes be challenging. When I did Algorithms and Data Structures, the assignment was all about applying them to get the fastest execution time on quiet complex set of data that had an inner loop inside each data point to optimise.
Completing it the worse way possible, ie setting up arrays and traversing them linearly would give you an execution time in the hours. It really took experimenting with different versions of most of the structures and algorithms taught to get the best execution result.
This years assignment that my brother is doing, seems that to get the fastest execution given the stuff taught in the class it's just a matter of using one hash table and a couple of numerically indexed lookup arrays. So the people doing it this year will get nowhere near as much out the assignment.
On the one hand, hardcore theoretical courses at the average CS school don't exist as weed-out at all. If you're lucky, you've got a good faculty member teaching a compilers or operating systems course that'll make it challenging, but only sometimes. Teaching things like Haskell, The Lambda Calculus, Prolog, Complexity Theory and C are "impractical" for someone doing a CS degree, because, you know, everyone uses "OO" (whatever that means) nowadays so that's the theory we should teach. Plus, if we teach a hard course about the theory of computation, lots of kids will flunk, and we can't have that, now can we?
Agreed for most schools but I will say that there are good schools that still teach at that level. The Intro to Programming Languages class at Northwestern has you implement an interpreter for a variety of different languages, including a variant of Scheme called Typed PLAI. Haskell was used as an example sometimes and we implemented a number of similar features (basic type checking, currying, etc.). I know that the operating system and compilers courses here are very difficult and have heard similar things about the corresponding classes at CMU.
Agree. I'm about to graduate from CMU, and their OS class was an extremely rewarding experience. I've heard similar things about their compilers class.
The required intro classes are also pretty rigorous, although I didn't take them personally. I'd bet that any CMU CS (note that engineering is a very separate program at CMU) grad would at least somewhat know how to program, and will have programmed in assembly and ML, along with the usual Java and C. Obviously you have to check whether they got C's in the big rigorous classes or not, but it's basically a good bar. It would be impossible to graduate and then fail FizzBuzz, for example, which to my understanding is not true of most CS programs.
The one main complaint I had with it was that the required freshman theory course (251), which is supposed to be this great legendary weed-out thing, was just a hodgepodge of badly specified discrete math, and still is, to my knowledge. It was hard, but in my opinion not in a good way. Maybe it works as a weed-out but not as an educational tool. The later required algorithms course, 451, was much better.
>Agreed for most schools but I will say that there are good schools that still teach at that level. The Intro to Programming Languages class at Northwestern has you implement an interpreter for a variety of different languages, including a variant of Scheme called Typed PLAI.
I'm graduating in a week or two with a BS in Computer Science/Systems. I don't know what schools you have experience with, but my particular school did very well at Computer Science and Software Development. I've taken several courses in data structures, algorithms, hardware, assembly, OS and all the way up the stack. I've also taken a two year rotation working with a team on a project for an outside company.
Consequentially, I have had a job lined up for several months.
All that to say schools that teach both do exists.
On the one hand, hardcore theoretical courses at the average CS school don't exist as weed-out at all. If you're lucky, you've got a good faculty member teaching a compilers or operating systems course that'll make it challenging, but only sometimes. Teaching things like Haskell, The Lambda Calculus, Prolog, Complexity Theory and C are "impractical" for someone doing a CS degree, because, you know, everyone uses "OO" (whatever that means) nowadays so that's the theory we should teach. Plus, if we teach a hard course about the theory of computation, lots of kids will flunk, and we can't have that, now can we?
On the other hand, any attempt to make the curriculum practical (since most schools border on vocational training anyway) is met with the response of "Well, a CS degree shouldn't prepare you to be an industry programmer!"
So really, most universities are left in a luke-warm middle-ground, where theory is being neglected but no one is willing to be the administrator who "flips the switch" and turns CS students into non-stop code monkeys.
Really, grounding yourself in a lot of CS theory, while occasionally forcing yourself to break out and hack up a project, is probably the best route to becoming a well-rounded programmer. Whether most people are capable of realizing how bad current CS education is and doing so, however, is another matter.