I’ve been kicking around the idea of opening up a uISV for a while.  My immediate inspiration to do so was, ironically, a blog post from Brian Green (site currently offline) which challenged people to come up with a uISV complete business plan targetted at a video game.  I’ve long had the sort of “Wouldn’t it be nice to be a game designer” dreams that many programmers have, but have resolved myself to a lifetime of coding somewhat more boring apps (not true: I’ve worked some jobs where the apps were pretty cutting edge, and every project is a chance to improve my skills) and actually being able to see the wife and children I hope to eventually have.

But that doesn’t mean I can’t dream about being a game designer.  And what is blogging if not the ephemera of a dream captured briefly in a text editor?  So I wrote up a business plan in three hours.  It was a fun diversion in downtime at work.  And while I’ve got desire asymptotically approaching zero to ever activate THAT business plan, the experience of researching things for it (Google AdSense, paid search, payment processors, etc) let me think “Hey, I could really pull this off On A Shoestring”.  So I decided to.

Now, lets back up eight months.  I’m involved, as a function of my day job, with the ESL teaching community here in Japan.  (I’ve been a teacher myself before, including ESL.)  One day, a teacher mailed our prefecture-wide distribution list with “Hey, I could really use a program to do X.  I searched but couldn’t find one.  Does anyone know of one?”  (I’m afraid the actual subject of this website isn’t going to get mentioned until launch.  Suffice it to say that X is something which leads to a fun classroom activity, can be done once per class per 2-3 months, and requires 45 minutes of mind-numbing drudgery if you don’t use a computer to do it.)  I figured the teacher had to be mistaken, since X wouldn’t be hard to do with a program, so I checked around the Internet.  For about an hour.  And there are just no good options for doing X, anywhere.  Well, I could fix that.  Within 6 hours (slow day at work), I had a prototype of a program to do X.  It was, to put it mildly, terrible (printing feature outsourced to Internet Explorer since I didn’t know how to use the printing API, user experience comparable to trying to navigate VI localized in Swahili, bare minimum functionality).  But hey, it was answering a question I got in an email from something which is barely tangentially connected to my day job.  I mailed the teacher the program and, on a lark, responded to the mailing list that I had something which would do X and to get a hold of me if you needed it.  I had 3 messages by the time I left work.  I sent out effusive thank you letters and long instructions of all the workarounds someone would need to actually do X with my hunk-o-junk.

The next day I showed up to work, opened my inbox, and the folder which handles replies to that mailing list was stuffed.  I stopped counting after the first twelve (this is from a list which reaches ~60 teachers, incidentally).  “Please please please let me have it!” was the general tone.  So I put the executable up on my college’s alumni web space, wrote up a page of workarounds, and mass mailed the list again and told them where to get it.  Thank you notes trickled in for weeks.

So fast forward back to the present.  Having decided that I was going to make a uISV On a Shoestring, I needed a product.  I remembered X.  I was pretty confident I could re-do X The Right Way This Time, and a complete code rewrite would assuage my legal and moral concerns about profiting monetarily from something that was technically done on company time for a tangentially work-related purpose.  So I started recoding X last Saturday.  And here we are, Tuesday, and X is roughly 70% complete.  This time its built from the ground up with the user experience in mind, and I’m confident that even my mother and aunt (two wonderful teachers who make every tech support horror story ring true — my aunt actually once took scissors to a 5.25 inch disk so it would fit in her drive) can use it.

How can this be done this fast?  Well, its not because I’m a fast coder.  I’d anticipate that its less than 1k lines of code, all told.  One tip: 99% of the work in designing this sort of simple application is user interface.  I have decided to use a development environment/language which makes GUI building easy (although since I need fine-grained control I wasn’t able to use a WYSIWYG GUI builder… more’s the pity, but thats probably the reason why there isn’t freeware to do X cluttering up Google already).  All of my own code was built from scratch for this project, but I did use (with permission) a snippet of code I found on the Internet for launching a web browser targetted at my purchase page.  The main tip I can give is to target a niche market.  There aren’t 5 million people in the US who will ever do X in their lives, so its so below the radar screen of major software developers and even uISVs who haven’t been teachers themselves that nobody has ever decided to spend ~30 developer hours and do a proper job of X.

My testing framework… well, I was going to try unit testing but my “business logic” such as it is is really, really simple.  I started with a strong, handwritten on paper design document with mockups of all the UI screens and descriptions of the behavior I wanted.  Every time I added a screen, I checked to make sure that it worked like described.  My technology choices and strong use of OO principles make me confident that when I add, say, an About popup the Edit menu bar can’t possibly break.  This saves time on testing the UI and lets me focus on “business logic”, user experience, and creating a trial version which will encourage my users to pony up the money.

Incidentally: strong design documents, don’t leave home without them.   If I had to do it all over again I would have written out my class hierarchy in full before writing a drop of code (I, stupidly, wrote out the Model and Controller in detail without writing the View… now the View is 6 files of spaghetti.)