Most CS students don't care about CS, and there's nothing
wrong with that.
Our society shouldn't look down on trade schools so much. There's too much of an importance placed on the prestige of graduating from a university, making everyone feel pressured to go to a university. These kids are wasting their time (and their parents' money) if they don't care about the material and are never going to use the material anyway. They're just there to get the rubber stamp from the university to impress their family, friends, and employers.
This emphasis on the college degree as a sign of prestige has a toxic side effect: the people who do care about the material get a diluted version of the material to better serve the university's goal of graduating as many people as possible.
I want to see more schools in the style of Digipen. Digipen offers a rigorous degree in "Real Time Interactive Simulation" -- in other words, Game Programming. They really do learn to code, and they really do learn the relevant mathematics for 3D graphics, physics simulation, etc. They probably don't sit through irrelevant courses on the theory of computation or programming language theory. Why aren't there similar programs for programming in general? You should be able to go to a trade school or university and get a solid and comprehensive degree in programming. And society should respect you for it.
Sidenote: I do think that it's possible to do this without devolving into a technology-specific curriculum. You can (and should) still teach at a conceptual level, with individual languages and APIs considered implementation details. I'm not advocating creating a degree in ".NET Programming" or "Ruby on Rails Programming" that'll be obsolete in 2 years.
While I agree that trade schools are a Good Thing ™, I have to respectfully but strongly disagree with your assertion that theory of computation and programming language semantics and implementation are somehow unimportant for any student of programming, whether vocational or theoretical.
True, it may not be terribly illuminating for a game programmer to rigorously prove historical theorems in computability or complexity theory. However, understanding the practical importance of big-O notation, the equivalence of any Turing-complete language, (as well as the lambda calculus, partially-recursive functions, etc.) and compiler design will all be of massive benefit when they're looking to actually distinguish themselves from the rest of the assembly-line game coders.
Overall, though, +1 on the idea of a solid two-year "Computer Programming" degree. Leave CS as a truly academic realm, and give those who are just looking for a solid white-collar career path a respectable path there.
I do think that Big-O notation and computational cost should be covered in a practical and intuitive way, but I'm not convinced of the utility of teaching Turing computability, programming language theory, or compiler design. You say that this "will all be of massive benefit when they're looking to actually distinguish themselves from the rest of the assembly-line game coders", but I think that anyone who wanted to get that real depth of knowledge and set themselves apart from the crowd should get a CS degree and (most importantly) continue learning on their own. What I'm envisioning for the trade school is purely what you describe as "a solid white-collar career path". I think there's a lot of people who are looking for a career that pays well and that they enjoy, but aren't interested in becoming an expert in their field, or making their career also their hobby.
To veer on a tangent -- my previous roommate went to Digipen, and he didn't find it rigorous at all. He felt it was dumbed down in the technical aspects. Has that changed in the past few years?
I don't know, I'm just going off of hearsay and the projects I've seen come out of Digipen. It's definitely less rigorous than a university program, and they're obviously exploiting the "I want to make video games!" motivation of a lot of kids. But I do think that the general model is pretty good, even if Digipen isn't an ideal example of its implementation.
What I find most frustrating is that people don't talk about the importance of application-level creativity. It's all about implementation.
The secret is that implementation is not interesting nor rewarding -- whether it's done in Java or C or whatever. It only becomes interesting when you are innovating at the application level.
And so, CS as a whole is a depressing field. Most jobs are unrewarding since you are told what to implement.
It's sort of like being asked to translate a novel from one language to another or to improve its grammar. I would rather write my own novel.
I think they're barking up the wrong tree. Knowing a vast amount of theoretical CS knowledge might make you good at implementing the fastest possible algorithm, but more and more that sort of programming is only seen in applications where those sorts of optimizations pay off the most (video games, embedded programming, and core systems software come to mind). I think their use of the term "Software Engineer" is therefore inaccurate, they should really be saying "Computer Scientist" because I'm sure there are plenty of good programmers who have gotten good through hands-on experience writing code vs. reading books and attending lectures about theory. I'm not trying to say theory is useless in the real world, I am trying to say that theory is not a prerequisite in the real world.
But yes, I'm also completely tired of elitism. I think it's brought about by the perception that programmers have to constantly compete to be #1, and by extension, to be really worthwhile at all, and while this mentality helps motivate some people, I only see it leading to feelings of inadequacy and complaining about newbies to make oneself feel competent.
Interesting about the mention of a relationship between building Legos and CS. The correlation between the two has been a theory of mine for a while. At least I have not yet found a hacker who enjoys building legos (or did as a child) that sucks at or doesnt enjoy building software. I have a feeling the mindsets required for both are strongly correlated.
When I was a wee lad, I didn't know what software was, but I had a huge box of legos and an imagination. My parents would buy me the playsets, and I'd build them to get ideas about how "masters" built things and would proceed to immediately take them apart and build new things with the pieces and the knowledge. This also happens to be what good hackers do. Hackers are always reading code, reading about code and learning what the "masters" do. Then they piece together all that they learned and create something new. It's the same exact process, and that is why your theory is correct.
Actually, if the JUMP instruction allows an indirect address, then it is already Turing-complete. I know X86 treats indirect jumps as a separate instruction, but it's not hard to imagine an assembly language where the two use the same instruction.
EDIT: Nope, we forgot there is no STORE instruction. Thus, no way whatsoever of writing output.
As much as I'd like to say I could do low-level CS, I'm honestly not that good at algorithms. Quick sort? I'm good at problem solving, which is what I think matters.
Before I knew better, I used to laugh at those people who found careers doing boring stuff with corporate applications (databases, etc.). The best part of my job is creating something from scratch - a blank screen of an IDE (when not fixing issues). And if we have excess energy after the workday/or on the weekend, we can always exert our creativity on open-source or personal projects. I love software development for the development aspect. How cool is it to say (or not say) to your friends that you could build a cool web startup (the tech is not that hard, except with exceptions)?
As much as I'd like to say I could do low-level CS, I'm honestly not that good at algorithms. Quick sort? I'm good at problem solving, which is what I think matters.
What's the difference between algorithms and problem solving?
Scenario: Consultant on-site. Application not working (Oracle, app server, and/or network issues). Training scheduled for next day. Diagnose/Fix the problem during the teleconference or else..
... an algorithm is a series of steps to solve a problem. If he is good at problem solving, he should have no problem with algorithms.
Now, I think a lot of people are bad at remembering every algorithm they are taught in a class. Unless you use it a few times, it's not likely you will be able to implement it off the top of your head, but that is what the internet and all those useful CS books are for.
But seeing examples of non-trivial algorithms makes what you once considered non-trivial, trivial. A lot of algorithm design seems to be a kind of poetry to me - where one draws on similarities to algorithms she's seen before, as a poet would draw on metaphors or imagery they've experienced elsewhere.
What would happen if one school actually decided that they would go the other way, and fail anyone who "sucked"? Wouldn't that school then get a good reputation for graduating only "great programmers," pushing any aspiring programmer to apply there--a virtuous cycle? The top schools in any field graduate the best simply because the best apply there, and the best apply there simply because "the best" are known to graduate from there.
I know this is amateur question, but I am taking my intro to programming class this quarter, and we are learning with Python(and pseudo-code, if that counts) am I doomed to being a crappy programmer? I was notorious for being a Lego addict when i was a kid, and i am taking the classes because i need a formal education on programming, so i would like to think I am not part of this group, but am I getting off on the wrong foot?
If you're not a 'hacker' now, then the odds are against you becoming one.
On the other hand, you don't really need to be a hacker to make a good living. I know quite a few really excellent programmers / software engineers / designers who can perform all those roles, and who are emphatically not hackers.
For most programming tasks, like billing software, or web-sites, there is a fairly straight-forward way to design something, and a reasonably straight-forward way to implement it. Reliable, predictable timelines and implementations are the high-end of business software consulting.
You can be pretty good at software engineering, and be fairly well-paid, even working regular hours and not letting it consume your life.
You can get a good education at almost any school in almost any language. Like much of your life, it depends entirely on what you put into it. If you only do enough to satisfy the core requirements of the class, and you are not motivated to explore the field on your own, then you're going to end up being a "crappy programmer."
Remember when people actually posted constructive compsci/programming articles that covered a wide variety of topics? Neither do I.
This current obsession with programming supremacy and geek dick waving is absolutely pointless.
If Universities started churning out uber hackers that were "20x more efficient" than last years model all these guys would start crying about how they can't get a decent paying job.
Our society shouldn't look down on trade schools so much. There's too much of an importance placed on the prestige of graduating from a university, making everyone feel pressured to go to a university. These kids are wasting their time (and their parents' money) if they don't care about the material and are never going to use the material anyway. They're just there to get the rubber stamp from the university to impress their family, friends, and employers.
This emphasis on the college degree as a sign of prestige has a toxic side effect: the people who do care about the material get a diluted version of the material to better serve the university's goal of graduating as many people as possible.
I want to see more schools in the style of Digipen. Digipen offers a rigorous degree in "Real Time Interactive Simulation" -- in other words, Game Programming. They really do learn to code, and they really do learn the relevant mathematics for 3D graphics, physics simulation, etc. They probably don't sit through irrelevant courses on the theory of computation or programming language theory. Why aren't there similar programs for programming in general? You should be able to go to a trade school or university and get a solid and comprehensive degree in programming. And society should respect you for it.
Sidenote: I do think that it's possible to do this without devolving into a technology-specific curriculum. You can (and should) still teach at a conceptual level, with individual languages and APIs considered implementation details. I'm not advocating creating a degree in ".NET Programming" or "Ruby on Rails Programming" that'll be obsolete in 2 years.