Monday, September 22, 2008

Over the years, I've hobbled together an application for personal finance management. Written in a combination of elisp (xemacs UI), perl (server), and shell scripts (command-line I/O), this was a fun exercise using "old school" development technologies. I believe I started it right around the turn of the millennium (2001?) to replace my use of M$ Money (allowing me to finally ditch use of Windoze altogether). Later, for a database class I was taking at UMass, I rewrote most the app, separating the database persistence and querying layers into a Perl-based server daemon with a proprietary I/O protocol. The xemacs-based UI is entirely text-based and keyboard-driven, of course, and has slowly grown to accommodate new functions. This app has served me incredibly well, providing an extremely efficient means of entering and querying my financial data. It even automatically balances my checking account for me, using downloaded account data and with strict and fuzzy matching of transactions to reconcile account statements. But the software is still missing a number of important pieces, including budgeting features, investment tracking, and UI support for many minor functions (I use manual SQL frequently). Adding these features to the existing system is entirely possible, but it would really just be busy work, without providing any real satisfaction of engineering accomplishment.

Having a few years under my belt using "modern" enterprise development technologies such as Hibernate, Spring Framework, and JavaServer Faces for my professional work, I've been itching to use these (and others) to re-engineer the app. I figure if I declare this in writing, I'm more likely to actually do it. Consider this posting as the official declaration.

I'd like to use this re-engineering effort to not only apply what I've learned from my professional work, but to push my skills and techniques further along and to try out new architectural ideas I have in mind. The re-engineering should also provide a good venue for trying out new technologies that would be too cumbersome or risky to test out on project at work. For example, I intend to take a look at Seam and SeamGen, possibly running under JBoss. I'd also like to assess the latest features of Spring 2.5. And I'd like to see what I can do to address the "bad smells" that have been wafting my way from the Hibernate domain model impementation in use on my work project. I'd like to even consider Scala features to see whether I can address some of the model implementation issues with new language constructs, such as Scala's traits. Hopefully, I'll write about some of my concerns and ideas as I move along with this project.

Initially, I intend to rewrite the server portion of the app using a SOA, and keep the xemacs UI. That should be an interesting mating of technologies from different eras, although I'll have to be careful if/when I flip the switch that connects these to layers, lest I cause some sort of technological anachronism with serious space-time implications.

No comments: