Richard Stallman's advice regarding learning the craft of programming is to
make small changes to actual large programs. You learn to write good code by
"reading lots of code and writing lots of code" and free software gives you
the ability to do that. So...
1.) Find a project you are interested in.
2.) Find out what small change you can make that is useful by asking others
in the project.
3.) Read and decipher the code (here is the learning a new language part).
4.) Make your change
5.) Fix bugs that are reported to you.
6.) Work on another change in this or another project.
His other suggestion is to learn Lisp! One way you can do that is by writing
some extensions for emacs using the free book "programming in emacs".