Well, I’ve promised to rant about my feelings on specifications versus letting ideas flow when designing or developing a project.
So far I’ve worked mostly on traditional software development, and even “worse”, consulting. In this scenario you really don’t want to go up to a client and say “Hey, you know Mr. Company Ten Times Our Size, I haven’t really written down any specification that you can actually look at, but I have this great gut feeling, and I’ve decided to… you know, see where this leads us!” Something like this would end pretty much in disaster.
In a more formal context of software development, it’s hard to gain a client’s trust without showing him some hard proof (usually in printable format), that you ARE working to solve his problems, and that you actually understand what he wants. On the other hand, I feel that sometimes the job of writing and maintaining all this specifications can be a truly daunting task. I usually see one of two things happen:
- You specify your heart out, start coding away, and then something in the requirements changes (and yes, some critical requirements always change), but the deadline stays the same… so there go the specifications on their way to outdatedness.
- Requirements change so much, that you end up doing most of the documentation after the project is done, and that turns specification into a kind of novel that recounts your mighty programming deeds. Not exactly useful for the developers, right?
See how I don’t really offer many solutions? Yeah, that’s the ranting nature of the post. Although I’ve been thinking that maybe one needs to embrace that the client must approve some nicely written business-language document just so he knows we’re on the same page, and developers should use something else entirely. What? Whatever works for your team… XP, Pair Programming, Post-it’s on the wall, RUP, you name it.
If, on the other hand, you’re not really catering for a set of stakeholders, and want to do some project either to tickle your own fancy or something you want to throw on the market in the future, formal specifications might just be the way to keep you from making something great.
Let me elaborate on that…
I’m a firm believer that no one likes doing stuff just to throw away. When you take the time to specify from top to bottom what you intend to do before you actually start doing it, you’re making it harder on yourself to try out alternatives, no matter how absurd or small in comparison they might look at first.
Since very few products actually end up being exactly what one first imagined, I believe you shouldn’t really take the time to start writing up use cases and data dictionaries until you’ve explored all the ideas that come to your mind.
I’m a bit old school so, my personal favourite is taking a pad (a paper one, not an “i”), and sketching up the application that I imagine, thinking about what would be the main features, how would it interact with users, and what extra stuff could I put in there. Every once in a while, I get a moment when I think: “Damn! This feature would be.. awesome! This could be the whole concept of the site!”, and that is totally worth the mental and sketching ramblings involved.
I hope that in some time, I’ll be able to share with you guys one of those ideas ;).
So, as a wrap up (this really got longer than I expected!), the main point I’m trying to make is… sketch, specify, draw, discuss, do anything that works for you, but don’t get trapped in formalisms if that’ll mean that you won’t be exploring other alternatives (even vague, long-shot ones) that come to your mind because it’ll be too hard (or too damn boring), to reflect that in some specification.
Thanks for reading this far! And please let me know your thoughts on the subject, really looking forward to hear/read your opinion!