On Tuesday 25 September 2007, Paul Seamons wrote: > I'm biased. I did Engineering. But if I had it to do all over again - I'd > do it all over again.
I totally agree. I have a B.S. from BYU in Computer Engineering. (When I started, it was an emphasis in the EE program.) I learned more about OS internals in the EE real-time systems class than in the CS OS class (which I took simultaneously). I learned many things relevant to compilers in the EE architecture class (where we hand-optimized assembly for our DLX simulators) that we never covered in the CS compiler class (which, I might add, is still a very good class and should be a requirement--at least it wasn't at the time). I feel that if you want to be a professor and teach, or research, then pure theory is great, and enough practical to do your research is all you'll need. But, if you're going for a career path, then you are going to need practical. IMO, practical is pointless if you have no theory to back it up. Practical requires mentoring, experience, and good examples to learn from. IME, BYU does not do much practical where CS is concerned. And, IME, in some cases I got more relevant CS theory from the EE side of classes than the CS side, for whatever that's worth. But, IMO you definitely need both. I truly believe any programmer will be better if they understand the hardware and what's actually happening underneath the hood: - Learn assembly - Learn C (it's about as close to bare hardware as you can get in a high-level language), and once you've already learned assembly, you begin to think as you write code what is going to physically happen when it executes. Additionally, having already learned assembly makes understanding pointers a no-brainer. - Learn Lisp so that you can get all of the fundamental mathematical concepts of CS w/o having to deal with the hardware--closures, data structures, recursion, lambda functions, functional programming, procedural, etc. - Learn some hardware design, so you understand state machines at the logical level--mealy vs moore. You never know when knowing the difference might make your code more manageable--when you apply the right one for the job. - Learn regular expressions (not a single class at BYU that I took even mentioned them) - Learn basic Unix and Windows system administration--it can never hurt to know how to manage the tools you're gonna use your entire life. - Learn at least basic networking. Goes hand-in-hand with basic administration, even if you never do network programming. - Learn revision control: CVS, git, bitkeeper, subversion, etc. - Learn software build tools--Make, compilers, linkers, etc. It does no good to learn how to write a program if you can't get it built into an executable. > In the end though, I've skirted the real issue here. You have asked what > Computer Science program is best, but you haven't given us the most > important piece of information: What do you want to be when you grow up? > What do you want to do with your degree? That is a hard question to > answer. I still haven't answered it very well for myself. Me either. There are endless possibilities, and each company, each position even, may only offer a few of them at a given time. Finding the right position in the right company that offers the challenges that are of interest to you can be difficult sometimes. Nick /* PLUG: http://plug.org, #utah on irc.freenode.net Unsubscribe: http://plug.org/mailman/options/plug Don't fear the penguin. */
