Honing your skills on CodeWars or HackerRank is definitely a good idea. I’ve myself spent months on the former and some time on the latter, and right there is a display of my issue with them: I lose interest. At first it’s really nice to tackle a bunch of “interesting” problems and feel successful, but as the difficulty of the problems goes up, it soon turns into “how do I get around the shortcomings of the language I use?”
That’s naturally something worth considering, but it just feels so weird when I have to overcome performance tests aimed at C in Ruby (or Clojure). It’s doable (most of the time), but it’s a whole different kind of measure. I recall a problem for which solutions in C were mostly pretty naive loops while something similar in Ruby would fail even the first few load tests.
While it feels unfair having to compete with languages one layer of abstraction lower than the ones I’m using, it’s at the same time a good way to find the limits of these languages. In “normal” situation it’s very unlikely you’ll need to process hundreds of millions of items in a single process within a very limited time so you’d simply never realize the low-level bottlenecks the language has. Fighting coding challenges means I can see close-up the pain points where the language gets in the way – then I can either work around them or just give up and use a low-level interface.
They don’t feel like a good metric on problems that bigger systems seem to face: issues resulting from multi-threading and parallel processing, weird mutability mishaps or locking problems. Maybe I should add extra rules to “easier” problems like having to use a mutex in a legit way?