Yes, this is an interesting point. I think there should be ways to do "deliberate practice" for finding better abstractions (reusable components). I would love find those methods.
Or interview prep sites, like leetcode, hackerrank, etc.
Or competitive programming sites, like topcoder.
Is that basically the best we can do?
The problem with those is that a lot of HN commenters believe that practicing for competitive programming (or algorithmic interview problems) has little to no relationship with actual day-to-day programming.
Personally, I think there has to be some relationship... But the HN community strongly disagrees (see any of the interview question threads)...