What would you say are your best kept secrets to keep yourself in top programming shape?
I think that is the best way to improve is to practice - code as often as you can. Once you are coding, you are making mistakes - once you are making mistakes, you are learning.
Also read The Ultimate Code Kata.
I read (yes, physically books and magazines, as well as online articles and webcasts) all the time. Luckily my employer requires us to constantly self-improve.
Keep programming everyday, read blogs about programming, and also play games!
Depends on what kind of programming you mean, but I think you can't go wrong by practicing on all the algorithmic and design contests at TopCoder, which is excellent for this purpose.
Every morning I spend 10 minutes weightlifting my entire collection of C++ related books. That keeps me in shape.
Help out in programming forums and places like StackOverflow. Then not only are you keeping yourself current, you're helping others learn at the same time.
Solving coding problems is always a good way.
One place to practice this is in TopCoder competitions.
I go to sites like this (and forums.msdn.microsoft.com and google groups etc) and read peoples questions and try to answer them. Frequently I had no idea what the answer is until I research it or try out some code.
Helping others and listening to others in IRC or on forums/QA sites like this. Taking snippets of code from blogs and adding a few features to them to ensure I really understand the concepts rather than just reading and saying thats good.
Since I am primarily involved in .NET application development I have started reading MSDN Magazine (via the website). Its also good to walkthrough others code, help others with problems and to just code!
I frequently open up a file I haven't recently touched and refactor it to be exactly as I think it should be. Somehow I always find stuff to improve. This includes writing tests for an untested part of the system.
Learn other programming languages. It seems to me that there are different mindsets for programmers in different languages, Java programmers think in different ways from .Net programmers, etc. So by learning a different language and being somewhat aware of the discussions / projects going on in the different language, you can think differently about your primary programming language.
For example, I learned/understood polymorphism and MVC from Python, despite having been exposed to it in VB.Net (my primary work language). I also developed great benefit in knowing the open source projects that are underway in Python, which are not the same kind of projects you see in the .Net community (e.g. there is some overlap but not more than 50%). This was very useful when suddenly I needed some specialized string parsing functionality, and was aware of a Python strategy for attacking it. I converted the idea to .Net and did my job far faster than my boss expected.
A few people have already mentioned TopCoder. I also recommend doing TopCoder problems, but with some specific variations:
1) Don't actually participate in the single-round matches (unless you want to for non-skill-building reasons). Rather, go to the practice rooms, open up the hardest problems, and spend a good couple of hours putting together a really good solution. It's ok if you have to spend a lot of time digging around in textbooks and on the internet; the point is to learn the details, not to prove you already know them.
2) Consider doing problems in a language you don't know very well. This can be a great way for someone who works with (say) C++ in their day job to brush up on (say) Python.
3) Do the "multicore threadfests". Heavily multithreaded programming is important and becoming more so by the day, but it's relatively hard to exercise your multithreading chops on your own, since you'd need to make up pretty elaborate problems to expose the difficult corners and visualize the potential benefits. The multicore threadfests provide these elaborate problems.
I generally try to solve problems that seem difficult from my perspective, or learn new languages. I also like "reinventing wheels", preferably at the lowest level possible. Its certainly improved my coding abilities over the years.
Writing bytecode, assembler, as well as compilers and interpreters with C++ has been particularly useful, since it helps to develop an insight into the mechanisms underlying which every program you are writing.
Read one technical book for every quarter. Recommended list from codinghorror
Learn one language for a year. One functional language one structural language etc.
Try to solve problems in sites like Topcoder and ProjectEuler.net
I read technical blogs, write regularly in my own technical blog, try to read a programming book on the side, and work on a side project in a new language so I can learn that language. Note that none of this was forced; I'm simply currently not fulfilling my "fix" at work.
Side projects are nice because like p3t0r said, you get to refactor a side project over and over again. At work, there's always a budget preventing you from doing that.
Learn a new programming language every year, and then implement a small language in that language.
Practicing problems at spoj.pl, topcoder.com is great, besides visiting stackoverflow to get help and help others is very useful.
Also, keep doing a side project as time passes by, try using new and different technologies & techniques in these project. And, besides that also try shifting the domain of your projects once a while to have a variety.
Making a game teaches a lot :)
Read this - http://gist.github.com/6443 Start a side project - github founder
I definitely prefer Project Euler to many of the others because it's more focused on the actual programming and not on trying to display the output perfectly to pass their unit tests.
Try to find new challenges in work or outside it (http://computinglife.wordpress.com/2008/04/15/optimization-pays/)
Reade + Write Technical Content.
Participate in discussion forums such as this, and learn from the collective knowledge.
Two things, (1)Practice with your computer (2)Know why your need what you are learning. Reading blogs, journals, tutorials, conferences, discussion and everything else just mentioned should all end up as things you PRACTICE with your hands on the keyboard and discover the reason WHY you need what you learned. You can learn a lot by reading and oral discussions but none of it sticks until you prove to yourself that you can do it, know when to do it and know how you should use it in practice.
learning how to develop code is futile. someone in India WILL take your job. Funny thing is I migrated from India seeking a better life. Now the same people are making my life miserable. I have embarked on learning the WHOLE stack. from SAP TO BIZTALK TO SHAREPOINT TO YOU NAME IT. just coding in c# or vb.net is going to lead you nowhere. trust me