I will be attending college in the near future and would love to be prepared and ahead of of the curve.

Will be attending to get a BS in Computer Science. Are there any recommendations on what to read/study before starting classes? I already started reading some books on C++ and will be starting with some java books next along with python.

I already have some experience with ruby, building my own little set of programs to help me with tasks I do often, I can read some code in different languages and will most likely port my existing programs in ruby to different languages as I learn them.

Is there anything you can recommend me learning/doing to make college easier and/or more enjoyable?

+2  A: 

Introduction to Algorithms from MIT Press. They will make you read it at some point anyway, so start now.

I was assigned this book in my algorithms course and never had to crack it open except for homework problems. Then again, most of what we covered were conveniently put on PowerPoint slides.
Bryan Denny
Starting with something lighter like Skiena's Algorithm manual or some other book that focuses on algorithm design rather than analysis is a better idea.
+7  A: 

I am a senior and if your college is anything like mine, you are already ahead of the pack by studying these things on your own. Most likely your college will be teaching Java at a beginner's level. Maybe you will see some C++ the year after that.

The one thing I would recommend is: keep learning on your own. If you only follow the curriculum you will probably get bored. Learning new stuff on your own will keep you ahead of the pack, and inspire awe in your college peers. :)

Aram Verstegen
"Keep learning on your own" -- This is the key to a successful life.
Chuck Conway
+8  A: 

I think the main focus should be on mathematics. Take into consideration that you will be doing very little coding, especially in the first year, since most of the courses will be of mathematical nature.

You might want to refresh your memory about trigonometry, functions, algebra, complex numbers, etc. You will also find out that once you get to the theoretical computation subjects, such as algorithms, data structures, computation theory, automata, etc. you will find out that a strong mathematical base will do you a great deal.

Once to get to the more hands-on programming courses, I think you'll be fine with the knowledge you have right now.

For now - stick to the math.

Yuval A
Thanks for bringing math up, for some odd reason I hadn't thought about it even though I knew it was necessary. I will be looking over at a sample 4 year plan and studying the math stuff, especially since I have been out of school for a while and my math is rusty.
Trigonometry? That never came up in my CS degree!
Philip Morton
@Toytown Mafia, most decent CS programs require at least Calc 2. If you don't think you'll use a ton of trig there you are crazy.
Many developers don't have degrees. Math isn't a big part of programming (unless you are field specifically math intensive). However as Yuval points out -- algorithms, data structures are important.
Chuck Conway
@Simucal, that all depends on what field you go into after the degree is attained. I have dug through some very nice libraries and never saw a single Calc function. I am not saying that Calc is not important mind you. I have seen gifted mathematicians write horrid code though. -1
@WolfmanDragon, Oh, I agree it isn't prolific. And I'm not suggesting it is that important to most developers. I was simply stating that most CS programs require calc which in turn requires trig.
I honestly see people implement Calc in their programs without even knowing it. When you write a game and it has some basic gravity/physics they often write Euler Integrations without knowing that is what they are doing or they are called. They kind of come up with a version of it on their own.
Math is vital to computer science - it's just not the standard math course sequence. Learning any math will help, of course, but learning CSci-related math will obviously serve you better in the field.
David Thornley
Calc is surely fundamental (heck, I'm an engineer), but I'd suggest to focus on abstract algebra and logic. While calc is an essential tool to carry around, algebra+logic are essential to deeply understanding programming and not getting lost in stupid stuff like "which language is the best?"
+1  A: 

I'm going to go against the grain here, and say that you should study up on the important, but not directly CS courses you will have to take.

If you already have a decent understanding of all the often disheartening basic knowledge courses (Calculus, Physics, Matrix Algebra), they won't seem as discouraging. This will also give you more time to discuss computer science itself with your professors and fellow students during your time there, which will certainly help

Michael Walts
+6  A: 

Joel (on software) thinks that what's the most crucial is a good understanding of pointers and recursion sets the great developers apart from the merely competent ones. I tend to agree.

So, get some experience dealing with pointers and recursion.

If you want a practical project to work on, implement a Sudoku solver in C. Or do some recursive graph algorithms in C; nothing fancy, just a DFS to get started will be fine. Then go from there.

Jonas Kölker
Recursion in C? Is the point to learn about stack overflows (if it ever gets that far into the recursion)? I'd try to use loops instead, and leave recursion for tail-call optimised languages.
"tail-call optimised languages" -- Such as C? ;-) it's a property of the implementation, not the language; gcc optimizes tail calls.Would you really prefer a loop and manual book-keeping of a stack rather than recursion? Why?
Jonas Kölker
+4  A: 

