I need some help, thoughts, recommendations as I undertake this, but first some background…
As I do every 15-18 months, I've decided that it's time to rebuild Pic of the Day. I've never actually done it; the codebase is still the same one I started 5-6 years ago and have edited (often daily) since then. But the amount of cruft is becoming more and more problematic, and while I could do a hard-core refactoring and trimming down of the app, I don't see a compelling benefit to doing it that way versus a ground-up rewrite, and I'm confident the latter will actually be quite a bit faster.
In the past I've created partial re-implementations with pure CFML, Spring/Hibernate, Grails, and CFML/Groovy hybrids. In every case, one of the objectives was a gradual migration, where the two versions either shared a database, or did incremental data copies from old to new, so the app could be ported in stages.
I've decided I really don't want to do that. Obviously I need to move data from old to new, but I'm happy with just doing the pic/recipient/rank tuples and the associated entities, and starting from scratch with the other bits (the spider state, the image pool, historical records, etc.).
My question for all of you is really about the technology stack. As I mentioned above, I've tried several. Time-to-market would be maximized with a CFML-centric solution, because that's what I have the best infrastructure and tooling for, but that's not a significant driver. PotD is a hobby; it's how I entertain myself for hours every night after the kids are in bed. I do have resource constraints on my server, particularly RAM, so that is a consideration, but other than that I'm pretty much open for anything.
If you were undertaking this project, what would you use and why? If you don't supply the why, I'm deleting your comment. :)
Ruby on Rails :) Mainly because even though I've used CF since 1997, I've found Ruby and RoR to be much faster to develop and much more fun in general….I'm betting that you won't share my enthusiasm though :)
It depends on what your driving motive is for maintaining the code base in the first place. If it's really entertainment value in terms of code learning / coding-for-relaxation – and it sounds like you're open to non-CF technology – why not use it as an opportunity to learn something fairly different?
Marlon's suggestion of RoR is reasonable (but you already have that under your belt I think?) so I'd add a suggestion of Scala and the Lift web framework. It's quite 'different' to most of the stuff I expect you've built apps with before so it could be fun to learn (I just read Programming Scala over the trip to CFinNC and was very impressed by the language). I'm not convinced about Lift but it's definitely a very interesting approach (it just seems a lot of work).
After reading Programming Collective Intelligence my suggestion is Python. This book provides a lot of depth around numerous data crunching algorithms that you are using to do the recommender, all of which are implemented in Python. And further to this end, I think there are several libraries in Python for this sort of work, NumPy comes to mind, which make life easier to do it.
Thanks for the comments guys. I've been doing some playing on Google App Engine with Scala, Scala with Lift (which I also think is quite interesting), as well as Groovy and Gaelyk (a REALLY lightweight framework for Groovy on GAE). Having issues with DataNucleus and the non-Java languages, at least with the Eclipse tooling though, so that's annoying. I like Scala, and would definitely prefer it to Java in most cases. Not sure about Scala vs. Groovy though. Static typing is awesome, but Groovy feels far smoother to me. Granted, I've done a lot more Groovy than Scala, so I'm reserving judgment for now, but the number of places the documentation says "and X is to help the compiler" seems a little sketch. If you have to explain why something is there, and the compiler is the only reason, it sounds like you need to write a better compiler. I can understand some of it (like method arguments), but not all of it (like the equals sign for methods). And why can't I use .property and have it inflated into .getProperty()? Yes, I know, a subtype that defines a field matching a supertype's getter, but anyone who does that should be shot.
I haven't tried Python on GAE, though that's obviously an option. I'm not a big fan of the language though; it's powerful for sure, but the semantic whitespace drives me NUTS. I spent a fair amount of effort customizing Trac a few years ago, and while I could get stuff done, I can't say I enjoyed it very much.
As for RoR, I'm not much of a fan. Built a couple tiny apps with it, and while I don't discount the productivity you can achieve, you have to really like their conventions and really know them inside out. And I'm not a huge fan of Ruby or ActiveRecord, which kind of puts a damper on things. :)
For the moment, I'm leaning towards Scala and Lift. I definitely need to build a couple larger projects with both of them before I commit to PotD, but to this point it seems attractive. And running the whole app on the cloud (GAE and S3) is also very attractive.