The following is an account of how I developed the photo calendar program.

Brute Force

My favorite recreational activities are hiking and backpacking. I also enjoy taking photographs during my wilderness journeys. After prodding from some family members, I agreed to take some of my best shots and put together a photo calendar. There are many commercial services that will do the job. This approach works well for one of two copies but gets expensive if you need a dozen or more. Having joined the ranks of the unemployed in 2001, I had a lot more time available than money. In December of 2002 I decided to prepare a photo calendar for 2003 using the resources of my home computer.

I have plenty of software experience. However, none of my past work involved authoring HTML documents. A programming guide from a local used bookstore got me started. One nice thing about internet browsers is the ability to examine the HTML source for the page you are viewing. I looked at a number of calendar examples to see how things were done. The calendar date block turned out to be nothing more complex than a table of numbers. There are only 4*7=28 different instances, depending on the length of the month and the beginning day of the first week.

This was an obvious candidate for an automated document generation program. Unfortunately, the realtime calendar was already sliding into January so I needed to crank out something quickly. I built my 2003 calendar templates by hand and sent out the finished product. The response was gratifying. As a personalized touch, I had included the birthdays for my hiking friends. No more excuses for missing those special days.

Adding Elegance

The summer of 2003 had a remarkable run of near perfect hiking weather. The photo calendar project slipped into the background as I pursued my other interests. I did make one strategic preparation. Another trip to the used bookstore yielded a JavaScript programming guide. I wrote a simple application with dynamic page content as preparation for the bigger task ahead.

In October of 2003 I started work on a JavaScript program for generating the calendar templates. There was no formal application design. The software began to evolve in classic hacker fashion. I put together a quick prototype of the input form. All that remained was generation of the proper outputs. I got side tracked by development of a CalendarState class for doing the required date calculations. It would have been easy to slap in a couple of routines that met the minimum requirement. However, I could see a broader use for that piece of code and I took the time to refine it with clean interfaces.

The next step was generation of the date block. This should have been the easiest programming task. All I needed to do was replicate the output that was previously built by hand. At this point an interesting phenomenon called feature creep began to manifest itself. I realized that small modifications to the program would allow customization of the date block in several different ways. Adding these options meant revising the input form to support the new output modes. The visual appeal of watching the calendar transform with just a mouse click was too strong to resist.

It was the second week in November when I started coding the last major software component, the notation database. Rather than worry about a detailed design, I started out by coding a minimal subset of the functionality that was required, relying on my software experience to avoid major blunders. Adding in the missing pieces without disrupting the existing structure was like playing a game of chess. Several coding sessions extended long into the morning hours as I wrestled with what appeared to be intractable roadblocks. But there was always that moment of intense satisfaction when a solution was finally achieved.

Joining The Software Community

By the second week of December the calendar program was essentially complete. While printing my 2004 calendar, I reflected on the fact that two months of programming had been spent to replicate a manual task that could have been completed in a couple days. I suppose if I live to age 90 I will achieve a net gain. The real payback was the fun and intellectual challenge in attempting and completing a task of unknown difficulty.

It occurred to me that maybe I could sell the software and make a profit. But then I asked myself, "Would you rather be remembered like Linus Torvalds or like Darl McBride?" Just the thought of the latter case almost made me ill. As a faithful user of GNU/Linux, I decided to make my program freely available. Joining the software community rather than exploiting it.

As I was preparing the SourceForge site I began to experience self doubt. Was the software good enough? Would other people find it useful or would it just be ignored? Then I thought of some of my past commercial work now lying forgotten in an obsure filing cabinet. No! This code deserves a chance to survive on its own merit without being shackeled by the chains of corporate intellectual property. The initial software release meets all my personal needs. Future development will depend on the interest and participation of the user community.

Written by: Kenneth Hopping

Last update: Dec 16, 2003