More important than what you brush on is getting your life in order.

If you are the type of person who is motivated enough to study on your own to learn more about computer science, you no doubt have great potential in the field, but you must be willing to dedicate yourself.

You don't need to learn everything before you go to the class, in fact sometimes going to class with a clean slate can help, but you have to make sure that you have all the time in the world to explore the things you are taught in school.

If this truly interests you, Make school your first priority don't crowd your schedule with other things that will take your concentration away from school. Learn it all, apply it, expand on what you learn, and you will become very skilled and knowledgeable in your field.

Of course, have fun and try other things, don't miss out on all the great extra-curricular activities available in college life. Just don't let any commitments be a blockade for your exploration.

The more you can concentrate, the more ideas will come to you, and with those ideas will come opportunities.

When its all said and done, you can continue to a successful career in industry or learn more by getting a masters or PHD and doing research in the future of computer science.

CS is an unlimited field, with infinite potential. If you are one of the lucky people who enjoy it, you can reap the benefits.

Best of luck, T.J.B.

At the same time, you should make sure that you don't miss out on all the other stuff which is part of the uni experience. There are far too many people doing CS who don't socialise at all and are worse off because of it.
Philip Morton
I agree. You should partake in other activities, as long as there is nothing to stop you from your explorations when you feel the inspiration.
+1  A: 

Reading your post, I think you're doing great as is :) .

In any case: a question was asked on stackoverflow before, about 'The Most Influential Books that Every Programmer should read'. It's a great reading list and I think is what you're looking for.

Thank you for that link, it has been bookmarked so I can read it later.
+3  A: 

It was a while ago now, but when I asked my soon-to-be-professor about what to read to prepare for my CS undergrad course he recommended Gödel, Escher, Bach by Douglas Hofstadter.

I'd also throw in Knuth.

The basic idea here is that a CS degree should be about teaching you to think about computers, computing and the science of development, whether software or hardware. Don't get too hung up on any particular language or operating system. Learn the generic foundations well and all of that specific stuff will get built solidly enough eventually.

I have never heard of this book, I will be getting a copy. +1
If you are suggesting "The Art of Computer Programming" as a good set of books to prepare for college it is obvious you have never read them.
And I think if you've read TAOCP and can't see its relevance to, erm, Computer Programming, then you've neither developed properly nor passed CS degrees. YMMV.
Godel, Escher Bach is GREAT. I read it tons when I was in mid school, though I'd gloss over the lisp a bit (when I go back these days, it makes a lot more sense)... the concepts in this book are wonderful. Very recommended!
Alex JL
+1  A: 

