<p>I was in the same situation you are: I applied to CS because I built my own computers, played PC games (and tinkered with their mod tools), knew how to reformat my drive, etc. Like you, I applied without having a clue what CS was. I also considered myself to be only slightly above average in mathematics, so I can share in your apprehension there. I'm now finishing my BSc in CS and (hopefully) heading to graduate school next fall. I'll give you some of the insights and experiences I've had (you asked for it - long post!)... hopefully they might help you or other CS potentials. Ill start by addressing the broader topics then narrowing down on the minor details.</p>
<p>What is CS?
Unlike physics, chemistry, art, or music, CS and other technology majors are relatively new. As such, there tends to be a fair amount of flexibility in what you learn. For instance, some departments emphasize computer programming and software design (this may also be an entirely different major called software engineering); others emphasize theory behind algorithms, data structures, and computing. In general, most programs tend to follow the latter with programming as a tool to visualize and reinforce theory.</p>
<p>Computer Science is actually rather hard to define. In fact, Im not too fond of most definitions of CS; as with many other fields, CS is way too broad to fit neatly into a few sentences or words. Some people even object to the science in computer science, because they believe it studies a machine rather than some set of natural laws or truths. Personally, I think people should be objecting to the use of computer in the title. Instead of a bland and hollow definition, Ill offer you my opinion on what a good CS program should do: help you to truly think logically. CS is about recognizing patterns, understanding structure, thinking recursively, and converting thoughts to procedures.</p>
<p>In terms of employability, this means computer science is an excellent degree for any profession that requires you to use your brain! You are not limited to jobs relating to technology at all. You mentioned law: CS would be extremely attractive to law schools as it sets you apart from the liberal arts undergrads, prepares you better for logical argument, and provides greater flexibility in specialization (intellectual property). I think one of my deans mentioned he thought a double-major in CS/Philosophy would be the perfect undergraduate combination for an aspiring lawyer. The point is that CS does not necessarily lead to a programming job like so many believe.</p>
<p>Difficulty & Job Prospects
I think most would agree that CS has a reputation of being a serious field, but the difficulty factor depends upon the institution you attend and your motivation more than anything else. There are real benefits to this reputation: for one, youre far more likely to receive financial aid in science and mathematics than the arts; in addition, you will be in higher demand when finding a job. </p>
<p>One of my concerns when entering CS was the outsourcing issue with India. Ive come to realize this is less of a threat than I anticipated: the issue is grossly spun such that it seems graduates are unwanted. In reality, lots of outsourcing is done a result of this fear leaving a dearth of talent in the industry; the remainder affects the IT sector that deals with what most college graduates would consider menial tasks: customer service, repetitive / simple programming, etc. Do some research on the topic to allay any fears you might have. (Better</a> Job Outlook for CS Grads is a recent article)</p>
<p>Mathematics
The main reason people are afraid of mathematics is that the teachers tend to be abysmal, dreadfully boring, absent-minded, aloof, and in every way detrimental to your understanding what is otherwise wondrous and even enjoyable. Bad mathematics courses are bloated with unnecessary formalism and pointless rote memorization. I used to absolutely dread mathematics in high school; it took one good teacher to turn this around for me. </p>
<p>Unfortunately, you cant rely on having a good mathematics professor, especially in college. Your early courses will likely be taught by a recent graduate who is more concerned with stroking their ego by using arcane notations and memorized steps than enlightening you to the simplicity and purpose of what youre learning. The best approach to learning mathematics (and physics, for that matter) is to understand the context of what youre learning. For example, linear algebra was one of my favorite courses because vectors and matrices are everywhere in computer graphics. Discrete mathematics is useful in artificial intelligence when youre using search algorithms (pathfinding in games). For me, connecting mathematics with applications like this makes it far more interesting and easier to remember.</p>
<p>Heres a must-read for just about everyone on the atrocity of mathematics education:
<a href="http://www.maa.org/devlin/LockhartsLament.pdf%5B/url%5D">http://www.maa.org/devlin/LockhartsLament.pdf</a></p>
<p>Programming & Languages
Your first few classes will likely be programming courses. If your exposure to programming is limited, don't feel behind the curve. Several other science majors (notably biology, engineering, and physics) take introductory CS courses to supplement their degrees, so this is not something you have to know before you enter. At the same time, do not expect a CS degree to turn you into a professional programmer. This is one of the more practical skills under the CS umbrella, so if you have no intention of pursuing research or academia take as many programming electives as possible. </p>
<p>Each department usually pushes one language for programming assignments in the core classes. From others Ive spoken with, the most common languages are C++ and Java (I was taught Java). Around sophomore year, I started looking at job postings and realized that employers were looking for knowledge of languages that I hadnt been taught. Initially, I was rather upset that my department seemingly neglected to prepare me for this. Dont let this worry you; Ive learned that picking up new languages is easy once you know the fundamentals of programming. Some electives let you explore other languages (C and UNIX is common), so keep an eye out for these courses if youre interested in software development. My recommendation is to learn other languages on your free time. This sounds painful, but you dont have to master each language (which, some would argue, is impossible), just mess around and try to recognize differences.</p>
<p>Internships & Motivation
I was an unremarkable student my first two years and even considered switching majors to music engineering or computer animation. Upon reflection, the reason for this was that I was expecting to be spoon-fed everything I needed to know in class and using my free time for anything else. The familiar saying you reap what you sow is cliché, but true. If you spend your entire four years riding the system, you wont truly benefit from your time. Find something that interests you within CS and research it on your own. Youll positively know when youre passionate about something find what that interest is and youll want to learn, not expect to be taught.</p>
<p>Finally, internships are a great way of boosting confidence and affirming your passion. I had no desire to go on to graduate school until after my internship. Seek out and fight for these opportunities.</p>