WARNING - this is likley to be controversial. But I aim to promote discussion as much as anything else.
I responded to a request for an application to do a simple task. One of the comments on my app was "Very slick". This is of course flattering, but it says a sad thing about software development in general : mediocrity is standard. Fortunately this, hopefully, won't remain the case:
Why would I (or anyone) submit an application which was adequate? What would be the point of half hearted effort?
- Seriously, I don't know.
Yes, with version 2 of my DevDays app, I've gone beyond the original requirements. But why would I (or anyone) do this?
- Because just doing enough isn't going to stand out!
- Because just doing what anyone could do isn't going to stand out!
But isn't that doing unnecessary extra work? Who's going to pay for it?
- The trick is to provide a lot of value for a little extra effort. It's paid for when that work gets you great recommendations and future business.
In my app I've added 'Twitterfall' type functionality. This was relatively simple to add through the use of the TweetSharp library. The value it adds to the application is great. It turns a passive application into an interactive one. Plus it's a boost to me: I got to try out a new library; I got to interact with Joel and received a boost in confidence that what I had created was good; plus I got some subject matter for a blog post.
Before I go on:
- Yes, I know there are times when there really is no need to do more than the absolute minimum.
- Yes, often there are other external pressures.
- Yes, often a client may have a limited budget.
- Yes, a client may want a very specific thing and not be interested in it being the best it can be.
- Yes, there are probably lots of other resons not to do this - but I'm being idealistic and this is my blog so I'm allowed.
Anyway, what was the point of all this? Oh yeah.
I want to make applications that are truly great and people enjoy and want to use.
I want to immitate someone who was actually a master craftsman who worked with wood. (He was more than just a famous carpenter.)
I want to put effort into what I'm doing and do the best possible job.
I don't want to make software people complain about at work when they compare it to the software they use at home.
I don't want to make a second version of a piece of software for someone because there was a clause written into the original contract that means they have to come back to us for future versions. I'd much rather write the first version of a piece of software and hand over the source code to the client (so they can get anyone they want to make the second version) but still have them come back to me to make the second version because they were impressed with what they received the first time.
I don't want to make commodity software. I don't want to be a commodity developer!
I don't want to make average software. I want to make great software!
This isn't just idle claims. I've actually been putting this into practice with a recent project. It was a common scenario: Large project and only a fraction of the time needed to complete it to a decent standard.
I saw two options: 1. Work at a reasonable rate and if everything went well end up with something that may be barely acceptable. or 2. Go above and beyond and create something I could be proud of.
Due to a unique set of circumstances (mostly my wife having arranged to visit her parents for two weeks with our son - so I was home alone) I was able to select option 2. Also, fortunately, the requirements of the project were an almost perfect fit with my skills (Windows Mobile, WinForms (desktop), ASP.NET & WebServices) so I stood a reasonable chance of being successful.
I decided that if I was going to undertake the project it was going to be as good as I could make it. This was as much to prove to myself that I could make some thing great in the time available as it was to deliver a great solution.
Yes - I made it very clear that the extra effort was a one off and not indicative of what could be expected in the future. That this was an exceptional level of effort was repeated back to me subsequently by the appropriate parties so I think I got this across.
I should also point out that the project (which I'm not allowed to talk about) was something very cool and something I wanted to see succeed. The deadline was for a pilot/demo which would be visited by many potential customers. The purpose of the demo was to prove that the technology worked and win, potentially, very large contracts.
So for the 2 months up to the demo I lived the project. It seemed like every waking moment was spent thinking about it, and even now find myself thinking about the next stage - which isn't what I'm working on. And I did loads of overtime (over 100 hours - all unpaid). This included an all nighter after the event when the client moved the deadline for the post event data analysis. I worked through the night (well I had one hours sleep before going in to do anohter full days work) because I didn't see the point in goign to all the effort before hand to make the demo work only to not be able to prove what we'd done. If you can't (accurately) report on what the system did, did the system really do anything? Was it all just smoke and mirrors?
When it came to the demo:
- the customer was very impressed as what I delivered was better than they had hoped for.
- there were a couple of minor bugs, but because I was there I managed to find workarounds - so no big deal, considering.
- the users of the software were initially wary but after a short time prefered working with the application and didn't want it taken away after the demo. They were also more productive with it.
- the potential customer we wanted to impress, were very impressed.
So was it worth it?
- I was happy with what I achieved.
- The client was impressed.
- The potenital customers were impressed (and some have already signed some big deals).
- I think, my boss was impressed.
But was it worth it?
I think so. I wanted the project to succeed and was only interested in being involved if it could be really good. (In retrospect I think I only managed to reach the level of 'barely acceptable' by my standards - but these are very high.) Yes I had to work very hard, but it was better (in my mind) than having just created something average - again.
What if I hadn't gone 'beyond the call of duty'?
- Because of the tight schedules I was keen to see how much I actually got done in a realtively short period of time. I was also keen to know exactly how much time I spent on the project. So I recorded (admitedly only in a basic way) how I spent my time.
In my estimation, if I hadn't put the extra time and effort in, the amount I would have got done would have meant that: there would have been some fairly essential functionality not there; the look and feel of the applications would have been much poorer; there would have been more bugs; the last minute changes that were necessary to actually do the demo couldn't have been made. All of which means (by my reckoning) that if I hadn't put the extra effort in the demo wouldn't have gone ahead. This would mean that the sales people wouldn't have had anything to show. They would have had a much harder job convincing the potential customers to but their business in the hands of a system they couldn't even see demonstrated.
Yes, I'm sure that if it was necessary some kind of limited demonstration could have been put together - instead of the full working system I created.
No, this isn't a dig at the sales people - it's just an observation that it's much easier to sell something if you can show it working, and working well.
So what did I learn from this:
- Making something great was worth it to the business.
- I am actually very clever and can make the applications I always knew I could.
- I REALLY don't want to work to that level again. (At least not without some serious reward* and only if the impact on family life can be minimized)
- Some other things it doesn't make sense to talk about here.
* Part of the reward in this case is me being able to say "I made that". - At least I will be able to say that when I'm allowed to talk about the project. ;)
- This is only possible if developing for someone who wants to make a great system
- I suspect it would be MUCH harder to create a truly great system without a very itterative process.
- Part of the reason that the client was so happy with what was delivered was "exactly what they wanted" not what they actually/initially asked for. I can see 3 reasons this was possible:
- I had good knowledge of the application domain. (Another reason I was excellently suited to the project.)
- I spent a lot of time talking direclty with the client to confirm exactly what they wanted and discussing possibilities. I suspect that if these communications had gone through other parties at least some of information would have become confused or lost. (Time constraints meant that there wasn't time to formally spec everything prior to development. - For the demo version only. This isn't a good way to build large, long lasting, reliable software.)
- The original 'spec' had reporting as a 'wish list' item. My experience taught me that it was actually essential and internally I promoted this to an 'essential' deliverable. - I was working on the basis that if you're going to be showing & trying to sell something to people who are only interested in the data that comes out the backend it helps to be able to show that data. Not only did I show the data but also put it in nice graphs (which everyone deemed was more than they could hope for - I consider that a Saturday well spent). As I sat in on some of the sales demos, I saw jaws drop in amazement and wonder as we were easily able to show and explain trends in data that no-one had previously been able to even capture. - I suspect that making sales is much easier when you've been able provoke that response.
Side thought: Is making boring, unremarkable software one of the reasons that many developers don't stay in the industry for a long time?
Yes, I have been influenced by Hugh Macleod and his book.