In distance running there two types of training that are commonly used to become a better athlete. The theory behind them is equally applicable to writing software.
The basic staple of training is simple easy mileage. This is how you condition your body to accept running as a natural state. It is from simple mileage that most of the improvement as a runner comes. There are still other types of training are used to make more specific improvements. These runs are done at a much faster than typical pace for much shorter distances. These are paces that would be impossible to run regularly. However, it is often said that to get faster you must run fast.
Learning to make better software can be seen similarly. The basic way we learn to better code is just by spending a lot of time working at it. Most of us that have not been condemned to endless meetings already do this. It’s the other type of training that I think we often actively avoid. This is a huge missed opportunity.
Regularly look for some harder things to do. Find ways to write tests for code that seems untestable, clean up those modules that appear to exude necessary confusion and complexity, attack the difficult performance problems and the most stubborn bugs. These are the tasks that will put a razor sharp edge on your skills.