I got a call from a customer last week who needed a small piece of work done that he defined as 'Trivial'. Ok, trivial can be good - quickie in and out and you're done, but usually when I hear the word trivial I always cringe because it rarely is.
Not Trivial:It's an issue of perception of course and it depends on who you talk to. If you talk to a non-developer almost any sort of development seems trivial. I mean everybody does it right? We have Web pages everywhere - so it's gotta be easy, n'est pas? Aeh, well, it depends.
Anyway this customer called and we're discussing his 'trivial' problem. Sure enough it's not rocket science but it involves doing some research to find a third party component and a reasonable bit of coding to implement this particular small service type application. I give the customer a quote of about 5 hours of billable time for a bare bones implementation that handles the specs he's laid out for me, pointing out that this is bare bones, lacking some adminstration functionality (ability to edit the data and no security etc.) - just addressing the immediate problem domain. So I say 5 hours and he fires back "5 hours? But this is so trivial!" So after some back and forth we decide to part ways and no work gets done (yet).
This isn't the first time I've seen this. Not sure where this impression comes from but somewhere along the line there's come up this idea that software development is easy. You just slap a few things together and voila your app magically appears. I would argue if you ask for a quote on just about anything more complicated than a single page app and you get an answer back of less than 5 hours they are full of shit. Or low-balling on purpose to get a foot in the door and charge more later. <s>
A 5 hour 'project' is tiny. Small time and rare at that. But I surprisingly I see a fair number of requests for this sort of thing coming through here and if I have the time - heck why not. <s>
When it comes down to time 5 hours of development is very little time when you consider:
When I build a new application from scratch it takes me roughly 30 minutes plus just to set up a new project, set up some base environment (configure IIS say, rights etc.), set up a base framework that handles things like error trapping and logging and a few other things and set up base configuration management with common settings. Sure I could bypass all this and just start slapping pages using the ASP.NET Wizards together but that's just not the way I work and in even the simplest applications this little startup time almost always pays off (and it definitely did here). And yes I honestly believe that *every* Web application needs proper Configuration management, error handling and logging/tracing none of which are native to .NET.
Building the basic application is the meat of things and that's fairly predictable. Then there's testing which is always a difficult task with Web applications and especially in this scenario where there's no UI and background scheduling application is involved and I have to communicate with the system through code generated messages. This part is where I usually underestimate complexity myself.
And finally there's deployment. In this case the app needs to go to an ISP and there are a few permission requirements involved that are uncertain. Getting an app onto a cheap ISP is always time consuming - figuring out how to log in, get all the passwords right, set up a SQL database and copy the data over - it all takes time. It's not rocket science but it definitely is time consuming. So 5 hours of time that I estimated for the customer was actually low balling it.
So, after a couple of days I get a call back from said customer - he's in the meantime fiddled around with stuff on his own - and decided that maybe 5 hours of my time is not so bad after all and we go ahead and go forward with this small service implementation. In the end from starting to deployment it ends up taking me closer to 7 hours mostly because of major issues during deployment with the ISP.
Of course now the customer realizes that there are a few additional things that might be required (which I mentioned originally ) - oh we might need security to keep people out and an admin console to deal with management of system settings and messages etc. and more discussion ensues of what should be done to 'finish' the application to what it really needs to be to be 'complete'. I estimate another 10 hours of work roughly and again - customer's not happy goes off and futzes around on his own - and comes back a week later.
By the time it's all said and done - 3 cat and mouse games and 20 billed hours later - the system is done and up and running and the customer's happy. Of course it would have taken a good chunk less time if we'd worked off this agreement right from the start, but so be it.
I don't think there's such a thing as trivial. Although ideas might start out trivial, almost anything that has any value whatsoever quickly outgrows the trivial stage. Whenever I hear trivial I usually think somebody is 'trivializing' a problem <s>.
My own Triviality
I'm picking on this semi-ficticious customer, but the truth is that I'm not immune to this kind of trivialization even for my own stuff. Here's an example. Over the last few weeks I've been updating my Web site which is a huge mish mash of technologies dating back to 1995. There's a lot of really old stuff and most of the non-dynamic site is running class ASP. Since I've been having a number of problems on my server recently which apparently is caused by classic ASP crashing and I've used that as an excuse - eh, kick in the ass - to move a bunch of these pages to ASPX pages. Most ASP pages had a small ATL COM component running on it that handled user tracking and referrer logging and to my chagrin banner management.
I started to create a .NET version of this ATL component which was totally trivial <g>. But because only a few pages actually use the banner manager I totally spaced the banner manager. All of a sudden I'm looking at writing some code that's not quite so trivial.
The banner manager I use lets me add banners interactively and track hits and clicks etc. as well as help me manage serving Google and third party ads and track all of this information about it. So it's not quite as simple as using the ASP.NET banner control and calling it a day. It's a small database app and there are some intricacies in how the banners need to be served so that search engine robots don't 'see' them etc. There's also the administration interface which lets me add, edit and manage ads as well as see some statistics for them.
So how hard can that be? In my own triviality excercise I figured this would take me a few hours to complete. Here's what the Admin UI looks like:
So what do you think, dear reader how long should this have taken? Here's a cross section of functionality:
- HttpHandler to serve ads
- BannerManager 'business object' that handles all data operations
- Banner instance that deals with banner display in simple and logged modes
- Admin interface to add/edit/manage and manage statistics
- SQL Backend
- Banner Click tracking
It looks pretty simple on paper (uh, this web page) doesn't it?
So if you had to take a roughish stab at this how long should this take.
So let's just say from my end that it took a lot longer than I expected it from my initial 'trivial' mindset. Granted as I went along with this I went and added quite a bit of functionality that the original manager never had and ended up with a manager that is much more flexible now. But still even for base functionality the time spent was way beyond my expectations.
There's no such thing as trivial in software development!