Take an elective subject or two from the psychology department so you can learn more about what makes people tick (after all, it's people who will be using your software and who you will need to interact with every day to get your work done) and also to meet some people from outside your main study area.

Chris Latta
+2  A: 

Personally, I would balance all that theory with some practical experience, and one that might even make you some money. Far better to spend your vacations programming than waiting tables. (For my reasoning, read Malcolm Gladwell's latest book, Outliers, and realise the importance of getting your 10,000 hours experience in your new subject.)

So my suggestion is to write an iPhone app. And don't just do something quick and easy - set yourself the goal of writing a decent app that people will actually buy. Perhaps a game if your talents lie in that direction.

Many college projects are short and designed to teach you a single point. Getting involved in a real project will teach you real-world skills, like structuring a large body of source code, writing unit tests, debugging, improving performance, reducing memory usage.

A successful app in the iPhone app store would also be the route to almost any job you wanted, after college.

Jane Sales
Writing code is definitely more interesting and useful than studying automata!
Philip Morton
Studying the automata will serve you well in the long run, though.
David Thornley
+1  A: 

Math Classes

I found the computer science classes to be easier than the math and science classes. Making sure your math skills (especially being fluent in algebra, which makes calculus so much easier) are up to speed is a good idea.

Mark Harrison
I agree about the algebra. If you aren't an algebra master by the time you enter calculus you certainly will be by the time you get out (if you pass). After taking derivatives all day long your algebra skills sharpen pretty fast.
+4  A: 

The basic principal of programming is logic. While mathematics are important, there are libraries for most mathematical functions. There are no libraries for good, cohesive logic though, it's just you and the compiler.

Aristotle, Gödel, Cantor, Nietzsche, Lotfi Zadeh have much to say to the beginning CS students. We build our work on dreams and thought, these are not always in agreement with logic. Know the difference.

Social skills. What is CS but communication? Many times we forget that computers are built to help people, they are not a means to themselves. How can one be successful in the the CS field without the ability to communicate with machine, techie and layman alike.

and, sometimes, you also have to communicate with the client... the perfect chaotic beast ;)
+1  A: 

Make sure you don't totally fill your life with math/cs/engineering classes. Be sure to have something else going on as well in order to take a break and think differently every now and then. Get out doing music, art, sports, camping, volunteering, whatever, just get away from the keyboard once in awhile.

Shannon Nelson
+1  A: 

Learn in your own spare time, outside of lectures. You'll be surprised at just how much you learn there, vs inside your lectures.

Mark Ingram
+60  A: 

Enjoy your first year. Go out, have fun, party, stay up late.

However, when it comes time to buckle down you have to be disciplined. This is the stage I've seen so many of my peers fail at that I think it is important to mention it.

Especially for people who sailed through high school. The people who never had to study, who completed their homework before the period ended or who aced all their tests. All that talk about not having "study habits" ends up being true. Some really smart people end up figuring this out too late when their grades are shot or are severely behind.

I'm going to tell you the secret to success in higher education:

Treat school like a 9am - 5pm job. Even if you don't have class until noon, wake up at the same time every day to keep the same sleep schedule. Go to the library or favorite study place and do homework until your class starts. Same if you get out of class before 5. Go finish your homework or your assigned reading until 5.

This is a really neat psychological trick. When 5 o-clock rolls around you can call it quits and do fun stuff your entire evening. Play video games, flirt with girls at the other end of the dorm, whatever. Everyone else you see will be stressing, doing assignments until the wee hours of the night. They'll look at you and wonder if you ever study.

This same advice was given to me before I went and it has served me well.

That's sound advice. If only I was that discipline in college.
Chuck Conway
I'm gonna try that, thank you!
Aram Verstegen
I agree with you Charles, this is some great advice that I will definitely be implementing, thank you.
Now this I do agree with. +1
This is the best advice I have heard, esspecially for first year.
Nick Presta
+1 wish I would've done that
Rex M
I did something similar at university - got through my entire degree (with, I think one exception) never breaking my "don't work past 8pm" rule. Helps with study-life balance, which seems a good character-trait to carry into working life after university.
Dominic Rodger
+1 - I like your "Treat school like a job" rule - good idea.
Mark Brittingham
I wish I knew about this four years ago! :)
Bryan Denny
Bryan .. this is what I wanted to say! :)
hasen j
sound... i'll try it
The only problem with this is that some colleges require time spent after 5pm on work. I would take a break from 5-10 and then work from 10-2am if I needed it, otherwise I would be sleeping. This wasn't all the time, but sometimes it was necessary.
Hey, what a neat idea!
You should mention that not only this increases the chances of succeeding, it also makes it a lot easier (though it may not seem so, once you do it you'll understand).

Know how you learn new material and what kind of electives,i.e. non-Comp Sci, classes you think you'd excel in taking. Languages like French or Spanish or Arts like Psychology or Sociology or Humanities like History or Geography are just the tip of the iceberg. Know how you'll live and if this requires certain elements as dorms when I was in university had some "quite houses" as they called them where noise was controlled and tended to be where alcohol wasn't common. By the learn I mean do you pick things up by book, orally, visually in pictures rather than words, or some other method? Would having the course notes in front of you and making notes on them be better than working with empty pages and taking notes that way? Are there practice exams for the courses which are the evil multiple choice exams of choosing the "best" answer where a few seem like a good one but one is slightly better and thus they can be a major pain.

Keep your eyes and ears open for research that your professors are doing that you'd like to get in on and ask if they would take an undergrad at whichever year you are as that can be a very nice way to move onto better stuff and possibly get paid for it.

Last but not least, see what social groups you'd like to be a member of and what activities are there for you to possibly take in before you get to school. I remember there being lots of free talks that various clubs put on where a professor would get up and give a talk about some new research going on or some other strange thing that made for good brain food in a sense. Do you like card games like Bridge? Are you athletic and competitive enough to play on the school team or would you rather have a more fun time without so much competition?

There are a few different worlds to university and colleges. Find the ones you enjoy and make them rock for ya!

JB King
+1  A: 

Try to meet as many people as you can. Practice this and work at it like any other skill. College is the easiest time you'll ever have meeting interesting people with similar goals/interests as yourself, and try to establish relationships with as many of them as you can.

Besides the fact that is sort of enjoyable, the more people you know the easier it will be for you to find jobs, relationships, advice, etc down the road.

+5  A: 

I'm graduating with a BS in CS in June, and this is what I think I learned:

a) If you're planning on working in the industry, as opposed to academia, you will want to take full advantage of any internship/coop opportunities your school offers. I'm at a school with 3 mandatory 6 month coops, and I've learned more there, than anywhere else.

