It started by accident, by taking apart an existing mathematical expression evaluator, to learn how it works. This led to a deeper understanding of lexer/parser/interpreter, (pre/in/post)fix notations, stack machines..
Once I realized that what I was looking at was a kind of "virtual machine", I was hooked and continued by adding language features like variables, arrays, objects/dictionaries, functions.
The basics are now fairly complete, but the language doesn't "do anything" yet - it's in its own small isolated universe. Next I'm imagining how it will safely interface with the outside world - networking, file system, database, vector graphics, sounds.. What I want is something like a cross between BASIC, Lisp, and Hypercard.
Anyway, still not sure how practical it's going to be, but it's been a wonderful learning experience. It led me down through the history of computer science to re/learn the basics, making numerous discoveries of things I didn't know, getting a better overview of what languages exist(ed), what I like (or not) about their syntax or approaches to various aspects of programming. Creating this little hobby language has definitely helped me grow as a programmer.
---
As for a non-tech related subject, studying music theory is endlessly fun and thought-provoking. It also comes down to creating one's own system/language.