views:

555

answers:

16

I am a college student going home for a five-week Christmas break. What would be the best thing for me to teach myself before next semester? Options:

  1. Reviewing/cementing things I've already learned. I've taken classes in C, C++, HTML/JavaScript, SQL, and Discrete Math, some going into more detail than others (obviously).

  2. Learn something ahead of time. I'm planning on taking classes in C#, COBOL, Java, and PHP/ColdFusion.

  3. Learn something I won't learn otherwise in college. I don't know if I should add anything else to my plate, but I would eventually like to learn Python and regular expressions.

  4. Do a project. I'm not sure what kind of project would be able to be completed in 4-5 weeks.

I left the choices pretty general, and I'm open to other computer related options. Thoughts?

A: 

My suggestion re #1 and #2 would depend on your success in the classes. If you feel you already learned the material (and have the grade to prove it) then I'd suggest #3.

But if you felt dissatisfied with your progress (or with the class) then I'd do #1 and firm up the weaker areas.

joel.neely
+2  A: 

My suggestion is to start a small project that you can get done in 4-5 weeks. I find learning new stuff of little benefit unless you sharpen your skills periodically.

AraK
Wish I up vote this some more...
Rev316
+8  A: 

Follow your passion. Read and learn about whatever it is that excites and interests you the most. Don't worry for now about what you "should" learn.

FWIW, the best, and really only way to learn a programming language is to actually use it.

RickNZ
+2  A: 

Here are a few ideas. Obviously, time off between semesters is a good time to relax and recoup, so take these as nothing more than well-intentioned suggestions and find ways to enjoy the break :)

  • Learn a scripting language. Python is fantastic (my personal favorite), but Perl would likewise serve you well. Professional projects you encounter in your professional career may have features written in a scripting language; it will help pad your resume and give you some good experience to learn one. You might also find some tools which will help you in future classes. Perl helped me in two networking classes when I didn't want to deal with parsing huge files in Bash :)

  • If you don't have any experience working with a different OS, get some. Install Linux if you haven't already and setup a few services. Being able to program is a fantastic thing; understanding how/why things work on various systems will give you a solid boost.

  • Check out an Open-Source project and review the code. Often you'll learn a lot simply by reading and attempting to understand other developers' code. Heck, you'll have to do it anyway when you're a professional so it's good to get accustomed to it ;)

  • Get together with other programmers in your area and share thoughts/ideas/experience. I really wish I had tapped into the tech communities where I live before my life became so busy with work and a family. If you can't find a local group to join, consider forming your own.

bedwyr
I do have XP/Ubuntu dual-booting on my notebook. I agree that it is a really good experience; I need to mess around some more with Linux.
Master Zota
+5  A: 

My vote is for #3. School was fun and all, but almost everything I actually use in the workforce I learned outside of school. Unless you're in trouble in school and need to do homework, I suggest learning something fun over your break that may actually be useful to you post school.

Jeremy Raymond
I fully agree with this post. You should seriously look at regular expressions if you want to learn something fun and extremely useful. You can use Regex for so many things once you learn how powerful they are.
Tinidian
Actually I think while in school, what help me the most in school (for programming projects/assignments) was stuff I learned outside of school.
Jeremy Raymond
A: 

Learn what is current in the industry. I just came out of college and for the most part I felt that college was a few years behind in what was being used in the industry. It is really up to you to make the initiative to learn the latest technology.

If you are interested in working for a certain company, find out what that company is using and create a small project to help yourself learn the technology. If you are interested in working, start using your free time to search for internships.

Eric U.
+1  A: 

I see nowhere on your list of classes taken, or that you plan to take in the future, a good grounding on algorithms and data structures (you may have gotten a little in "discrete maths", but probably not very broad nor deep coverage). That's not just "one more technology", like that interminable list of programming languages -- once you master it well, it's stuff that will serve you faithfully throughout your professional life (exactly what structures and algorithms the languages, libraries and frameworks will provide, and which ones you'll have to program yourself, varies, of course - but, in either case, a good understanding of what's going on is precious).