b) Use your knowledge of Ruby and other tools to your advantage. Ask your professors if you can complete assignments with it. You'd be surprised how many professors will let you, especially after your first year. This can give you a huge advantage over your classmates who may be using less expressive languages.

As an example, I completed the final project for one course in 2 hrs by using Ruby on Rails instead of Java. I wrote a total of 60 lines of code. We had half the term to complete this.

c) Use your knowledge of Software Engineering to your advantage. They never taught us how to write unit tests, but I've saved myself and my team tens of hours of debugging by doing so. As another example, Agile principles will help you keep your priorities straight.

Good luck!


During the last 1-2 years of high school, I barely did any homework and still got quite good grades in math and physics courses (9-10 out of 10). In the final exams this slacking affected my math and physics grades by maybe about one grade.

So when I entered university, I was not mentally prepared to study. During the first autumn I failed one math course and got the minimum grade from another. The programming courses were easy, since I had written a couple small programs, so getting full points from those was very easy. But only after failing those two math courses did I awaken to the need to study. Starting from the following spring, I did all my homework, so that I really understood all the things, after which getting full points from the courses was not too difficult.

(During the last year I've again been slacking - I have finished all the required courses, but I still need to write my masters thesis. At this point it's too easy to do work, hobby projects and hang around in SO etc. instead of writing the thesis.)

The lesson is to get ready to do work. Do all the homework and study until you understand the theory fully. The first CS courses are easy, so first put more effort into math and try go get all your math courses finished before the harder CS courses appear. Also it's good to have some work experience while studying, since it helps to put the things into practice, but try to avoid getting too occupied with real work, or your studies will not progress.

Esko Luontola
+1  A: 

Find other interests as well to balance the CS. Take classes in business and other arenas. Have lots of fun, learn, meet as many people as you can. Go find some research projects - and not necessarily in CS department - many other graduate students might need the help of a developer for their research.

The university's job is to guide you through your education. They usually do an ok job but you have to take a lot of the initiative and make the experience all it can be. Don't be passive. This can mean anything - from being a social butterfly in college or a partier or a non stop studier - or all of it.

Have fun, it is a great experience.

+1  A: 

Get involved with an open source project that you like (perhaps ruby based). If they won't let you contribute code or patches, volunteer to write some tests or clean up the docs.

Ray Tayek

School is for getting good grades. Just get good grades by memorizing things. Do all your learning outside of school.

Joe Philllips

I think the only piece of advice I would give would be not to stress too much. As was mentioned before, the fact that you're even thinking about preparing sets you ahead of the pack. When I started college, I had read a couple books and fiddled around a little bit, but hadn't really accomplished much. Even having done as little as I had, I was amazed at how little my peers had done. And that little bit helped me to understand topics as they were actually taught much better than some of my peers who had not done anything before college. Hang out here, have fun, and you'll do fine.

Also, if you're going to a Java school, spend some time on your own to learn C or even C++. I think its well worth it.

Jeff Barger
+1  A: 

Get sleep. I found that the people that planned on getting plenty of sleep did the best on tests, were better able to concentrate, etc. It is easy to have a crazy schedule and not get enough sleep. This will be a huge problem. Get enough sleep.

I wish I could give this more than one vote.
Paul Fisher
+1  A: 

I recommend picking an interesting minor, because at some point or other you are going to get tired of all of the math, physics and computer science classes and will want a slight change of scenery.

I, for instance, am minoring in History, with a personal focus on modern European history (post 1865). I personally chose this because I think it is important to know how we got to our current state of affairs to begin with. I can't express how much I've learned from classes on the Holocaust and Eastern Europe. I was even lucky enough to be able to experience a Holocaust survivor coming before one of my lecture classes and taking questions from students for an hour and fifteen minutes on about what she lived through.

So again, don't be afraid to take some classes in some other subjects that interest you outside of computer science.

