[The meat of this post was actually a reply to a UAF (Univeristy of Alaska Fairbanks) LUG (Linux User’s Group) mailing-list thread a few months back. It’s been reworked for this blog post. In addition, this post was moved from my person blog, jjncj.com where it was originally posted March 25 of last year.]
I was reminded of this topic by a post on CodeJustin that had a poll about whether or not you went to college for programming. For me the answer is yes and no. I went to college to learn many skills and much theory about computer systems, but 95%+ of what I use in my day-to-day job I’ve taught myself. However, that learned theory has formed a solid foundation for my learned skills.
This has been hashed out many, many times, but I’ll jump into the fray again. If you want a foundation in computer science, and the ability to learn: get a theory-based CS degree. If you just want the skills you need for a job, take a class for it, read it on the web, or take a university course that is more geared toward certifications (for example: see the UAF Info Tech program).
But as to practical skills, the UAF CS program does offer many. If you want to program, take Operating Systems (321) and Assembly (301). Architecture (471) is a good one too. Those classes will make understanding programming so much easier, because you understand what the system is doing as your program executes. If you want to be a network guru, take CS 442 first (or the grad level 642). Will it teach you to set up a windows AD network and configure roaming profiles? No, but it will give you a base-line knowledge level that will make understanding how that network works, and troubleshooting that network, so much easier.
I’ve taken the full complement of CS classes to earn my BS, and almost my MS. There are classes I may never use again. But I’m glad I had CS 201/202 (I’ve used C/C++ since in job and school); 301 (Assembly language; understanding of a computer’s operation); 331/631 (Compiler and language theory; better understanding of how compilers work, and the complexities thereof); 401 (senior project, better understanding of process and project management); Computer Architecture (gives me a good idea of how all the hardware fits together so I understand the system better when working on it); 311 (Algorithms and data structures; will I being doing heavy algorithm design, maybe, but I also know I can evaluate possible algorithms for efficiency and the load they will put on the system); 321 (Operating systems; especially helps when running on “sane” systems such as Linux or Mac OS X); 447 (software engineering: gave me so much insight into the proper ways to go about designing programs. Something I’m about to put into heavy use at my current job); and there are others.
Among the things I’ve learned on my own or via “on the job training”: Python, Perl; SQL; Visual Basic; Linux administration; Apache administration; Postfix administration; a little Sendmail too; general system administration; network setup, with some routing (My friend Todd Medbury could still make my head hurt); hardware/software troubleshooting/assembly; Qt programming; CGI/web programming; Bind (DNS Server); HTML; VMWare Server; Bacula (backup server); as well as other skills I’ve probably failed to mention. I’m not bragging, I’m simply pointing out that taking classes in all those would have been prohibitively expensive, taken a LOT of time, and in the end I would have learned less than my on-the-job training taught me.
For another example of what all that theory got me, see this paper. Careful design and development led to a successful election with software that was designed, coded, and debugged (very little debugging, due to careful coding) in 80 hours.
My point is, with a CS degree from UAF (or another college that is more on the theory side), you will be able to drop into any job and pick up the skills quickly. With a purely skills-based degree, if you do not have the learn-on-your-own-itude that is needed in this industry, you will be totally lost when faced with a new paradigm or language.
Bottom line: if one requires a university class to learn a job skill, then a CS degree won’t do one much good in the real world, whether theoretical or practical.