## Ask Slashdot: Online, Free Equivalent To a CompSci BS? 197

An anonymous reader writes

*"I am a middle school math teacher and I also run a programming club. I recent completed my M.Ed in math education and was inspired to try to do the new GT online MS in Computer Science in a couple of years. I have some background in programming: two intro to comp sci courses, Java, C++, Python, the main scripting languages, and a bunch of math background. I also read through this great article on getting these pre-requisites completed through Coursera but unfortunately you need to wait for courses to enroll. I would like to just learn these on my own time, no credit necessary. Suggestions?"*
## Donald Knuth (Score:2, Insightful)

## Re:Ivy League = theroy loaded classes with skill g (Score:5, Insightful)

Other way around. If you learn the new hot skills, you can get a low level job where you'll struggle and work poorly because you don't really know what you're doing. Then when the buzzwords change, you'll be unhirable. If you learn the theory and fundamentals, you'll write better code more quickly and be able to easily pick up new technologies as they come along. Theory always trumps "real world" skills.

## Re:Ivy League = theroy loaded classes with skill g (Score:4, Insightful)

We would all be better off with a good knowledge of the history of the Roman empire since we seem to be following down the drain the disasters of its later stages.

## Computer Science BS (Score:4, Insightful)

You should have a look at the average course structure of a BS program. Normally it contains the following elements:

- Math. hopefully graph theory, lin. algebra, not so important for most things, but still often found in curricula analysis

- CS theory: first-order logic/predicate logic, Turing machines, grammars (the Chomsky stuff) LR, LL, LRAR, regular languages, mu-recursion, the language Z or objective-Z (however this item is optional)

- Different programming paradigms. Best learned with special languages: functional -> Scheme/Lisp/Haskell; OOP, but you already know that.

- OOP programming and design pattern

- Software engineering: UML a bit, use case forms etc., different types of project management: agile, RUP and V-model (only basic principles)

- Hardware: basic analog electric components, transistor etc.; FPGA etc. VHDL or something similar; basic CPU designs, 3-address code, gate architecture (pipeline is often too complicated)

- Some other basic field. Robotic, e-learning etc.

- Some extra stuff from a different field (hopefully not a science and not economics)

There are plenty of books on most of these topics. If you would live in Germany you just could enroll at the next University for free and checkout their courses. Or go there without enrolling. In most cases no one would check if you are a student ;-)

## The job equivilent of a college CS education (Score:5, Insightful)

The simple fact of the matter is that a 4-year university's computer science program is not meant to provide job training, and as far as career skills go, you could pick up a CS degree equivalent of job skills in under a year.

I wrote about this the other day, on the Ask Slashdot: Modern Web Development Applied Associates Degree [slashdot.org] topic, and I'm sticking to my guns on it. You don't need any math more complex than simple algebra. You don't need any theory classes.

Some of these theory classes may provide better insight, and lacking them may limit you if you're attempting to enter a highly specialized, complex field with no demonstrable experience in it (which, by the by, doesn't really happen), but for 98% of your day job, it's going to be more important for you to know how to parse and sanitize input than it will be for you to know how to write a compiler, raytracer, decompose a function into mathematical terms, perform a Big-O analysis, design a memory manager for an OS, and you'll probably never use matrices or differential equations.

Hell, the grads I see now a days haven't got a concept of efficient design, most lack basic database skills, awareness of common libraries, common development tools, never used any team-based tracking systems or source control, and so on. Unless they've struck out on their own, they're almost completely unsuitable as candidates. Many of the self-taught devs seem to have a better grasp of things, if only because they end up attempting to write usable software from design to implementation, instead of homework assignments demonstrating polymorphism and recursion.

On the other hand, for many HR departments, a degree is go/no-go. You'll never get to an interview without one, and there's no free, online equivalent for that. You'll just have to make do with having superior technical skills, and try to apply at a company that values that more than a sheet of paper.

## Re:correction (Score:5, Insightful)

And theory is just that.... theory. Any academic approach will fails 90% of the time in the real world, hence RMS's bazaar (real world) vs. cathedral (theory) analogy.

Of course "pro-theory" advocates has a scapegoat: in the real world; if you didn't do it right, it's because you didn't follow the theory as most academics would say (e.g. Agile's "

you didn't do it right" excuse). The irony....Let me illustrate the difference between theory and "real world skills" on solving any problem which is equivalent to finding shortest path in a graph. There are three basic algorithms to solve that problem: depth-first search (linear-time, only works if the graph is a tree), Dijkstra's algorithm [wikipedia.org] (O(m+n log n) where "m" is the number of edges and "n" is the number of vertices, works on any graph as long as no edges have negative weight) and Floyd-Warshal algorithm [wikipedia.org] (cubic time in the number of vertices, works even with negative weights and detects if the graph contains a negative loop, in which case the shortest path is undefined).

Somebody who knows the theory will inspect the specific problem he's trying to solve and choose the fastest algorithm from the list above that will work with the data. There are lots of reference implementations around so writing those about 50 lines of code will be easy.

Somebody who doesn't know the theory but has lots of "real world skills" probably won't realize that the problem has a well-known 50-line solution that works in all cases and he'll hack together some poorly thought-out piece of crap that's too slow and fails spectacularly on data that don't match the coder's assumptions. As the time goes by and bug reports pile up, the mess will grow even bigger into a convoluted tangle of several thousand lines of code that only the best and bravest dare to maintain.