Neat dissertation topic! I've used code golf for this very thing. It really forces you to learn the weird nooks and crannies of a language, and try lots of different strategies.
There is work by Frank Vahid (founder of ZyBooks) on many small programs and how students performed comparable to other traditional styles.
However, in the vein of this thread, I think that is only playing one note to learning CS. When I compare CS to martial arts (MA), I consider the traditional programming exercise akin to sparring. It is real world situated, but with the number of new variables it is difficult to successfully demonstrate or refine your understanding. MA, like CS, has a high attrition rate to start, and for reasons I consider isomorphic - a false sense of what CS/MA is and the demoralizing effect of "losing" constantly (sparring or debugging).
So, in MA, there are attempts to make sparring less intimidating. You can pair equal experienced partners or against an understanding senior, but you also focus on drills. If we consider sparring as a combination of problem solving and applying technique in the moment, then drilling removes the problem solving aspect to allow for technique refinement.
So, in combination with traditional programming exercises, my current work is looking at novel practice activities separate from tradition - for example, error finding, output prediction, and even typing exercises (which I have published on).
That's very interesting. I considering doing this but it seemed like an awful lot of work needed to start. There was a boom of 'learn to code' sites recently but looks like nobody really tackled it from that angle.