Bryan Denny
This is very true, I'm from the same school of thought that thinks that your minor should be in something that you are interested in but don't want to purse for a career.

Something that you might hear people say is that "College is what you make of it," this is very true. If you go to college and do the bare minimum necessary to walk the stage and get your degree, then you will likely have a negative opinion of the time and money that your are soon to be investing. However, if you pay attention in your classes, take a minor that you are interested in, join a club, and try to get involved outside of college.

If your college has night school classes, then I would highly recommend taking a couple even more so as you get closer to finishing your degree. The students in night school classes tend to be several years removed from the "college age" and are more serious about their studies, but will also tell you things that you need to know about what life is like outside of college. Also, if the upper division classes can be taken for graduate credit or undergraduate credit, then you will see professionals that are working towards their Masters degrees. This is helpful to you for networking as they might be able to help you find a job when you get out.

Also, try not to take everything too serious while you are in college, one thing I hear people say from time to time is "If you can't look back on your college years and laugh, you did it wrong." When you get done with school you should have some stories to tell people that don't involve going to class and studying all of the time. Outside of that first job you get and maybe graduate school if you go right away, nobody cares as much about the grades you got, but they do care that you finished your degree.

+1  A: 

Here's what I recommend doing to make the most out of your experience:

  1. Get a part-time job in programming, or do internships. This, in my opinion, is the single most important thing you can do. When you are looking for jobs when you're done with school, experience is king, and employers really favor people who have done internships or have any work experience. Doing real programming work gives you a feel for the industry, and it'll give you much more perspective about the things you'll learn about in class.

  2. Join the ACM/IEEE Student chapters, and really get yourself involved with those organizations. If they have programming contests, do them.

  3. Sit in the front row, and make sure every professor knows you by name. If you ever apply to grad school or need references, then this is important.

  4. Keep the GPA up. To get a good job, this helps quite a bit. There's some certain magic cutoffs, like 4.0, 3.8, 3.5 and 3.0. I've read that IBM doesn't accept anyone whose GPA is below a 3.0. Similarly, if you're ever interested in med school, law school, or business school, then having a high GPA helps tremendously.

  5. If the university has opportunities for tutoring lower-level computer science classes, then do it. You'll learn about the material far more than just by taking classes alone, and you'll probably make money while doing it.

  6. Read books about programming. There's plenty of good reading lists out there. So many people try to learn everything from the internet, and don't read books. This really can help distinguish you from your peers.

  7. Learn new languages on your own, and make up your own programming problems. You are your own best teacher, so take advantage of it!

  8. Learn how to use some IDEs, and try to get good using the debugger. Do not be like me and println() your way through college. You need to be able to trace your code and understand what it does.

  9. Have fun and meet lots of people!

David Hodgson

If you do not like it, do not specialize in it. Still you must have a disciplined approach = you should be able to study even the stuff you dislike.

+1  A: 

When you go to college, get involved. A professional society is a great way to meet people from your major socially, and also to get opportunities for internships, part-time jobs, or full-time work after you graduate. Your college might have an ACM branch or an IEEE branch that might be able to help you. (I know this because I'm in one.)

<advice style="preachy" tags="not-programming-related"> Also, don't be afraid to try things in general you've never done or considered before. (I joined an athletic team after having not done anything sportsy at all in high school.) It ends up a lot more fun that way. </advice>

(DISCLAIMER: Technically, I don't know if this is the "best" way to do things in the end. I'm just having fun right now. And I seem to be having reasonable success in the learnin' part of the equation too.)

Paul Fisher

How come no one said this yet?

Get a laptop with a decently large screen... like 15-inch and is not too heavy.

Good luck with college! =)


Find the best professors

One good suggestion I've heard (not CS-specific) is "don't look for great classes; look for great professors." Find out who the best ones are, and take everything you can from them.

Nathan Long
the best ones usually won't be giving out the most A's. Never shy away from a tough class. do your best and take a C if need be. learn stuff at school, don't just take easy courses to get A's.
San Jacinto

As others have said, Math. More specifically:

You can't get by without algebra. period. Trig. will help you in Calculus courses you'll need to take. The calculus courses are invaluable, not so much because you'll be programming calc formulas all the time, but because much of higher math (stats, etc.) uses calc at its foundation. don't slouch away from the calculus! if you want a job other than coding websites or user interfaces (not that there is a problem with that by any means), then you are going to need to know math.

also, pay VERY careful attention to your discrete math course(s). the concepts you learn in there will also be invaluable.

San Jacinto