Today was an excellent day. Cue air guitar.
I had my performance evaluation today. I get rated in three categories. Normally my supervisor rates me excellent in two categories and outstanding in one. In order to get an overall outstanding rating, you have to be excellent or better in all categories and outstanding in a majority of categories. So, I was usually rated as close as you can get to overall outstanding without being overall outstanding. That always tweaked me a little bit. Not much. I mean, I was still getting an excellent evaluation.
This year, I was rated outstanding across the board. Every category, and therefore the overall as well. I got the total outstanding for two reasons. One, I performed well in dealing with the new Sharp Floor system, despite it being difficult and time consuming. Two, despite dealing with the time suck of Sharp Floor, I managed to do all my other work on time and in good form. It has been incredibly stressful dealing with Sharp Floor, and it’s nice to know that the effort I’ve been putting in is noticed and appreciated.
You might think that’s why I thought it was a good day, but it got better. I’m updating my main database search program to deal with the new system. This program is the engine for one of our major business process, and will probably need to become the engine for more of them in the future. This is the sort of task I really enjoy at work. This upgrade is even more enjoyable because I really feel it’s one of the best programs I’ve ever written.
The program dynamically generates code to search the databases, which allows it to search six different databases from one set of search terms. In the previous version the dynamic code generation was all hard coded. That is, it was part of the program itself. In the new version, the dynamic code generation is generalized, and much of it is moved outside of the program into templates. This makes it easy to modify the templates to change the generated code, allowing users to personalize their searches. Furthermore, it allows you to create new templates to search new databases (or the same ones in completely different ways), as long as they’re reasonably similar to the databases we currently use. To top it off, this makes the underlying program incredibly simpler. Instead of requiring three routines for each of the databases that it can search, it just needs three routines, each of which is simpler than any of the routines in the previous program.
Today I ran into a problem with the upgrade. One of the databases is an order of magnitude larger than the others. If you search that database wrong, you can clog up the server and shut down everyone’s searches across the entire agency (and yes, I actually did that once). In the old system, that database had it’s own routines and it was easy to handle it all in one of them. In the new system, it needs to be done in two unrelated routines that all the other databases are using. I had a bad feeling in my gut today, because I couldn’t see a way to do it that wouldn’t be a horrendous kludge that gummed up the efficiency of the new system. But I put my fear aside, thought through it carefully, came up with a solution, implemented half of that solution, and tested most of that half.
That’s what I love about programming. I love solving problems. Programming is the ultimate problem, because it can be an infinite number of problems.