For students that want an added programming challenge, I recommend checking out
https://projecteuler.net. Tons of problems, many of which explore interesting solutions - you may be able to quickly come up with a solution that solves a problem, but that program then takes hours to run. A little more thinking and focus will get you a program that can solve the same problem in under a minute. The problems are designed to make you think about efficiency, and good programming practices make solving them easier - many problems deal with similar topics, so creating utility classes to hold common algorithms will help a lot. I've challenged my students in the past to tackle some of them!
The best part? Language doesn't matter, the hardware your running it on doesn't matter. Once you solve it, you get access to a forum thread about the problem, allowing you to see other solutions in a dozen different languages!. It's a great learning tool, in my opinion.