I think there are two different things you can aim for in improving your skills.
One is learning "uber-programming" and the other learning excellent software engineering. The uber-programmer is using super-sophisticated algorithms and crazy efficient stuff with syntax or just crazy stuff. The excellent software engineer is working to make the complicated stuff look as simple as possible and be maintainable by the least sophisticated programmer possible.
The great thing is that in any given project, you can probably find an opportunity to improve your skill in one of these two categories.
When I've worked with subpar developers, it gave me a chance to do the uber-stuff they couldn't/wouldn't do. But writing code that solved problems "in a way even Bob can understand" is actually an interesting challenge even if it's different than database tuning or whatever.
One is learning "uber-programming" and the other learning excellent software engineering. The uber-programmer is using super-sophisticated algorithms and crazy efficient stuff with syntax or just crazy stuff. The excellent software engineer is working to make the complicated stuff look as simple as possible and be maintainable by the least sophisticated programmer possible.
The great thing is that in any given project, you can probably find an opportunity to improve your skill in one of these two categories.
When I've worked with subpar developers, it gave me a chance to do the uber-stuff they couldn't/wouldn't do. But writing code that solved problems "in a way even Bob can understand" is actually an interesting challenge even if it's different than database tuning or whatever.