views:

262

answers:

5

I'm computer science student and I have been programming for some time (few years mostly as hobby). Recently I've been thinking, which option would be better way to improve my programming skills. On the one hand I like to write everything by myself, it gives me opportunity to experiment, decide about it and so on... On the other hand I'm afraid I won't create anything great alone, also someday I will go to job and ability to work in a team would be very usefull. So if someone could give me advice I would be very thankfull... :)

+13  A: 

I very much recommend contributing to a project to start with. You'll learn new techniques, you'll learn how open source is run, and you'll be more likely to ship code that people actually use.

By contributing (probably first by submitting patches, then hopefully as a team member), you be getting code reviews by other programmers, often more experienced and with very different backgrounds. You'll also ship code you're excited about and see how to maintain it once it's in the wild (software upgrades, bug handling, user support, usability, etc.).

Jon Galloway
+6  A: 

I'll second the recommendation to contribute, but I would also encourage you to simultaneously work on your own projects, too. The things is, though, don't worry about creating something great--if you find a need for a program, write it. Problems don't start with solutions; otherwise they wouldn't be problems :-)

Brian Warshaw
+4  A: 

I'd say do both, if you have the time. If not, you should think about contributing to an existing project before going on your own, if that is an option of course.

@Jon touches on some of the issues you'll get by contributing to an established project, namely code review and feedback. Another thing you'll learn is how to work in a team, which is more political than you might think, and any experience on teamwork is going to be invaluable when you get to the point where you're trying to find a job. It (as in the project) will also look good on your resume, at least if your contribution is verifiable and significant and the project is something that amounts to something.

As for doing something on your own, that'll teach you something about project management and similar things as well. If you can, I wouldn't discount this path entirely in favor for the above path. If you create, and release, something that people use, you would learn such things as support handling (bug reports and general feedback), planning, release management, version control (it might not seem that way, but when you're in charge of the source control database, you tend to set different standards than if you're just a user, at least when you try to hunt down your first big bug in an older version). Ownership of the source code also tends to make one behave differently towards writing code than when you're just adding code to someone else's project.

So if you can spare the time, I'd say do both. Pick a project you know you can contribute to and run with it, and try to create your own project as well. The experience you'll get from both will be invaluable in the long run.

Lasse V. Karlsen
A: 

I also second the recommendation to do both. Contributing will at the very least help improve your skills with reading other peoples code, which is a hard thing to get used to.

jeremiahd
+2  A: 

I would do an OS project on my own!

Ok, that was somewhat tongue in cheek, but it would actually be a great learning experience if you are up for it. Doesn't have to be anything too fancy. I would recommend writing this new OS "kernel" on top of an existing platform (Windows or Linux) to use that as your development platform. Your "kernel" would operate as a program within a single process that includes some form of memory management library, task scheduler primitive, synchronization object, and perhaps a simple device model to output to the native GUI of the OS you develop this within.

If you actually develop such a "kernel" library to the point were you could implement some sort of multi-threaded program on top of your "kernel" running within a Windows/Linux process, you would learn a ton in getting the system to that point.

Tall Jeff