So I've had a downright enjoyable evening of ripping out old legacy half-C and C-with-classes code and modernizing it, which has eliminated a lot of cruft and fragility. This makes me deeply happy.
It's also been a great experience with mucking around with template magic. At one point I got side tracked and just started playing with a half dozen ways to solve a fairly simple problem using template metaprogramming. I've never really gotten too deep into template metaprograms in C++, mainly because I've never needed to; but once I found an excuse, I had a lot of fun with the whole thing. Of course, all of the stuff I did was way too arcane and magicky to be used in production code, but it was great to stretch my brain all the same.
The entire incident takes me back to the oft-revisited notion of code kata, or exercises, or drills, or whatever you want to call them. I used to do a lot more of that kind of thing, but I've slacked off a lot in recent years. At the risk of making myself sound stupid (or, more accurately, making myself sound a lot smarter than I really am), I think it's because it's gotten harder to find problems that I've never solved before.
In some way, shape, or form, I've approached and at least reasoned through the vast bulk of the sort of little mini-puzzle type problems that usually populate lists of kata and the like. I'm certainly not trying to say that I've figured every single problem out, or even necessarily come up with optimal (or good) solutions for the ones I have done. It's just that when I find a challenge problem of some kind, 9 times out of 10 I look at it and go, "Oh, yeah, I remember doing something a lot like this once," and then I just forget it and move on.
(The other time out of ten, by the way, I'm just too damn lazy to care.)
While in some ways it's nice to have a lot of experience to draw on, it's also a little worrying. It means - in my mind, at least - that I'm not making sure I'm as sharp as I think I am. What if I actually have to implement one of these problems one day, and realize that I've spent years thinking I knew the answer but really didn't?
I think I'd feel like a world-class moron at that point.
I've dabbled in several major programming paradigms. I've worked on technology ranging from embedded systems - literally on bare metal with PICs - to highly abstract enterprise systems that barely even seem to be connected to actual code anymore. I've done assembly language, managed languages, functional languages, a few completely pathological languages... hell, I've written a few scripting engines and demented little VMs in my time. (I just wish, in retrospect, that I'd realized how smart it would have been to keep them.)
I know there are plenty of places yet to explore... it's just that they're very esoteric lands indeed, and the sheer amount of energy it takes to explore things arcane and off-the-beaten-path makes it hard to continue to explore in my free time.
And in a lot of ways, I kind of regret that.