Saturday, January 1, 2011

The 12 hour holiday programming challenge


Overview

This blog post deals with the conception, creation and completion of booark.com, and it's chrome extension.

The problem
A few weeks ago I spent an infuriating 45 minutes trying to track down an article I had read in the month earlier.


I searched through my web history to no avail, then flicked through every recent post on the site I believed the article came from. After that, I tried traditional Google search methods, localized to the site in question. Yet still, I could not find the link. Eventually I tracked the link down by remembering some obscure words used in the article, but not before I had wasted the better part of an hour in the process.


"Well why didn't you just Bookmark the article?" I hear you ask.


A good question. Normally when I come across an article I find noteworthy, I do add a browser bookmark. But that solution is less than ideal because it's very easy to end up with 100's of uncategorized, unsorted bookmarks. More often than not, I will likely end up purging them all in a batch at some point down the road to restore some order to my bookmarks. 


Of course there are plenty of social bookmarking tools like Digg and Delicious, but those tools have never appealed to me. Certainly I don't fancy the idea of facing community shaming if I chose the wrong category to apply to a link.


There has to be a better way right?


The proposed solution
What I really wanted was a bookmarking solution that allowed me to categorize and sort my bookmarks with labels relevant to me. For example, I might want to apply labels to an article such as:
  • present idea for wife
  • contact this person
  • research, programming
  • hotel, nyc


After doing a touch of reflecting on this problem in my idle time, I conceived a very simple solution to the problem: I would write a simple bookmarking utility, integrated into my primary web browser (Chrome), which would allow me to apply custom labels to links. It must be simple and fast to use. 


As an extra requirement, it would have to be written, from start to finish, in 12 (non-consecutive) hours or less. I am currently in the final stages of another (much larger) project, so I really couldn't afford to spend any considerable time on this side project. 


Development
Initially development progressed very quickly. I'd estimate it took me 4 hours to design the database & public API and deploy a functional version on the server that communicated with the extension. After that I got the initial table interface working (using the excellent DataTables) on my local development server, as well as writing the shell index page for the site.


At this point, I'd spent about 6 hours on the project and I had a fully functional prototype. As such, I was thinking I'd come pretty close to hitting my original time 12 hour time estimate.


Alas, this was to prove wishful thinking. As is almost always the case with any software project I've been involved in previously, the 'little details' end up taking the most time. Even on a project with a scope as small as this, this proved true here.


The rest of my time was spent like so:
  • Table styling and configuration - 4 hours
  • Page styling - 2 hours
  • Extension styling - 6 hours
  • Privacy policies & terms of service related work - 2 hours
  • Database reworks, server error checking, comm interfaces, page handlers, etc - 6 hours
  • Misc (Domain configuration & forwarding, creating Twitter accounts (@booark), logo creation, writing this blog, finding icons, etc) - 3 hours

Lessons learnt
The biggest lesson learnt is that my time estimates proved to be very inaccurate. I'd say I did a good job of estimating the points I was aware of at the time of making estimates. But I would have been better served adding some buffer time for points I haven't thought of yet. 


As an example, I decided to implement a Jquery Star Rating plugin to turn this:





into this:




Integrating the library proved easy enough. But as a result of integrating this library, the following work also had to be done:
  • Add a custom render method to the site and extension tables to convert the numerical  rating to use the star images
  • Add a custom filter method to the site and extension tables
  • Modify the initialized code of the stars on the extension once an existing rating had been retrieved
None of the work above was particularly difficult. But it did consume a few hours that hadn't been allocated for initially.


Of course I could just make a definitive task list and never allow myself to deviate from it. I am currently employing this plan with my other project to good results. But in this instance, I figured it would be better to spend some extra time really polishing the project to completion. 


Conclusion
Overall, I am very happy with the end result. Booark does everything I need it to do, it looks good, and is simple to use. I especially like how well integrated the Chrome Extension is.


My 12 hour project did balloon out to 29 hours in total, which on face value seems dreadful. But large portions of that extra work will be amortized into my other project, so I'm quite OK with the extra time spent. 


Also, considering the fact that this project was created from scratch, I think coming in well under a standard 40 hour work week is more than acceptable here.


As for future expansion, that really depends on how well Booark is received. If enough people use the application, I will likely look iPhone & Android apps, as well as a Firefox extension. 


Thanks for taking the time to read this. If you have any suggestions for this application, please feel free to contact me at lacy@digitalashes.com.







No comments:

Post a Comment