|
Having said what I did in a brother post to yours, on the other hand I'd say that the amount of practically useful stuff in a CS degree is surprisingly small, and I learned most of it before I went to college. I'd probably rate analysis of algorithms as the most useful, but it is very simple stuff: it's just expressing the time or space used by an algorithm as a formula, a function of the input size, but discarding all but the fastest-growing term. There's all the other stuff that you need to know, like the basic data structures, but these are (IME) hard to avoid if you've done much programming at all. I'm not sure you need to know hardly anything about hardware architecture unless you're aiming to code at a very low level, device drivers etc. Obviously, familiarity with machine code, cache characteristics, optimization at the assembly level, etc. are useful, but these things are best learned by sitting at a computer with a stack the Intel processor PDFs, an assembly timing loop and a simple algorithm you're trying to reduce the clock count on. I'll add some of my own experience, as I got into compilers and currently work as a compiler developer. I was interested in compilers at a young age, I recall thinking hard in school about how one should go about evaluating arithmetic expressions correctly accounting for precedence. I wrote an open-source expression evaluator for the Delphi community, as part of the JEDI library. I built a regular expression compiler in Java, compiling to Java bytecode, as my final year project in college. Then, in my first job (in a software company, working on a green-field project, very lucky), I was able to point out the benefit of writing a custom compiler for a DSL to fill in a configurability-shaped hole in the architecture. After having built up this experience, I was in good shape when Borland (as it was at the time) came calling looking for an engineer for the Delphi compiler. I don't think there's a deterministic kind of guarantee that can be drawn from this experience. But learning the whole stack of technology that you need to implement a language certainly gives you plenty of practice in a lot of the fundamentals of CS, right from data structures and parsing at the top (I personally would avoid parser generators as a didactic exercise) to machine architecture and cache hierarchies at the bottom, to details you'd rather not have to know about, like the idiosyncratic addressing modes of the x86 processor. And putting it into practice, even if it's in an open-source side-project, gives you a better angle on related opportunities. |
Any chance you could give a list of that surprisingly smalll amount of practically useful stuff?