tags:

views:

1370

answers:

11

I am beginning my first job as a junior software developer at the end of this month. I am about to start my second year of college (part time) and have been only self taught thus far. I find that my largest barricade to developing my skills as a programmer has been a general lack of challenging projects to work on.

I have obtained my new position (and most of my experience) by developing various utilities used by our manufacturing team to perform calibration and testing of our flagship product. This has taught me a lot, but I need to write more code, and they are content for the time being.

So I ask; what types of projects should I be working on? projects that will challenge me, but are not so difficult as to be out of reach. I have a good understanding of the fundamentals, and am most comfortable in C# and ruby, but I can also write in C/C++, which would be my preferred language at the moment. Thank you in advance for any suggestions.

+7  A: 

First off, congratulations on the new job!

Have a google for coding kata's or dojos, they are computational problems/projects whatever you want to call them that can be good for working the brain. I would like to do more of these, but I'm currently studying lots anyway! Heres some links that I hope give you an idea:

Coding Dojo
Project Euler

Hope this helps! :)

PS: If you come across any more good sites, please share, I would love to get more of these on my delicious!

Rob Cooper
+5  A: 

Write a game! It's fun, and rewarding. Just don't try to start with an MMORPG. Do something simple like Tetris, or Pong.

See the Game Development Wiki for a great reference.

Ryan Fox
+5  A: 

I'd be checking in for some open source action. Take a look on sourceforge or codeplex for something that takes your fancy, check out the latest revision and start digging through the code.

Scott Hanselman has an excellent series of posts on his blog called the weekly source code where he goes through open source projects and reads the code and looks for cool techniques they use. It might be a good starting point to look for some interesting projects to get involved with.

lomaxx
+3  A: 

+1 for Project Euler (though -1 for RobC's spelling ;)).

If you're used to writing code in imperative languages, perhaps you should have a play with a functional language such as Haskell, Erlang or F#? It's a good way of changing the way you think about programming, and it'll no doubt improve your general coding ability.

Good luck!

@robcthegeek: I've only managed to find this and this. Neither of them are mind-blowing to be honest. Projet Euler is by far the best I've seen thus far. There was a series at Dev102, but that's now finished.

OJ
+1  A: 

@Ryan: I have started and deserted many using rpg maker (that's why I learned ruby), but I can never seem to get the story planned out well enough. Thanks for the link though, I always need things to read too.

@OJ: Yeah, Project Euler is great (thanks Rob), that is where I began playing with C, mainly so it would not take a day and a half to find the sum of all the primes under 4 million. It is fun, but it does not push me in a practical way, i.e., learning the API and programming in more of a system sense. I have been studying Scheme a bit, maybe I'll play with that a bit more.

@Derek: Thanks for the input! I have written a couple of plug-ins for Paint.NET, even though they already existed for the purpose of learning, and yeah, it taught me a lot. I like your compiler suggestion. I wrote an extremely simple "compiler" for a language I stumbled across ("Brain"...expletive) over the weekend. Really just a glorified switch statement, and it compiles to (and was written in) C code, so I could go deeper. Thanks again!

On a side note, I have to say that this is already a great forum. I've learned things already in the few hours that I have been active.

Ed Swangren
+2  A: 

It goes against common sense, but when analyzing what kind of assignments I get in college, your best bet is reinventing the wheel. Find something that interests you (Twitter, Photoshop, World of Warcraft, etc.) and make your own version. By trying to recreate one of these closed source projects, you learn valuable skills, especially when it comes to diagnosing problems and learning by example. Remember though, you are trying to create a ghetto version of the app not a perfect replica (although all the more power to you if you make the next WoW or Twitter or Google for that matter).

icco
A: 

@OJ Thanks for calling me out on the spelling! ;) My bad, it was still early here, was sat there eating my breakfast at the time! :D

+1 for the comment on changing your language type. Thats something I am keen to do once I am done with the lame MCAD. Think going from procedural to functional will be a great way to mess my brain up :D ;)

Also, thanks for the links, I'll check them out :)

Rob Cooper
+24  A: 

I'll echo Rob first and say congrats!

I think your idea to use C/C++ is a good one. Experience in those languages will serve you well. You should also get experience with some non-imperative eventually, but C/C++ knowledge will always serve you well. Now, as for what projects to work on, I have a few recommendations.

Write some plugins

Find a program that you like, and figure out what feature it's missing. Then create that feature. Obviously, this will work a lot better if the program is actually extensible. I learned a lot by writing plugins for some applications I liked. It gave me exposure to good code written by others, and it gave me a chance to build something useful, without being overwhelmed.

Writing a plugin is a lot like adding features directly to an open source program, except that you're working with a cleaner interface, so you don't need to learn the entire source yet. It can also be a good way to get exposure to the program if you would like to eventually become a direct contributor eventually.

Oh, and writing plugins also taught me the value of backups and versioning, when an accident destroyed the bulk of my code. Don't make that mistake.

Make your class projects big

Most people just scrape by in class. Don't be most people. You should pick projects which are larger than they need to be, and you will learn a lot more. When people were putting together 300 line class projects, I was putting together a 3000 line project to teach myself C#. I even added plugin support. Why? Because it taught me a lot more than doing the bare minimum.

Of course, what I built at the time would actually be quite unimpressive now. I'm sure it could have been written much better (and with fewer lines). Still, it was a big project at the time, at it taught me a lot of things. Small projects just cannot stretch you the way large projects will.

Build a library

I'm going to be honest. Putting together another windowing library, or a container library, or a networking library, or any other kind of library, is going to be a waste of time in most senses. In all likelihood, you won't get a ton of use out of any libraries you build. However, if you do take the time to build a library, you will learn a lot.

You'll get a deeper knowledge of the domain that your library addresses. You'll become a lot more familiar with the low-level APIs exposed by the OS, since that's what you'll be building on. You'll learn a lot of new tricks if you take the time to learn about similar libraries. And finally, you'll learn a lot about structuring code to make the library clean. You'll learn about making better interfaces, making consistent interfaces. You will also have to face design tradeoffs. Composition or inheritance? Abstract classes or interfaces? All of this is very good practice. You will probably mess up a lot and restructure several times, but that's why you'll learn.

Build a compiler

This is an old standby. If you haven't written a compiler, you should. It'll get you so much closer to the metal. It doesn't have to be a full-featured compiler. It doesn't even have to compile all the way to x86 assembler (or machine code). Writing for a virtual machine is perfectly fine. You'll learn a lot regardless of the target platform. At the very least, you'll have a lot more respect for the magic that goes into modern compilers.

Whatever you decide, I wish you good luck, and keep us updated with any good project ideas you come up with or try.

Derek Park
+1 for plugins and compilers.
Chris
+2  A: 

To answer your question directly, take a look at some Open Source projects and get stuck in.

Indirectly, you will learn more by real world, on the job coding than you ever can by doing stuff part time. Once you are spending 8+ hours per day coding, you'll be surprised how quickly you will improve.

As you go along do things like read blogs, listen to podcasts and keep up with new or emerging trends to stay current and interested.

KiwiBastard
+1  A: 

Some here have mentioned online programming contest sites so I'll add my favorite. Thousands of problems to work on there.

unclerojelio
+1  A: 

Try having a look at your other hobbies and interests and see if there is anything you can create to support that for example I have a large collection of books/dvds so I am planning on creating an application to keep track of them, other examples might be if you are into fitness you could write an app to track your workouts and map your progress, set goals etc.

Try building your applications for multiple platforms.

Trotts