Besides the fundamental stuff (lists, trees, graphs, hash tables, ...), if you have spare cycles left you could also usefully get some basics in probability and statistics, numerical algorithms (matrix multiplication, interpolation, linear systems, Newton-Raphsom, ...), distributed algorithms. Really, data structures and algorithms are really the meat and potatoes of our profession -- MUCH more important than knowing nine programming languages rather than just eight;-). (You could say programming languages are the forks, knives and plates that make it more sensible to deal with said potatoes and meat, but that might be stretching an analogy a bit too far;-).

Alex Martelli
I actually did take a course titled "Data Structures and Algorithms". It went through the basics (searches, sorts, lists, arrays, pointers, etc.) in C. I actually do need to go back through that book, though.
Master Zota
Alex Martelli
Yeah, go back through the book. It's very likely you'll get asked about data structures, and it sucks not to be able to say how you'd validate a Binary Search Tree or improve search performance on a singly linked list.
danieltalsky
+1  A: 

My vote goes to #3 and #4. Look into Django, its a Python based web framework. You can kill 2 birds with 1 stone and its fairly straight forward with 0 exposure to web programming.

Woot4Moo
A: 

Lore has it that BDFL wrote the initial Python interpreter over a long holiday vacation. Instead I suggest you learn Python during these 5 weeks.

There are many good reasons for learning Python, in general, and it seems to make even more sense in the context of a formal (if only self-guided, in part) CS education. The most compelling ones may be the fact that Python introduces many programming paradigms and that its interpreted and dynamic nature make it easy to try small snippets interactively.
Also, Python comes an extensive standard library as well as additional libraries for just about anything: this makes it easy to whip up small programs in any domain that may be of interest to you, be it video game programming, controlling a telescope or a web application. The key is to do something that you are very interested in, after all this is a vacation too ;-)

In January, when you return to school, I encourage you to visit your academic adviser and maybe alter your intended course load. I see a lot of redundancy in there, for example Java AND C# (one of these should suffice; better doing more in-depth in one of these), also some possibly outdated stuff (COBOL?). While being "polyglot" is a good thing, with natural language as well as programming languages, you should maybe focus on going "deep" with only one or two languages (you got a whole career ahead of you to learn other languages), and also on learning more fundamental CS concepts and their related math abstractions.

mjv
+27  A: 

Speaking as an old-timer who hasn't had a college break for fifteen years....

Learn to surf, or to snow-board, or to do breakdancing or DJ'ing, or ANYTHING else other than programming.

That's what breaks are for.

Andrew Shepherd
Yea, do something outdoor or at least something you don't just sit in front of a screen. A break like this might give you inspiration in your programming related stuff.
o.k.w
Why would that be an either-or proposal ? That's what laptops are _really_ for: to bring along at the ski chalet ;-)
mjv
I'd say Hang with friends and family. You have the rest of the year to be a hermit!
micmoo
Hobbies can become a great source of side-projects :-)
CaptainCasey
A: 

Continue your HTML, Javascript and SQL education by learning PHP, it takes next to no time at all. If you already have a good understanding of Javascript the next best place to go would be jQuery, it's a magnificent creation. Both of these are pretty easy to learn and there is a lot of code and tutorials floating around. The PHP website and jQuery website will be your best friends. For some really great jQuery examples head on over to AjaxRain. To incorporate SQL easily into your PHP projects try the Adodb library, it's fantastically simple and very powerful.

Ambrosia
A: 

If you are still in your early year in the university, I suggest you get a very broad awareness of everything. Go to your local bookstores, and note all computer related titles. It could be Ruby, JVM, Groovy, Erlang, Rails, SVN, Git, Oracle, .NET, SSL, RegEx, Django, Lua, Adobe Air, Silverlight, Apache etc. Go home and do research on them.

It's quite a relaxing exercise, and lets you follow a lot of discussion on many boards.

idazuwaika
+2  A: 

