I enjoy writing toy versions of real-world applications. I'd say 90% of the code that makes up a program is there only to provide smooth edges, error checking, safety, etc. If you ignore all of this and focus on the remaining 10% - the core, bit-banging logic - you can learn a lot and have fun.