Learning programming languages by solving interesting, hypothetical problems.