Functional Programming (Haskell, Erlang, F#, Scala)

geoaxis
+1! He's studied C/C++ and no functional languages. This would be a real eye-opener.
CaptainCasey
+1  A: 

Andrew has my primary fear covered: Do something that isn't programming.

Now, assuming you've got that covered, breaks are great and all but you probably will get bored, eventually. If (and when) you get bored, I say #4 but with a small change: Start a Project with someone else.

There are a couple problems with doing a project all on your own:

  1. You probably don't know everything you need.
  2. You (hopefully) don't have time to learn everything you need.
  3. Once you learn something, doing it still takes time and you will run out.

Getting someone else involved, especially a friend in the same program, gives you someone else to learn with, someone else to challenge you, someone else to hold you accountable and someone else who is getting things done! Moreover, programming with someone else (reading their code, explaining yours, working with a VCS) is incredibly valuable experience to an employer. The days of hairy-knuckled solo whiz developers is over; we need to be social!

My suggestion: set up meetings each week:

  1. A planning meeting ("What are we doing?")
  2. A coding session (Implement something, for real.)

Obviously, with holidays and everything else, plan on skipping the ones you won't be able to do, but don't cancel them last-minute. Hold yourself, at least, to attending the meetings. They won't always be productive, or at least not as much as you hope, but it's time you spend thinking about the project. If anything sticks, hopefully you take the project and what code you started into the following semester. Even if it's not an original idea (e.g. copy some other program that seems interesting) you'll get somewhere interesting.

P.S. COBOL? Really?

Andres Jaan Tack
+3  A: 

I'm going to offer up something very different. It's not programming as such, but it will affect you deeply further down the line, no matter what language, environment, or compiler you use, whatever job you have, no matter what you venture doing;

Epistemology.

Yeah, I know; wishy-washy weird philosophy stuff, but all paths, as they say, lead to Rome (except, of course, that they don't). In this case, a better understanding of something they won't teach you at Uni/College unless you ask for something completely different and inherently useless (ie. lectures in philosophy), well, it will probably prove priceless when you need it.

Human knowledge is the game we're playing here; there is no program you'll ever create that hasn't got the basic premise of human knowledge and of identity at hand. Sure, we create, consume and kill off files and memory at an alarming rate, all in the name of "getting the job done", but there's of course a huge gap between getting the job done and getting it done right.

Time and time again I bump my programming head against the brick wall of digital identity management, a field in which we try to link things in the real world with things in the virtual world. What else is computing about, right? So, an object over here is supposed to represent a thing over there in the real-world, but how do we know they are the same? (The Semantic Web and Topic Maps communities are filled to the brim of trying to figure that conundrum out) There's an epistemological term 'representialism' which is a handy search-word here, of course. But I challenge you to see if you can find a reasonable, fast, and elegant solution to the real-virtual identity problem. (I've written a few tomes on the subject myself, and it isn't as easy as first thought, all the more we need a new set of fresh eyes on it)

I'd probably start with something slight more concrete such as Knowledge management, which is really about making our computer systems more adapted to human behavior and needs (rather than the opposite of treating them as basic tools), and possibly dip your toe in user experience fields (has a lot of cool cognitive sciences involved) by reading "Don't make me think" by Steve Krug at the same time. Learning about usability and understanding its importance is probably better now than any failed project down the line.

If you're brave you could venture down the path of 'Women, fire and dangerous things' by Lakoff for more understanding of how we humans categorize, how are languages are built up, and postulate from that how are computer systems are supposed to work if we don't use the underpinnings of linguistic knowledge to create them? Tags without control are just as bad as words by themselves, or a counted tag cloud. Controlled vocabularies are just as bad as any pointed identification mark. They're just two opposites of what we really want, what we really need. And that might just be a fun mind exercise for 4-5 weeks?

Also, learn early that with all things, it depends. None of these things are about programming, but they all are about why we program. Good luck.

AlexanderJohannesen
+1 you had me at epistemology
David Berger
I think majoring in Philosophy would actually have been more useful to my career in software over the long term than either the major I chose (Math) or even Computer Science. The problem with Comp Sci the way they teach it in school is that it's corrupted and broken, and you will have to spend time unlearning 90% of it when you start working in the real world.
RickNZ
BTW, the Big Challenge in software is not the languages or the tools, which are comparatively easy; it's learning **how to think**, and **how to solve problems** -- and those issues fall directly in the realm of philosophy.
RickNZ
+1  A: 

What to do over Christmas?. Do some charity work with and for real people. This could improve your skills in the following areas, all of which are immensely useful in IT: communication skills, teamwork, patience, empathy, understanding, planning, realism, ...As a bonus you will feel much better too.

Conor