I just finished my second year in my Bachelor of Science majoring in Computer Science. I fucked around and did absolutely terrible last year. This year I took things a bit more seriously, quit WoW, and my results were a lot better. However since I was such a tool during first year, I've turned a three year degree into a four year degree. Now I'm looking at my last two years and I'm having a hard time deciding how to go about this. There are only so many 3rd year Computer Science papers, and I'm taking all of them except for the stuff I really don't want to do (Performance Modelling and Simulation, and Microprocessor Systems). I've even extended to taking a couple of classes that I'm not super excited about, but feel like I really should know to make myself employable (eg. Database Management - I took Intro to Databases this year and didn't really enjoy it, but I graded well enough). There are like two 2nd year CS papers I didn't take this year, both of which I have absolutely zero desire to sit through.
So what I figured was, I'll take everything in CS that I want to know (most stuff) or feel would help my job prospects, and for the rest I would simply pad it with stuff that interests me, a lot of which has very little/nothing to do with CS. I feel retarded for asking, but am I doing this wrong? I
could take some more math classes, but I generally don't really enjoy math, to be honest (I know, olol CS major that doesn't love math), and besides the Psych class I've picked after being advised by my Human-Computer Interaction lecturer, most of my picks are really disjointed.
What isn't helping is that I really don't have an idea what I'm going to do when I finish university. I enjoyed my Software Engineering class so right now I'm telling myself that I'll be working
somewhere within that field. I'm hoping I'll have a better idea after some third-year stuff.
Anyway,
here's a spreadsheet of what I've come up with. I need 360 points to graduate, 216 above level 1. Assuming I pass everything over the next two years I'll be 44 points over, and I'm only taking 3 classes in my last semester so if I somehow struggle I should be able to tack some more stuff on there.
I know the last year is looking light on the CS side but I'm not super comfortable with having a year away from a lot of these subjects and going back into them feeling a bit rusty.
Any advice would be appreciated.
Posts
Right now after I get through the bottleneck that is Data Structures, I get to dive in to the rest of my coursework, which boils down to (my list of what I want to take):
CS 3850 Object Oriented Programming
CS 4750 Operating Systems II
CS 3150 Nonlinear Systems and Chaos
CS 4440 Theory of Algorithms
CS 4250 Database Management Systems, 3 units
CS 3000 Communication Networks, 3 units
CS 4450 Coding and Information Theory
CS 3740 Computer Organization
CS 3750 Operating Systems I
CS 4100 Programming Languages (WP)
CS 4300 Compiler Theory
CS 4410 Automata, Computability, and Formal Languages
CS 4800 Software Engineering
CS 4960 Seminar in Computer Science
As long as you're not gonna go nuts with too many, or too few CS classes, you should be fine.
See how many books I've read so far in 2010
This is exactly how I feel about it. I actually quite enjoyed the stuff that I was learning in my Discrete Math intro class. But I'm not particularly strong on math so a lot of the work that went in to proving my understanding wasn't much fun.
You brought up something that I'm not really sure about. I have Discrete Methods and Linear Algebra classes available to me, but to do Linear Algebra I'll need to take another math class next year to meet the prerequisite for the class. I've heard people suggest linear algebra for anything involving video games (I'm sure it has it's uses elsewhere too :P). Like I said I'm unsure what I'm going to do after uni. Working in game development sounds cool though honestly I could take it or leave it if the opportunity was there. Am I going to be kicking myself years from now if I don't learn some of this stuff?
Does your degree program support internships? That will do a hell of a lot more for your job prospects than any course you take. Also, networking. I finished a BS in Computer Engineering in 2005 and not having an internship or any industry contacts has really screwed me over. Aside from that, Real Time Systems and Introduction to Computer Forensics were probably the only interesting courses I took that weren't on your list, though it depends entirely on the course instructor.
Chances are you won't remember the majority of the math you learn if you aren't using it for years. Supposedly I learned Inverse Laplace transformation, but I'll be damned if I can remember what any of it looks like. Having text books handy helps, but you'll probably need a refresher if you use any of this math outside of college.
From what I remember of discrete math, it was pretty easy and a lot of it was rehash of what you've probably already done numerous times (boolean operators, combinatorics and the like). There have been times when remembering some of the more math-y points of the subject would have been useful, but nothing to lose sleep over.
As far as what you might do after graduation, software engineering is pretty much synonymous with computer programming, so that's the go-to title. The differences between jobs would be the types of software you're supposed to be engineering. And I'm guessing you're not really into hardware (skipping Microprocessors), but neither am I, so I can't really give any advice there. I guess there's also research and further degree programs (Masters/PhD) that you could go into as well.
Take this all with a grain of salt though, as I graduated this past spring with a CS degree and can't find a job to save my life. I've been targeting the games industry, but apparently I don't have good enough math skills and I don't orgasm when someone mentions "C++" and spit and swear when any other language is mentioned (slight exaggeration). I also can't seem to find work in other fields because I don't have experience with all the new Web 2.0 technologies.
My suggestion is to go to any job fairs your school holds and see what's out there. Also, if there's a particular field you're interested in (AI, or Graphics, or whatever), talk to those professors about what kinds of jobs you can look for and what classes are really important for those fields.
And it's also not bad to take classes you actually enjoy instead of "more CS classes for the sake of CS." It helps round out your education and gets you into a more diverse classroom setting at least. Looking at your schedule, though, I'd be a little uneasy about the lack of CS courses the last year too. If I were you, I'd probably end up taking some math courses.
My reasoning was two-fold: I felt like I needed a break my final semester before getting into the workforce, and I figured a lighter schedule would give me more time for career fairs/networking/job placement/etc. Like you mentioned though, make sure you stay polished on your skills even when not using them. I would HIGHLY recommend either taking a class on the newest web tools (AJAX, REST, etc) or learning them yourself, as they are in incredibly high demand right now and development seems to be moving away from desktop applications. Are you classes based on .NET, Java, or something else?
Based on interviews I've seen and the way I interview people for positions here, it's most important to understand the concepts (OOP, for example) but also how to implement them in the language(s) they use. We will hire people who show good understanding of the principles but are light on actual programming experience, but not the reverse.
I have to say, I work in business development and I've already forgotten most of the advanced Calc and Diff. Eq. stuff I learned. I suppose if necessary it's easier to pick them back up than learn them new, but unless you plan to get into specific fields, I don't think you'll be hurting yourself by forgoing the extra Math.
What Ganluan has said is pretty much what I keep hearing, especially from friends working at Microsoft, IBM, etc. Knowledge of the concepts and fundamentals is key, knowledge of syntax can be learned anytime. If you know the concepts, you can switch to a different language fairly easy. The converse is not true. That and knowledge of algorithms. Big companies love a good knowledge base in algorithms.
See how many books I've read so far in 2010
Aside from that, take stuff that looks interesting and then see if that leads to a job. Don't take courses you hate in order to be "more employable", because what you are doing is making yourself more employable in a subfield that you hate. If you don't care about (for instance) graphics or GUI, you can still get jobs doing (for instance) embedded systems work. If web development doesn't interest you, there are other jobs. You get the idea.
edit: also, getting some internship or, failing that, a research assistant position over the summer or something is crucial. Schoolwork alone generally doesn't help you learn to deal with huge codebases and groups of people.
Plus I work full time, which is non negotiable since I have a wife and 2 kids.
I've applied for an internship at Lawrence Livermore Labs, which a) is more than likely fucking hard to get into and b) nearly 2 hours away
See how many books I've read so far in 2010
As for stuff I'm not taking, after looking more closely at what I'm skipping, my only real option is Microprocessor Systems. Like databases, I didn't enjoy the prereq but graded reasonably well in it. But I'm working on the assumption that a sound understanding of databases is very important, whereas I have no interest in microprocessor systems and am hoping it won't be so necessary. Not to mention, fuck assembly.
Mostly C/C++/Java. For most assignments we're given a choice, and I'm a bit more comfortable in C++ or C, though for my software engineering project this year we were told to use Java. I feel reasonably comfortable with OOP in either C++ or Java.
Yeah, during first year when we were being taught the principles of OO, this is what the lecturers kept saying. That despite learning it in Java, the class wasn't about learning Java, the class was about using Java to gain an understanding in OO. I appreciated that a bit more while learning C++ this year; feeling comfortable in C and with OO in Java, picking up C++ was pretty smooth. I'd like to think I'd be able to transition into other OO languages relatively easily.
Yeah this is basically how I've been trying to approach this. Considering I wasn't getting super excited during much of my intro discrete math class, I'm questioning whether it's worth spending another 3 semesters (I need 2 semesters of level 1 math to even meet the prereq for this Linear Systems class) studying it. My biggest fear being that if I have difficulty maintaining an interest, I'll struggle, which is partially why I did so terrible first year. I guess my big concern is that a lot of this linear algebra stuff teaches concepts that I need to know, even if I won't be explicitly using it.
Thanks a lot for the advice so far, everyone.
For reference, I'm a programmer in the game industry.
Okay, well I'm rearranging some classes to fit in the prerequisites to be able to take Linear Systems the year after. It involves dropping some random interest classes (ie. philosophy stuff), but my timetable is starting to look a lot more sensible. Discrete Methods will also be available to me the next semester, and I've put it down for now.
I'm really only doing this to cover my ass. Like I said, I'm unsure what I'm going to be doing outside of university. I always liked the idea of working in games but it's hardly my lifelong dream, and I've heard a few negative things about working in the industry (really hard to get in to, relatively low pay rates, long hours/tight deadlines, etc), though I don't know how much of that is true.
I'll pick up a text book and see if I can get a bit of a handle on this myself. As far as I'm aware none of the courses available to me use/teach .NET.
I definitely have a much clearer idea of what I'm doing for the next two years now. Thanks a lot for the help, guys.
So you shouldn't let that stuff scare you off, but at the end of the day what makes you happy as a programmer in this industry is solving technical problems. At the end of the cycle you've got a game, but your day-to-day satisfaction comes from the same place as in any other programming job.