Games
Games, I think, are one of the funnest things to make and program. It doesn't matter what language I'm making them in, I love them and am always making one or have ideas for them spinning in the back of my mind.
Games are an excellent way to practice your skills in logic and design. You have to account for all the rules, every situation, and assume that the user is going to do the craziest things you didn't even expect. Your code not only has to be able to handle everything but be able to handle everything correctly. In addition, your game has to be designed well not only in how it works but how it looks.
The challenge of making games has always made me learn and understand more and I believe that it will continue to do so for a long time.