Since the best way to learn is to work on projects, what are some good software to try making yourself with a purpose of sharpening certain programming skills or learning a new language?
I found the following programs give a good start with new languages:
Conway's Game of Life
Easy to implement. Gives you a good start with simple usage of container classes. Doesn't necessarily need graphics for output of results.
In addition you could write a 3D version of it, and use a game engine for output (eg something simple like Panda3D)
Slightly more complex. Complexity can be adjusted to your needs. Either just cancel out numbers and stop when that's not possible anymore or go on and implement a search tree to solve more complex problems. Problems and solutions for Sudokus on every level of difficulty for testing your program are available on the web in abundance. Same for material on possible strategies.
Problems on every level of difficulty you can want. And compare your solutions to those of experienced programmers in every major programming language.
I'm not sure what you mean with 'what are some good software to try ...', but I can recommend the book 'seven languages in seven weeks'
It gives you a good starting point to try new languages.
Most of these sites provided you with the option of coding in multiple programming languages so you can use the one you are most familiar with.
And if you are a master at your game, there's always ICPC.
I would say any project that meets the following three requirements:
- Something that you find interesting
- Something where you can get a sense of progress very fast (so for example try to avoid something like creating a 3d game)
- Something that fits the programming paradigm of that language. E.g. if it is a functional language, then a project where you would do some data manipulation, math, or something.
- Go to Sourceforge.net or GitHub, search for projects in that language, and see which ones intrigue you.
- Think about the libraries that you work with most often in "real life". Do you write a lot of webservices? Try writing a webservices framework for the new language. Do a lot of graphics programming? Try writing a simple rendering engine. Do data analysis? Implement a basic statistics package. Etc., etc. This has the benefit that you'll already see the utility (because you use something similar on a day-to-day basis) and you'll already have some domain knowledge. These sorts of projects also tend to be ones that you can spend an infinite amount of time tweaking (i.e., learning more stuff from), that you may want to open source eventually, and that will keep you involved in the language if they become an ongoing hobby; the downside to that is that it may never really feel "finished", and that's discouraging to some personalities.
- Depending on the development domain, there may be books specifically intended to guide you through projects. This tends to be especially true of game dev platforms (iOS, XNA).
Anything you like enough to keep doing. The most learning is done in that last 1% that is commonly ignored on a side project, but is a very important part of a work product.
As a result, it's a very personal choice what the project could be. That's why there's so many great OS projects out there, and why everyone says that they matter so much when they're on your resume/CV: that person worked hard on it and learned lots from working on that last 1% of it to make it usable by others and enjoys what they do.