Fridays are 'sparring days' at the boxing gym where I train. We fight 2 minute rounds, with 30 seconds intervals in between. Each round we fight a different opponent. By the end of the session, everyone sparred with everyone.
This setup makes things interesting, for example: on the first round you get a guy with weak defense, and you beat him without mercy for the whole 2 minutes. Second round: the guy is much lighter and much faster. He runs circles around you, punishing your head and body like there's no tomorrow. Third round: the guy keeps walking towards you like a raging bull, and you have to keep him away. Fourth round: your partner never throws a punch. He only waits for you to attack so he can counter-punch you. You have to be extra careful when attacking to avoid getting hit. Different people, different styles, different challenges.
Power, speed and aggression will only take you so far in boxing. What really makes a good fighter is the ability to adapt, learn new things and overcome challenges as they appear.
To me, this is a perfect analogy to the life of a developer. Each project is a whole new challenge. You can work on a given project for years and say "I have years of experience working with Rails", and then a new project comes up, with different business rules and different requirements, and you have to learn a lot of new stuff that you've never seen before. There is no such thing as "learn everything there is about programming". That's impossible. As with a fighter, what makes a great developer is not only the amount of stuff he already knows, but the capacity to adapt, learn new things, and overcome the obstacles that emerge every day.
In boxing, coding and life, there's always a bigger challenge.
Keep coding (and punching)!