Rice. A swamp grass that we consume, awesome. But how do you prepare rice? You could,
- Buy it in pre-prepared microwave packets
- Buy a rice cooker
- Make it yourself using some water and a suacepan
Theres probably more but that would detract from my carefully constructed metaphor (I'm not drunk, honest). So whats the point? Well lets think about the pros and cons of each.
You can buy these little pouches of rice that you pop in the microwave for 3 minutes and bing you've got hot steamy rice. Sort of. It's never perfect. The work involved in taking a perishable food stuff and making it "less" perishable, packaging it and shipping it around the world kind of degrades the product a bit. You ultimately have to trade off quality for convenience. You can certainly add ingredients to the rice to rejuvenate it but its never quite same and lets be honest the packet size is always either too big or too small and you end up wasting some.
Using a Rice Cooker
Rice cookers typically cook rice really well but they are an investment, you may only use it occasionally, some of them are a pain to clean and you've always got to find space for it in your kitchen (if you had a fancy tool for every type of food you'd need a much bigger kitchen). Plus these things don't really scale very well. They typically make a certain size and if you want more than that you need to start doing it in batches or invest in another rice cooker.
Make it Yourself
Rice can be a pain in the ass to cook, it sounds simple. Too little water and it burns and sticks to the bottom of the pan, too much and it boils over leaving starchy water everywhere. You can under-cook it, or wore overcook it into a stogy mess. If you get distracted or try to do too many other things its easy for things to go bad and you'll be left with a mess that needs cleaning up. Then theres the problem of judging the right amount of rice to cook. Eventually though, after a spot of trial and error, cooking rice without fancy tools becomes rather easy and predictable.
A Carefully Constructed Metaphor
I did mention previously that this was a metaphor and I wasn't lying. I've been mulling over this analogy for a while (while I was cooking rice for real). In software you've got similar approaches to delivery,
- You can buy an off-the-shelf solution that accomplishes most things
- You can use a framework with all the bells and whistles
- You can roll your own solution
The all have their own trade-offs that align well with the rice metaphor.
Off the shelf products give you a certain level of convenience provided you are willing to live with that you are often compromising user experience to satisfy the view of a "typical user" that the product must adhere to to appeal to wide user base. And yes you can typically add your own ingredients through extra development work but it's never quite right.
By using a large framework you've got accept a certain amount of upfront complexity for the future promise of making the delivery of solutions easier. Much like the rice cooker, frameworks will invariably bring with them a slew of features that you'll never use. However there will always be the need to manage and cope with that extra complexity and often the cost of this complexity (setting up boilerplate for a new feature, writing a bunch of configuration to allow the framework to do it's magic etc.) could be greater than the value a small feature provides. Features users want will be deferred because of decisions they did not have a say in.
Finally the idea of making your own rice, or using a minimal set of common tools to deliver the right amount features. Yes it may seem initially daunting, you'll probably get it wrong a few times (do too much or not enough) but eventually you'll build up enough knowledge and skill that you can see that reliance on heavy abstractions is often more of a burden than a help. While rolling your own may appear as unnecessary risk - taking this approach in small steps is significantly less risky than pinning all your hopes in a frameworks sales pitch or the promise of buy-and-run COTS products.
Building your own stuff has the added future benefit of letting you make more informed decisions. Clearly there is no one right answer for every situation - sometimes you may just benefit from firing up a ready rolled WordPress site, or, perhaps Middleman or Jekyll would fit in well with the publishing strategy of the project, but sometimes a simple
Makefile with a bunch of
sed calls will do the job.
Finally the simple act of actually trying build your own solutions will give you greater clarity when you need to answer questions around build vs buy or technology choices. Just because frameworks, tools and products allow you to be ignorant of many things it doesn't mean you should be.