The Ray Tracer Challenge by Jamis Buck. It uses Cucumber tests to specify the behaviour of the code, without giving you the code. Not a single weekend project. I've been doing it in C++ to learn about the modern language, but any language can be used.
Great book - I only abandoned it halfway because my first child was born :)