Reinventing the wheel – a phrase which means duplicating an existing feature from scratch – is often used in the context that it is unnecessary or inefficient.
I think that in most cases this is true, but I was hesitant to start this post by screaming to never, ever, under any circumstances whatsoever reinvent the wheel, because I think that sometimes it can be necessary or at least justified.
I wrote last week about programmers who make their lives difficult for themselves by doing things the “wrong” way, essentially due to their ignorance or inexperience with whatever they’re doing. For this class of programmers, the saying “Don’t reinvent the wheel” probably sticks.
But there are some situations where it can be beneficial to reinvent the wheel, so long as you know why you’re doing it and it’s for the right reasons:
- The current options out there don’t suit your needs. Sometimes you want to re-implement something that is already out there, because it doesn’t do what you want to do, which compromises some core functionality of what you want to achieve. By implementing this yourself it will make your software better in some way and will be a worthwhile use of your time.
- You want a lighter version of what’s already out there. You feel that the options out there are too bloated for what you want (often because they are generic) so rolling your own is a way of making your software more efficient. Stack Overflow user Ólafur Waage actually did this with his blog, Cyborg Zombie Ninja Pirate (CZNP) which he explained and justified in his first post:
I am sick and tired of large bloated CMS or blog systems. WordPress I’m looking at you.
I’ve been a fan of the idea that people who are smarter than you should do their smart work for you. And I tried my best to apply that to the current blogging systems out there. So I said enough is enough. I’ll make my own.
Which is something (ironically) I agree with. By doing so it meant that he had a more efficient and more favourable option than what was already out there.
- As a learning experience. Although not perhaps for use in actual products, sometimes I will implement something that is readily available in order to learn from it, perhaps for a side-project or something which isn’t constrained by time or resources. Although it often won’t make my life easier, it will help broaden my knowledge on a particular area, which I think is an important supplement to software development.
It’s very easy to feel the need to re-implement something that’s already out there, but make sure that if you do it’s for the right reasons and the end result will have made your extra efforts worthwhile.